momentic 2.26.0 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,14 +1,14 @@
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]="6d4b8763-9e65-5faa-9980-eb8bfa44ae80")}catch(e){}}();
4
- var GO=Object.defineProperty;var ct=(r,e)=>()=>(r&&(e=r(r=0)),e);var jO=(r,e)=>{for(var t in e)GO(r,t,{get:e[t],enumerable:!0})};var Tw,vw=ct(()=>{"use strict";Tw=typeof globalThis=="object"?globalThis:global});var Aw=ct(()=>{"use strict";vw()});var Rw=ct(()=>{"use strict";Aw()});var Jn,zg=ct(()=>{"use strict";Jn="1.9.0"});function kH(r){var e=new Set([r]),t=new Set,n=r.match(ww);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===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(ww);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 ww,Cw,xw=ct(()=>{"use strict";zg();ww=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;Cw=kH(Jn)});function Ga(r,e,t,n){var o;n===void 0&&(n=!1);var i=xl[Cl]=(o=xl[Cl])!==null&&o!==void 0?o:{version:Jn};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==Jn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+Jn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+Jn+"."),!0}function Qn(r){var e,t,n=(e=xl[Cl])===null||e===void 0?void 0:e.version;if(!(!n||!Cw(n)))return(t=xl[Cl])===null||t===void 0?void 0:t[r]}function ja(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+Jn+".");var t=xl[Cl];t&&delete t[r]}var UH,Cl,xl,_l=ct(()=>{"use strict";Rw();zg();xw();UH=Jn.split(".")[0],Cl=Symbol.for("opentelemetry.js.api."+UH),xl=Tw});function Il(r,e,t){var n=Qn("diag");if(n)return t.unshift(e),n[r].apply(n,BH([],FH(t),!1))}var FH,BH,_w,Iw=ct(()=>{"use strict";_l();FH=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BH=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},_w=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("verbose",this._namespace,e)},r}()});var rt,md=ct(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(rt||(rt={}))});function Mw(r,e){r<rt.NONE?r=rt.NONE:r>rt.ALL&&(r=rt.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",rt.ERROR),warn:t("warn",rt.WARN),info:t("info",rt.INFO),debug:t("debug",rt.DEBUG),verbose:t("verbose",rt.VERBOSE)}}var Pw=ct(()=>{"use strict";md()});var HH,zH,GH,wn,Ml=ct(()=>{"use strict";Iw();Pw();md();_l();HH=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zH=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},GH="diag",wn=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=Qn("diag");if(s)return s[o].apply(s,zH([],HH(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:rt.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=Qn("diag"),d=Mw((s=i.logLevel)!==null&&s!==void 0?s:rt.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 Ga("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ja(GH,t)},t.createComponentLogger=function(o){return new _w(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var Ow,Lw=ct(()=>{"use strict";Ow=Symbol("BaggageEntryMetadata")});function Gg(r){return typeof r!="string"&&(jH.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:Ow,toString:function(){return r}}}var jH,Nw=ct(()=>{"use strict";Ml();Lw();jH=wn.instance()});function jg(r){return Symbol.for(r)}var VH,Vg,$g=ct(()=>{"use strict";VH=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),Vg=new VH});function Kg(){return qg}var Mi,$H,hd,WH,qH,KH,YH,Wg,XH,JH,QH,qg,ZH,e1,t1,r1,n1,o1,i1,Yg=ct(()=>{"use strict";Mi=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),$H=function(){function r(){}return r.prototype.createGauge=function(e,t){return e1},r.prototype.createHistogram=function(e,t){return t1},r.prototype.createCounter=function(e,t){return ZH},r.prototype.createUpDownCounter=function(e,t){return r1},r.prototype.createObservableGauge=function(e,t){return o1},r.prototype.createObservableCounter=function(e,t){return n1},r.prototype.createObservableUpDownCounter=function(e,t){return i1},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),hd=function(){function r(){}return r}(),WH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(hd),qH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(hd),KH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(hd),YH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(hd),Wg=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),XH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),JH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),QH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),qg=new $H,ZH=new WH,e1=new KH,t1=new YH,r1=new qH,n1=new XH,o1=new JH,i1=new QH});var vr,Dw=ct(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(vr||(vr={}))});var a1,s1,kw,Uw=ct(()=>{"use strict";$g();a1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},s1=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},kw=function(){function r(){}return r.prototype.active=function(){return Vg},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,s1([n],a1(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var l1,c1,Xg,u1,Fw,Bw=ct(()=>{"use strict";Uw();_l();Ml();l1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},c1=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Xg="context",u1=new kw,Fw=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return Ga(Xg,e,wn.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,c1([e,t,n],l1(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return Qn(Xg)||u1},r.prototype.disable=function(){this._getContextManager().disable(),ja(Xg,wn.instance())},r}()});var Va,Hw=ct(()=>{"use strict";Bw();Va=Fw.getInstance()});var $,zw=ct(()=>{"use strict";Ml();$=wn.instance()});var d1,Gw,jw=ct(()=>{"use strict";Yg();d1=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return qg},r}(),Gw=new d1});var Jg,Vw,$w=ct(()=>{"use strict";jw();_l();Ml();Jg="metrics",Vw=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return Ga(Jg,e,wn.instance())},r.prototype.getMeterProvider=function(){return Qn(Jg)||Gw},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ja(Jg,wn.instance())},r}()});var gd,Ww=ct(()=>{"use strict";$w();gd=Vw.getInstance()});var $e=ct(()=>{"use strict";Nw();$g();md();Yg();Dw();Hw();zw();Ww()});var As=(r,e)=>{},lm=!1;try{let r=await import("@sentry/node");As=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),lm=!0}catch{}import{Command as jK,Option as lr}from"@commander-js/extra-typings";import{execSync as VK}from"child_process";import{existsSync as tU,statSync as rU}from"fs";import{z as cm}from"zod";var r2=cm.object({input:cm.string(),agentConfigVersion:cm.string().optional()});import{z as Ct}from"zod";var i2=Ct.object({srcs:Ct.array(Ct.string()),urls:Ct.array(Ct.string()),desiredSrc:Ct.string().optional(),desiredUrl:Ct.string().optional()}),yy=Ct.object({srcRegex:Ct.string().optional(),urlRegex:Ct.string().optional()}),Ey=Ct.object({x:Ct.number(),y:Ct.number(),correlation:Ct.number()}),a2=Ct.object({searchImageBase64String:Ct.string(),pageImageBase64String:Ct.string(),id:Ct.string().uuid(),timeoutMs:Ct.number().max(1e4).min(0).optional()});import{z as L}from"zod";import*as D from"zod";import{extendZodWithOpenApi as VO}from"zod-openapi";VO(D);var so=(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))(so||{}),$O=D.object({mPathSelectorTokens:D.string().array(),frameSrcRegex:D.string().optional(),frameUrlRegex:D.string().optional(),indices:D.number().array()}),um=D.object({result:D.number(),traceId:D.string()}).array(),Sc=D.object({type:D.literal("GCS_TRACES"),traces:um}),ao=(o=>(o.Precise="precise",o.Narrow="narrow",o.Unspecific="broad",o.Irrelevant="irrelevant",o))(ao||{}),by=D.object({attributes:D.record(D.string(),D.string()).optional(),text:D.string().optional(),position:D.object({x1:D.number(),y1:D.number(),x2:D.number(),y2:D.number(),tolerance:D.nativeEnum(ao)}).optional(),shape:D.object({width:D.number(),height:D.number(),tolerance:D.nativeEnum(ao)}).optional(),boundingBox:D.object({x:D.number(),y:D.number(),width:D.number(),height:D.number()}).optional()}),WO=D.object({selectors:D.string().array(),requirements:by.optional()}),lo=D.object({id:D.number().int(),dataMomenticId:D.number().int().optional(),selector:D.string().optional(),hybridSelector:D.object({textContent:D.string().nullish(),attributes:D.record(D.string(),D.string().optional()),tagName:D.string(),expandShadowRoot:D.boolean().optional(),classNames:D.string().array(),nthChild:D.number()}).array().optional(),generatedSelectors:D.string().array().optional(),requirements:by.optional(),additionalElements:WO.array().optional(),role:D.string().optional(),name:D.string().optional(),numChildren:D.number().optional(),content:D.string().optional(),pathFromRoot:D.string().optional(),serializedHtml:D.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:D.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:D.string().url().optional(),boundingBox:D.object({x:D.number().optional(),y:D.number().optional(),width:D.number(),height:D.number()}).describe("css pixel bounding box").optional(),frameCache:$O.optional(),inputDescription:D.string().optional().describe("the description that generated this cache"),targetSource:D.nativeEnum(so).optional(),targetUpdateTime:D.string().optional(),targetUpdateLoggerTags:D.record(D.string(),D.string()).optional(),cacheResolutionUpdateSource:D.string().optional(),cacheResolutionUpdateTime:D.string().optional(),cacheResolutionUpdateLoggerTags:D.record(D.string(),D.string()).optional(),memory:Sc.optional()}).openapi({ref:"ElementTargetCache"});function yc(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var qO=D.object({type:D.literal("description"),elementDescriptor:D.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),KO=D.object({x:D.number(),y:D.number()}),YO=D.object({type:D.literal("coordinates"),pixels:KO}).openapi({ref:"CoordinatesTarget"});function co(r){return r.type==="description"}function pn(r){return r.type==="coordinates"}var jt=D.discriminatedUnion("type",[qO,YO]).openapi({ref:"ElementTarget"});function dm(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Vt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.pixels.y}`}}function Ec(r){return Sc.safeParse(r).success}import{v4 as Me}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as aL}from"zod-openapi";import{z as ce}from"zod";import{extendZodWithOpenApi as XO}from"zod-openapi";import{z as ws}from"zod";import Ty from"zod";var Rs=Ty.object({updatedAt:Ty.coerce.date().optional()});var pm=ws.object({result:ws.boolean(),traceId:ws.string()}).array(),mm=ws.object({type:ws.literal("GCS_TRACES"),traces:pm}),hm=Rs.extend({memory:mm.optional()});XO(ce);var vy=ce.object({plan:ce.string().optional(),evidence:ce.string().optional(),thoughts:ce.string(),result:ce.boolean(),relevantElements:ce.array(ce.number()).optional(),updatedMemory:pm.optional()}),Kr=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Kr||{});var JO=ce.object({type:ce.literal("ELEMENT_NAME"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Kr),value:ce.string()}).openapi({ref:"ElementNameAssertion"}),QO=ce.object({type:ce.literal("ELEMENT_STYLE"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Kr),property:ce.string(),value:ce.string()}).openapi({ref:"ElementStyleAssertion"}),ZO=ce.object({type:ce.literal("ELEMENT_CONTENT"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Kr),value:ce.string()}).openapi({ref:"ElementContentAssertion"}),eL=ce.object({type:ce.literal("ELEMENT_ATTRIBUTE"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Kr),attr:ce.string(),value:ce.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Hn=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Hn||{});var tL=ce.object({type:ce.literal("ELEMENT_EXISTENCE"),negated:ce.boolean().optional(),condition:ce.nativeEnum(Hn).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),bc=ce.discriminatedUnion("type",[ZO,eL,tL,JO,QO]).openapi({ref:"ManualElementAssertion"});var rL=ce.object({type:ce.literal("CONTENT"),negated:ce.boolean().optional(),value:ce.string()}).openapi({ref:"PageContentAssertion"}),Ay=ce.discriminatedUnion("type",[rL]).openapi({ref:"ManualPageAssertion"});import Zt from"zod";var gm=Zt.discriminatedUnion("type",[Zt.object({type:Zt.literal("SUBSTRING"),url:Zt.string()}),Zt.object({type:Zt.literal("GLOB"),glob:Zt.string()}),Zt.object({type:Zt.literal("REGEX"),regex:Zt.string()}),Zt.object({type:Zt.literal("DOMAIN"),domain:Zt.string()})]),Cs=Zt.object({urlMatcher:gm,method:Zt.string().optional()});import{z as de}from"zod";var nL=de.object({type:de.literal("json"),content:de.string().describe("The JSON content to send in the request body")}),oL=de.object({type:de.literal("form-urlencoded"),content:de.record(de.string(),de.string()).describe("The form fields to send in the request body")}),iL=de.discriminatedUnion("type",[nL,oL]),Qo=de.object({url:de.string(),method:de.union([de.literal("GET"),de.literal("POST"),de.literal("PUT"),de.literal("DELETE"),de.literal("PATCH")]),headers:de.record(de.string(),de.string()).optional(),params:de.record(de.string(),de.string()).optional(),body:iL.optional(),timeout:de.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ry=de.object({url:de.string(),headers:de.record(de.string(),de.string()).optional(),query:de.string(),variables:de.string().optional(),timeout:de.number().int().optional().describe("Max seconds to wait for the request to complete")}),Tc=de.object({code:de.string(),fragment:de.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:de.union([de.literal("NODE"),de.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:de.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ke=(K=>(K.AI_EXTRACT="AI_EXTRACT",K.AI_ASSERTION="AI_ASSERTION",K.AUTH_LOAD="AUTH_LOAD",K.AUTH_SAVE="AUTH_SAVE",K.BLUR="BLUR",K.CAPTCHA="CAPTCHA",K.CLICK="CLICK",K.COOKIE="COOKIE",K.COPY="COPY",K.DIALOG="DIALOG",K.DRAG="DRAG",K.ELEMENT_CHECK="ELEMENT_CHECK",K.FILE_UPLOAD="FILE_UPLOAD",K.FOCUS="FOCUS",K.GO_BACK="GO_BACK",K.GO_FORWARD="GO_FORWARD",K.HOVER="HOVER",K.JAVASCRIPT="JAVASCRIPT",K.LOCAL_STORAGE="LOCAL_STORAGE",K.MOUSE_DRAG="MOUSE_DRAG",K.NAVIGATE="NAVIGATE",K.NEW_TAB="NEW_TAB",K.PAGE_CHECK="PAGE_CHECK",K.PASTE="PASTE",K.PRESS="PRESS",K.KEY_DOWN="KEY_DOWN",K.KEY_UP="KEY_UP",K.REFRESH="REFRESH",K.REQUEST="REQUEST",K.GRAPHQL_REQUEST="GRAPHQL_REQUEST",K.SCROLL_DOWN="SCROLL_DOWN",K.SCROLL_UP="SCROLL_UP",K.SCROLL_LEFT="SCROLL_LEFT",K.SCROLL_RIGHT="SCROLL_RIGHT",K.SELECT_OPTION="SELECT_OPTION",K.SWITCH_TAB="TAB",K.TYPE="TYPE",K.VISUAL_DIFF="VISUAL_DIFF",K.WAIT="WAIT",K.WAIT_FOR_URL="WAIT_FOR_URL",K.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",K.AWAIT_LISTENER="AWAIT_LISTENER",K.RECORD_REQUESTS="RECORD_REQUESTS",K.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",K.SET_HEADER="SET_HEADER",K.MOCK_ROUTE="MOCK_ROUTE",K.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",K.OFFLINE_MODE="OFFLINE_MODE",K.SUCCESS="SUCCESS",K))(Ke||{});aL(R);var te=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),Cr=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"}),fr=Rs.extend({target:lo}).optional().openapi({ref:"SingleTargetCache"});function wy(r){return fr.safeParse(r).success}var Ac=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),Cy=te.merge(Ac).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Rc=Cr.merge(R.object({cache:fr})),ei=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),ti=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ki=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Yi=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),F2=R.discriminatedUnion("type",[ei,ti,Ki,Yi]).openapi({ref:"AllScrollCommands"}),sL=te.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),xy=te.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),lL=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")}),_y=te.extend({type:R.literal("WAIT_FOR_URL"),matcher:gm}).merge(lL).openapi({ref:"WaitUrlCommand"}),Iy=te.merge(Ac).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),My=te.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Py=te.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),cL=te.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),uL=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"}),fm=te.merge(Cr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Oy=te.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),Ly=te.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),Ny=te.merge(Tc).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Xi=te.merge(Cr).extend({type:R.literal("CLICK"),target:jt,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:fr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),Sm=Rs.extend({fromTarget:lo.optional(),toTarget:lo.optional()}),Ji=te.merge(Cr).merge(R.object({type:R.literal("DRAG"),fromTarget:jt,toTarget:jt,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:Sm.optional()})).openapi({ref:"DragCommand"}),Qi=te.merge(Cr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:jt.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:fr})).openapi({ref:"MouseDragCommand"}),Zi=te.merge(Cr).merge(R.object({type:R.literal("HOVER"),target:jt,cache:fr})).openapi({ref:"HoverCommand"}),xs=te.merge(Cr).merge(R.object({type:R.literal("FOCUS"),target:jt,cache:fr})).openapi({ref:"FocusCommand"}),_s=te.merge(Cr).extend({type:R.literal("BLUR"),target:jt.optional(),cache:fr}).openapi({ref:"BlurCommand"}),dL=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),pL=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),mL=te.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[dL,pL]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),ym=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()})]),ea=te.merge(Cr).extend({type:R.literal("SELECT_OPTION"),target:jt,cache:fr,choice:ym.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Em=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),Is=te.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Em.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:hm.optional()})).openapi({ref:"AIAssertionCommand"}),mn=5,ta=600,ra=te.merge(Cr).extend({type:R.literal("ELEMENT_CHECK"),target:jt,assertion:bc,cache:fr.or(hm).optional(),timeout:R.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Dy=te.extend({type:R.literal("PAGE_CHECK"),assertion:Ay,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),ky=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"}),hL=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()}),Uy=25,na=te.merge(Cr).merge(hL).extend({type:R.literal("TYPE"),target:jt.optional(),value:R.string(),cache:fr}).openapi({ref:"TypeCommand"}),Fy=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"}),By=te.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),Hy=te.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),gL=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),fL=R.object({type:R.literal("REGEX"),pattern:R.string()}),SL=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),yL=R.discriminatedUnion("type",[gL,fL,SL]),EL=te.merge(Ac).merge(R.object({type:R.literal("TAB"),action:yL})).openapi({ref:"TabCommand"}),zy=te.merge(Ac).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),bL=te.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),Gy=te.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),jy=te.extend({type:R.literal("REQUEST")}).merge(Qo).openapi({ref:"RequestCommand"}),Vy=te.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(Ry).openapi({ref:"GraphQLRequestCommand"}),$y=te.merge(R.object({type:R.literal("SUCCESS"),condition:Is.optional()})).openapi({ref:"SuccessCommand"}),Wy=te.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),TL=R.object({data:R.string().describe("location at which to find a jpg"),width:R.number(),height:R.number()}),Ms=te.merge(Cr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:jt.optional(),screenshot:TL.optional(),cache:fr})).openapi({ref:"VisualDiffCommand"}),vL=te.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Cs,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),AL=te.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),RL=te.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:Cs,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wL=te.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),CL=te.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:Cs.optional()})).openapi({ref:"SetHeaderCommand"}),xL=te.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:Cs,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"})),_L=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"})),IL=te.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),ML=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],B2=[...ML,"DRAG"],PL=R.discriminatedUnion("type",[Xi,na,Fy,By,Hy,ea,Cy,ti,ei,Is,My,Zi,xy]),OL=R.discriminatedUnion("type",[...PL.options,Ji]),LL=R.discriminatedUnion("type",[...OL.options]),qy=R.discriminatedUnion("type",[...LL.options,$y]),bm=R.discriminatedUnion("type",[$y,Xi,na,Fy,By,Hy,ea,Cy,ti,ei,Is,My,Zi,xy,Ny,ra,Dy,zy,_y,ky,Oy,Py,Gy,Ji,Qi,Ly,Iy,jy,Vy]),NL=R.discriminatedUnion("type",[ky,uL,cL,fm,bL,Oy,sL,ra,mL,Py,Ny,Gy,Qi,zy,Dy,Ly,Iy,jy,Vy,Ki,Yi,EL,Ms,xs,_s,_y,vL,AL,RL,wL,CL,xL,_L,IL]),oa=R.discriminatedUnion("type",[...qy.options,...NL.options]).openapi({ref:"Command"}),wc=R.discriminatedUnion("type",[...qy.options,Wy]),H2=R.discriminatedUnion("type",[...bm.options,Wy]);function zn(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:Me(),type:r};break;case"AUTH_LOAD":{e={id:Me(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Me(),type:r,goal:""};break;case"DIALOG":e={id:Me(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Me(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Me(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Me(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Me(),type:r,delay:1};break;case"BLUR":e={id:Me(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Me(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Me(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Me(),type:r,value:""};break;case"SELECT_OPTION":e={id:Me(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Me(),type:r,url:""};case"TAB":e={id:Me(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Me(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Me(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Me(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Me(),type:r,code:""};break;case"AI_ASSERTION":e={id:Me(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Me(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Me(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Me(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Me(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Me(),type:r,key:""};break}case"SET_HEADER":{e={id:Me(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Me(),type:r};break}case"OFFLINE_MODE":{e={id:Me(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Ky(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as DL}from"zod";var $2=DL.discriminatedUnion("type",[_s,fm,Xi,Ji,xs,Zi,Qi,ei,ti,Ki,Yi,ea,na,Ms,ra]);function Yy(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as kL}from"zod";import{z as uo}from"zod";function Ps(r){return uo.object({key:uo.string(),testId:uo.string().optional(),moduleId:uo.string().optional(),organizationId:uo.string(),value:r})}function Os(r){return Ps(r).extend({uniqueKey:uo.string()})}function Cc(r){return uo.record(uo.string(),Os(r))}var er={type:!0,cache:!0},Gn=kL.discriminatedUnion("type",[Is.pick(er),_s.pick(er),Xi.pick(er),Ji.pick(er),ra.pick(er),xs.pick(er),Zi.pick(er),Qi.pick(er),ei.pick(er),ti.pick(er),Ki.pick(er),Yi.pick(er),ea.pick(er),na.pick(er),Ms.pick(er)]),xc=Object.values(Ke).filter(r=>Gn.options.some(e=>e.shape.type.safeParse(r).success));oa.options.forEach(r=>{if("target"in r.shape&&!xc.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function _c(r){return xc.includes(r.type)}var Xy=Ps(Gn),Jy=Os(Gn),Z2=Cc(Gn);import{v4 as ze}from"uuid";import{z as w}from"zod";var Zy=Symbol("Let zodToJsonSchema decide on which parser to use");var Qy={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"},eE=r=>typeof r=="string"?{...Qy,name:r}:{...Qy,...r};var tE=r=>{let e=eE(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,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 Tm(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function ve(r,e,t,n,o){r[e]=t,Tm(r,e,n,o)}var Ic=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as be}from"zod";function ot(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?Ic(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as UL}from"zod";function rE(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==UL.ZodAny&&(t.items=re(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&ve(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&ve(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(ve(t,"minItems",r.exactLength.value,r.exactLength.message,e),ve(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function nE(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?ve(t,"minimum",n.value,n.message,e):ve(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ve(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ve(t,"maximum",n.value,n.message,e):ve(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ve(t,"maximum",n.value,n.message,e));break;case"multipleOf":ve(t,"multipleOf",n.value,n.message,e);break}return t}function oE(){return{type:"boolean"}}function Mc(r,e){return re(r.type._def,e)}var iE=(r,e)=>re(r.innerType._def,e);function vm(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>vm(r,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 FL(r,e)}}var FL=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":ve(t,"minimum",n.value,n.message,e);break;case"max":ve(t,"maximum",n.value,n.message,e);break}return t};function aE(r,e){return{...re(r.innerType._def,e),default:r.defaultValue()}}function sE(r,e){return e.effectStrategy==="input"?re(r.schema._def,e):ot(e)}function lE(r){return{type:"string",enum:Array.from(r.values)}}var BL=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function cE(r,e){let t=[re(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),re(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(BL(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 uE(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as Ls}from"zod";var Am,Yr={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:()=>(Am===void 0&&(Am=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Am),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 Pc(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":ve(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":ve(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Xr(t,"email",n.message,e);break;case"format:idn-email":Xr(t,"idn-email",n.message,e);break;case"pattern:zod":tr(t,Yr.email,n.message,e);break}break;case"url":Xr(t,"uri",n.message,e);break;case"uuid":Xr(t,"uuid",n.message,e);break;case"regex":tr(t,n.regex,n.message,e);break;case"cuid":tr(t,Yr.cuid,n.message,e);break;case"cuid2":tr(t,Yr.cuid2,n.message,e);break;case"startsWith":tr(t,RegExp(`^${Rm(n.value,e)}`),n.message,e);break;case"endsWith":tr(t,RegExp(`${Rm(n.value,e)}$`),n.message,e);break;case"datetime":Xr(t,"date-time",n.message,e);break;case"date":Xr(t,"date",n.message,e);break;case"time":Xr(t,"time",n.message,e);break;case"duration":Xr(t,"duration",n.message,e);break;case"length":ve(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),ve(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{tr(t,RegExp(Rm(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Xr(t,"ipv4",n.message,e),n.version!=="v4"&&Xr(t,"ipv6",n.message,e);break}case"base64url":tr(t,Yr.base64url,n.message,e);break;case"jwt":tr(t,Yr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&tr(t,Yr.ipv4Cidr,n.message,e),n.version!=="v4"&&tr(t,Yr.ipv6Cidr,n.message,e);break}case"emoji":tr(t,Yr.emoji(),n.message,e);break;case"ulid":{tr(t,Yr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Xr(t,"binary",n.message,e);break}case"contentEncoding:base64":{ve(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{tr(t,Yr.base64,n.message,e);break}}break}case"nanoid":tr(t,Yr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Rm(r,e){return e.patternStrategy==="escape"?zL(r):r}var HL=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function zL(r){let e="";for(let t=0;t<r.length;t++)HL.has(r[t])||(e+="\\"),e+=r[t];return e}function Xr(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):ve(r,"format",e,t,n)}function tr(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:dE(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):ve(r,"pattern",dE(e,n),t,n)}function dE(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.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(t.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(t.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]="750765bf-2aed-5bef-89bd-cd904ac1e4d1")}catch(e){}}();
4
+ var GO=Object.defineProperty;var ct=(r,e)=>()=>(r&&(e=r(r=0)),e);var jO=(r,e)=>{for(var t in e)GO(r,t,{get:e[t],enumerable:!0})};var Tw,vw=ct(()=>{"use strict";Tw=typeof globalThis=="object"?globalThis:global});var Aw=ct(()=>{"use strict";vw()});var Rw=ct(()=>{"use strict";Aw()});var Jn,zg=ct(()=>{"use strict";Jn="1.9.0"});function kH(r){var e=new Set([r]),t=new Set,n=r.match(ww);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===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(ww);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 ww,Cw,xw=ct(()=>{"use strict";zg();ww=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;Cw=kH(Jn)});function Ga(r,e,t,n){var o;n===void 0&&(n=!1);var i=xl[Cl]=(o=xl[Cl])!==null&&o!==void 0?o:{version:Jn};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==Jn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+Jn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+Jn+"."),!0}function Qn(r){var e,t,n=(e=xl[Cl])===null||e===void 0?void 0:e.version;if(!(!n||!Cw(n)))return(t=xl[Cl])===null||t===void 0?void 0:t[r]}function ja(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+Jn+".");var t=xl[Cl];t&&delete t[r]}var UH,Cl,xl,_l=ct(()=>{"use strict";Rw();zg();xw();UH=Jn.split(".")[0],Cl=Symbol.for("opentelemetry.js.api."+UH),xl=Tw});function Il(r,e,t){var n=Qn("diag");if(n)return t.unshift(e),n[r].apply(n,BH([],FH(t),!1))}var FH,BH,_w,Iw=ct(()=>{"use strict";_l();FH=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BH=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},_w=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Il("verbose",this._namespace,e)},r}()});var rt,md=ct(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(rt||(rt={}))});function Mw(r,e){r<rt.NONE?r=rt.NONE:r>rt.ALL&&(r=rt.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",rt.ERROR),warn:t("warn",rt.WARN),info:t("info",rt.INFO),debug:t("debug",rt.DEBUG),verbose:t("verbose",rt.VERBOSE)}}var Pw=ct(()=>{"use strict";md()});var HH,zH,GH,wn,Ml=ct(()=>{"use strict";Iw();Pw();md();_l();HH=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zH=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},GH="diag",wn=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=Qn("diag");if(s)return s[o].apply(s,zH([],HH(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:rt.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=Qn("diag"),d=Mw((s=i.logLevel)!==null&&s!==void 0?s:rt.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 Ga("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ja(GH,t)},t.createComponentLogger=function(o){return new _w(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var Ow,Lw=ct(()=>{"use strict";Ow=Symbol("BaggageEntryMetadata")});function Gg(r){return typeof r!="string"&&(jH.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:Ow,toString:function(){return r}}}var jH,Nw=ct(()=>{"use strict";Ml();Lw();jH=wn.instance()});function jg(r){return Symbol.for(r)}var VH,Vg,$g=ct(()=>{"use strict";VH=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),Vg=new VH});function Kg(){return qg}var Mi,$H,hd,WH,qH,KH,YH,Wg,XH,JH,QH,qg,ZH,ez,tz,rz,nz,oz,iz,Yg=ct(()=>{"use strict";Mi=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),$H=function(){function r(){}return r.prototype.createGauge=function(e,t){return ez},r.prototype.createHistogram=function(e,t){return tz},r.prototype.createCounter=function(e,t){return ZH},r.prototype.createUpDownCounter=function(e,t){return rz},r.prototype.createObservableGauge=function(e,t){return oz},r.prototype.createObservableCounter=function(e,t){return nz},r.prototype.createObservableUpDownCounter=function(e,t){return iz},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),hd=function(){function r(){}return r}(),WH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(hd),qH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(hd),KH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(hd),YH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(hd),Wg=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),XH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),JH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),QH=function(r){Mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wg),qg=new $H,ZH=new WH,ez=new KH,tz=new YH,rz=new qH,nz=new XH,oz=new JH,iz=new QH});var vr,Dw=ct(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(vr||(vr={}))});var az,sz,kw,Uw=ct(()=>{"use strict";$g();az=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},sz=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},kw=function(){function r(){}return r.prototype.active=function(){return Vg},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,sz([n],az(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var lz,cz,Xg,uz,Fw,Bw=ct(()=>{"use strict";Uw();_l();Ml();lz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},cz=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Xg="context",uz=new kw,Fw=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return Ga(Xg,e,wn.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,cz([e,t,n],lz(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return Qn(Xg)||uz},r.prototype.disable=function(){this._getContextManager().disable(),ja(Xg,wn.instance())},r}()});var Va,Hw=ct(()=>{"use strict";Bw();Va=Fw.getInstance()});var $,zw=ct(()=>{"use strict";Ml();$=wn.instance()});var dz,Gw,jw=ct(()=>{"use strict";Yg();dz=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return qg},r}(),Gw=new dz});var Jg,Vw,$w=ct(()=>{"use strict";jw();_l();Ml();Jg="metrics",Vw=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return Ga(Jg,e,wn.instance())},r.prototype.getMeterProvider=function(){return Qn(Jg)||Gw},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ja(Jg,wn.instance())},r}()});var gd,Ww=ct(()=>{"use strict";$w();gd=Vw.getInstance()});var $e=ct(()=>{"use strict";Nw();$g();md();Yg();Dw();Hw();zw();Ww()});var As=(r,e)=>{},lm=!1;try{let r=await import("@sentry/node");As=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),lm=!0}catch{}import{Command as jK,Option as lr}from"@commander-js/extra-typings";import{execSync as VK}from"child_process";import{existsSync as tU,statSync as rU}from"fs";import{z as cm}from"zod";var r2=cm.object({input:cm.string(),agentConfigVersion:cm.string().optional()});import{z as Ct}from"zod";var i2=Ct.object({srcs:Ct.array(Ct.string()),urls:Ct.array(Ct.string()),desiredSrc:Ct.string().optional(),desiredUrl:Ct.string().optional()}),yy=Ct.object({srcRegex:Ct.string().optional(),urlRegex:Ct.string().optional()}),Ey=Ct.object({x:Ct.number(),y:Ct.number(),correlation:Ct.number()}),a2=Ct.object({searchImageBase64String:Ct.string(),pageImageBase64String:Ct.string(),id:Ct.string().uuid(),timeoutMs:Ct.number().max(1e4).min(0).optional()});import{z as L}from"zod";import*as D from"zod";import{extendZodWithOpenApi as VO}from"zod-openapi";VO(D);var so=(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))(so||{}),$O=D.object({mPathSelectorTokens:D.string().array(),frameSrcRegex:D.string().optional(),frameUrlRegex:D.string().optional(),indices:D.number().array()}),um=D.object({result:D.number(),traceId:D.string()}).array(),Sc=D.object({type:D.literal("GCS_TRACES"),traces:um}),ao=(o=>(o.Precise="precise",o.Narrow="narrow",o.Unspecific="broad",o.Irrelevant="irrelevant",o))(ao||{}),by=D.object({attributes:D.record(D.string(),D.string()).optional(),text:D.string().optional(),position:D.object({x1:D.number(),y1:D.number(),x2:D.number(),y2:D.number(),tolerance:D.nativeEnum(ao)}).optional(),shape:D.object({width:D.number(),height:D.number(),tolerance:D.nativeEnum(ao)}).optional(),boundingBox:D.object({x:D.number(),y:D.number(),width:D.number(),height:D.number()}).optional()}),WO=D.object({selectors:D.string().array(),requirements:by.optional()}),lo=D.object({id:D.number().int(),dataMomenticId:D.number().int().optional(),selector:D.string().optional(),hybridSelector:D.object({textContent:D.string().nullish(),attributes:D.record(D.string(),D.string().optional()),tagName:D.string(),expandShadowRoot:D.boolean().optional(),classNames:D.string().array(),nthChild:D.number()}).array().optional(),generatedSelectors:D.string().array().optional(),requirements:by.optional(),additionalElements:WO.array().optional(),role:D.string().optional(),name:D.string().optional(),numChildren:D.number().optional(),content:D.string().optional(),pathFromRoot:D.string().optional(),serializedHtml:D.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:D.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:D.string().url().optional(),boundingBox:D.object({x:D.number().optional(),y:D.number().optional(),width:D.number(),height:D.number()}).describe("css pixel bounding box").optional(),frameCache:$O.optional(),inputDescription:D.string().optional().describe("the description that generated this cache"),targetSource:D.nativeEnum(so).optional(),targetUpdateTime:D.string().optional(),targetUpdateLoggerTags:D.record(D.string(),D.string()).optional(),cacheResolutionUpdateSource:D.string().optional(),cacheResolutionUpdateTime:D.string().optional(),cacheResolutionUpdateLoggerTags:D.record(D.string(),D.string()).optional(),memory:Sc.optional()}).openapi({ref:"ElementTargetCache"});function yc(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var qO=D.object({type:D.literal("description"),elementDescriptor:D.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),KO=D.object({x:D.number(),y:D.number()}),YO=D.object({type:D.literal("coordinates"),pixels:KO}).openapi({ref:"CoordinatesTarget"});function co(r){return r.type==="description"}function pn(r){return r.type==="coordinates"}var jt=D.discriminatedUnion("type",[qO,YO]).openapi({ref:"ElementTarget"});function dm(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Vt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.pixels.y}`}}function Ec(r){return Sc.safeParse(r).success}import{v4 as Me}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as aL}from"zod-openapi";import{z as ge}from"zod";import{extendZodWithOpenApi as XO}from"zod-openapi";import{z as ws}from"zod";import Ty from"zod";var Rs=Ty.object({updatedAt:Ty.coerce.date().optional()});var pm=ws.object({result:ws.boolean(),traceId:ws.string()}).array(),mm=ws.object({type:ws.literal("GCS_TRACES"),traces:pm}),hm=Rs.extend({memory:mm.optional()});XO(ge);var vy=ge.object({thoughts:ge.string(),result:ge.boolean(),relevantElements:ge.array(ge.number()).optional(),updatedMemory:pm.optional()}),Kr=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Kr||{});var JO=ge.object({type:ge.literal("ELEMENT_NAME"),negated:ge.boolean().optional(),operation:ge.nativeEnum(Kr),value:ge.string()}).openapi({ref:"ElementNameAssertion"}),QO=ge.object({type:ge.literal("ELEMENT_STYLE"),negated:ge.boolean().optional(),operation:ge.nativeEnum(Kr),property:ge.string(),value:ge.string()}).openapi({ref:"ElementStyleAssertion"}),ZO=ge.object({type:ge.literal("ELEMENT_CONTENT"),negated:ge.boolean().optional(),operation:ge.nativeEnum(Kr),value:ge.string()}).openapi({ref:"ElementContentAssertion"}),eL=ge.object({type:ge.literal("ELEMENT_ATTRIBUTE"),negated:ge.boolean().optional(),operation:ge.nativeEnum(Kr),attr:ge.string(),value:ge.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Hn=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Hn||{});var tL=ge.object({type:ge.literal("ELEMENT_EXISTENCE"),negated:ge.boolean().optional(),condition:ge.nativeEnum(Hn).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),bc=ge.discriminatedUnion("type",[ZO,eL,tL,JO,QO]).openapi({ref:"ManualElementAssertion"});var rL=ge.object({type:ge.literal("CONTENT"),negated:ge.boolean().optional(),value:ge.string()}).openapi({ref:"PageContentAssertion"}),Ay=ge.discriminatedUnion("type",[rL]).openapi({ref:"ManualPageAssertion"});import Zt from"zod";var gm=Zt.discriminatedUnion("type",[Zt.object({type:Zt.literal("SUBSTRING"),url:Zt.string()}),Zt.object({type:Zt.literal("GLOB"),glob:Zt.string()}),Zt.object({type:Zt.literal("REGEX"),regex:Zt.string()}),Zt.object({type:Zt.literal("DOMAIN"),domain:Zt.string()})]),Cs=Zt.object({urlMatcher:gm,method:Zt.string().optional()});import{z as de}from"zod";var nL=de.object({type:de.literal("json"),content:de.string().describe("The JSON content to send in the request body")}),oL=de.object({type:de.literal("form-urlencoded"),content:de.record(de.string(),de.string()).describe("The form fields to send in the request body")}),iL=de.discriminatedUnion("type",[nL,oL]),Qo=de.object({url:de.string(),method:de.union([de.literal("GET"),de.literal("POST"),de.literal("PUT"),de.literal("DELETE"),de.literal("PATCH")]),headers:de.record(de.string(),de.string()).optional(),params:de.record(de.string(),de.string()).optional(),body:iL.optional(),timeout:de.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ry=de.object({url:de.string(),headers:de.record(de.string(),de.string()).optional(),query:de.string(),variables:de.string().optional(),timeout:de.number().int().optional().describe("Max seconds to wait for the request to complete")}),Tc=de.object({code:de.string(),fragment:de.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:de.union([de.literal("NODE"),de.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:de.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ke=(K=>(K.AI_EXTRACT="AI_EXTRACT",K.AI_ASSERTION="AI_ASSERTION",K.AUTH_LOAD="AUTH_LOAD",K.AUTH_SAVE="AUTH_SAVE",K.BLUR="BLUR",K.CAPTCHA="CAPTCHA",K.CLICK="CLICK",K.COOKIE="COOKIE",K.COPY="COPY",K.DIALOG="DIALOG",K.DRAG="DRAG",K.ELEMENT_CHECK="ELEMENT_CHECK",K.FILE_UPLOAD="FILE_UPLOAD",K.FOCUS="FOCUS",K.GO_BACK="GO_BACK",K.GO_FORWARD="GO_FORWARD",K.HOVER="HOVER",K.JAVASCRIPT="JAVASCRIPT",K.LOCAL_STORAGE="LOCAL_STORAGE",K.MOUSE_DRAG="MOUSE_DRAG",K.NAVIGATE="NAVIGATE",K.NEW_TAB="NEW_TAB",K.PAGE_CHECK="PAGE_CHECK",K.PASTE="PASTE",K.PRESS="PRESS",K.KEY_DOWN="KEY_DOWN",K.KEY_UP="KEY_UP",K.REFRESH="REFRESH",K.REQUEST="REQUEST",K.GRAPHQL_REQUEST="GRAPHQL_REQUEST",K.SCROLL_DOWN="SCROLL_DOWN",K.SCROLL_UP="SCROLL_UP",K.SCROLL_LEFT="SCROLL_LEFT",K.SCROLL_RIGHT="SCROLL_RIGHT",K.SELECT_OPTION="SELECT_OPTION",K.SWITCH_TAB="TAB",K.TYPE="TYPE",K.VISUAL_DIFF="VISUAL_DIFF",K.WAIT="WAIT",K.WAIT_FOR_URL="WAIT_FOR_URL",K.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",K.AWAIT_LISTENER="AWAIT_LISTENER",K.RECORD_REQUESTS="RECORD_REQUESTS",K.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",K.SET_HEADER="SET_HEADER",K.MOCK_ROUTE="MOCK_ROUTE",K.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",K.OFFLINE_MODE="OFFLINE_MODE",K.SUCCESS="SUCCESS",K))(Ke||{});aL(R);var te=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),Cr=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"}),fr=Rs.extend({target:lo}).optional().openapi({ref:"SingleTargetCache"});function wy(r){return fr.safeParse(r).success}var Ac=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),Cy=te.merge(Ac).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Rc=Cr.merge(R.object({cache:fr})),ei=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),ti=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ki=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Yi=te.merge(Rc.merge(R.object({target:jt.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),F2=R.discriminatedUnion("type",[ei,ti,Ki,Yi]).openapi({ref:"AllScrollCommands"}),sL=te.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),xy=te.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),lL=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")}),_y=te.extend({type:R.literal("WAIT_FOR_URL"),matcher:gm}).merge(lL).openapi({ref:"WaitUrlCommand"}),Iy=te.merge(Ac).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),My=te.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Py=te.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),cL=te.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),uL=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"}),fm=te.merge(Cr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Oy=te.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),Ly=te.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),Ny=te.merge(Tc).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Xi=te.merge(Cr).extend({type:R.literal("CLICK"),target:jt,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:fr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),Sm=Rs.extend({fromTarget:lo.optional(),toTarget:lo.optional()}),Ji=te.merge(Cr).merge(R.object({type:R.literal("DRAG"),fromTarget:jt,toTarget:jt,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:Sm.optional()})).openapi({ref:"DragCommand"}),Qi=te.merge(Cr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:jt.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:fr})).openapi({ref:"MouseDragCommand"}),Zi=te.merge(Cr).merge(R.object({type:R.literal("HOVER"),target:jt,cache:fr})).openapi({ref:"HoverCommand"}),xs=te.merge(Cr).merge(R.object({type:R.literal("FOCUS"),target:jt,cache:fr})).openapi({ref:"FocusCommand"}),_s=te.merge(Cr).extend({type:R.literal("BLUR"),target:jt.optional(),cache:fr}).openapi({ref:"BlurCommand"}),dL=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),pL=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),mL=te.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[dL,pL]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),ym=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()})]),ea=te.merge(Cr).extend({type:R.literal("SELECT_OPTION"),target:jt,cache:fr,choice:ym.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Em=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),Is=te.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Em.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:hm.optional()})).openapi({ref:"AIAssertionCommand"}),mn=5,ta=600,ra=te.merge(Cr).extend({type:R.literal("ELEMENT_CHECK"),target:jt,assertion:bc,cache:fr.or(hm).optional(),timeout:R.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Dy=te.extend({type:R.literal("PAGE_CHECK"),assertion:Ay,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),ky=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"}),hL=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()}),Uy=25,na=te.merge(Cr).merge(hL).extend({type:R.literal("TYPE"),target:jt.optional(),value:R.string(),cache:fr}).openapi({ref:"TypeCommand"}),Fy=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"}),By=te.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),Hy=te.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),gL=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),fL=R.object({type:R.literal("REGEX"),pattern:R.string()}),SL=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),yL=R.discriminatedUnion("type",[gL,fL,SL]),EL=te.merge(Ac).merge(R.object({type:R.literal("TAB"),action:yL})).openapi({ref:"TabCommand"}),zy=te.merge(Ac).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),bL=te.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),Gy=te.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),jy=te.extend({type:R.literal("REQUEST")}).merge(Qo).openapi({ref:"RequestCommand"}),Vy=te.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(Ry).openapi({ref:"GraphQLRequestCommand"}),$y=te.merge(R.object({type:R.literal("SUCCESS"),condition:Is.optional()})).openapi({ref:"SuccessCommand"}),Wy=te.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),TL=R.object({data:R.string().describe("location at which to find a jpg"),width:R.number(),height:R.number()}),Ms=te.merge(Cr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:jt.optional(),screenshot:TL.optional(),cache:fr})).openapi({ref:"VisualDiffCommand"}),vL=te.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Cs,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),AL=te.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),RL=te.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:Cs,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wL=te.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),CL=te.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:Cs.optional()})).openapi({ref:"SetHeaderCommand"}),xL=te.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:Cs,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"})),_L=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"})),IL=te.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),ML=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],B2=[...ML,"DRAG"],PL=R.discriminatedUnion("type",[Xi,na,Fy,By,Hy,ea,Cy,ti,ei,Is,My,Zi,xy]),OL=R.discriminatedUnion("type",[...PL.options,Ji]),LL=R.discriminatedUnion("type",[...OL.options]),qy=R.discriminatedUnion("type",[...LL.options,$y]),bm=R.discriminatedUnion("type",[$y,Xi,na,Fy,By,Hy,ea,Cy,ti,ei,Is,My,Zi,xy,Ny,ra,Dy,zy,_y,ky,Oy,Py,Gy,Ji,Qi,Ly,Iy,jy,Vy]),NL=R.discriminatedUnion("type",[ky,uL,cL,fm,bL,Oy,sL,ra,mL,Py,Ny,Gy,Qi,zy,Dy,Ly,Iy,jy,Vy,Ki,Yi,EL,Ms,xs,_s,_y,vL,AL,RL,wL,CL,xL,_L,IL]),oa=R.discriminatedUnion("type",[...qy.options,...NL.options]).openapi({ref:"Command"}),wc=R.discriminatedUnion("type",[...qy.options,Wy]),H2=R.discriminatedUnion("type",[...bm.options,Wy]);function zn(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:Me(),type:r};break;case"AUTH_LOAD":{e={id:Me(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Me(),type:r,goal:""};break;case"DIALOG":e={id:Me(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Me(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Me(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Me(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Me(),type:r,delay:1};break;case"BLUR":e={id:Me(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Me(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Me(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Me(),type:r,value:""};break;case"SELECT_OPTION":e={id:Me(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Me(),type:r,url:""};case"TAB":e={id:Me(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Me(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Me(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Me(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Me(),type:r,code:""};break;case"AI_ASSERTION":e={id:Me(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Me(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Me(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Me(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Me(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Me(),type:r,key:""};break}case"SET_HEADER":{e={id:Me(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Me(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Me(),type:r};break}case"OFFLINE_MODE":{e={id:Me(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Ky(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as DL}from"zod";var $2=DL.discriminatedUnion("type",[_s,fm,Xi,Ji,xs,Zi,Qi,ei,ti,Ki,Yi,ea,na,Ms,ra]);function Yy(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as kL}from"zod";import{z as uo}from"zod";function Ps(r){return uo.object({key:uo.string(),testId:uo.string().optional(),moduleId:uo.string().optional(),organizationId:uo.string(),value:r})}function Os(r){return Ps(r).extend({uniqueKey:uo.string()})}function Cc(r){return uo.record(uo.string(),Os(r))}var er={type:!0,cache:!0},Gn=kL.discriminatedUnion("type",[Is.pick(er),_s.pick(er),Xi.pick(er),Ji.pick(er),ra.pick(er),xs.pick(er),Zi.pick(er),Qi.pick(er),ei.pick(er),ti.pick(er),Ki.pick(er),Yi.pick(er),ea.pick(er),na.pick(er),Ms.pick(er)]),xc=Object.values(Ke).filter(r=>Gn.options.some(e=>e.shape.type.safeParse(r).success));oa.options.forEach(r=>{if("target"in r.shape&&!xc.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function _c(r){return xc.includes(r.type)}var Xy=Ps(Gn),Jy=Os(Gn),Z2=Cc(Gn);import{v4 as ze}from"uuid";import{z as w}from"zod";var Zy=Symbol("Let zodToJsonSchema decide on which parser to use");var Qy={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"},eE=r=>typeof r=="string"?{...Qy,name:r}:{...Qy,...r};var tE=r=>{let e=eE(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,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 Tm(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function ve(r,e,t,n,o){r[e]=t,Tm(r,e,n,o)}var Ic=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as be}from"zod";function ot(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?Ic(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as UL}from"zod";function rE(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==UL.ZodAny&&(t.items=re(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&ve(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&ve(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(ve(t,"minItems",r.exactLength.value,r.exactLength.message,e),ve(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function nE(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?ve(t,"minimum",n.value,n.message,e):ve(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ve(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ve(t,"maximum",n.value,n.message,e):ve(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ve(t,"maximum",n.value,n.message,e));break;case"multipleOf":ve(t,"multipleOf",n.value,n.message,e);break}return t}function oE(){return{type:"boolean"}}function Mc(r,e){return re(r.type._def,e)}var iE=(r,e)=>re(r.innerType._def,e);function vm(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>vm(r,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 FL(r,e)}}var FL=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":ve(t,"minimum",n.value,n.message,e);break;case"max":ve(t,"maximum",n.value,n.message,e);break}return t};function aE(r,e){return{...re(r.innerType._def,e),default:r.defaultValue()}}function sE(r,e){return e.effectStrategy==="input"?re(r.schema._def,e):ot(e)}function lE(r){return{type:"string",enum:Array.from(r.values)}}var BL=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function cE(r,e){let t=[re(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),re(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(BL(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 uE(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as Ls}from"zod";var Am,Yr={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:()=>(Am===void 0&&(Am=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Am),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 Pc(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":ve(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":ve(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Xr(t,"email",n.message,e);break;case"format:idn-email":Xr(t,"idn-email",n.message,e);break;case"pattern:zod":tr(t,Yr.email,n.message,e);break}break;case"url":Xr(t,"uri",n.message,e);break;case"uuid":Xr(t,"uuid",n.message,e);break;case"regex":tr(t,n.regex,n.message,e);break;case"cuid":tr(t,Yr.cuid,n.message,e);break;case"cuid2":tr(t,Yr.cuid2,n.message,e);break;case"startsWith":tr(t,RegExp(`^${Rm(n.value,e)}`),n.message,e);break;case"endsWith":tr(t,RegExp(`${Rm(n.value,e)}$`),n.message,e);break;case"datetime":Xr(t,"date-time",n.message,e);break;case"date":Xr(t,"date",n.message,e);break;case"time":Xr(t,"time",n.message,e);break;case"duration":Xr(t,"duration",n.message,e);break;case"length":ve(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),ve(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{tr(t,RegExp(Rm(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Xr(t,"ipv4",n.message,e),n.version!=="v4"&&Xr(t,"ipv6",n.message,e);break}case"base64url":tr(t,Yr.base64url,n.message,e);break;case"jwt":tr(t,Yr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&tr(t,Yr.ipv4Cidr,n.message,e),n.version!=="v4"&&tr(t,Yr.ipv6Cidr,n.message,e);break}case"emoji":tr(t,Yr.emoji(),n.message,e);break;case"ulid":{tr(t,Yr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Xr(t,"binary",n.message,e);break}case"contentEncoding:base64":{ve(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{tr(t,Yr.base64,n.message,e);break}}break}case"nanoid":tr(t,Yr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Rm(r,e){return e.patternStrategy==="escape"?zL(r):r}var HL=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function zL(r){let e="";for(let t=0;t<r.length;t++)HL.has(r[t])||(e+="\\"),e+=r[t];return e}function Xr(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):ve(r,"format",e,t,n)}function tr(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:dE(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):ve(r,"pattern",dE(e,n),t,n)}function dE(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.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(t.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(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
5
5
  ]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
6
6
  ]))`;continue}}if(t.s&&n[c]==="."){o+=a?`${n[c]}\r
7
7
  `:`[${n[c]}\r
8
8
  ]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return o}function Oc(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===Ls.ZodEnum)return{type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((n,o)=>({...n,[o]:re(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??ot(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:re(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===Ls.ZodString&&r.keyType._def.checks?.length){let{type:n,...o}=Pc(r.keyType._def,e);return{...t,propertyNames:o}}else{if(r.keyType?._def.typeName===Ls.ZodEnum)return{...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===Ls.ZodBranded&&r.keyType._def.type._def.typeName===Ls.ZodString&&r.keyType._def.type._def.checks?.length){let{type:n,...o}=Mc(r.keyType._def,e);return{...t,propertyNames:o}}}return t}function pE(r,e){if(e.mapStrategy==="record")return Oc(r,e);let t=re(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||ot(e),n=re(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||ot(e);return{type:"array",maxItems:125,items:{type:"array",items:[t,n],minItems:2,maxItems:2}}}function mE(r){let e=r.values,n=Object.keys(r.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function hE(r){return r.target==="openAi"?void 0:{not:ot({...r,currentPath:[...r.currentPath,"not"]})}}function gE(r){return r.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var Ns={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function SE(r,e){if(e.target==="openApi3")return fE(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(n=>n._def.typeName in Ns&&(!n._def.checks||!n._def.checks.length))){let n=t.reduce((o,i)=>{let a=Ns[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(t.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=t.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===t.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:t.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(t.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return fE(r,e)}var fE=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((n,o)=>re(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return t.length?{anyOf:t}:void 0};function yE(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:Ns[r.innerType._def.typeName],nullable:!0}:{type:[Ns[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=re(r.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let t=re(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function EE(r,e){let t={type:"number"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"int":t.type="integer",Tm(t,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?ve(t,"minimum",n.value,n.message,e):ve(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ve(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ve(t,"maximum",n.value,n.message,e):ve(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ve(t,"maximum",n.value,n.message,e));break;case"multipleOf":ve(t,"multipleOf",n.value,n.message,e);break}return t}function bE(r,e){let t=e.target==="openAi",n={type:"object",properties:{}},o=[],i=r.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=jL(c);l&&t&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=re(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=GL(r,e);return a!==void 0&&(n.additionalProperties=a),n}function GL(r,e){if(r.catchall._def.typeName!=="ZodNever")return re(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function jL(r){try{return r.isOptional()}catch{return!0}}var TE=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return re(r.innerType._def,e);let t=re(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:ot(e)},t]}:ot(e)};var vE=(r,e)=>{if(e.pipeStrategy==="input")return re(r.in._def,e);if(e.pipeStrategy==="output")return re(r.out._def,e);let t=re(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=re(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,n].filter(o=>o!==void 0)}};function AE(r,e){return re(r.type._def,e)}function RE(r,e){let n={type:"array",uniqueItems:!0,items:re(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&ve(n,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&ve(n,"maxItems",r.maxSize.value,r.maxSize.message,e),n}function wE(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,n)=>re(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[]),additionalItems:re(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,n)=>re(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[])}}function CE(r){return{not:ot(r)}}function xE(r){return ot(r)}var _E=(r,e)=>re(r.innerType._def,e);var IE=(r,e,t)=>{switch(e){case be.ZodString:return Pc(r,t);case be.ZodNumber:return EE(r,t);case be.ZodObject:return bE(r,t);case be.ZodBigInt:return nE(r,t);case be.ZodBoolean:return oE();case be.ZodDate:return vm(r,t);case be.ZodUndefined:return CE(t);case be.ZodNull:return gE(t);case be.ZodArray:return rE(r,t);case be.ZodUnion:case be.ZodDiscriminatedUnion:return SE(r,t);case be.ZodIntersection:return cE(r,t);case be.ZodTuple:return wE(r,t);case be.ZodRecord:return Oc(r,t);case be.ZodLiteral:return uE(r,t);case be.ZodEnum:return lE(r);case be.ZodNativeEnum:return mE(r);case be.ZodNullable:return yE(r,t);case be.ZodOptional:return TE(r,t);case be.ZodMap:return pE(r,t);case be.ZodSet:return RE(r,t);case be.ZodLazy:return()=>r.getter()._def;case be.ZodPromise:return AE(r,t);case be.ZodNaN:case be.ZodNever:return hE(t);case be.ZodEffects:return sE(r,t);case be.ZodAny:return ot(t);case be.ZodUnknown:return xE(t);case be.ZodDefault:return aE(r,t);case be.ZodBranded:return Mc(r,t);case be.ZodReadonly:return _E(r,t);case be.ZodCatch:return iE(r,t);case be.ZodPipeline:return vE(r,t);case be.ZodFunction:case be.ZodVoid:case be.ZodSymbol:return;default:return(n=>{})(e)}};function re(r,e,t=!1){let n=e.seen.get(r);if(e.override){let s=e.override?.(r,e,n,t);if(s!==Zy)return s}if(n&&!t){let s=VL(n,e);if(s!==void 0)return s}let o={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,o);let i=IE(r,r.typeName,e),a=typeof i=="function"?re(i(),e):i;if(a&&$L(r,e,a),e.postProcess){let s=e.postProcess(a,r,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var VL=(r,e)=>{switch(e.$refStrategy){case"root":return{$ref:r.path.join("/")};case"relative":return{$ref:Ic(e.currentPath,r.path)};case"none":case"seen":return r.path.length<e.currentPath.length&&r.path.every((t,n)=>e.currentPath[n]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),ot(e)):e.$refStrategy==="seen"?ot(e):void 0}},$L=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);var Ds=(r,e)=>{let t=tE(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:re(u._def,{...t,currentPath:[...t.basePath,t.definitionPath,l]},!0)??ot(t)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=re(r._def,o===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,o]},!1)??ot(t),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),t.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[t.openAiAnyTypeName]||(n[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[t.definitionPath]:n}:i:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,o].join("/"),[t.definitionPath]:{...n,[o]:i}};return t.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as hn}from"zod";import{extendZodWithOpenApi as WL}from"zod-openapi";WL(hn);var Te=(p=>(p.AI_PROVIDER="AIProviderError",p.USER_INFRA="UserInfrastructureError",p.ACTION_FAILURE="ActionFailureError",p.ASSERTION_FAILURE="AssertionFailureError",p.CONFIG_ERROR="UserConfigurationError",p.SETUP_FAILURE="SetupFailureError",p.TEARDOWN_FAILURE="TeardownFailureError",p.WEB_AGENT_PLATFORM="InternalWebAgentError",p.UNKNOWN_PLATFORM="InternalPlatformError",p.JOB_TIMEOUT="JobTimeoutError",p.CONCURRENCY_ERROR="ConcurrencyError",p.UNKNOWN="UnknownError",p))(Te||{});var ME=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Lc={ActionFailureError:"Action failure",AssertionFailureError:"Assertion failure",SetupFailureError:"Setup failure",TeardownFailureError:"Teardown failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error",ConcurrencyError:"Concurrency error"},ia={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",AssertionFailureError:"An AI check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",SetupFailureError:"A setup step failed to execute, preventing the main test from running. This indicates an issue with test preparation, prerequisite steps, or initial state. This can only apply to failures that occur before teardown.",TeardownFailureError:"A teardown step failed to execute after the main test completed. This indicates an issue with cleanup or post-test operations or an uncaught error in the test. This can only apply to failures that occur after setup.",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",ConcurrencyError:"The AI test executed correctly, but the application state did not match expectations because another process modified the same resource concurrently. This failure is due to a concurrency error, such as a race condition or deadlock. Commonly caused by tests running simultaneously when using constants rather than random values, or underlying operations that allow for race conditions. For example, in Notion, if multiple tests are running at the same time where one creates a page and enters text to check if it renders, but another test deletes all pages before it can validate the render, this would be a concurrency error.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},wm=hn.object({reason:hn.nativeEnum(Te),previousStepsDescription:hn.array(hn.string()).optional(),summary:hn.string(),rootCause:hn.string().optional()}).openapi({ref:"TestResultClassification"}),Nc=hn.object({errorMessage:hn.string(),errorStack:hn.string().optional(),classification:wm.optional()}).openapi({ref:"TestFailureDetails"});var Ue=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var ks=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function PE(r){for(let e of Object.values(Te))if(r.includes(e))return e}var I=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(Te))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message}}},aa=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}};var xr=class extends Error{decisions;cacheMissReason;constructor(e,t,n,o={}){super(e,o),this.decisions=t,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
9
9
  Decisions:
10
10
  ${this.decisions.map(e=>e.toString()).join(`
11
- `)}`}};function OE(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function Cm(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var gn=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},Dc=class extends gn{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},kc=class extends gn{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function xm(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var _m="Element to be clicked has no bounding box";function LE(r){return r instanceof Error?r.message.startsWith(_m):!1}function Im(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function Mm(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var Us=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};var Pm={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};bm.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!Pm[e])throw new Error(`Command type ${e} is missing a description`)});var NE=w.object({type:w.literal("CLICK"),description:w.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:w.boolean().or(w.null()),rightClick:w.boolean().or(w.null())}),DE=w.object({type:w.literal("TYPE"),description:w.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:w.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:w.boolean().or(w.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:w.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),kE=w.object({type:w.literal("GO_BACK")}),qL=w.object({type:w.literal("GO_FORWARD")}),KL=w.object({type:w.literal("LOCAL_STORAGE"),key:w.string().describe("The localStorage key to set or get."),value:w.string().describe("The value to store in localStorage. If reading, this can be empty.")}),UE=w.object({type:w.literal("PRESS"),keys:w.array(w.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),FE=w.object({type:w.literal("SELECT_OPTION"),description:w.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:w.discriminatedUnion("type",[w.object({type:w.literal("VALUE"),value:w.string()}),w.object({type:w.literal("LABEL"),label:w.string()}),w.object({type:w.literal("INDEX"),index:w.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),BE=w.object({type:w.literal("NAVIGATE"),url:w.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),HE=w.object({type:w.literal("SCROLL"),y:w.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),zE=w.object({type:w.literal("WAIT"),timeout:w.number().describe("The number of seconds to wait.")}),GE=w.object({type:w.literal("AI_ASSERTION"),assertion:w.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:w.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),jE=w.object({type:w.literal("HOVER"),description:w.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),YL=w.object({type:w.literal("COPY"),value:w.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),XL=w.object({type:w.literal("PASTE")}),JL=w.object({type:w.literal("REFRESH")}),QL=w.object({type:w.literal("REQUEST"),url:w.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:w.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:w.record(w.string(),w.string()).or(w.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:w.record(w.string(),w.string()).or(w.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:w.string().or(w.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:w.number().int().or(w.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),ZL=w.object({type:w.literal("GRAPHQL_REQUEST"),url:w.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:w.record(w.string(),w.string()).or(w.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:w.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:w.string().or(w.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:w.number().int().or(w.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),VE=w.object({type:w.literal("DRAG"),fromDescription:w.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:w.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:w.number().int().positive().or(w.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:w.number().positive().or(w.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),eN=w.object({type:w.literal("MOUSE_DRAG"),description:w.string().or(w.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:w.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:w.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:w.number().int().positive().or(w.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),tN=w.object({type:w.literal("JAVASCRIPT"),code:w.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:w.union([w.literal("NODE"),w.literal("BROWSER")]).or(w.null()).describe("Execution environment. Default is NODE."),timeout:w.number().or(w.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),rN=w.object({type:w.literal("AI_EXTRACT"),goal:w.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:w.string().or(w.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:w.string().or(w.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:w.string().or(w.null()).describe("URL or URL regex for the iframe to extract data from.")}),nN=w.object({type:w.literal("ELEMENT_CHECK"),description:w.string().describe("Description of the element to check."),assertionType:w.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:w.string().or(w.null()).describe("The value to check against (required for CONTENT assertions)."),negated:w.boolean().or(w.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the assertion to be true.")}),oN=w.object({type:w.literal("PAGE_CHECK"),value:w.string().describe("The text content to check for on the page."),negated:w.boolean().or(w.null()).describe("If true, checks that the content is NOT present."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the assertion to be true.")}),iN=w.object({type:w.literal("NEW_TAB"),url:w.string().describe("The URL to open in the new tab.")}),aN=w.object({type:w.literal("WAIT_FOR_URL"),matcher:w.discriminatedUnion("type",[w.object({type:w.literal("SUBSTRING"),url:w.string()}),w.object({type:w.literal("GLOB"),glob:w.string()}),w.object({type:w.literal("REGEX"),regex:w.string()}),w.object({type:w.literal("DOMAIN"),domain:w.string()})]).describe("How to match the URL."),caseInsensitive:w.boolean().or(w.null()),negated:w.boolean().or(w.null()).describe("Wait for the URL to NOT match instead."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the URL.")}),Om=w.object({type:w.literal("SUCCESS")}),Lm=w.object({type:w.literal("FAILURE")}),$E=w.discriminatedUnion("type",[NE,DE,UE,FE,BE,HE,zE,GE,jE,kE]),sN=w.discriminatedUnion("type",[...$E.options,VE]),sa=w.discriminatedUnion("type",[NE,DE,UE,FE,BE,HE,zE,GE,jE,kE,VE,tN,nN,oN,iN,aN,rN,YL,qL,KL,eN,XL,JL,QL,ZL]),sX=Ds(sa),lN=w.discriminatedUnion("type",[...sa.options,Om,Lm]),lX=Ds(w.discriminatedUnion("type",[...$E.options,Om,Lm])),cX=Ds(w.discriminatedUnion("type",[...sN.options,Om,Lm])),uX=w.object({command:w.unknown(),thoughts:w.string()});var Fc=r=>{let e=lN.parse(r);switch(e.type){case"CLICK":return{id:ze(),type:"CLICK",doubleClick:e.doubleClick??void 0,rightClick:e.rightClick??void 0,target:{type:"description",elementDescriptor:e.description}};case"TYPE":return{id:ze(),type:"TYPE",value:e.text,target:{type:"description",elementDescriptor:e.description},pressEnter:e.pressEnter??void 0,clearContent:e.clearContent};case"PRESS":return{id:ze(),type:"PRESS",value:e.keys.join("+")};case"SELECT_OPTION":return{id:ze(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:`<select> element matching description: ${e.description}`},choice:ym.parse(e.option)};case"NAVIGATE":return{id:ze(),type:"NAVIGATE",url:e.url};case"SCROLL":return e.y>0?{id:ze(),type:"SCROLL_DOWN",deltaY:e.y}:{id:ze(),type:"SCROLL_UP",deltaY:-e.y};case"WAIT":return{id:ze(),type:"WAIT",delay:e.timeout};case"AI_ASSERTION":return{id:ze(),type:"AI_ASSERTION",assertion:e.assertion,timeout:e.timeout};case"HOVER":return{id:ze(),type:"HOVER",target:{type:"description",elementDescriptor:e.description}};case"DRAG":return{id:ze(),type:"DRAG",fromTarget:{type:"description",elementDescriptor:e.fromDescription},toTarget:{type:"description",elementDescriptor:e.toDescription},steps:e.steps??void 0,hoverSeconds:e.hoverSeconds??void 0};case"JAVASCRIPT":return{id:ze(),type:"JAVASCRIPT",code:e.code,environment:e.environment??void 0,timeout:e.timeout??void 0};case"AI_EXTRACT":return{id:ze(),type:"AI_EXTRACT",goal:e.goal,schema:e.schema??void 0,envKey:e.envKey??void 0,iframeUrl:e.iframeUrl??void 0};case"COPY":return{id:ze(),type:"COPY",value:e.value};case"PASTE":return{id:ze(),type:"PASTE"};case"REFRESH":return{id:ze(),type:"REFRESH"};case"GO_FORWARD":return{id:ze(),type:"GO_FORWARD"};case"LOCAL_STORAGE":return{id:ze(),type:"LOCAL_STORAGE",key:e.key,value:e.value};case"MOUSE_DRAG":return{id:ze(),type:"MOUSE_DRAG",target:e.description?{type:"description",elementDescriptor:e.description}:void 0,deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),steps:e.steps??void 0};case"ELEMENT_CHECK":{let t;switch(e.assertionType){case"EXISTS":t={type:"ELEMENT_EXISTENCE",condition:"EXISTS",negated:e.negated??void 0};break;case"VISIBLE":t={type:"ELEMENT_EXISTENCE",condition:"VISIBLE",negated:e.negated??void 0};break;case"CONTENT_CONTAINS":t={type:"ELEMENT_CONTENT",operation:"CONTAINS",value:e.value??"",negated:e.negated??void 0};break;case"CONTENT_EQUALS":t={type:"ELEMENT_CONTENT",operation:"EQUALS",value:e.value??"",negated:e.negated??void 0};break;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.assertionType)}return{id:ze(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:e.description},assertion:t,timeout:e.timeout??void 0}}case"PAGE_CHECK":return{id:ze(),type:"PAGE_CHECK",assertion:{type:"CONTENT",value:e.value??void 0,negated:e.negated??void 0},timeout:e.timeout??void 0};case"NEW_TAB":return{id:ze(),type:"NEW_TAB",url:e.url};case"WAIT_FOR_URL":return{id:ze(),type:"WAIT_FOR_URL",matcher:e.matcher,caseInsensitive:e.caseInsensitive??void 0,negated:e.negated??void 0,timeout:e.timeout??void 0};case"GO_BACK":return{id:ze(),type:"GO_BACK"};case"REQUEST":return{id:ze(),type:"REQUEST",url:e.url,method:e.method,headers:e.headers??void 0,params:e.params??void 0,body:e.body?{type:"json",content:e.body}:void 0,timeout:e.timeout??void 0};case"GRAPHQL_REQUEST":return{id:ze(),type:"GRAPHQL_REQUEST",url:e.url,headers:e.headers??void 0,query:e.query,variables:e.variables??void 0,timeout:e.timeout??void 0};case"SUCCESS":case"FAILURE":return{id:ze(),type:e.type};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}};import{z as Nm}from"zod";import{extendZodWithOpenApi as dN}from"zod-openapi";import{z as WE}from"zod";import{extendZodWithOpenApi as cN}from"zod-openapi";import{z as ri}from"zod";var _r=ri.object({index:ri.number().optional().describe("global index within a test (in-order traversal)"),id:ri.string(),skipped:ri.boolean().optional(),envKey:ri.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:ri.boolean().optional(),retries:ri.number().optional()});cN(WE);var uN=_r.extend({type:WE.literal("PRESET_ACTION")}),Sr=uN.extend({command:oa}).openapi({ref:"PresetAction"});dN(Nm);var ni=_r.extend({type:Nm.literal("AI_ACTION"),text:Nm.string(),steps:Sr.array().optional()}).openapi({ref:"AIAction"});import{z as rr}from"zod";import{z as Bc}from"zod";import{extendZodWithOpenApi as pN}from"zod-openapi";pN(Bc);var la=_r.extend({type:Bc.literal("AI_ACTION_DYNAMIC"),text:Bc.string(),retries:Bc.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as qE}from"zod";var Dm=_r.extend({type:qE.literal("CONDITIONAL"),skipped:qE.boolean().optional()});import{z as Ae}from"zod";var mN=Ae.object({cacheKey:Ae.string(),cacheExpiryMs:Ae.number()}),km=_r.extend({id:Ae.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ae.record(Ae.string()).optional(),cacheConfig:mN.optional()}),Jr=km.extend({type:Ae.literal("MODULE"),moduleId:Ae.string().uuid()}),hN=Ae.union([Jr.pick({type:!0,moduleId:!0}),Ae.record(Ae.unknown())]),gN=Ae.object({type:Ae.literal("URL_REGEX"),regex:Ae.string()}),fN=Ae.object({type:Ae.literal("PAGE_CHECK"),substring:Ae.string()}),Um=Ae.object({cacheInvalidation:Ae.discriminatedUnion("type",[fN,gN]).optional()}),cr=Ae.object({moduleId:Ae.string().uuid(),name:Ae.string(),description:Ae.string().nullish(),enabled:Ae.boolean().nullish(),parameters:Ae.string().array().nullish(),defaultParameters:Ae.record(Ae.string(),Ae.string()).nullish(),parameterEnums:Ae.record(Ae.string(),Ae.string().array()).nullish(),defaultCacheKey:Ae.string().nullish(),defaultCacheTtl:Ae.number().nullish(),defaultCacheAllInvocations:Ae.boolean().nullish(),autoAuth:Ae.boolean().nullish(),advanced:Um.nullish()});var Fm=r=>r.type==="AI_ACTION"||r.type==="AI_ACTION_DYNAMIC"||r.type==="PRESET_ACTION";import{z as Ir}from"zod";var Bm=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Bm||{});var SN=Ir.discriminatedUnion("type",[Ir.object({type:Ir.literal("NAVIGATE_URL"),url:Ir.string().url()}),Ir.object({type:Ir.literal("GO_TO_SECTION_START")})]),yN=Ir.object({trigger:Ir.nativeEnum(Bm).optional(),attempts:Ir.number().int().optional(),restartBehavior:SN}),Fs=_r.extend({type:Ir.literal("SECTION"),description:Ir.string().describe("user provided goal of what the section should accomplish"),plan:Ir.string().array().optional(),autohealingConfig:yN.optional()});var KE=cr.merge(km).extend({type:rr.literal("RESOLVED_MODULE"),steps:rr.lazy(()=>pt.array())}),Hm=cr.extend({steps:rr.lazy(()=>pt.array())}),zm=Fs.extend({steps:rr.lazy(()=>Ye.array())}),EN=Fs.extend({steps:rr.lazy(()=>pt.array())}),oi=Dm.extend({blocks:rr.object({assertion:rr.lazy(()=>Sr),steps:rr.lazy(()=>Ye.array())}).array(),elseSteps:rr.lazy(()=>Ye.array().optional())}),bN=Dm.extend({blocks:rr.object({assertion:rr.lazy(()=>Sr),steps:rr.lazy(()=>pt.array())}).array(),elseSteps:rr.lazy(()=>pt.array().optional())}),Ye=rr.discriminatedUnion("type",[Sr,ni,la,Jr,oi,zm]),pt=rr.discriminatedUnion("type",[Sr,ni,la,KE,bN,EN]);import{z as Mr}from"zod";var TN=Mr.object({steps:Ye.array(),beforeSteps:Ye.array().nullish(),afterSteps:Ye.array().nullish()}),po=Mr.object({steps:pt.array(),beforeSteps:pt.array().nullish(),afterSteps:pt.array().nullish()}),ii=Mr.object({steps:Mr.record(Mr.string(),Mr.unknown()).array(),beforeSteps:Mr.record(Mr.string(),Mr.unknown()).array().nullish(),afterSteps:Mr.record(Mr.string(),Mr.unknown()).array().nullish()});var Re="1.0.22",Gm="0.0.2";import{z as $t}from"zod";import{z as ai}from"zod";var vN=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,De=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ca=ai.string().min(1).max(255).superRefine((r,e)=>{try{mo(r)}catch(t){return e.addIssue({code:ai.ZodIssueCode.custom,message:t.message,fatal:!0}),ai.NEVER}});function mo(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(vN))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Hc=ai.preprocess(r=>r===null?"":r,ai.union([ai.string().url(),ai.literal("")])).optional();var jm=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],ho=$t.object({id:$t.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:ca.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:$t.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),AN=$t.object({selector:ho,inputs:$t.record($t.string()).or($t.null())}),Vm=$t.object({type:$t.literal("PRESET_ACTION"),action:sa,envKey:$t.string().or($t.null()).describe(`key in the environment to save the result of this step to. Only use this for ${jm.join(" or ")} steps.`)}),$m=$t.object({type:$t.literal("MODULE"),module:AN}),YE=$t.object({type:$t.literal("AI_ACTION_DYNAMIC"),text:$t.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});function XE(r,e){let t=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=r??{},a=new Set([...t,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=t.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call momentic_module_get to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var JE=L.object({phrase:L.string()}),Wm=L.object({thoughts:L.string().optional(),result:L.union([L.literal("NOT_FOUND"),L.string(),L.number(),L.array(L.unknown()),L.record(L.unknown(),L.unknown()),L.unknown()])}),iJ=L.object({text:L.string()}),RN=L.boolean().or(L.nativeEnum(ao)).transform(r=>!(!r||r==="irrelevant")),QE=L.object({attributes:L.array(L.string()).nullish(),text:RN.nullish(),position:L.nativeEnum(ao).nullish(),shape:L.nativeEnum(ao).nullish()}),wN=L.object({id:L.number().int(),requirements:QE}),CN=wN.array(),ZE=L.object({thoughts:L.string(),review:L.string().optional(),id:L.number().int(),updatedMemory:um.optional(),requirements:QE.nullish().transform(r=>{if(r!==null)return r}),additionalElements:CN.nullish().transform(r=>{if(r!==null)return r})});var zc=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(zc||{}),qm=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(qm||{});var eb=L.object({thoughts:L.string(),category:L.nativeEnum(zc)}),tb=L.object({thoughts:L.string(),category:L.nativeEnum(qm)}),xN=L.discriminatedUnion("op",[L.object({op:L.literal("replace"),path:L.string(),value:L.string()}),L.object({op:L.literal("add"),path:L.string(),value:L.string()}),L.object({op:L.literal("remove"),path:L.string()})]),aJ=L.object({thoughts:L.string(),patches:xN.array()}),_N=[L.literal("add"),L.literal("replace"),L.literal("remove")],IN=L.object({op:L.union(_N),path:L.string(),value:pt.optional()}),rb=L.object({patches:IN.array(),thoughts:L.string()}),Km=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Km||{}),nb=L.object({thoughts:L.string(),scenario:L.nativeEnum(Km),instructions:L.string().nullish()}),ob=L.object({reasoning:L.string(),scenario:L.string(),patch:L.null().optional()}),sJ=L.object({thoughts:L.string(),evaluation:L.number().min(0).max(10)}),lJ=L.object({observations:L.string(),reasoning:L.string(),command:wc});var Ym=L.object({summary:L.string(),reasoning:L.string(),evaluation:L.discriminatedUnion("type",[L.object({type:L.literal("DONE")}),L.object({type:L.literal("RIGHT_TRACK")}),L.object({type:L.literal("WRONG_TRACK"),feedback:L.string()}),L.object({type:L.literal("IMPOSSIBLE")})])}),MN=L.object({startId:L.number().int(),endId:L.number().int()}),ib=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(ib||{}),ab=L.object({categoryThoughts:L.string(),category:L.nativeEnum(ib),relevantSections:MN.array()}),jn=L.boolean().nullish().transform(r=>r??!1),sb=L.object({thoughts:L.string().optional(),isPageReady:jn,descriptionLabels:L.object({usesTextContent:jn,usesAppearance:jn,usesPosition:jn,usesRelativeElements:jn,usesSingleQuotes:jn,isAmbiguous:jn,targetDoesNotExist:jn,usesIcon:jn}).optional()});import{z as O}from"zod";import*as ue from"zod";var hJ=ue.object({thoughts:ue.string().optional().describe("only provided if a description was provided"),target:lo.optional().describe("only provided if a description was provided"),pageState:ue.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ue.object({label:ue.string(),value:ue.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ue.object({data:ue.string(),height:ue.number().int(),width:ue.number().int()}).optional().describe("only provided if returnScreenshot is true")}),lb=ue.union([ue.literal("ELEMENT_CHECK"),ue.literal("NEGATED_CHECK"),ue.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ue.literal("SELECT_OPTION"),ue.literal("TYPE")]);function si(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Bs=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Bs||{}),ua=ue.object({matched:ue.boolean(),reason:ue.string().optional().describe("Human understandable description"),logs:ue.string().array().optional().describe("Logs for debugging")}),PN=ua.extend({type:ue.literal("USER_SELECTOR")}),ON=ua.extend({type:ue.literal("CSS_SELECTOR"),selectors:ue.string().array()}),LN=ua.extend({type:ue.literal("HYBRID_SELECTOR")}),NN=ua.extend({type:ue.literal("HTML_DISTANCE"),distance:ue.number().optional(),closestElement:ue.string().optional(),savedElement:ue.string().optional()}),DN=ua.extend({type:ue.literal("TEMPLATE_MATCHING"),elementImageUrl:ue.string().url()}),kN=ua.extend({type:ue.literal("AUTO_FRAME"),logs:ue.string().array().optional()}),cb=ue.discriminatedUnion("type",[PN,ON,LN,NN,DN,kN]);import{z as js}from"zod";import{z as YN}from"zod";import*as J from"zod";import{extendZodWithOpenApi as zN}from"zod-openapi";import{cloneDeep as Hs}from"lodash-es";import gb from"truncate-json";import*as ui from"zod";import{extendZodWithOpenApi as FN}from"zod-openapi";import{z as Wt}from"zod";import{z as pe}from"zod";var Xm=pe.object({autoFollowNewTabs:pe.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:pe.union([pe.boolean(),pe.literal("inputs-only")]).optional(),ignoreHrefForCaching:pe.boolean().optional(),disableSecondaryCacheResolution:pe.boolean().optional(),hybridSelectorMode:pe.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:pe.union([pe.boolean(),pe.literal("always")]).optional(),visualActions:pe.boolean().optional(),autoExpandIframes:pe.boolean().optional(),disableHtmlSnapshots:pe.boolean().optional(),importantAttributes:pe.string().array().optional(),importantClasses:pe.string().array().optional(),importantStyles:pe.string().array().optional()});var ub=1e4,db=6e4,UN=pe.object({server:pe.string(),username:pe.string().optional(),password:pe.string().optional()}),li=Xm.extend({pageLoadTimeoutMs:pe.number().optional().refine(r=>r===void 0||r<=db&&r>=-1,{message:`Page load timeout must be between 0 and ${db/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:pe.number().optional().refine(r=>r===void 0||r<=ub&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${ub/1e3} seconds`}),localChromeExtensionPaths:pe.string().array().optional(),extraHeaders:pe.record(pe.string(),pe.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:pe.record(pe.string(),pe.record(pe.string(),pe.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:pe.string().optional(),disableGpu:pe.boolean().optional(),disableBrowserMonitoring:pe.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),bustCacheOnBoundingBoxChange:pe.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:pe.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:pe.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:UN.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:pe.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory.")});var yt="BASE_URL",Gc="CURRENT_URL",ci="ENV_NAME",da="TEST_NAME",bJ={[yt]:"https://www.google.com"},pb=Wt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),mb=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.string().describe("variable value"))}),hb=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.unknown().describe("variable value")),browser:li.optional()});var TJ=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.unknown().describe("variable value"))});FN(ui);var Jm=ui.object({env:ui.record(ui.unknown())}).openapi({ref:"TestContextSnapshot"}),BN="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",HN=[yt,ci,da],fb=[Gc,yt,ci,da],nr=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[yt]??"about:blank",o=e.env[Gc]??"about:blank",i=e.env[ci],a=e.env[da],s={};for(let[l,u]of Object.entries(e.env))fb.includes(l)||(t??{})[l]===void 0&&(s[l]=u);return new r({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Hs(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){HN.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[ci]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Hs(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>fb.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,BN]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=gb(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=gb(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Gc]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Hs(e.variablesFromEnvironment),this.setMomenticSystemVariable(yt,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ci,e.envName),e.testName&&this.setMomenticSystemVariable(da,e.testName)}getDynamicVariablesCopy(){return Hs(this.env)}getVariablesFromEnvironmentCopy(){return Hs(this.varsFromMomenticEnvironment)}};var Pe=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Pe||{}),jc=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(jc||{});zN(J);var Qm=J.object({beforeUrl:J.string().optional(),afterUrl:J.string().optional(),message:J.string().optional(),beforeSnapshot:J.string().optional(),afterSnapshot:J.string().optional(),startedAt:J.coerce.date(),finishedAt:J.coerce.date()}),GN=Qm.extend({viewport:J.object({height:J.number(),width:J.number()}).nullish(),status:J.nativeEnum(jc),message:J.string().optional(),elementInteracted:J.string().optional()}),di=Qm.extend({status:J.nativeEnum(Pe),message:J.string().optional(),data:J.unknown().optional(),beforeTestContext:Jm.optional(),afterTestContext:Jm.optional(),failureReason:J.nativeEnum(Te).optional(),details:J.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),Zm=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(Zm||{}),Vc=di.merge(Sr).extend({results:GN.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:J.lazy(()=>xt.array()).optional(),failureRecoveryStatus:J.object({type:J.nativeEnum(Zm),message:J.string()}).optional()}),jN=di.merge(ni).extend({results:J.lazy(()=>Vc.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),VN=di.merge(la).extend({results:J.lazy(()=>Vc.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),$N=di.merge(Jr).extend({moduleName:J.string().optional(),results:J.lazy(()=>xt.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),WN=di.merge(oi).extend({assertionResult:Vc.optional(),results:J.lazy(()=>xt.array()).describe("results for the block actually executed"),previousAttempts:J.lazy(()=>xt.array()).optional()}),qN=di.merge(Fs).extend({results:J.lazy(()=>xt.array()),healingAttempts:J.lazy(()=>xt.array().array()).optional(),previousAttempts:J.lazy(()=>xt.array()).optional()}),xt=J.discriminatedUnion("type",[jN,VN,Vc,$N,WN,qN]),$c=di.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),KN=Qm.extend({index:J.number().optional(),userFacingStepReference:J.string().optional(),description:J.string(),pageState:J.string().optional(),elementInteracted:J.string().optional(),startedAt:J.coerce.date().or(J.string()).optional().catch(void 0),finishedAt:J.coerce.date().or(J.string()).optional().catch(void 0)}),Wc=KN.extend({beforeScreenshot:J.string().optional(),afterScreenshot:J.string().optional()});var eh=YN.object({results:xt.array().describe("main results"),beforeResults:xt.array().optional(),afterResults:xt.array().optional()}),zs=eh.partial();import{z as B}from"zod";import{extendZodWithOpenApi as tD}from"zod-openapi";var pa=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(pa||{});import{isValidCron as XN}from"cron-validator";import{z as me}from"zod";import{z as th}from"zod";var Vn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(Vn||{});var qc=th.object({width:th.number().min(200).max(1e4),height:th.number().min(200).max(1e4)}),Sb={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},WJ=Object.keys(Sb);var qt=Sb["Desktop Large"],go="en-us",fo="America/Los_Angeles";var So={latitude:37.7749,longitude:-122.4194};var yb=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Eb=1e4,Kc=li.extend({browserType:me.nativeEnum(Vn).optional(),slowMoMs:me.number().optional().refine(r=>r===void 0||r<=Eb&&r>=-1,{message:`Slow motion must be between 0 and ${Eb} milliseconds`}),basicAuthorization:me.object({username:me.string().optional(),password:me.string().optional()}).optional(),geolocation:me.object({latitude:me.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:me.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:me.boolean().optional(),locale:me.string().optional(),timezone:me.enum(yb).optional(),colorScheme:me.enum(["light","dark"]).optional()}),bb=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],rh=me.object({useMemory:me.boolean().optional(),failureRecovery:me.boolean().optional().describe("undefined means inherit org settings")}),JN=rh.extend({disableAICaching:me.boolean().optional(),failureRecoveryInstructions:me.string().optional()}),QN=me.object({viewport:qc.optional()}),pi=QN.merge(JN).merge(Kc),ma=me.object({cron:me.string().refine(r=>XN(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:me.boolean().default(!1),env:me.string().optional(),timeZone:me.string().default("America/Los_Angeles"),jobKey:me.string().optional()}),ha=me.object({onSuccess:me.boolean().default(!1),failureMessage:me.string().optional(),onFailure:me.boolean().default(!0),successMessage:me.string().optional()}),ZN=me.object({name:me.string(),required:me.boolean().optional(),defaultValue:me.string().describe("this is not optional because we need a value when the editor is first loaded")}),Yc=ZN.array(),eD=me.object({name:me.string(),value:me.string()}),Tb=eD.array(),Xc=me.object({name:me.string(),default:me.boolean().optional(),fixtures:pb.array().optional()});tD(B);var Pr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},we=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(we||{}),Jc=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Jc||{});var Et=B.string().pipe(B.coerce.date()).or(B.date()),Gs=B.object({id:B.string(),runKey:B.string(),organizationId:B.string(),executionType:B.nativeEnum(pa).optional().default("WEB"),createdAt:Et,createdBy:B.string(),flake:B.boolean().nullish(),scheduledAt:Et.or(B.null()),startedAt:Et.or(B.null()),updatedAt:Et.nullish(),finishedAt:Et.or(B.null()),resolvedBaseUrl:B.string().nullish(),environmentName:B.string().nullish(),gitBranchName:B.string().nullish(),githubRepository:B.string().nullish(),gitlabProjectPath:B.string().nullish(),labels:B.array(B.string()).optional(),gitOriginUrl:B.string().nullish(),gitCommitSha:B.string().nullish(),gitCommitShaShort:B.string().nullish(),gitCommitAuthorName:B.string().nullish(),cliVersion:B.string().nullish(),section:B.nativeEnum(Jc).nullish(),status:B.nativeEnum(we),trigger:B.nativeEnum(Pr),attempts:B.number(),runAttempts:B.array(B.object({id:B.string(),status:B.nativeEnum(we),startedAt:Et.or(B.null()),finishedAt:Et.or(B.null())})).optional(),videos:B.array(B.string()).optional(),failureReason:B.nativeEnum(Te).nullish(),failureDetails:Nc.nullish(),failureRecoveryDetails:B.object({attempts:B.number()}).nullish(),pipelineId:B.string().nullish(),resolvedInputs:B.record(B.string(),B.string()).nullish(),quarantined:B.boolean().nullish().default(!1),quarantinedReason:B.string().nullish(),localTestId:B.string().nullish(),testId:B.string().nullish(),testName:B.string().nullish(),description:B.string().nullish(),test:B.object({name:B.string(),id:B.string()}).nullish().default(null),suiteId:B.string().nullish()}).openapi({ref:"RunMetadata"}),rD={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Qc=Gs.pick({...rD,test:!0}),vb=Gs.omit({failureReason:!0,failureDetails:!0,test:!0}),nh=Gs.extend({stepsSnapshot:B.array(B.record(B.unknown())).nullish(),resolvedInputs:B.record(B.string(),B.string()).nullish(),test:B.object({name:B.string(),id:B.string(),description:B.string().nullish(),baseUrl:B.string().nullish(),advanced:pi.nullish()}).nullish()}).merge(eh),Ab=r=>r.includes("PASSED")&&r.includes("FAILED");var nD=js.object({id:js.string().uuid(),startedAt:Et.or(js.null()),finishedAt:Et.or(js.null()),status:js.nativeEnum(we)}).merge(zs),h8=nD.array();var Zc=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Zc||{});import{z as bt}from"zod";var oD=bt.object({id:bt.string(),status:bt.nativeEnum(we),trigger:bt.nativeEnum(Pr),createdAt:Et,startedAt:Et.nullish(),finishedAt:Et.nullish(),gitCommitSha:bt.string().nullish(),gitCommitShaShort:bt.string().nullish(),gitCommitTimestamp:Et.nullish(),gitBranchName:bt.string().nullish(),gitOriginUrl:bt.string().nullish(),gitCommitMessage:bt.string().nullish(),gitCommitAuthorName:bt.string().nullish(),githubRepository:bt.string().nullish(),gitlabProjectPath:bt.string().nullish(),pipelineId:bt.string().nullish(),cliVersion:bt.string().nullish(),labels:bt.string().array().optional(),suite:bt.object({id:bt.string(),name:bt.string()}).nullish(),runs:bt.object({status:bt.nativeEnum(we)}).array()}).openapi({ref:"RunGroup"}),Rb=oD.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Qc.array()});import{z as It}from"zod";var iD=It.object({type:It.literal("TARGETING"),name:It.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:cb.array(),pageState:It.string().optional(),targetSource:It.nativeEnum(so).optional(),targetUpdateTime:It.string().optional()}),aD=It.object({type:It.literal("AI_LOCATION"),matched:It.boolean(),pageState:It.string().optional(),ragUsed:It.boolean().optional(),thoughts:It.string().optional()}),sD=It.object({type:It.literal("ASSERTION"),relevantElementsSerialized:It.string().array().optional(),pageState:It.string().optional(),ragUsed:It.boolean().optional()}),wb=It.discriminatedUnion("type",[iD,aD,sD]);function eu(){return{details:[]}}import{z as ht}from"zod";var lD=ht.object({id:ht.string(),name:ht.string()}),_8=lD.merge(ht.object({createdAt:Et,createdBy:ht.string(),schedule:ma,notification:ha,environment:ht.object({name:ht.string()}).nullish(),beforeTests:ht.object({id:ht.string()}).array().nullish(),afterTests:ht.object({id:ht.string()}).array().nullish()})),Cb=ht.object({id:ht.string().uuid(),orgId:ht.string(),createdAt:Et,startedAt:Et.or(ht.null()),finishedAt:Et.or(ht.null()),status:ht.nativeEnum(we),trigger:ht.nativeEnum(Pr),suite:ht.object({id:ht.string(),name:ht.string()}).nullish(),runs:Gs.array()}),I8=Cb.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),xb=Cb.extend({runs:Qc.array()});import{z as Or}from"zod";import{cloneDeep as O8}from"lodash-es";import{z as Oe}from"zod";var F8=Oe.object({thoughts:Oe.string(),subGoals:Oe.object({instruction:Oe.string()}).array()}),B8=Oe.object({thoughts:Oe.string(),newPlanMarkdown:Oe.string()}),H8=Oe.object({thoughts:Oe.string(),correct:Oe.boolean(),failedActionIndex:Oe.number().optional()}),cD=Oe.object({type:Oe.literal("PLANNING"),beforePlan:Oe.string(),goalDecision:Oe.string(),thoughts:Oe.string()}),uD=Oe.object({type:Oe.literal("RUNNING"),stepDisplayName:Oe.string(),status:Oe.nativeEnum(Pe),results:xt.array()}),dD=Oe.object({type:Oe.literal("REVISING"),beforePlan:Oe.string(),afterPlan:Oe.string(),errString:Oe.string(),diffs:Oe.string(),thoughts:Oe.string()}),pD=Oe.object({type:Oe.literal("SYSTEM"),message:Oe.string()}),mD=Oe.discriminatedUnion("type",[cD,uD,dD,pD]),_b=mD.array();var $8=Or.object({id:Or.string(),scheduledAt:Or.coerce.date().nullable(),startedAt:Or.coerce.date().nullable(),finishedAt:Or.coerce.date().nullable(),status:Or.nativeEnum(we),history:_b.nullable(),testPlan:Or.object({id:Or.string(),name:Or.string()}).nullable(),test:Or.object({id:Or.string(),name:Or.string()}).nullable()});import{z as or}from"zod";var oh=or.object({content:or.string(),ids:or.string().array(),tokenLength:or.number()}),hD=or.object({chunks:oh.array()}),l6=or.object({ids:or.string().array(),score:or.number(),tokenLength:or.number()}),c6=hD.extend({description:or.string().describe("Input to pass to RAG engine"),tokenLimit:or.number()}),Ib=or.object({ids:or.number().array()}),Mb=or.object({indices:or.number().array()});var Nt=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),S6=Nt.extend({chunks:oh.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),gD=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),Pb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:lb.optional().catch(void 0),memory:O.discriminatedUnion("type",[Sc,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Ob=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),Lb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),fD=O.literal("NEGATED_CHECK"),Nb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:Em.optional(),memory:O.discriminatedUnion("type",[mm,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:fD.optional()}),Db=O.object({command:oa}),kb=O.object({message:O.string()}),ih=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:gD.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),Ub=O.object({results:Wc.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Fb=O.object({results:Wc.array(),goal:O.string(),errorMessage:O.string()}),Bb=O.object({failedResults:Wc.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),y6=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),Hb=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),zb=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as Vs}from"zod";var T6=Vs.object({goal:Vs.string()}),Gb=Vs.object({keywords:Vs.array(Vs.string())});import{z as ah}from"zod";var tu=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(tu||{}),R6=ah.nativeEnum(tu),SD=ah.enum(["v1","v2","v3"]),w6=SD.or(ah.string().describe("for people with special configurations"));var ru={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as it}from"zod";var jb=it.object({attributesRequired:it.array(it.string()).optional(),textRequired:it.boolean().optional(),boundsRequired:it.boolean().optional()}),yD=it.object({id:it.number(),thoughts:it.string(),inWebview:it.boolean().optional(),requirements:jb.optional(),additionalElements:it.object({id:it.number(),requirements:jb}).array().optional()}),Vb=it.object({description:it.string(),screenXml:it.string(),screenshot:it.string()}),$b=it.object({assertion:it.string(),screenXml:it.string(),screenshot:it.string()}),ED=it.object({thoughts:it.string(),result:it.boolean(),relevantElements:it.array(it.number()).optional()});var Wb=r=>!(!r.org_id||!r.user_id||!r.platform);import{z as mi}from"zod";var qb=mi.object({id:mi.string().uuid(),skipped:mi.boolean().optional(),envKey:mi.string().optional().describe("key in the environment to save the result of this step to")}),sh=qb.merge(Qo).extend({type:mi.literal("REQUEST")}),lh=qb.merge(Tc).extend({type:mi.literal("JAVASCRIPT")}),ch=mi.discriminatedUnion("type",[lh,sh]);import{z as Lr}from"zod";var Kb=Lr.object({id:Lr.string(),name:ca,description:Lr.string().optional().nullish(),baseUrl:Hc.nullish(),schemaVersion:Lr.string(),advanced:Lr.unknown().optional(),retries:Lr.number(),envs:Lr.array(Xc).nullish(),parameters:Yc.nullish()}),bD=Lr.object({createdAt:Lr.coerce.date(),updatedAt:Lr.coerce.date(),schedule:ma.nullish(),notification:ha.nullish(),createdBy:Lr.string(),organizationId:Lr.string()}),TD=Kb.merge(bD),Y6=TD.extend({steps:ch.array()}),X6=Kb.extend({steps:ch.array()});import{z as ur}from"zod";var Yb=ur.object({startedAt:ur.coerce.date(),finishedAt:ur.coerce.date(),status:ur.nativeEnum(Pe),message:ur.string().optional(),data:ur.unknown().optional()}),vD=Yb.merge(lh).extend({type:ur.literal("JAVASCRIPT")}),AD=Yb.merge(sh).extend({type:ur.literal("REQUEST")}),RD=ur.discriminatedUnion("type",[vD,AD]),Xb=ur.object({startedAt:ur.coerce.date(),finishedAt:ur.coerce.date().nullish(),status:ur.nativeEnum(we),results:RD.array(),failureReason:ur.string().nullish(),failureDetails:Nc.nullish()});import{z as dr}from"zod";var wD=dr.object({id:dr.string(),organizationId:dr.string(),createdAt:dr.coerce.date(),updatedAt:dr.coerce.date(),createdBy:dr.string(),scheduledAt:dr.coerce.date().nullish(),startedAt:dr.coerce.date().nullish(),finishedAt:dr.coerce.date().nullish(),status:dr.nativeEnum(we),trigger:dr.nativeEnum(Pr),results:Xb.array().nullish(),apiTestName:dr.string().nullish(),apiTestPath:dr.string().nullish(),apiTestId:dr.string().nullish()}),a9=wD.pick({status:!0,startedAt:!0,finishedAt:!0});var $s=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))($s||{}),Jb=3;function CD(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function uh(r){if(!CD(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function dh(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return Jb;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var ga=class{trackStepExecution(){}async flush(){}};import{parseString as xD,splitCookiesString as _D}from"set-cookie-parser";import{z as ke}from"zod";var ph=ke.object({name:ke.string(),value:ke.string(),url:ke.string().optional(),domain:ke.string().optional(),path:ke.string().optional(),expires:ke.number().default(Date.now()/1e3+60*60*24*365),httpOnly:ke.boolean().optional(),secure:ke.boolean().default(!0),sameSite:ke.union([ke.literal("Strict"),ke.literal("Lax"),ke.literal("None")]).default("None")});function nu(r,e){let t=[],n=_D(r);for(let o of n){let i=xD(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=ph.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:p})}}return t}var ID=ke.object({origin:ke.string(),localStorage:ke.array(ke.object({name:ke.string(),value:ke.string()}))}),MD=ke.object({entries:ke.record(ke.string(),ke.array(ke.tuple([ke.unknown(),ke.unknown()]))),version:ke.number().optional()}),ou=ke.object({cookies:ph.array().optional(),origins:ID.array().optional(),idb:ke.record(ke.string(),MD).optional().describe("key is db name")});function Qb(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=ph.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}import{v4 as B9}from"uuid";import Se from"zod";import{v4 as I9}from"uuid";import{z}from"zod";import*as V from"zod";var Zb=V.discriminatedUnion("type",[V.object({type:V.literal("SCREEN")}),V.object({type:V.literal("OPEN_APP")}),V.object({type:V.literal("OPEN_WEBVIEW")})]),Ws=V.object({type:V.literal("description"),description:V.string()}),eT=V.object({type:V.literal("CUSTOM_COORDINATES"),startX:V.number().describe("Starting X coordinate in pixels"),startY:V.number().describe("Starting Y coordinate in pixels"),deltaPixels:V.number().describe("Number of pixels to scroll in the specified direction")}),mh=V.discriminatedUnion("type",[...Zb.options,V.object({type:V.literal("CUSTOM"),target:Ws}),eT]);var PD=V.object({type:V.literal("coordinates"),xPercent:V.number(),yPercent:V.number()}),iu=V.discriminatedUnion("type",[Ws,PD]),tT=V.object({requiredText:V.string().optional(),requiredAttributes:V.record(V.string(),V.string()).optional(),requiredBounds:V.boolean().optional()}),OD=V.object({xPath:V.string(),requirements:tT.optional()}),LD=V.object({type:V.literal("CUSTOM"),target:Ws,cache:V.lazy(()=>rT).optional()}),ND=V.object({pixelDelta:V.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:V.union([Zb,LD,eT]),direction:V.enum(["up","down"])}),rT=V.object({type:V.literal("NATIVE"),bounds:V.number().array(),resolvedDescription:V.string(),xPath:V.string(),elementOnlySerializedXml:V.string(),scrollDetails:ND.optional(),requirements:tT.optional(),requiredRelatedElements:OD.array().optional(),memory:V.never().optional()}),DD=V.object({type:V.literal("WEBVIEW"),resolvedDescription:V.string(),xPath:V.string(),browserCache:lo.optional(),memory:V.never().optional()}),nT=V.union([rT,DD]);var yo=(b=>(b.AI_CHECK="AI_CHECK",b.TAP="TAP",b.TYPE="TYPE",b.PRESS="PRESS",b.PRESS_KEYBOARD="PRESS_KEYBOARD",b.OPEN_APP="OPEN_APP",b.KILL_APP="KILL_APP",b.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",b.SWIPE="SWIPE",b.SCROLL_TO="SCROLL_TO",b.SCREEN_CHECK="SCREEN_CHECK",b.ELEMENT_CHECK="ELEMENT_CHECK",b.JAVASCRIPT="JAVASCRIPT",b.REQUEST="REQUEST",b.WAIT="WAIT",b.ADD_FILE="ADD_FILE",b.INSTALL_APP="INSTALL_APP",b.UNINSTALL_APP="UNINSTALL_APP",b.ADB="ADB",b.STATE="STATE",b))(yo||{}),au=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(au||{}),oT=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(oT||{}),UD=z.object({updatedAt:z.coerce.date().optional()}),Tt=z.object({id:z.string().uuid(),disableCache:z.boolean().optional()}),FD=Tt.extend({type:z.literal("STATE")}),BD=Tt.extend({type:z.literal("KILL_APP")}),qs=UD.extend({target:nT}),HD=Tt.extend({type:z.literal("AI_CHECK"),assertion:z.string(),timeoutSecs:z.number().optional()}),hh=Tt.extend({type:z.literal("TAP"),target:iu,cache:qs.optional(),longPress:z.boolean().optional(),longPressDurationMs:z.number().optional(),doubleTap:z.boolean().optional(),doubleTapDelayMs:z.number().optional(),relativePosition:z.object({x:z.number(),y:z.number()}).optional()}),gh=Tt.extend({type:z.literal("TYPE"),target:iu.optional(),cache:qs.optional(),keyPressDelayMs:z.number().optional(),text:z.string(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional()});var zD=Tt.extend({type:z.literal("PRESS"),key:z.nativeEnum(au),longPress:z.boolean().optional()}),GD=Tt.extend({type:z.literal("PRESS_KEYBOARD"),key:z.nativeEnum(oT)}),jD=Tt.extend({type:z.literal("OPEN_APP"),packageName:z.string(),activityName:z.string().optional(),intentExtras:z.string().optional()}),VD=Tt.extend({type:z.literal("OPEN_NOTIFICATION_DRAWER")}),fh=Tt.extend({type:z.literal("SWIPE"),direction:z.enum(["up","down","left","right"]),scrollableElement:mh,cache:qs.optional(),viewportPercent:z.number().optional(),durationMs:z.number().optional()}),Sh=Tt.extend({type:z.literal("SCROLL_TO"),target:Ws,direction:z.enum(["down","up"]),scrollableElement:mh,scrollStepPercent:z.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:qs.optional()});var $D=z.object({type:z.literal("CONTENT"),negated:z.boolean().optional(),value:z.string()}),WD=Tt.extend({type:z.literal("SCREEN_CHECK"),assertion:$D,timeout:z.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}),yh=Tt.extend({type:z.literal("ELEMENT_CHECK"),target:iu,cache:qs.optional(),assertion:bc,timeout:z.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}),qD=Tt.extend({type:z.literal("JAVASCRIPT"),code:z.string(),timeout:z.number().int().max(60).optional().describe("Max seconds for the code to complete")}),KD=Tt.extend({type:z.literal("REQUEST")}).merge(Qo),YD=Tt.extend({type:z.literal("WAIT"),timeoutSecs:z.number()}),XD=Tt.extend({type:z.literal("ADB"),command:z.string(),jsonArgs:z.string().optional()}),JD=Tt.extend({type:z.literal("ADD_FILE"),file:z.string(),storageLocation:z.string()}),QD=z.string().trim(),ZD=Tt.extend({type:z.literal("INSTALL_APP"),uri:QD}),ek=Tt.extend({type:z.literal("UNINSTALL_APP"),packageName:z.string()}),iT=z.discriminatedUnion("type",[HD,hh,gh,zD,jD,VD,GD,fh,Sh,WD,yh,qD,KD,YD,JD,ZD,ek,BD,XD,FD]);var tk=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],aT=Se.object({type:Se.enum(tk).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:Se.string().or(Se.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),rk=Se.object({type:Se.literal("TAP"),description:Se.string().describe("Description of the element to tap."),longPress:Se.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:Se.boolean().describe("Whether to tap twice in quick succession."),relativePosition:Se.null().or(Se.object({x:Se.number(),y:Se.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
11
+ `)}`}};function OE(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function Cm(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var gn=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},Dc=class extends gn{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},kc=class extends gn{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function xm(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var _m="Element to be clicked has no bounding box";function LE(r){return r instanceof Error?r.message.startsWith(_m):!1}function Im(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function Mm(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var Us=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};var Pm={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};bm.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!Pm[e])throw new Error(`Command type ${e} is missing a description`)});var NE=w.object({type:w.literal("CLICK"),description:w.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:w.boolean().or(w.null()),rightClick:w.boolean().or(w.null())}),DE=w.object({type:w.literal("TYPE"),description:w.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:w.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:w.boolean().or(w.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:w.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),kE=w.object({type:w.literal("GO_BACK")}),qL=w.object({type:w.literal("GO_FORWARD")}),KL=w.object({type:w.literal("LOCAL_STORAGE"),key:w.string().describe("The localStorage key to set or get."),value:w.string().describe("The value to store in localStorage. If reading, this can be empty.")}),UE=w.object({type:w.literal("PRESS"),keys:w.array(w.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),FE=w.object({type:w.literal("SELECT_OPTION"),description:w.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:w.discriminatedUnion("type",[w.object({type:w.literal("VALUE"),value:w.string()}),w.object({type:w.literal("LABEL"),label:w.string()}),w.object({type:w.literal("INDEX"),index:w.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),BE=w.object({type:w.literal("NAVIGATE"),url:w.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),HE=w.object({type:w.literal("SCROLL"),y:w.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),zE=w.object({type:w.literal("WAIT"),timeout:w.number().describe("The number of seconds to wait.")}),GE=w.object({type:w.literal("AI_ASSERTION"),assertion:w.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:w.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),jE=w.object({type:w.literal("HOVER"),description:w.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),YL=w.object({type:w.literal("COPY"),value:w.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),XL=w.object({type:w.literal("PASTE")}),JL=w.object({type:w.literal("REFRESH")}),QL=w.object({type:w.literal("REQUEST"),url:w.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:w.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:w.record(w.string(),w.string()).or(w.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:w.record(w.string(),w.string()).or(w.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:w.string().or(w.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:w.number().int().or(w.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),ZL=w.object({type:w.literal("GRAPHQL_REQUEST"),url:w.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:w.record(w.string(),w.string()).or(w.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:w.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:w.string().or(w.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:w.number().int().or(w.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),VE=w.object({type:w.literal("DRAG"),fromDescription:w.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:w.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:w.number().int().positive().or(w.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:w.number().positive().or(w.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),eN=w.object({type:w.literal("MOUSE_DRAG"),description:w.string().or(w.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:w.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:w.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:w.number().int().positive().or(w.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),tN=w.object({type:w.literal("JAVASCRIPT"),code:w.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:w.union([w.literal("NODE"),w.literal("BROWSER")]).or(w.null()).describe("Execution environment. Default is NODE."),timeout:w.number().or(w.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),rN=w.object({type:w.literal("AI_EXTRACT"),goal:w.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:w.string().or(w.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:w.string().or(w.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:w.string().or(w.null()).describe("URL or URL regex for the iframe to extract data from.")}),nN=w.object({type:w.literal("ELEMENT_CHECK"),description:w.string().describe("Description of the element to check."),assertionType:w.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:w.string().or(w.null()).describe("The value to check against (required for CONTENT assertions)."),negated:w.boolean().or(w.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the assertion to be true.")}),oN=w.object({type:w.literal("PAGE_CHECK"),value:w.string().describe("The text content to check for on the page."),negated:w.boolean().or(w.null()).describe("If true, checks that the content is NOT present."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the assertion to be true.")}),iN=w.object({type:w.literal("NEW_TAB"),url:w.string().describe("The URL to open in the new tab.")}),aN=w.object({type:w.literal("WAIT_FOR_URL"),matcher:w.discriminatedUnion("type",[w.object({type:w.literal("SUBSTRING"),url:w.string()}),w.object({type:w.literal("GLOB"),glob:w.string()}),w.object({type:w.literal("REGEX"),regex:w.string()}),w.object({type:w.literal("DOMAIN"),domain:w.string()})]).describe("How to match the URL."),caseInsensitive:w.boolean().or(w.null()),negated:w.boolean().or(w.null()).describe("Wait for the URL to NOT match instead."),timeout:w.number().or(w.null()).describe("Max seconds to wait for the URL.")}),Om=w.object({type:w.literal("SUCCESS")}),Lm=w.object({type:w.literal("FAILURE")}),$E=w.discriminatedUnion("type",[NE,DE,UE,FE,BE,HE,zE,GE,jE,kE]),sN=w.discriminatedUnion("type",[...$E.options,VE]),sa=w.discriminatedUnion("type",[NE,DE,UE,FE,BE,HE,zE,GE,jE,kE,VE,tN,nN,oN,iN,aN,rN,YL,qL,KL,eN,XL,JL,QL,ZL]),sX=Ds(sa),lN=w.discriminatedUnion("type",[...sa.options,Om,Lm]),lX=Ds(w.discriminatedUnion("type",[...$E.options,Om,Lm])),cX=Ds(w.discriminatedUnion("type",[...sN.options,Om,Lm])),uX=w.object({command:w.unknown(),thoughts:w.string()});var Fc=r=>{let e=lN.parse(r);switch(e.type){case"CLICK":return{id:ze(),type:"CLICK",doubleClick:e.doubleClick??void 0,rightClick:e.rightClick??void 0,target:{type:"description",elementDescriptor:e.description}};case"TYPE":return{id:ze(),type:"TYPE",value:e.text,target:{type:"description",elementDescriptor:e.description},pressEnter:e.pressEnter??void 0,clearContent:e.clearContent};case"PRESS":return{id:ze(),type:"PRESS",value:e.keys.join("+")};case"SELECT_OPTION":return{id:ze(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:`<select> element matching description: ${e.description}`},choice:ym.parse(e.option)};case"NAVIGATE":return{id:ze(),type:"NAVIGATE",url:e.url};case"SCROLL":return e.y>0?{id:ze(),type:"SCROLL_DOWN",deltaY:e.y}:{id:ze(),type:"SCROLL_UP",deltaY:-e.y};case"WAIT":return{id:ze(),type:"WAIT",delay:e.timeout};case"AI_ASSERTION":return{id:ze(),type:"AI_ASSERTION",assertion:e.assertion,timeout:e.timeout};case"HOVER":return{id:ze(),type:"HOVER",target:{type:"description",elementDescriptor:e.description}};case"DRAG":return{id:ze(),type:"DRAG",fromTarget:{type:"description",elementDescriptor:e.fromDescription},toTarget:{type:"description",elementDescriptor:e.toDescription},steps:e.steps??void 0,hoverSeconds:e.hoverSeconds??void 0};case"JAVASCRIPT":return{id:ze(),type:"JAVASCRIPT",code:e.code,environment:e.environment??void 0,timeout:e.timeout??void 0};case"AI_EXTRACT":return{id:ze(),type:"AI_EXTRACT",goal:e.goal,schema:e.schema??void 0,envKey:e.envKey??void 0,iframeUrl:e.iframeUrl??void 0};case"COPY":return{id:ze(),type:"COPY",value:e.value};case"PASTE":return{id:ze(),type:"PASTE"};case"REFRESH":return{id:ze(),type:"REFRESH"};case"GO_FORWARD":return{id:ze(),type:"GO_FORWARD"};case"LOCAL_STORAGE":return{id:ze(),type:"LOCAL_STORAGE",key:e.key,value:e.value};case"MOUSE_DRAG":return{id:ze(),type:"MOUSE_DRAG",target:e.description?{type:"description",elementDescriptor:e.description}:void 0,deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),steps:e.steps??void 0};case"ELEMENT_CHECK":{let t;switch(e.assertionType){case"EXISTS":t={type:"ELEMENT_EXISTENCE",condition:"EXISTS",negated:e.negated??void 0};break;case"VISIBLE":t={type:"ELEMENT_EXISTENCE",condition:"VISIBLE",negated:e.negated??void 0};break;case"CONTENT_CONTAINS":t={type:"ELEMENT_CONTENT",operation:"CONTAINS",value:e.value??"",negated:e.negated??void 0};break;case"CONTENT_EQUALS":t={type:"ELEMENT_CONTENT",operation:"EQUALS",value:e.value??"",negated:e.negated??void 0};break;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.assertionType)}return{id:ze(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:e.description},assertion:t,timeout:e.timeout??void 0}}case"PAGE_CHECK":return{id:ze(),type:"PAGE_CHECK",assertion:{type:"CONTENT",value:e.value??void 0,negated:e.negated??void 0},timeout:e.timeout??void 0};case"NEW_TAB":return{id:ze(),type:"NEW_TAB",url:e.url};case"WAIT_FOR_URL":return{id:ze(),type:"WAIT_FOR_URL",matcher:e.matcher,caseInsensitive:e.caseInsensitive??void 0,negated:e.negated??void 0,timeout:e.timeout??void 0};case"GO_BACK":return{id:ze(),type:"GO_BACK"};case"REQUEST":return{id:ze(),type:"REQUEST",url:e.url,method:e.method,headers:e.headers??void 0,params:e.params??void 0,body:e.body?{type:"json",content:e.body}:void 0,timeout:e.timeout??void 0};case"GRAPHQL_REQUEST":return{id:ze(),type:"GRAPHQL_REQUEST",url:e.url,headers:e.headers??void 0,query:e.query,variables:e.variables??void 0,timeout:e.timeout??void 0};case"SUCCESS":case"FAILURE":return{id:ze(),type:e.type};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}};import{z as Nm}from"zod";import{extendZodWithOpenApi as dN}from"zod-openapi";import{z as WE}from"zod";import{extendZodWithOpenApi as cN}from"zod-openapi";import{z as ri}from"zod";var _r=ri.object({index:ri.number().optional().describe("global index within a test (in-order traversal)"),id:ri.string(),skipped:ri.boolean().optional(),envKey:ri.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:ri.boolean().optional(),retries:ri.number().optional()});cN(WE);var uN=_r.extend({type:WE.literal("PRESET_ACTION")}),Sr=uN.extend({command:oa}).openapi({ref:"PresetAction"});dN(Nm);var ni=_r.extend({type:Nm.literal("AI_ACTION"),text:Nm.string(),steps:Sr.array().optional()}).openapi({ref:"AIAction"});import{z as rr}from"zod";import{z as Bc}from"zod";import{extendZodWithOpenApi as pN}from"zod-openapi";pN(Bc);var la=_r.extend({type:Bc.literal("AI_ACTION_DYNAMIC"),text:Bc.string(),retries:Bc.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as qE}from"zod";var Dm=_r.extend({type:qE.literal("CONDITIONAL"),skipped:qE.boolean().optional()});import{z as Ae}from"zod";var mN=Ae.object({cacheKey:Ae.string(),cacheExpiryMs:Ae.number()}),km=_r.extend({id:Ae.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ae.record(Ae.string()).optional(),cacheConfig:mN.optional()}),Jr=km.extend({type:Ae.literal("MODULE"),moduleId:Ae.string().uuid()}),hN=Ae.union([Jr.pick({type:!0,moduleId:!0}),Ae.record(Ae.unknown())]),gN=Ae.object({type:Ae.literal("URL_REGEX"),regex:Ae.string()}),fN=Ae.object({type:Ae.literal("PAGE_CHECK"),substring:Ae.string()}),Um=Ae.object({cacheInvalidation:Ae.discriminatedUnion("type",[fN,gN]).optional()}),cr=Ae.object({moduleId:Ae.string().uuid(),name:Ae.string(),description:Ae.string().nullish(),enabled:Ae.boolean().nullish(),parameters:Ae.string().array().nullish(),defaultParameters:Ae.record(Ae.string(),Ae.string()).nullish(),parameterEnums:Ae.record(Ae.string(),Ae.string().array()).nullish(),defaultCacheKey:Ae.string().nullish(),defaultCacheTtl:Ae.number().nullish(),defaultCacheAllInvocations:Ae.boolean().nullish(),autoAuth:Ae.boolean().nullish(),advanced:Um.nullish()});var Fm=r=>r.type==="AI_ACTION"||r.type==="AI_ACTION_DYNAMIC"||r.type==="PRESET_ACTION";import{z as Ir}from"zod";var Bm=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Bm||{});var SN=Ir.discriminatedUnion("type",[Ir.object({type:Ir.literal("NAVIGATE_URL"),url:Ir.string().url()}),Ir.object({type:Ir.literal("GO_TO_SECTION_START")})]),yN=Ir.object({trigger:Ir.nativeEnum(Bm).optional(),attempts:Ir.number().int().optional(),restartBehavior:SN}),Fs=_r.extend({type:Ir.literal("SECTION"),description:Ir.string().describe("user provided goal of what the section should accomplish"),plan:Ir.string().array().optional(),autohealingConfig:yN.optional()});var KE=cr.merge(km).extend({type:rr.literal("RESOLVED_MODULE"),steps:rr.lazy(()=>pt.array())}),Hm=cr.extend({steps:rr.lazy(()=>pt.array())}),zm=Fs.extend({steps:rr.lazy(()=>Ye.array())}),EN=Fs.extend({steps:rr.lazy(()=>pt.array())}),oi=Dm.extend({blocks:rr.object({assertion:rr.lazy(()=>Sr),steps:rr.lazy(()=>Ye.array())}).array(),elseSteps:rr.lazy(()=>Ye.array().optional())}),bN=Dm.extend({blocks:rr.object({assertion:rr.lazy(()=>Sr),steps:rr.lazy(()=>pt.array())}).array(),elseSteps:rr.lazy(()=>pt.array().optional())}),Ye=rr.discriminatedUnion("type",[Sr,ni,la,Jr,oi,zm]),pt=rr.discriminatedUnion("type",[Sr,ni,la,KE,bN,EN]);import{z as Mr}from"zod";var TN=Mr.object({steps:Ye.array(),beforeSteps:Ye.array().nullish(),afterSteps:Ye.array().nullish()}),po=Mr.object({steps:pt.array(),beforeSteps:pt.array().nullish(),afterSteps:pt.array().nullish()}),ii=Mr.object({steps:Mr.record(Mr.string(),Mr.unknown()).array(),beforeSteps:Mr.record(Mr.string(),Mr.unknown()).array().nullish(),afterSteps:Mr.record(Mr.string(),Mr.unknown()).array().nullish()});var Re="1.0.22",Gm="0.0.2";import{z as $t}from"zod";import{z as ai}from"zod";var vN=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,De=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ca=ai.string().min(1).max(255).superRefine((r,e)=>{try{mo(r)}catch(t){return e.addIssue({code:ai.ZodIssueCode.custom,message:t.message,fatal:!0}),ai.NEVER}});function mo(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(vN))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Hc=ai.preprocess(r=>r===null?"":r,ai.union([ai.string().url(),ai.literal("")])).optional();var jm=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],ho=$t.object({id:$t.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:ca.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:$t.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),AN=$t.object({selector:ho,inputs:$t.record($t.string()).or($t.null())}),Vm=$t.object({type:$t.literal("PRESET_ACTION"),action:sa,envKey:$t.string().or($t.null()).describe(`key in the environment to save the result of this step to. Only use this for ${jm.join(" or ")} steps.`)}),$m=$t.object({type:$t.literal("MODULE"),module:AN}),YE=$t.object({type:$t.literal("AI_ACTION_DYNAMIC"),text:$t.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});function XE(r,e){let t=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=r??{},a=new Set([...t,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=t.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call momentic_module_get to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var JE=L.object({phrase:L.string()}),Wm=L.object({thoughts:L.string().optional(),result:L.union([L.literal("NOT_FOUND"),L.string(),L.number(),L.array(L.unknown()),L.record(L.unknown(),L.unknown()),L.unknown()])}),iJ=L.object({text:L.string()}),RN=L.boolean().or(L.nativeEnum(ao)).transform(r=>!(!r||r==="irrelevant")),QE=L.object({attributes:L.array(L.string()).nullish(),text:RN.nullish(),position:L.nativeEnum(ao).nullish(),shape:L.nativeEnum(ao).nullish()}),wN=L.object({id:L.number().int(),requirements:QE}),CN=wN.array(),ZE=L.object({thoughts:L.string(),review:L.string().optional(),id:L.number().int(),updatedMemory:um.optional(),requirements:QE.nullish().transform(r=>{if(r!==null)return r}),additionalElements:CN.nullish().transform(r=>{if(r!==null)return r})});var zc=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(zc||{}),qm=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(qm||{});var eb=L.object({thoughts:L.string(),category:L.nativeEnum(zc)}),tb=L.object({thoughts:L.string(),category:L.nativeEnum(qm)}),xN=L.discriminatedUnion("op",[L.object({op:L.literal("replace"),path:L.string(),value:L.string()}),L.object({op:L.literal("add"),path:L.string(),value:L.string()}),L.object({op:L.literal("remove"),path:L.string()})]),aJ=L.object({thoughts:L.string(),patches:xN.array()}),_N=[L.literal("add"),L.literal("replace"),L.literal("remove")],IN=L.object({op:L.union(_N),path:L.string(),value:pt.optional()}),rb=L.object({patches:IN.array(),thoughts:L.string()}),Km=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Km||{}),nb=L.object({thoughts:L.string(),scenario:L.nativeEnum(Km),instructions:L.string().nullish()}),ob=L.object({reasoning:L.string(),scenario:L.string(),patch:L.null().optional()}),sJ=L.object({thoughts:L.string(),evaluation:L.number().min(0).max(10)}),lJ=L.object({observations:L.string(),reasoning:L.string(),command:wc});var Ym=L.object({summary:L.string(),reasoning:L.string(),evaluation:L.discriminatedUnion("type",[L.object({type:L.literal("DONE")}),L.object({type:L.literal("RIGHT_TRACK")}),L.object({type:L.literal("WRONG_TRACK"),feedback:L.string()}),L.object({type:L.literal("IMPOSSIBLE")})])}),MN=L.object({startId:L.number().int(),endId:L.number().int()}),ib=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(ib||{}),ab=L.object({categoryThoughts:L.string(),category:L.nativeEnum(ib),relevantSections:MN.array()}),jn=L.boolean().nullish().transform(r=>r??!1),sb=L.object({thoughts:L.string().optional(),isPageReady:jn,descriptionLabels:L.object({usesTextContent:jn,usesAppearance:jn,usesPosition:jn,usesRelativeElements:jn,usesSingleQuotes:jn,isAmbiguous:jn,targetDoesNotExist:jn,usesIcon:jn}).optional()});import{z as O}from"zod";import*as ue from"zod";var hJ=ue.object({thoughts:ue.string().optional().describe("only provided if a description was provided"),target:lo.optional().describe("only provided if a description was provided"),pageState:ue.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ue.object({label:ue.string(),value:ue.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ue.object({data:ue.string(),height:ue.number().int(),width:ue.number().int()}).optional().describe("only provided if returnScreenshot is true")}),lb=ue.union([ue.literal("ELEMENT_CHECK"),ue.literal("NEGATED_CHECK"),ue.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ue.literal("SELECT_OPTION"),ue.literal("TYPE")]);function si(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Bs=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Bs||{}),ua=ue.object({matched:ue.boolean(),reason:ue.string().optional().describe("Human understandable description"),logs:ue.string().array().optional().describe("Logs for debugging")}),PN=ua.extend({type:ue.literal("USER_SELECTOR")}),ON=ua.extend({type:ue.literal("CSS_SELECTOR"),selectors:ue.string().array()}),LN=ua.extend({type:ue.literal("HYBRID_SELECTOR")}),NN=ua.extend({type:ue.literal("HTML_DISTANCE"),distance:ue.number().optional(),closestElement:ue.string().optional(),savedElement:ue.string().optional()}),DN=ua.extend({type:ue.literal("TEMPLATE_MATCHING"),elementImageUrl:ue.string().url()}),kN=ua.extend({type:ue.literal("AUTO_FRAME"),logs:ue.string().array().optional()}),cb=ue.discriminatedUnion("type",[PN,ON,LN,NN,DN,kN]);import{z as js}from"zod";import{z as YN}from"zod";import*as J from"zod";import{extendZodWithOpenApi as zN}from"zod-openapi";import{cloneDeep as Hs}from"lodash-es";import gb from"truncate-json";import*as ui from"zod";import{extendZodWithOpenApi as FN}from"zod-openapi";import{z as Wt}from"zod";import{z as ce}from"zod";var Xm=ce.object({autoFollowNewTabs:ce.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:ce.union([ce.boolean(),ce.literal("inputs-only")]).optional(),ignoreHrefForCaching:ce.boolean().optional(),disableSecondaryCacheResolution:ce.boolean().optional(),hybridSelectorMode:ce.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:ce.union([ce.boolean(),ce.literal("always")]).optional(),visualActions:ce.boolean().optional(),autoExpandIframes:ce.boolean().optional(),disableHtmlSnapshots:ce.boolean().optional(),importantAttributes:ce.string().array().optional(),importantClasses:ce.string().array().optional(),importantStyles:ce.string().array().optional()});var ub=1e4,db=6e4,UN=ce.object({server:ce.string(),username:ce.string().optional(),password:ce.string().optional()}),li=Xm.extend({pageLoadTimeoutMs:ce.number().optional().refine(r=>r===void 0||r<=db&&r>=-1,{message:`Page load timeout must be between 0 and ${db/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:ce.number().optional().refine(r=>r===void 0||r<=ub&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${ub/1e3} seconds`}),localChromeExtensionPaths:ce.string().array().optional(),extraHeaders:ce.record(ce.string(),ce.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:ce.record(ce.string(),ce.record(ce.string(),ce.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:ce.string().optional(),disableGpu:ce.boolean().optional(),disableBrowserMonitoring:ce.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:ce.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:ce.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:ce.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:ce.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:ce.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:UN.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:ce.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory.")});var yt="BASE_URL",Gc="CURRENT_URL",ci="ENV_NAME",da="TEST_NAME",bJ={[yt]:"https://www.google.com"},pb=Wt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),mb=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.string().describe("variable value"))}),hb=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.unknown().describe("variable value")),browser:li.optional()});var TJ=Wt.object({name:Wt.string(),variables:Wt.record(Wt.string().describe("variable name"),Wt.unknown().describe("variable value"))});FN(ui);var Jm=ui.object({env:ui.record(ui.unknown())}).openapi({ref:"TestContextSnapshot"}),BN="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",HN=[yt,ci,da],fb=[Gc,yt,ci,da],nr=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[yt]??"about:blank",o=e.env[Gc]??"about:blank",i=e.env[ci],a=e.env[da],s={};for(let[l,u]of Object.entries(e.env))fb.includes(l)||(t??{})[l]===void 0&&(s[l]=u);return new r({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Hs(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){HN.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[ci]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Hs(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>fb.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,BN]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=gb(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=gb(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Gc]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Hs(e.variablesFromEnvironment),this.setMomenticSystemVariable(yt,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ci,e.envName),e.testName&&this.setMomenticSystemVariable(da,e.testName)}getDynamicVariablesCopy(){return Hs(this.env)}getVariablesFromEnvironmentCopy(){return Hs(this.varsFromMomenticEnvironment)}};var Pe=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Pe||{}),jc=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(jc||{});zN(J);var Qm=J.object({beforeUrl:J.string().optional(),afterUrl:J.string().optional(),message:J.string().optional(),beforeSnapshot:J.string().optional(),afterSnapshot:J.string().optional(),startedAt:J.coerce.date(),finishedAt:J.coerce.date()}),GN=Qm.extend({viewport:J.object({height:J.number(),width:J.number()}).nullish(),status:J.nativeEnum(jc),message:J.string().optional(),elementInteracted:J.string().optional()}),di=Qm.extend({status:J.nativeEnum(Pe),message:J.string().optional(),data:J.unknown().optional(),beforeTestContext:Jm.optional(),afterTestContext:Jm.optional(),failureReason:J.nativeEnum(Te).optional(),details:J.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),Zm=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(Zm||{}),Vc=di.merge(Sr).extend({results:GN.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:J.lazy(()=>xt.array()).optional(),failureRecoveryStatus:J.object({type:J.nativeEnum(Zm),message:J.string()}).optional()}),jN=di.merge(ni).extend({results:J.lazy(()=>Vc.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),VN=di.merge(la).extend({results:J.lazy(()=>Vc.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),$N=di.merge(Jr).extend({moduleName:J.string().optional(),results:J.lazy(()=>xt.array()),previousAttempts:J.lazy(()=>xt.array()).optional()}),WN=di.merge(oi).extend({assertionResult:Vc.optional(),results:J.lazy(()=>xt.array()).describe("results for the block actually executed"),previousAttempts:J.lazy(()=>xt.array()).optional()}),qN=di.merge(Fs).extend({results:J.lazy(()=>xt.array()),healingAttempts:J.lazy(()=>xt.array().array()).optional(),previousAttempts:J.lazy(()=>xt.array()).optional()}),xt=J.discriminatedUnion("type",[jN,VN,Vc,$N,WN,qN]),$c=di.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),KN=Qm.extend({index:J.number().optional(),userFacingStepReference:J.string().optional(),description:J.string(),pageState:J.string().optional(),elementInteracted:J.string().optional(),startedAt:J.coerce.date().or(J.string()).optional().catch(void 0),finishedAt:J.coerce.date().or(J.string()).optional().catch(void 0)}),Wc=KN.extend({beforeScreenshot:J.string().optional(),afterScreenshot:J.string().optional()});var eh=YN.object({results:xt.array().describe("main results"),beforeResults:xt.array().optional(),afterResults:xt.array().optional()}),zs=eh.partial();import{z as B}from"zod";import{extendZodWithOpenApi as tD}from"zod-openapi";var pa=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(pa||{});import{isValidCron as XN}from"cron-validator";import{z as pe}from"zod";import{z as th}from"zod";var Vn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(Vn||{});var qc=th.object({width:th.number().min(200).max(1e4),height:th.number().min(200).max(1e4)}),Sb={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},WJ=Object.keys(Sb);var qt=Sb["Desktop Large"],go="en-us",fo="America/Los_Angeles";var So={latitude:37.7749,longitude:-122.4194};var yb=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Eb=1e4,Kc=li.extend({browserType:pe.nativeEnum(Vn).optional(),slowMoMs:pe.number().optional().refine(r=>r===void 0||r<=Eb&&r>=-1,{message:`Slow motion must be between 0 and ${Eb} milliseconds`}),basicAuthorization:pe.object({username:pe.string().optional(),password:pe.string().optional()}).optional(),geolocation:pe.object({latitude:pe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:pe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:pe.boolean().optional(),locale:pe.string().optional(),timezone:pe.enum(yb).optional(),colorScheme:pe.enum(["light","dark"]).optional()}),bb=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],rh=pe.object({useMemory:pe.boolean().optional(),failureRecovery:pe.boolean().optional().describe("undefined means inherit org settings")}),JN=rh.extend({disableAICaching:pe.boolean().optional(),failureRecoveryInstructions:pe.string().optional()}),QN=pe.object({viewport:qc.optional()}),pi=QN.merge(JN).merge(Kc),ma=pe.object({cron:pe.string().refine(r=>XN(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:pe.boolean().default(!1),env:pe.string().optional(),timeZone:pe.string().default("America/Los_Angeles"),jobKey:pe.string().optional()}),ha=pe.object({onSuccess:pe.boolean().default(!1),failureMessage:pe.string().optional(),onFailure:pe.boolean().default(!0),successMessage:pe.string().optional()}),ZN=pe.object({name:pe.string(),required:pe.boolean().optional(),defaultValue:pe.string().describe("this is not optional because we need a value when the editor is first loaded")}),Yc=ZN.array(),eD=pe.object({name:pe.string(),value:pe.string()}),Tb=eD.array(),Xc=pe.object({name:pe.string(),default:pe.boolean().optional(),fixtures:pb.array().optional()});tD(B);var Pr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},we=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(we||{}),Jc=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Jc||{});var Et=B.string().pipe(B.coerce.date()).or(B.date()),Gs=B.object({id:B.string(),runKey:B.string(),organizationId:B.string(),executionType:B.nativeEnum(pa).optional().default("WEB"),createdAt:Et,createdBy:B.string(),flake:B.boolean().nullish(),scheduledAt:Et.or(B.null()),startedAt:Et.or(B.null()),updatedAt:Et.nullish(),finishedAt:Et.or(B.null()),resolvedBaseUrl:B.string().nullish(),environmentName:B.string().nullish(),gitBranchName:B.string().nullish(),githubRepository:B.string().nullish(),gitlabProjectPath:B.string().nullish(),labels:B.array(B.string()).optional(),gitOriginUrl:B.string().nullish(),gitCommitSha:B.string().nullish(),gitCommitShaShort:B.string().nullish(),gitCommitAuthorName:B.string().nullish(),cliVersion:B.string().nullish(),section:B.nativeEnum(Jc).nullish(),status:B.nativeEnum(we),trigger:B.nativeEnum(Pr),attempts:B.number(),runAttempts:B.array(B.object({id:B.string(),status:B.nativeEnum(we),startedAt:Et.or(B.null()),finishedAt:Et.or(B.null())})).optional(),videos:B.array(B.string()).optional(),failureReason:B.nativeEnum(Te).nullish(),failureDetails:Nc.nullish(),failureRecoveryDetails:B.object({attempts:B.number()}).nullish(),pipelineId:B.string().nullish(),resolvedInputs:B.record(B.string(),B.string()).nullish(),quarantined:B.boolean().nullish().default(!1),quarantinedReason:B.string().nullish(),localTestId:B.string().nullish(),testId:B.string().nullish(),testName:B.string().nullish(),description:B.string().nullish(),test:B.object({name:B.string(),id:B.string()}).nullish().default(null),suiteId:B.string().nullish()}).openapi({ref:"RunMetadata"}),rD={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Qc=Gs.pick({...rD,test:!0}),vb=Gs.omit({failureReason:!0,failureDetails:!0,test:!0}),nh=Gs.extend({stepsSnapshot:B.array(B.record(B.unknown())).nullish(),resolvedInputs:B.record(B.string(),B.string()).nullish(),test:B.object({name:B.string(),id:B.string(),description:B.string().nullish(),baseUrl:B.string().nullish(),advanced:pi.nullish()}).nullish()}).merge(eh),Ab=r=>r.includes("PASSED")&&r.includes("FAILED");var nD=js.object({id:js.string().uuid(),startedAt:Et.or(js.null()),finishedAt:Et.or(js.null()),status:js.nativeEnum(we)}).merge(zs),h8=nD.array();var Zc=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Zc||{});import{z as bt}from"zod";var oD=bt.object({id:bt.string(),status:bt.nativeEnum(we),trigger:bt.nativeEnum(Pr),createdAt:Et,startedAt:Et.nullish(),finishedAt:Et.nullish(),gitCommitSha:bt.string().nullish(),gitCommitShaShort:bt.string().nullish(),gitCommitTimestamp:Et.nullish(),gitBranchName:bt.string().nullish(),gitOriginUrl:bt.string().nullish(),gitCommitMessage:bt.string().nullish(),gitCommitAuthorName:bt.string().nullish(),githubRepository:bt.string().nullish(),gitlabProjectPath:bt.string().nullish(),pipelineId:bt.string().nullish(),cliVersion:bt.string().nullish(),labels:bt.string().array().optional(),suite:bt.object({id:bt.string(),name:bt.string()}).nullish(),runs:bt.object({status:bt.nativeEnum(we)}).array()}).openapi({ref:"RunGroup"}),Rb=oD.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Qc.array()});import{z as It}from"zod";var iD=It.object({type:It.literal("TARGETING"),name:It.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:cb.array(),pageState:It.string().optional(),targetSource:It.nativeEnum(so).optional(),targetUpdateTime:It.string().optional()}),aD=It.object({type:It.literal("AI_LOCATION"),matched:It.boolean(),pageState:It.string().optional(),ragUsed:It.boolean().optional(),thoughts:It.string().optional()}),sD=It.object({type:It.literal("ASSERTION"),relevantElementsSerialized:It.string().array().optional(),pageState:It.string().optional(),ragUsed:It.boolean().optional()}),wb=It.discriminatedUnion("type",[iD,aD,sD]);function eu(){return{details:[]}}import{z as ht}from"zod";var lD=ht.object({id:ht.string(),name:ht.string()}),_8=lD.merge(ht.object({createdAt:Et,createdBy:ht.string(),schedule:ma,notification:ha,environment:ht.object({name:ht.string()}).nullish(),beforeTests:ht.object({id:ht.string()}).array().nullish(),afterTests:ht.object({id:ht.string()}).array().nullish()})),Cb=ht.object({id:ht.string().uuid(),orgId:ht.string(),createdAt:Et,startedAt:Et.or(ht.null()),finishedAt:Et.or(ht.null()),status:ht.nativeEnum(we),trigger:ht.nativeEnum(Pr),suite:ht.object({id:ht.string(),name:ht.string()}).nullish(),runs:Gs.array()}),I8=Cb.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),xb=Cb.extend({runs:Qc.array()});import{z as Or}from"zod";import{cloneDeep as O8}from"lodash-es";import{z as Oe}from"zod";var F8=Oe.object({thoughts:Oe.string(),subGoals:Oe.object({instruction:Oe.string()}).array()}),B8=Oe.object({thoughts:Oe.string(),newPlanMarkdown:Oe.string()}),H8=Oe.object({thoughts:Oe.string(),correct:Oe.boolean(),failedActionIndex:Oe.number().optional()}),cD=Oe.object({type:Oe.literal("PLANNING"),beforePlan:Oe.string(),goalDecision:Oe.string(),thoughts:Oe.string()}),uD=Oe.object({type:Oe.literal("RUNNING"),stepDisplayName:Oe.string(),status:Oe.nativeEnum(Pe),results:xt.array()}),dD=Oe.object({type:Oe.literal("REVISING"),beforePlan:Oe.string(),afterPlan:Oe.string(),errString:Oe.string(),diffs:Oe.string(),thoughts:Oe.string()}),pD=Oe.object({type:Oe.literal("SYSTEM"),message:Oe.string()}),mD=Oe.discriminatedUnion("type",[cD,uD,dD,pD]),_b=mD.array();var $8=Or.object({id:Or.string(),scheduledAt:Or.coerce.date().nullable(),startedAt:Or.coerce.date().nullable(),finishedAt:Or.coerce.date().nullable(),status:Or.nativeEnum(we),history:_b.nullable(),testPlan:Or.object({id:Or.string(),name:Or.string()}).nullable(),test:Or.object({id:Or.string(),name:Or.string()}).nullable()});import{z as or}from"zod";var oh=or.object({content:or.string(),ids:or.string().array(),tokenLength:or.number()}),hD=or.object({chunks:oh.array()}),l6=or.object({ids:or.string().array(),score:or.number(),tokenLength:or.number()}),c6=hD.extend({description:or.string().describe("Input to pass to RAG engine"),tokenLimit:or.number()}),Ib=or.object({ids:or.number().array()}),Mb=or.object({indices:or.number().array()});var Nt=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),S6=Nt.extend({chunks:oh.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),gD=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),Pb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:lb.optional().catch(void 0),memory:O.discriminatedUnion("type",[Sc,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Ob=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),Lb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),fD=O.literal("NEGATED_CHECK"),Nb=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:Em.optional(),memory:O.discriminatedUnion("type",[mm,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:fD.optional()}),Db=O.object({command:oa}),kb=O.object({message:O.string()}),ih=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:gD.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),Ub=O.object({results:Wc.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Fb=O.object({results:Wc.array(),goal:O.string(),errorMessage:O.string()}),Bb=O.object({failedResults:Wc.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),y6=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),Hb=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),zb=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as Vs}from"zod";var T6=Vs.object({goal:Vs.string()}),Gb=Vs.object({keywords:Vs.array(Vs.string())});import{z as ah}from"zod";var tu=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(tu||{}),R6=ah.nativeEnum(tu),SD=ah.enum(["v1","v2","v3"]),w6=SD.or(ah.string().describe("for people with special configurations"));var ru={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as it}from"zod";var jb=it.object({attributesRequired:it.array(it.string()).optional(),textRequired:it.boolean().optional(),boundsRequired:it.boolean().optional()}),yD=it.object({id:it.number(),thoughts:it.string(),inWebview:it.boolean().optional(),requirements:jb.optional(),additionalElements:it.object({id:it.number(),requirements:jb}).array().optional()}),Vb=it.object({description:it.string(),screenXml:it.string(),screenshot:it.string()}),$b=it.object({assertion:it.string(),screenXml:it.string(),screenshot:it.string()}),ED=it.object({thoughts:it.string(),result:it.boolean(),relevantElements:it.array(it.number()).optional()});var Wb=r=>!(!r.org_id||!r.user_id||!r.platform);import{z as mi}from"zod";var qb=mi.object({id:mi.string().uuid(),skipped:mi.boolean().optional(),envKey:mi.string().optional().describe("key in the environment to save the result of this step to")}),sh=qb.merge(Qo).extend({type:mi.literal("REQUEST")}),lh=qb.merge(Tc).extend({type:mi.literal("JAVASCRIPT")}),ch=mi.discriminatedUnion("type",[lh,sh]);import{z as Lr}from"zod";var Kb=Lr.object({id:Lr.string(),name:ca,description:Lr.string().optional().nullish(),baseUrl:Hc.nullish(),schemaVersion:Lr.string(),advanced:Lr.unknown().optional(),retries:Lr.number(),envs:Lr.array(Xc).nullish(),parameters:Yc.nullish()}),bD=Lr.object({createdAt:Lr.coerce.date(),updatedAt:Lr.coerce.date(),schedule:ma.nullish(),notification:ha.nullish(),createdBy:Lr.string(),organizationId:Lr.string()}),TD=Kb.merge(bD),Y6=TD.extend({steps:ch.array()}),X6=Kb.extend({steps:ch.array()});import{z as ur}from"zod";var Yb=ur.object({startedAt:ur.coerce.date(),finishedAt:ur.coerce.date(),status:ur.nativeEnum(Pe),message:ur.string().optional(),data:ur.unknown().optional()}),vD=Yb.merge(lh).extend({type:ur.literal("JAVASCRIPT")}),AD=Yb.merge(sh).extend({type:ur.literal("REQUEST")}),RD=ur.discriminatedUnion("type",[vD,AD]),Xb=ur.object({startedAt:ur.coerce.date(),finishedAt:ur.coerce.date().nullish(),status:ur.nativeEnum(we),results:RD.array(),failureReason:ur.string().nullish(),failureDetails:Nc.nullish()});import{z as dr}from"zod";var wD=dr.object({id:dr.string(),organizationId:dr.string(),createdAt:dr.coerce.date(),updatedAt:dr.coerce.date(),createdBy:dr.string(),scheduledAt:dr.coerce.date().nullish(),startedAt:dr.coerce.date().nullish(),finishedAt:dr.coerce.date().nullish(),status:dr.nativeEnum(we),trigger:dr.nativeEnum(Pr),results:Xb.array().nullish(),apiTestName:dr.string().nullish(),apiTestPath:dr.string().nullish(),apiTestId:dr.string().nullish()}),a9=wD.pick({status:!0,startedAt:!0,finishedAt:!0});var $s=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))($s||{}),Jb=3;function CD(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function uh(r){if(!CD(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function dh(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return Jb;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var ga=class{trackStepExecution(){}async flush(){}};import{parseString as xD,splitCookiesString as _D}from"set-cookie-parser";import{z as ke}from"zod";var ph=ke.object({name:ke.string(),value:ke.string(),url:ke.string().optional(),domain:ke.string().optional(),path:ke.string().optional(),expires:ke.number().default(Date.now()/1e3+60*60*24*365),httpOnly:ke.boolean().optional(),secure:ke.boolean().default(!0),sameSite:ke.union([ke.literal("Strict"),ke.literal("Lax"),ke.literal("None")]).default("None")});function nu(r,e){let t=[],n=_D(r);for(let o of n){let i=xD(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=ph.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:p})}}return t}var ID=ke.object({origin:ke.string(),localStorage:ke.array(ke.object({name:ke.string(),value:ke.string()}))}),MD=ke.object({entries:ke.record(ke.string(),ke.array(ke.tuple([ke.unknown(),ke.unknown()]))),version:ke.number().optional()}),ou=ke.object({cookies:ph.array().optional(),origins:ID.array().optional(),idb:ke.record(ke.string(),MD).optional().describe("key is db name")});function Qb(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=ph.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}import{v4 as B9}from"uuid";import Se from"zod";import{v4 as I9}from"uuid";import{z}from"zod";import*as V from"zod";var Zb=V.discriminatedUnion("type",[V.object({type:V.literal("SCREEN")}),V.object({type:V.literal("OPEN_APP")}),V.object({type:V.literal("OPEN_WEBVIEW")})]),Ws=V.object({type:V.literal("description"),description:V.string()}),eT=V.object({type:V.literal("CUSTOM_COORDINATES"),startX:V.number().describe("Starting X coordinate in pixels"),startY:V.number().describe("Starting Y coordinate in pixels"),deltaPixels:V.number().describe("Number of pixels to scroll in the specified direction")}),mh=V.discriminatedUnion("type",[...Zb.options,V.object({type:V.literal("CUSTOM"),target:Ws}),eT]);var PD=V.object({type:V.literal("coordinates"),xPercent:V.number(),yPercent:V.number()}),iu=V.discriminatedUnion("type",[Ws,PD]),tT=V.object({requiredText:V.string().optional(),requiredAttributes:V.record(V.string(),V.string()).optional(),requiredBounds:V.boolean().optional()}),OD=V.object({xPath:V.string(),requirements:tT.optional()}),LD=V.object({type:V.literal("CUSTOM"),target:Ws,cache:V.lazy(()=>rT).optional()}),ND=V.object({pixelDelta:V.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:V.union([Zb,LD,eT]),direction:V.enum(["up","down"])}),rT=V.object({type:V.literal("NATIVE"),bounds:V.number().array(),resolvedDescription:V.string(),xPath:V.string(),elementOnlySerializedXml:V.string(),scrollDetails:ND.optional(),requirements:tT.optional(),requiredRelatedElements:OD.array().optional(),memory:V.never().optional()}),DD=V.object({type:V.literal("WEBVIEW"),resolvedDescription:V.string(),xPath:V.string(),browserCache:lo.optional(),memory:V.never().optional()}),nT=V.union([rT,DD]);var yo=(b=>(b.AI_CHECK="AI_CHECK",b.TAP="TAP",b.TYPE="TYPE",b.PRESS="PRESS",b.PRESS_KEYBOARD="PRESS_KEYBOARD",b.OPEN_APP="OPEN_APP",b.KILL_APP="KILL_APP",b.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",b.SWIPE="SWIPE",b.SCROLL_TO="SCROLL_TO",b.SCREEN_CHECK="SCREEN_CHECK",b.ELEMENT_CHECK="ELEMENT_CHECK",b.JAVASCRIPT="JAVASCRIPT",b.REQUEST="REQUEST",b.WAIT="WAIT",b.ADD_FILE="ADD_FILE",b.INSTALL_APP="INSTALL_APP",b.UNINSTALL_APP="UNINSTALL_APP",b.ADB="ADB",b.STATE="STATE",b))(yo||{}),au=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(au||{}),oT=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(oT||{}),UD=z.object({updatedAt:z.coerce.date().optional()}),Tt=z.object({id:z.string().uuid(),disableCache:z.boolean().optional()}),FD=Tt.extend({type:z.literal("STATE")}),BD=Tt.extend({type:z.literal("KILL_APP")}),qs=UD.extend({target:nT}),HD=Tt.extend({type:z.literal("AI_CHECK"),assertion:z.string(),timeoutSecs:z.number().optional()}),hh=Tt.extend({type:z.literal("TAP"),target:iu,cache:qs.optional(),longPress:z.boolean().optional(),longPressDurationMs:z.number().optional(),doubleTap:z.boolean().optional(),doubleTapDelayMs:z.number().optional(),relativePosition:z.object({x:z.number(),y:z.number()}).optional()}),gh=Tt.extend({type:z.literal("TYPE"),target:iu.optional(),cache:qs.optional(),keyPressDelayMs:z.number().optional(),text:z.string(),clearContent:z.boolean().optional(),forceClearContent:z.boolean().optional()});var zD=Tt.extend({type:z.literal("PRESS"),key:z.nativeEnum(au),longPress:z.boolean().optional()}),GD=Tt.extend({type:z.literal("PRESS_KEYBOARD"),key:z.nativeEnum(oT)}),jD=Tt.extend({type:z.literal("OPEN_APP"),packageName:z.string(),activityName:z.string().optional(),intentExtras:z.string().optional()}),VD=Tt.extend({type:z.literal("OPEN_NOTIFICATION_DRAWER")}),fh=Tt.extend({type:z.literal("SWIPE"),direction:z.enum(["up","down","left","right"]),scrollableElement:mh,cache:qs.optional(),viewportPercent:z.number().optional(),durationMs:z.number().optional()}),Sh=Tt.extend({type:z.literal("SCROLL_TO"),target:Ws,direction:z.enum(["down","up"]),scrollableElement:mh,scrollStepPercent:z.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:qs.optional()});var $D=z.object({type:z.literal("CONTENT"),negated:z.boolean().optional(),value:z.string()}),WD=Tt.extend({type:z.literal("SCREEN_CHECK"),assertion:$D,timeout:z.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}),yh=Tt.extend({type:z.literal("ELEMENT_CHECK"),target:iu,cache:qs.optional(),assertion:bc,timeout:z.number().int().min(0).max(ta).optional().describe("max seconds to wait for the assertion to be true")}),qD=Tt.extend({type:z.literal("JAVASCRIPT"),code:z.string(),timeout:z.number().int().max(60).optional().describe("Max seconds for the code to complete")}),KD=Tt.extend({type:z.literal("REQUEST")}).merge(Qo),YD=Tt.extend({type:z.literal("WAIT"),timeoutSecs:z.number()}),XD=Tt.extend({type:z.literal("ADB"),command:z.string(),jsonArgs:z.string().optional()}),JD=Tt.extend({type:z.literal("ADD_FILE"),file:z.string(),storageLocation:z.string()}),QD=z.string().trim(),ZD=Tt.extend({type:z.literal("INSTALL_APP"),uri:QD}),ek=Tt.extend({type:z.literal("UNINSTALL_APP"),packageName:z.string()}),iT=z.discriminatedUnion("type",[HD,hh,gh,zD,jD,VD,GD,fh,Sh,WD,yh,qD,KD,YD,JD,ZD,ek,BD,XD,FD]);var tk=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],aT=Se.object({type:Se.enum(tk).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:Se.string().or(Se.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),rk=Se.object({type:Se.literal("TAP"),description:Se.string().describe("Description of the element to tap."),longPress:Se.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:Se.boolean().describe("Whether to tap twice in quick succession."),relativePosition:Se.null().or(Se.object({x:Se.number(),y:Se.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
12
12
  Tap on an element on the screen.
13
13
  `),nk=Se.object({type:Se.literal("PRESS"),key:Se.nativeEnum(au)}).describe(`
14
14
  Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher).
@@ -18,7 +18,7 @@ ${this.decisions.map(e=>e.toString()).join(`
18
18
  Swipe in a direction within a container (screen/app/webview).
19
19
  `),sk=Se.object({type:Se.literal("SCROLL_TO"),targetDescription:Se.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:Se.enum(["down","up"]).describe("Direction to scroll while searching for the target."),container:aT,scrollStepPercent:Se.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
- `),W9=Se.discriminatedUnion("type",[rk,nk,ok,ik,ak,sk]);import lk from"zod";var Ks={type:!0,cache:!0},fa=lk.discriminatedUnion("type",[yh.pick(Ks),hh.pick(Ks),gh.pick(Ks),fh.pick(Ks),Sh.pick(Ks)]),Q9=Object.values(yo).filter(r=>fa.options.some(e=>e.shape.type.safeParse(r).success));var sT=Ps(fa),lT=Os(fa),Z9=Cc(fa);import cT from"zod";var su=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(su||{}),uT=(e=>(e.LOCAL="local",e))(uT||{}),dT=cT.nativeEnum(su).or(cT.nativeEnum(uT)),Ys=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(Ys||{});import{cloneDeep as oQ}from"lodash-es";import aQ from"truncate-json";import vt from"zod";import{z as Qr}from"zod";import{z as at}from"zod";var Kt=at.object({id:at.string(),name:ca,baseUrl:Hc,description:at.string().optional().nullish(),schemaVersion:at.string(),advanced:pi,retries:at.number(),envs:at.array(Xc).nullish(),parameters:Yc.nullish(),disabled:at.boolean().optional(),labels:at.array(at.string()).optional().catch([])}),mQ=at.enum(["INHERIT","ENABLED","DISABLED"]);var ck=pi.extend({failureRecovery:at.boolean().or(at.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:at.boolean().or(at.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var hQ=Kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:ck}),gQ=Kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),uk=at.object({labels:at.array(at.string()).optional(),outputs:Tb.nullish()}),Nr=Kt.merge(uk),dk=at.object({createdAt:at.coerce.date(),updatedAt:at.coerce.date(),updatedBy:at.string().nullable(),schedule:ma,notification:ha,createdBy:at.string(),organizationId:at.string(),folderId:at.string().nullable().optional()}),pk=Kt.merge(dk),fQ=pk.merge(po),lu=Kt.merge(po),SQ=Kt.merge(ii);var mk="test",hk="module",gk="mobile-test",fk="mobile-module";var he=(o=>(o.TEST=`momentic/${mk}`,o.MODULE=`momentic/${hk}`,o.MOBILE_TEST=`momentic/${gk}`,o.MOBILE_MODULE=`momentic/${fk}`,o))(he||{}),RQ=Kt.merge(ii),Eh=cr.extend({steps:Qr.array(Qr.record(Qr.string(),Qr.unknown())),schemaVersion:Qr.string()}),wQ=Eh.extend({fileType:Qr.literal(he.MODULE)}),CQ=Qr.object({test:Qr.string().describe("YAML for the test, including metadata and steps"),modules:Qr.record(Qr.string(),Qr.string()).describe("Map of module name to YAML for the module")});var bh=vt.object({parameterNames:vt.string().array(),defaultParameters:vt.record(vt.string(),vt.string()).optional(),parameterEnums:vt.record(vt.string(),vt.string().array()).optional()}),Sk=vt.object({moduleId:vt.string().uuid(),name:vt.string(),description:vt.string().nullish(),parameters:bh.optional(),enabled:vt.boolean().nullish(),schemaVersion:vt.string()}),cu=Sk.omit({name:!0}),pT=cu.extend({steps:vt.array(vt.record(vt.string(),vt.unknown()))}),yk=vt.object({fileType:vt.literal(he.MOBILE_MODULE)}).merge(pT);import Dt from"zod";var fn=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(fn||{}),Xs=Dt.object({id:Dt.string().uuid(),envKey:Dt.string().optional(),skipped:Dt.boolean().optional(),retries:Dt.number().optional()}),Js=Xs.extend({type:Dt.literal("MOBILE_PRESET_STEP"),command:iT,keyPressDelayMs:Dt.number().optional()}),Qs=Dt.object({moduleId:Dt.string(),inputs:Dt.record(Dt.string(),Dt.string()).optional()}),uu=Xs.merge(Qs.extend({type:Dt.literal("MOBILE_MODULE_STEP")})),NQ=Qs.extend({steps:Dt.lazy(()=>hi.array())}),Zs=Xs.extend({type:Dt.literal("MOBILE_AI_ACTION_STEP"),text:Dt.string()}),hi=Dt.discriminatedUnion("type",[Js,uu,Zs]);import Xe from"zod";import el from"zod";var Eo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Eo||{}),Th=Qs.extend({steps:el.lazy(()=>Sa.array()),description:el.string().optional(),name:el.string().describe("name of the module"),parameters:bh.optional()}),Ek=Xs.merge(Th).extend({type:el.literal("RESOLVED_MOBILE_MODULE")}),Sa=el.discriminatedUnion("type",[Ek,Js,Zs]);function mT(r){return Object.values(Eo).includes(r)||Object.values(fn).includes(r)}var bk=Xe.object({disableMomenticAccessibilityTree:Xe.boolean().optional(),autoGrantPermissions:Xe.boolean().optional()}),vh=bk.extend({region:dT.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Xe.object({androidVersion:Xe.nativeEnum(Ys).optional()}).optional(),localEmulatorSettings:Xe.object({avdId:Xe.string()}).optional(),geolocation:Xe.object({latitude:Xe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Xe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),tl=Xe.object({retries:Xe.number().optional().describe("number of retries to run"),defaultChannel:Xe.string().optional().describe("default channel to use"),defaultTag:Xe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Xe.string().optional(),defaultApkFilePath:Xe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:vh.optional()}),ya=Xe.object({id:Xe.string().uuid(),description:Xe.string(),schemaVersion:Xe.string(),settings:tl.optional()}),hT=ya.extend({fileType:Xe.literal(he.MOBILE_TEST)}),Tk=ya.merge(Xe.object({steps:Xe.array(hi)})),JQ=hT.merge(Tk),QQ=Xe.object({name:Xe.string(),steps:Xe.array(hi).optional(),settings:tl.optional()}),vk=ya.extend({steps:Sa.array()});import Le from"zod";var gi=Le.object({startTime:Le.number(),endTime:Le.number().optional(),durationMs:Le.number().optional(),error:Le.string().optional(),result:Le.unknown().optional(),attributes:Le.record(Le.string(),Le.unknown())});var Ak=gi.extend({type:Le.literal("SECTION"),name:Le.string(),subSpans:Le.lazy(()=>Mk.array())}),Rk=gi.extend({type:Le.literal("AI_LOCATOR_CALL"),result:Le.object({id:Le.number(),thoughts:Le.string()}).optional()}),wk=gi.extend({type:Le.literal("AI_ASSERTION_CALL"),result:Le.object({thoughts:Le.string(),result:Le.boolean()}).optional()}),Ck=gi.extend({type:Le.literal("TARGET_RESOLUTION"),result:Le.object({serializedElement:Le.string()}).optional()}),xk=gi.extend({type:Le.literal("EMULATOR_INTERACTION"),name:Le.string(),withinWebview:Le.boolean().optional()}),_k=gi.extend({type:Le.literal("EMULATOR_READ_STATE"),name:Le.string()}),Ik=gi.extend({type:Le.literal("GENERIC"),name:Le.string()}),Mk=Le.discriminatedUnion("type",[Ak,Rk,wk,Ck,xk,_k,Ik]);import Yt from"zod";var Ah=Yt.object({message:Yt.string().optional(),startTime:Yt.number(),endTime:Yt.number(),status:Yt.nativeEnum(Pe),trace:Yt.unknown(),beforeSnapshot:Yt.string().optional(),afterSnapshot:Yt.string().optional(),data:Yt.unknown().optional().describe("output data from the step")}),Pk=Ah.merge(Js).extend({previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Ok=Ah.merge(uu).extend({steps:Yt.lazy(()=>Zr.array()),name:Yt.string().optional(),previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Lk=Ah.merge(Zs).extend({steps:Yt.lazy(()=>Zr.array()),previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Zr=Yt.discriminatedUnion("type",[Pk,Ok,Lk]);import{parse as uZ}from"date-fns";var LZ=new Set(Object.values(Ke));var Nk={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"},NZ={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:[]},DZ={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",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."},kZ={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",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",ADB:"ADB command",STATE:"Debug state"},UZ={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.",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).",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 Dk from"semver";import{z as kk}from"zod";var zZ=kk.string().refine(r=>Dk.valid(r),{message:"must be a valid semver string"});import{Faker as VZ,en as $Z}from"@faker-js/faker";import{z as k}from"zod";var Ea=55555,qZ=k.object({body:k.string(),to:k.string(),from:k.string()}),KZ=k.object({from:k.string().optional(),to:k.string(),timeout:k.number().optional(),beforeDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional()}),YZ=k.object({to:k.string().email(),from:k.string(),subject:k.string(),body:k.string(),html:k.string().optional()}),XZ=k.object({inbox:k.string().transform(r=>r.toLowerCase()),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),timeout:k.number().optional(),trimWhitespace:k.boolean().optional()}),JZ=k.object({inbox:k.string(),limit:k.number().optional(),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),trimWhitespace:k.boolean().optional()});var du=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(du||{}),gT=k.object({body:k.string().nullish(),status:k.number().optional(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}),Uk=k.object({url:k.string(),options:k.object({method:k.string(),body:k.string().nullish(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}).optional()}).optional(),Fk=k.object({body:k.string().nullish(),options:k.object({status:k.number(),statusText:k.string().optional(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}).optional()}).optional(),fT=k.object({result:k.unknown(),variableUpdates:k.record(k.string(),k.unknown()).optional(),persistentVariableUpdates:k.record(k.string(),k.unknown()).optional(),error:k.string().optional(),success:k.boolean()}),QZ=k.object({id:k.string().optional(),orgId:k.string(),momenticLambdaAuthHash:k.string(),code:k.string(),fragment:k.boolean(),state:k.object({env:k.record(k.string(),k.unknown()),request:Uk,response:Fk,additionalBindings:k.record(k.string(),k.unknown()).optional()}),timeoutMs:k.number().optional(),disallowVariableUpdates:k.boolean().optional(),responseSerialization:k.nativeEnum(du).optional()}),bo=15e3;import*as Xt from"zod";import{extendZodWithOpenApi as Bk}from"zod-openapi";Bk(Xt);var Hk=Xt.object({url:Xt.string(),lineNumber:Xt.number(),columnNumber:Xt.number()}).openapi({ref:"CodeLocation"}),pu=Xt.object({timestamp:Xt.number(),text:Xt.string(),type:Xt.string(),tabIndex:Xt.number(),args:Xt.unknown().array().optional(),url:Xt.string().optional(),location:Hk.optional()}).openapi({ref:"ConsoleLog"}),ST=pu.array(),zk=ST.array();import*as Rh from"zod";import{extendZodWithOpenApi as Gk}from"zod-openapi";Gk(Rh);var jk=Rh.object({logsPerPage:pu.array().array()}).openapi({ref:"DebugData"});var rl=class{async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,n,o){}async storeNetworkLogsForRunAttempt(e,t,n,o){}async storeScreenshot(e,t,n){}async storeHtmlSnapshot(e,t,n){}};import{z as M}from"zod";var Vk=M.object({name:M.string(),version:M.string(),comment:M.string().optional()}),$k=M.object({name:M.string(),version:M.string(),comment:M.string().optional()}),Wk=M.object({onContentLoad:M.number().optional(),onLoad:M.number().optional(),comment:M.string().optional()}),wh=M.object({startedDateTime:M.string(),id:M.string(),title:M.string().optional(),pageTimings:Wk,comment:M.string().optional()}),qk=M.array(wh),Kk=M.object({name:M.string(),value:M.string(),path:M.string().optional(),domain:M.string().optional(),expires:M.string().optional(),httpOnly:M.boolean().optional(),secure:M.boolean().optional(),comment:M.string().optional()}),ET=M.array(Kk),Yk=M.object({name:M.string(),value:M.string(),comment:M.string().optional()}),bT=M.array(Yk),Xk=M.object({name:M.string(),value:M.string(),comment:M.string().optional()}),Jk=M.array(Xk),Qk=M.object({name:M.string(),value:M.string().optional(),fileName:M.string().optional(),contentType:M.string().optional(),comment:M.string().optional()}),Zk=M.array(Qk),e0=M.object({mimeType:M.string(),params:Zk,text:M.string(),comment:M.string().optional(),_redactedReason:M.string().optional()}),t0=M.object({method:M.string(),url:M.string(),httpVersion:M.string().optional(),cookies:ET,headers:bT,queryString:Jk,postData:e0.optional(),headersSize:M.number().optional(),bodySize:M.number().optional(),comment:M.string().optional()}),r0=M.object({size:M.number().optional(),compression:M.number().optional(),mimeType:M.string().optional(),text:M.string().optional(),encoding:M.string().optional(),comment:M.string().optional(),_redactedReason:M.string().optional()}),n0=M.object({status:M.number(),statusText:M.string(),httpVersion:M.string().optional(),cookies:ET,headers:bT,content:r0,redirectURL:M.string().optional(),headersSize:M.number().optional(),bodySize:M.number().optional(),comment:M.string().optional(),_mocked:M.boolean().optional()}),yT=M.object({expires:M.string().optional(),lastAccess:M.string(),eTag:M.string(),hitCount:M.number(),comment:M.string().optional()}),o0=M.object({beforeRequest:yT.optional(),afterRequest:yT.optional(),comment:M.string().optional()}),i0=M.object({blocked:M.number().optional(),dns:M.number().optional(),connect:M.number().optional(),send:M.number(),wait:M.number(),receive:M.number(),ssl:M.number().optional(),comment:M.string().optional()}),Ch=M.object({pageref:M.string().optional(),startedDateTime:M.string(),time:M.number().optional(),request:t0,response:n0.optional(),cache:o0.optional(),timings:i0,serverIPAddress:M.string().optional(),connection:M.string().optional(),comment:M.string().optional(),_resourceType:M.string().optional()}),a0=M.array(Ch),s0=M.object({version:M.string().default("1.1"),creator:Vk.optional(),browser:$k.optional(),pages:qk.optional(),entries:a0,comment:M.string().optional()}),l0=M.object({log:s0}),d7=M.record(M.string(),wh),p7=M.record(M.string(),Ch);import{cloneDeep as c0}from"lodash-es";import{z as Sn}from"zod";var xh=(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))(xh||{});var TT=Sn.union([Sn.string(),Sn.number(),Sn.boolean(),Sn.null(),Sn.record(Sn.string(),Sn.lazy(()=>TT)),Sn.array(Sn.lazy(()=>TT))]),nl=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=c0(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(xh).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},A7=new nl({},{});var _h={".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"},vT=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],w7=Object.keys(_h);import*as AT from"zod";var x7=AT.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as To}from"zod";var M7=To.object({id:To.string(),name:To.string(),createdAt:To.coerce.date(),createdBy:To.string(),updatedAt:To.coerce.date(),updatedBy:To.string().nullable(),organizationId:To.string()});import{z as N}from"zod";import vo from"zod";var ba=vo.object({platformSep:vo.string(),fullPathSegments:vo.string().array(),relativePathSegments:vo.string().array(),relativePath:vo.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:vo.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:vo.coerce.date(),createdAt:vo.coerce.date()});var u0=N.array(ba.extend({id:N.string(),name:N.string(),description:N.string().optional(),labels:N.string().array().optional()})),d0=ba.extend({id:N.string(),name:N.string(),description:N.string().optional(),content:Hm}),p0=N.array(d0),j7=N.object({tests:u0,modules:p0,labels:N.string().array()}),V7=lu.merge(Nr),RT=N.object({schemaVersion:N.string(),stepLists:po}),wT=Nr.partial().merge(Kt.pick({id:!0})),Ih={name:N.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:N.string().optional(),baseUrl:N.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:N.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:N.nativeEnum(Vn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:qc.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:N.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},CT=N.object(Ih),$7=lu.merge(N.object({relativeFilePath:N.string().describe("relative to project root")})),xT=N.object({name:N.string()}),W7=N.object({relativeFilePath:N.string()}),_T=N.object({name:N.string()}),q7=N.object({relativeFilePath:N.string()}),IT=N.object({name:N.string(),description:N.string(),enabled:N.boolean(),steps:N.lazy(()=>pt.array()),testFilePath:N.string().describe("relative to the project root"),folderPath:N.string().optional().describe("user selected folder path")}),MT=N.object({name:N.string(),description:N.string(),enabled:N.boolean()}).partial();var K7=N.array(hb),PT=N.object({defaultEnv:N.string().optional().describe("name of the default env, or undefined to unset")}),OT=N.object({configFilePath:N.string().describe("full path on disk")}),Y7=N.string().array(),X7=N.object({message:N.string(),newRelativeTestPath:N.string().optional()}),Mh=N.object({name:N.string(),absolutePath:N.string(),relativePath:N.string(),pathSegments:N.array(N.string()),isDirectory:N.boolean(),size:N.number(),createdAt:N.coerce.date(),modifiedAt:N.coerce.date(),accessedAt:N.coerce.date()}),LT=N.object({pathSegments:N.array(N.string())}),J7=N.object({absolutePath:N.string(),pathSegments:N.array(N.string()),contents:N.array(Mh)}),NT=N.object({pathSegments:N.array(N.string())}),DT=N.object({pathSegments:N.array(N.string()),newPathSegments:N.array(N.string())}),kT=N.object({pathSegments:N.array(N.string()),recursive:N.boolean().optional()}),Q7=N.object({success:N.boolean(),message:N.string(),pathSegments:N.array(N.string()).optional()}),Z7=N.object({gitBranch:N.string(),fileMtime:N.coerce.date(),gitCommitSha:N.string()});var mu=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],hu=mu.map(r=>`**/${r}/**`),UT=!0,Dr=!1,FT=15e4;import yn from"chalk";import m0 from"safe-stable-stringify";import h0 from"truncate-json";import g0 from"zod";var fi=m0.configure({deterministic:!1});function BT(r){let e=fi(r),{jsonString:t}=h0(e,5e4);return t}var f0=["app","version","env","namespace","host"];function Fe(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!f0.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Ph=g0.enum(["debug","info","warn","error"]);var ol={debug:20,info:30,warn:40,error:50},HT={20:"debug",30:"info",40:"warn",50:"error"},Si=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=ol[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
21
+ `),W9=Se.discriminatedUnion("type",[rk,nk,ok,ik,ak,sk]);import lk from"zod";var Ks={type:!0,cache:!0},fa=lk.discriminatedUnion("type",[yh.pick(Ks),hh.pick(Ks),gh.pick(Ks),fh.pick(Ks),Sh.pick(Ks)]),Q9=Object.values(yo).filter(r=>fa.options.some(e=>e.shape.type.safeParse(r).success));var sT=Ps(fa),lT=Os(fa),Z9=Cc(fa);import cT from"zod";var su=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(su||{}),uT=(e=>(e.LOCAL="local",e))(uT||{}),dT=cT.nativeEnum(su).or(cT.nativeEnum(uT)),Ys=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(Ys||{});import{cloneDeep as oQ}from"lodash-es";import aQ from"truncate-json";import vt from"zod";import{z as Qr}from"zod";import{z as at}from"zod";var Kt=at.object({id:at.string(),name:ca,baseUrl:Hc,description:at.string().optional().nullish(),schemaVersion:at.string(),advanced:pi,retries:at.number(),envs:at.array(Xc).nullish(),parameters:Yc.nullish(),disabled:at.boolean().optional(),labels:at.array(at.string()).optional().catch([])}),mQ=at.enum(["INHERIT","ENABLED","DISABLED"]);var ck=pi.extend({failureRecovery:at.boolean().or(at.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:at.boolean().or(at.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var hQ=Kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:ck}),gQ=Kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),uk=at.object({labels:at.array(at.string()).optional(),outputs:Tb.nullish()}),Nr=Kt.merge(uk),dk=at.object({createdAt:at.coerce.date(),updatedAt:at.coerce.date(),updatedBy:at.string().nullable(),schedule:ma,notification:ha,createdBy:at.string(),organizationId:at.string(),folderId:at.string().nullable().optional()}),pk=Kt.merge(dk),fQ=pk.merge(po),lu=Kt.merge(po),SQ=Kt.merge(ii);var mk="test",hk="module",gk="mobile-test",fk="mobile-module";var me=(o=>(o.TEST=`momentic/${mk}`,o.MODULE=`momentic/${hk}`,o.MOBILE_TEST=`momentic/${gk}`,o.MOBILE_MODULE=`momentic/${fk}`,o))(me||{}),RQ=Kt.merge(ii),Eh=cr.extend({steps:Qr.array(Qr.record(Qr.string(),Qr.unknown())),schemaVersion:Qr.string()}),wQ=Eh.extend({fileType:Qr.literal(me.MODULE)}),CQ=Qr.object({test:Qr.string().describe("YAML for the test, including metadata and steps"),modules:Qr.record(Qr.string(),Qr.string()).describe("Map of module name to YAML for the module")});var bh=vt.object({parameterNames:vt.string().array(),defaultParameters:vt.record(vt.string(),vt.string()).optional(),parameterEnums:vt.record(vt.string(),vt.string().array()).optional()}),Sk=vt.object({moduleId:vt.string().uuid(),name:vt.string(),description:vt.string().nullish(),parameters:bh.optional(),enabled:vt.boolean().nullish(),schemaVersion:vt.string()}),cu=Sk.omit({name:!0}),pT=cu.extend({steps:vt.array(vt.record(vt.string(),vt.unknown()))}),yk=vt.object({fileType:vt.literal(me.MOBILE_MODULE)}).merge(pT);import Dt from"zod";var fn=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(fn||{}),Xs=Dt.object({id:Dt.string().uuid(),envKey:Dt.string().optional(),skipped:Dt.boolean().optional(),retries:Dt.number().optional()}),Js=Xs.extend({type:Dt.literal("MOBILE_PRESET_STEP"),command:iT,keyPressDelayMs:Dt.number().optional()}),Qs=Dt.object({moduleId:Dt.string(),inputs:Dt.record(Dt.string(),Dt.string()).optional()}),uu=Xs.merge(Qs.extend({type:Dt.literal("MOBILE_MODULE_STEP")})),NQ=Qs.extend({steps:Dt.lazy(()=>hi.array())}),Zs=Xs.extend({type:Dt.literal("MOBILE_AI_ACTION_STEP"),text:Dt.string()}),hi=Dt.discriminatedUnion("type",[Js,uu,Zs]);import Xe from"zod";import el from"zod";var Eo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Eo||{}),Th=Qs.extend({steps:el.lazy(()=>Sa.array()),description:el.string().optional(),name:el.string().describe("name of the module"),parameters:bh.optional()}),Ek=Xs.merge(Th).extend({type:el.literal("RESOLVED_MOBILE_MODULE")}),Sa=el.discriminatedUnion("type",[Ek,Js,Zs]);function mT(r){return Object.values(Eo).includes(r)||Object.values(fn).includes(r)}var bk=Xe.object({disableMomenticAccessibilityTree:Xe.boolean().optional(),autoGrantPermissions:Xe.boolean().optional()}),vh=bk.extend({region:dT.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Xe.object({androidVersion:Xe.nativeEnum(Ys).optional()}).optional(),localEmulatorSettings:Xe.object({avdId:Xe.string()}).optional(),geolocation:Xe.object({latitude:Xe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Xe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),tl=Xe.object({retries:Xe.number().optional().describe("number of retries to run"),defaultChannel:Xe.string().optional().describe("default channel to use"),defaultTag:Xe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Xe.string().optional(),defaultApkFilePath:Xe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:vh.optional()}),ya=Xe.object({id:Xe.string().uuid(),description:Xe.string(),schemaVersion:Xe.string(),settings:tl.optional()}),hT=ya.extend({fileType:Xe.literal(me.MOBILE_TEST)}),Tk=ya.merge(Xe.object({steps:Xe.array(hi)})),JQ=hT.merge(Tk),QQ=Xe.object({name:Xe.string(),steps:Xe.array(hi).optional(),settings:tl.optional()}),vk=ya.extend({steps:Sa.array()});import Le from"zod";var gi=Le.object({startTime:Le.number(),endTime:Le.number().optional(),durationMs:Le.number().optional(),error:Le.string().optional(),result:Le.unknown().optional(),attributes:Le.record(Le.string(),Le.unknown())});var Ak=gi.extend({type:Le.literal("SECTION"),name:Le.string(),subSpans:Le.lazy(()=>Mk.array())}),Rk=gi.extend({type:Le.literal("AI_LOCATOR_CALL"),result:Le.object({id:Le.number(),thoughts:Le.string()}).optional()}),wk=gi.extend({type:Le.literal("AI_ASSERTION_CALL"),result:Le.object({thoughts:Le.string(),result:Le.boolean()}).optional()}),Ck=gi.extend({type:Le.literal("TARGET_RESOLUTION"),result:Le.object({serializedElement:Le.string()}).optional()}),xk=gi.extend({type:Le.literal("EMULATOR_INTERACTION"),name:Le.string(),withinWebview:Le.boolean().optional()}),_k=gi.extend({type:Le.literal("EMULATOR_READ_STATE"),name:Le.string()}),Ik=gi.extend({type:Le.literal("GENERIC"),name:Le.string()}),Mk=Le.discriminatedUnion("type",[Ak,Rk,wk,Ck,xk,_k,Ik]);import Yt from"zod";var Ah=Yt.object({message:Yt.string().optional(),startTime:Yt.number(),endTime:Yt.number(),status:Yt.nativeEnum(Pe),trace:Yt.unknown(),beforeSnapshot:Yt.string().optional(),afterSnapshot:Yt.string().optional(),data:Yt.unknown().optional().describe("output data from the step")}),Pk=Ah.merge(Js).extend({previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Ok=Ah.merge(uu).extend({steps:Yt.lazy(()=>Zr.array()),name:Yt.string().optional(),previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Lk=Ah.merge(Zs).extend({steps:Yt.lazy(()=>Zr.array()),previousAttempts:Yt.lazy(()=>Zr.array()).optional()}),Zr=Yt.discriminatedUnion("type",[Pk,Ok,Lk]);import{parse as uZ}from"date-fns";var LZ=new Set(Object.values(Ke));var Nk={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"},NZ={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:[]},DZ={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",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."},kZ={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",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",ADB:"ADB command",STATE:"Debug state"},UZ={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.",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).",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 Dk from"semver";import{z as kk}from"zod";var zZ=kk.string().refine(r=>Dk.valid(r),{message:"must be a valid semver string"});import{Faker as VZ,en as $Z}from"@faker-js/faker";import{z as k}from"zod";var Ea=55555,qZ=k.object({body:k.string(),to:k.string(),from:k.string()}),KZ=k.object({from:k.string().optional(),to:k.string(),timeout:k.number().optional(),beforeDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional()}),YZ=k.object({to:k.string().email(),from:k.string(),subject:k.string(),body:k.string(),html:k.string().optional()}),XZ=k.object({inbox:k.string().transform(r=>r.toLowerCase()),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),timeout:k.number().optional(),trimWhitespace:k.boolean().optional()}),JZ=k.object({inbox:k.string(),limit:k.number().optional(),afterDate:k.string().pipe(k.coerce.date()).or(k.date()).optional(),trimWhitespace:k.boolean().optional()});var du=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(du||{}),gT=k.object({body:k.string().nullish(),status:k.number().optional(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}),Uk=k.object({url:k.string(),options:k.object({method:k.string(),body:k.string().nullish(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}).optional()}).optional(),Fk=k.object({body:k.string().nullish(),options:k.object({status:k.number(),statusText:k.string().optional(),headers:k.array(k.tuple([k.string(),k.string()])).optional()}).optional()}).optional(),fT=k.object({result:k.unknown(),variableUpdates:k.record(k.string(),k.unknown()).optional(),persistentVariableUpdates:k.record(k.string(),k.unknown()).optional(),error:k.string().optional(),success:k.boolean()}),QZ=k.object({id:k.string().optional(),orgId:k.string(),momenticLambdaAuthHash:k.string(),code:k.string(),fragment:k.boolean(),state:k.object({env:k.record(k.string(),k.unknown()),request:Uk,response:Fk,additionalBindings:k.record(k.string(),k.unknown()).optional()}),timeoutMs:k.number().optional(),disallowVariableUpdates:k.boolean().optional(),responseSerialization:k.nativeEnum(du).optional()}),bo=15e3;import*as Xt from"zod";import{extendZodWithOpenApi as Bk}from"zod-openapi";Bk(Xt);var Hk=Xt.object({url:Xt.string(),lineNumber:Xt.number(),columnNumber:Xt.number()}).openapi({ref:"CodeLocation"}),pu=Xt.object({timestamp:Xt.number(),text:Xt.string(),type:Xt.string(),tabIndex:Xt.number(),args:Xt.unknown().array().optional(),url:Xt.string().optional(),location:Hk.optional()}).openapi({ref:"ConsoleLog"}),ST=pu.array(),zk=ST.array();import*as Rh from"zod";import{extendZodWithOpenApi as Gk}from"zod-openapi";Gk(Rh);var jk=Rh.object({logsPerPage:pu.array().array()}).openapi({ref:"DebugData"});var rl=class{async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,n,o){}async storeNetworkLogsForRunAttempt(e,t,n,o){}async storeScreenshot(e,t,n){}async storeHtmlSnapshot(e,t,n){}};import{z as M}from"zod";var Vk=M.object({name:M.string(),version:M.string(),comment:M.string().optional()}),$k=M.object({name:M.string(),version:M.string(),comment:M.string().optional()}),Wk=M.object({onContentLoad:M.number().optional(),onLoad:M.number().optional(),comment:M.string().optional()}),wh=M.object({startedDateTime:M.string(),id:M.string(),title:M.string().optional(),pageTimings:Wk,comment:M.string().optional()}),qk=M.array(wh),Kk=M.object({name:M.string(),value:M.string(),path:M.string().optional(),domain:M.string().optional(),expires:M.string().optional(),httpOnly:M.boolean().optional(),secure:M.boolean().optional(),comment:M.string().optional()}),ET=M.array(Kk),Yk=M.object({name:M.string(),value:M.string(),comment:M.string().optional()}),bT=M.array(Yk),Xk=M.object({name:M.string(),value:M.string(),comment:M.string().optional()}),Jk=M.array(Xk),Qk=M.object({name:M.string(),value:M.string().optional(),fileName:M.string().optional(),contentType:M.string().optional(),comment:M.string().optional()}),Zk=M.array(Qk),e0=M.object({mimeType:M.string(),params:Zk,text:M.string(),comment:M.string().optional(),_redactedReason:M.string().optional()}),t0=M.object({method:M.string(),url:M.string(),httpVersion:M.string().optional(),cookies:ET,headers:bT,queryString:Jk,postData:e0.optional(),headersSize:M.number().optional(),bodySize:M.number().optional(),comment:M.string().optional()}),r0=M.object({size:M.number().optional(),compression:M.number().optional(),mimeType:M.string().optional(),text:M.string().optional(),encoding:M.string().optional(),comment:M.string().optional(),_redactedReason:M.string().optional()}),n0=M.object({status:M.number(),statusText:M.string(),httpVersion:M.string().optional(),cookies:ET,headers:bT,content:r0,redirectURL:M.string().optional(),headersSize:M.number().optional(),bodySize:M.number().optional(),comment:M.string().optional(),_mocked:M.boolean().optional()}),yT=M.object({expires:M.string().optional(),lastAccess:M.string(),eTag:M.string(),hitCount:M.number(),comment:M.string().optional()}),o0=M.object({beforeRequest:yT.optional(),afterRequest:yT.optional(),comment:M.string().optional()}),i0=M.object({blocked:M.number().optional(),dns:M.number().optional(),connect:M.number().optional(),send:M.number(),wait:M.number(),receive:M.number(),ssl:M.number().optional(),comment:M.string().optional()}),Ch=M.object({pageref:M.string().optional(),startedDateTime:M.string(),time:M.number().optional(),request:t0,response:n0.optional(),cache:o0.optional(),timings:i0,serverIPAddress:M.string().optional(),connection:M.string().optional(),comment:M.string().optional(),_resourceType:M.string().optional()}),a0=M.array(Ch),s0=M.object({version:M.string().default("1.1"),creator:Vk.optional(),browser:$k.optional(),pages:qk.optional(),entries:a0,comment:M.string().optional()}),l0=M.object({log:s0}),d7=M.record(M.string(),wh),p7=M.record(M.string(),Ch);import{cloneDeep as c0}from"lodash-es";import{z as Sn}from"zod";var xh=(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))(xh||{});var TT=Sn.union([Sn.string(),Sn.number(),Sn.boolean(),Sn.null(),Sn.record(Sn.string(),Sn.lazy(()=>TT)),Sn.array(Sn.lazy(()=>TT))]),nl=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=c0(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(xh).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},A7=new nl({},{});var _h={".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"},vT=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],w7=Object.keys(_h);import*as AT from"zod";var x7=AT.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as To}from"zod";var M7=To.object({id:To.string(),name:To.string(),createdAt:To.coerce.date(),createdBy:To.string(),updatedAt:To.coerce.date(),updatedBy:To.string().nullable(),organizationId:To.string()});import{z as N}from"zod";import vo from"zod";var ba=vo.object({platformSep:vo.string(),fullPathSegments:vo.string().array(),relativePathSegments:vo.string().array(),relativePath:vo.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:vo.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:vo.coerce.date(),createdAt:vo.coerce.date()});var u0=N.array(ba.extend({id:N.string(),name:N.string(),description:N.string().optional(),labels:N.string().array().optional()})),d0=ba.extend({id:N.string(),name:N.string(),description:N.string().optional(),content:Hm}),p0=N.array(d0),j7=N.object({tests:u0,modules:p0,labels:N.string().array()}),V7=lu.merge(Nr),RT=N.object({schemaVersion:N.string(),stepLists:po}),wT=Nr.partial().merge(Kt.pick({id:!0})),Ih={name:N.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:N.string().optional(),baseUrl:N.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:N.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:N.nativeEnum(Vn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:qc.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:N.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},CT=N.object(Ih),$7=lu.merge(N.object({relativeFilePath:N.string().describe("relative to project root")})),xT=N.object({name:N.string()}),W7=N.object({relativeFilePath:N.string()}),_T=N.object({name:N.string()}),q7=N.object({relativeFilePath:N.string()}),IT=N.object({name:N.string(),description:N.string(),enabled:N.boolean(),steps:N.lazy(()=>pt.array()),testFilePath:N.string().describe("relative to the project root"),folderPath:N.string().optional().describe("user selected folder path")}),MT=N.object({name:N.string(),description:N.string(),enabled:N.boolean()}).partial();var K7=N.array(hb),PT=N.object({defaultEnv:N.string().optional().describe("name of the default env, or undefined to unset")}),OT=N.object({configFilePath:N.string().describe("full path on disk")}),Y7=N.string().array(),X7=N.object({message:N.string(),newRelativeTestPath:N.string().optional()}),Mh=N.object({name:N.string(),absolutePath:N.string(),relativePath:N.string(),pathSegments:N.array(N.string()),isDirectory:N.boolean(),size:N.number(),createdAt:N.coerce.date(),modifiedAt:N.coerce.date(),accessedAt:N.coerce.date()}),LT=N.object({pathSegments:N.array(N.string())}),J7=N.object({absolutePath:N.string(),pathSegments:N.array(N.string()),contents:N.array(Mh)}),NT=N.object({pathSegments:N.array(N.string())}),DT=N.object({pathSegments:N.array(N.string()),newPathSegments:N.array(N.string())}),kT=N.object({pathSegments:N.array(N.string()),recursive:N.boolean().optional()}),Q7=N.object({success:N.boolean(),message:N.string(),pathSegments:N.array(N.string()).optional()}),Z7=N.object({gitBranch:N.string(),fileMtime:N.coerce.date(),gitCommitSha:N.string()});var mu=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],hu=mu.map(r=>`**/${r}/**`),UT=!0,Dr=!1,FT=15e4;import yn from"chalk";import m0 from"safe-stable-stringify";import h0 from"truncate-json";import g0 from"zod";var fi=m0.configure({deterministic:!1});function BT(r){let e=fi(r),{jsonString:t}=h0(e,5e4);return t}var f0=["app","version","env","namespace","host"];function Fe(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!f0.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Ph=g0.enum(["debug","info","warn","error"]);var ol={debug:20,info:30,warn:40,error:50},HT={20:"debug",30:"info",40:"warn",50:"error"},Si=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=ol[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
22
22
  `).map((n,o)=>o>0?`${t}${n}`:n).join(`
23
23
  `)}logWithLevelHelper(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(t(` ${s}:`,l)),console.log(t(" 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(t(` ${s}.${p}:`,m.message)),m.stack&&console.log(t(` ${s}.${p}.stack:`,m.stack));continue}if(typeof m=="object"&&m!==null){let h=this.indentMultiline(fi(m,void 0,2)," ");console.log(t(` ${s}.${p}:`,h));continue}console.log(t(` ${s}.${p}:`,m))}}else typeof c=="object"?(l=fi(c,void 0,2),l=this.indentMultiline(l),console.log(t(` ${s}:`,l))):console.log(t(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=fi(a,void 0,2),s=s.split(`
24
24
  `).map((c,l)=>l>0?` ${c}`:c).join(`
@@ -28,8 +28,8 @@ ${this.decisions.map(e=>e.toString()).join(`
28
28
  `);process.stderr.write(`${o}
29
29
  `),globalThis.console=e}}var St=" ".repeat(6);function Yv(r,e="",t=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=r.split(`
30
30
  `),a=[];for(let s of i)if(t){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 uU from"fetch-retry";import dU from"os";import Xv,{multistream as pU}from"pino";import mU from"pino-pretty";import hU from"pino-std-serializers";var Ta=new Map,gU=!0,Jv="Log throttle exceeded",fU=100,SU=5e3,yU=uU(global.fetch,{retries:2,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),Yh=class r{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:t,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=t??dU.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=gU?Xv(a):Xv(a,pU([{stream:mU({colorize:!0})}]))}child(e){return new r({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 t=await yU(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:fi(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===Jv)return!0;let t=Date.now();return t-this.lastWindowStart>SU&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,Jv),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<fU?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,t,n,...o){try{this.logHelper(e,t,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,t,n,...o){if(ol[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof t=="string"&&!n&&(t={message:t}),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error&&(t.err=hU.err(t.err));let i={...this.bindingAttributes,...t&&typeof t=="object"?t:{},...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:BT({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 t=this.bindingAttributes.app;this.bindingAttributes.app=e,Ta.set("app",this),Ta.delete(t)}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=HT[e]):(this.minLevelValue=ol[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},va=({app:r,hostname:e,disableConsoleLogs:t})=>(Ta.has(r)||Ta.set(r,new Yh({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Ta.get(r));async function Zv(){await Promise.all([...Ta.values()].map(r=>r.flush()))}import{hostname as EU}from"os";var X=va({app:"cli",hostname:EU(),disableConsoleLogs:!0}).child({cliVersion:"2.26.0"});var TU=5;async function Au({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>TU&&(E.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(l){i++,X.warn({err:l},"Failed to fetch run status, retrying..."),E.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))}E.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Aa({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return Kv(()=>{if(c.forEach(u=>{E.log(""),o(u)}),c.length){E.log("");let u=c.length===1?"":"s";E.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{E.dimmed(n(d))})}if(l.length){E.log("");let u=l.length===1?"":"s";E.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{E.dimmed(n(d))})}if(a.length){E.log("");let u=a.length===1?"":"s";E.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{E.dimmed(n(d))})}if(s.length){E.log("");let u=s.length===1?"":"s";E.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{E.dimmed(n(d))})}if(i.length){E.log("");let u=i.length===1?"":"s";E.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{E.dimmed(n(d))})}E.log(""),E.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 Ru=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=Lc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ia[r.failureReason],o=r.failureDetails.classification?.rootCause;if(E.error(e),o){E.log(`${St}- Error type: ${bn.dim(t)}`);let i="- Root cause analysis:",a=Yv(`${i} ${o}`,`${St} `,!1),s=a.indexOf(":");E.log(`${St}${i} ${bn.dim(a.slice(s+1))}`)}else E.log(`${St}Reason: ${bn.red(t)}`),E.log(`${St}Description: ${bn.red(n)}`)},ll=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=bn.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=bn.bgGreen.white("PASS"),a=3):r.includes("START")?(i=bn.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=bn.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=bn.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=bn.bgMagenta.white("RUNNING"),a=0):(E.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),bU||(i=`${i}`),E.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import vU from"fs";import{tmpdir as AU}from"os";import RU from"path";import{registry as cl}from"playwright-core/lib/server";import eA from"proper-lockfile";var tA=RU.join(AU(),"momenticBrowserInstallation");var Xh=["chrome","chromium","chrome-for-testing","ffmpeg"],wU={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},rA={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function nA(r){let e=rA[wU[r]??""]??"",t=cl.findExecutable(e);return!t||t.installType==="none"?!1:Jh(t)}function Jh(r){let e=r.executablePath();return vU.existsSync(e)}function CU(r,e){let t=rA[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=cl.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Jh(n)))return n}async function xU({browser:r,force:e}){let t=CU(r,e);if(!t){E.info(`Browser '${r}' is already installed, skipping...`);return}E.info(`Installing browser '${r}'...`);try{await cl.installDeps([t],!1),await cl.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){E.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=cl.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Jh(o);)E.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function oA({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Xh:Array.from(new Set(r));try{await eA.lock(tA,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){E.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 xU({browser:i,force:e})}catch(a){o=a,E.error(`Failed to install the ${i} browser: ${a}`)}}finally{await eA.unlock(tA,{realpath:!1})}if(o)throw o}import _U from"blocked-at";import IU from"why-is-node-running";function iA(r){MU(r),PU()}function MU(r){_U((e,t)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=t.join(`
32
- `);console.warn(n),r.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function PU(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let r=process._getActiveHandles();console.log("Active handles:",r.map(e=>e.constructor?.name))}IU(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}import{randomUUID as $K}from"crypto";import vP from"body-parser";import Pq from"cors";import Oq from"dedent";import{Router as PF}from"express";import ir from"fs";import{globSync as OF}from"glob";import Mt from"path";import Yu from"fs";import{z as BU}from"zod";var F="v1",Qh="cli",Ei="2.26.0";var Ao=3.1783027;function OU(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function Ge(r){return Math.ceil(Zh(r)/Ao)}function Zh(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
31
+ `)}import uU from"fetch-retry";import dU from"os";import Xv,{multistream as pU}from"pino";import mU from"pino-pretty";import hU from"pino-std-serializers";var Ta=new Map,gU=!0,Jv="Log throttle exceeded",fU=100,SU=5e3,yU=uU(global.fetch,{retries:2,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),Yh=class r{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:t,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=t??dU.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=gU?Xv(a):Xv(a,pU([{stream:mU({colorize:!0})}]))}child(e){return new r({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 t=await yU(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:fi(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===Jv)return!0;let t=Date.now();return t-this.lastWindowStart>SU&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,Jv),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<fU?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,t,n,...o){try{this.logHelper(e,t,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,t,n,...o){if(ol[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof t=="string"&&!n&&(t={message:t}),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error&&(t.err=hU.err(t.err));let i={...this.bindingAttributes,...t&&typeof t=="object"?t:{},...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:BT({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 t=this.bindingAttributes.app;this.bindingAttributes.app=e,Ta.set("app",this),Ta.delete(t)}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=HT[e]):(this.minLevelValue=ol[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},va=({app:r,hostname:e,disableConsoleLogs:t})=>(Ta.has(r)||Ta.set(r,new Yh({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Ta.get(r));async function Zv(){await Promise.all([...Ta.values()].map(r=>r.flush()))}import{hostname as EU}from"os";var X=va({app:"cli",hostname:EU(),disableConsoleLogs:!0}).child({cliVersion:"2.27.0"});var TU=5;async function Au({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>TU&&(E.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(l){i++,X.warn({err:l},"Failed to fetch run status, retrying..."),E.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))}E.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Aa({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return Kv(()=>{if(c.forEach(u=>{E.log(""),o(u)}),c.length){E.log("");let u=c.length===1?"":"s";E.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{E.dimmed(n(d))})}if(l.length){E.log("");let u=l.length===1?"":"s";E.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{E.dimmed(n(d))})}if(a.length){E.log("");let u=a.length===1?"":"s";E.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{E.dimmed(n(d))})}if(s.length){E.log("");let u=s.length===1?"":"s";E.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{E.dimmed(n(d))})}if(i.length){E.log("");let u=i.length===1?"":"s";E.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{E.dimmed(n(d))})}E.log(""),E.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 Ru=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=Lc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ia[r.failureReason],o=r.failureDetails.classification?.rootCause;if(E.error(e),o){E.log(`${St}- Error type: ${bn.dim(t)}`);let i="- Root cause analysis:",a=Yv(`${i} ${o}`,`${St} `,!1),s=a.indexOf(":");E.log(`${St}${i} ${bn.dim(a.slice(s+1))}`)}else E.log(`${St}Reason: ${bn.red(t)}`),E.log(`${St}Description: ${bn.red(n)}`)},ll=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=bn.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=bn.bgGreen.white("PASS"),a=3):r.includes("START")?(i=bn.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=bn.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=bn.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=bn.bgMagenta.white("RUNNING"),a=0):(E.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),bU||(i=`${i}`),E.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import vU from"fs";import{tmpdir as AU}from"os";import RU from"path";import{registry as cl}from"playwright-core/lib/server";import eA from"proper-lockfile";var tA=RU.join(AU(),"momenticBrowserInstallation");var Xh=["chrome","chromium","chrome-for-testing","ffmpeg"],wU={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},rA={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function nA(r){let e=rA[wU[r]??""]??"",t=cl.findExecutable(e);return!t||t.installType==="none"?!1:Jh(t)}function Jh(r){let e=r.executablePath();return vU.existsSync(e)}function CU(r,e){let t=rA[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=cl.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Jh(n)))return n}async function xU({browser:r,force:e}){let t=CU(r,e);if(!t){E.info(`Browser '${r}' is already installed, skipping...`);return}E.info(`Installing browser '${r}'...`);try{await cl.installDeps([t],!1),await cl.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){E.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=cl.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Jh(o);)E.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function oA({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Xh:Array.from(new Set(r));try{await eA.lock(tA,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){E.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 xU({browser:i,force:e})}catch(a){o=a,E.error(`Failed to install the ${i} browser: ${a}`)}}finally{await eA.unlock(tA,{realpath:!1})}if(o)throw o}import _U from"blocked-at";import IU from"why-is-node-running";function iA(r){MU(r),PU()}function MU(r){_U((e,t)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=t.join(`
32
+ `);console.warn(n),r.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function PU(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let r=process._getActiveHandles();console.log("Active handles:",r.map(e=>e.constructor?.name))}IU(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}import{randomUUID as $K}from"crypto";import vP from"body-parser";import Pq from"cors";import Oq from"dedent";import{Router as PF}from"express";import ir from"fs";import{globSync as OF}from"glob";import Mt from"path";import Yu from"fs";import{z as BU}from"zod";var F="v1",Qh="cli",Ei="2.27.0";var Ao=3.1783027;function OU(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function Ge(r){return Math.ceil(Zh(r)/Ao)}function Zh(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
33
33
  `,""),t=t.replaceAll(" ","");let n=OU(t);return t.length-n+Ao*n}if(typeof r>"u"||r===null)return 0;if(typeof r=="number")return String(r).length;if(Array.isArray(r))return r.forEach(t=>{e+=Zh(t)}),e;if(typeof r=="object"){let t=r;return Object.keys(t).forEach(n=>{e+=String(n).length,n==="image_url"?(t[n]??{}).detail==="high"?e+=1105*Ao:e+=85*Ao:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Ao:e+=Zh(t[n])}),e}if(typeof r=="boolean")return r?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof r}': ${r}`)}var Ro=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var aA=r=>{let e=r.reason===void 0?new DOMException("This operation was aborted.","AbortError"):r.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function H(r,e){let{milliseconds:t,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((s,c)=>{let l;if(e.signal){let{signal:p}=e;if(p.aborted)return c(aA(p));l=()=>c(aA(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 r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new Ro(o??`Promise timed out after ${t}ms`);c(p)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(p=>{d(),s(p)}).catch(p=>{d(),c(p)})})}var wu=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};var LU=9e4,NU=3,DU=1500,kU=15e3,en=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function UU(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var eg=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Ei&&(e[yu]=Ei),Qh&&(e[WT]=Qh),e}async sendRequest(e,t){let{retries:n=NU,requestTimeoutMs:o=LU,initialRetryDelayMs:i=DU,maxRetryDelayMs:a=kU,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof en&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Ro),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,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let p=await UU(u);throw new en(u.status,p,`Request to ${t.method} ${e} failed with status ${u.status}: ${p}`)}let d;if(u.status===204)d={};else{let p=await u.text();try{d=JSON.parse(p)}catch{d=p}}return this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Ft=class extends eg{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[$T]:this.mode??""}}};import{createAnthropic as FU}from"@ai-sdk/anthropic";var ul=({baseUrl:r,apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o})=>i=>{let a={Authorization:`Bearer ${e}`,[yu]:Ei??"",...t&&{[KT]:t},...n||{}};return o&&(a[qT]=JSON.stringify(o)),FU({baseURL:`${r}/v1/llm/anthropic/${i}`,headers:a,apiKey:e})(i)};var $n=class extends Ft{agentConfig;constructor(e,t){let n={...ru,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return Mb.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${F}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Ei,...e},signal:t.abortSignal});return Ib.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${F}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return BU.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${F}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return QT.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${F}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Uh.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return JT.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return XT.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${F}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Uh.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${F}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return YT.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${F}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${F}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Ym.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${F}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return ZT.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${F}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Wm.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return ab.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return sb.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${F}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return wm.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${F}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return Gb.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${F}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return rb.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${F}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return ob.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${F}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return nb.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${F}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return yy.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return ul({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as tg}from"zod";var Je=class extends Ft{constructor(e){super({...e,mode:void 0})}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${F}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{E.warn(`API key check failed: ${t.message}`)}});return pv.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${F}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return lv.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${F}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return tv.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${F}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${F}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return nv.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${F}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${F}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return ov.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${F}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return ev.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${F}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return dv.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${F}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return mv.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${F}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return _v.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${F}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${F}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${F}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${F}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${F}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return hv.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${F}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return Rb.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${F}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${F}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${F}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return gv.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${F}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${F}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return fv.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${F}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return Sv.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${F}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return yv.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${F}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Lv.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${F}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${F}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return il.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${F}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return il.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${F}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return zh.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${F}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return il.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${F}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return il.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${F}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return zh.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${F}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return tg.record(tg.string(),tg.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${F}/quarantine`,{method:"GET"});return Ev.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${F}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,t,n){await this.sendRequest(`/${F}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${F}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return bv.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${F}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:t,md5:n}){let o={channel:e,tag:t,md5:n},i=await this.sendRequest(`/${F}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return Tv.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${F}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${F}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return vv.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${F}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function rg(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(E.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),E.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return E.debug("Got auth info from API"),n}var Cu=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var wo=class extends Ft{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${F}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Ey.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Ra=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as HU,en as zU}from"@faker-js/faker";var wa="v1",Tn=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 HU({locale:zU}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${wa}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof en?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${wa}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof en?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${wa}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof en?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${wa}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof en?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${wa}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof en?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${wa}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof en?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function sA(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var xu=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await sA(n,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function dt(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Wn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},qn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ng={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},og={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function lA(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?qn[r.operation]:Wn[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?qn[r.operation]:Wn[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?qn[r.operation]:Wn[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?qn[r.operation]:Wn[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?og[r.condition]:ng[r.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var $le={CONTENT:"The page"};function jU(r){switch(r.type){case"VALUE":return`the option with value ${r.value}`;case"LABEL":return`the option with label ${r.label}`;case"INDEX":return`the option at index ${r.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function Iu(r){switch(r.type){case"SUBSTRING":return`match substring '${r.url}'`;case"REGEX":return`match regex '${r.regex}'`;case"GLOB":return`match glob '${r.glob}'`;case"DOMAIN":return`match domain '${r.domain}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function _u(r){let e="";return r.method&&(e=` with method ${r.method}`),`${Iu(r.urlMatcher)}${e}`}function VU(r){return`${r.negated?qn.CONTAINS:Wn.CONTAINS} '${r.value}'`}function $U(r){switch(r.type){case"CONTENT":return VU(r);default:return r.type,""}}function Co(r,e=!0){switch(r.type){case"SUCCESS":return r.condition?.assertion?`Check success condition: ${r.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${r.goal}`;case"NAVIGATE":return`Go to URL: ${e?dt(r.url,30):r.url}`;case"DIALOG":return`Automatically ${r.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${Vt(r.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${Vt(r.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Vt(r.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Vt(r.target)}`:""}`;case"WAIT":return`Wait for ${r.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(r.target?.type==="coordinates")return`Click at coordinates: ${Vt(r.target)}`;let n="";return r.target?.elementDescriptor.length?n=` on element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` on element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Click${n}`}case"FOCUS":return`Focus ${Vt(r.target)}`;case"BLUR":return`Focus ${Vt(r.target)}`;case"DRAG":return`Drag ${Vt(r.fromTarget)} onto ${Vt(r.toTarget)}`;case"MOUSE_DRAG":return r.target?.type==="description"&&r.target.elementDescriptor?`Click and drag ${Vt(r.target)} by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`:`Click and drag mouse by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`;case"TYPE":{let n="";return r.target?.type==="coordinates"?n=` in element at coordinates: ${Vt(r.target)}`:r.target?.elementDescriptor.length?n=` in element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` in element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Type '${r.value}'${n||""}`}case"HOVER":{let n="";return r.target.type==="coordinates"?n=` over coordinates: ${Vt(r.target)}`:r.target.elementDescriptor.length>0?n=` over element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` over element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Hover${n}`}case"PRESS":return`Press ${r.value}`;case"KEY_DOWN":return`Hold down ${r.value} on the keyboard`;case"KEY_UP":return`Release ${r.value} on the keyboard`;case"SELECT_OPTION":{let n="",o=jU(r.choice);return r.target.type==="coordinates"?n=` from element at coordinates: ${Vt(r.target)}`:r.target.elementDescriptor.length>0?n=` from: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` from: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${o}'${n}`}case"TAB":switch(r.action.type){case"SUBSTRING":return`Switch to tab with substring: ${r.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${r.action.pattern}`;case"INDEX":return`Switch to tab at index: ${r.action.index}`;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${r.url}`;case"REQUEST":return`Send ${r.method} request to ${r.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${r.url}`;case"COOKIE":return`Set cookie: ${r.value}`;case"LOCAL_STORAGE":return`Set local storage: ${r.key}: ${r.value}`;case"JAVASCRIPT":return`Run JavaScript: ${e?dt(r.code,30):r.code}`;case"AI_ASSERTION":return`Assertion: '${r.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${r.target?`for element: ${Vt(r.target)}`:"for entire page"}`;case"FILE_UPLOAD":return r.fileSource.type==="URL"?`Upload file: ${r.fileSource.url}`:`Upload file: ${r.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${Vt(r.target)} ${lA(r.assertion)}`;case"PAGE_CHECK":return`Check the page ${$U(r.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Iu(r.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return r.requestMatcher?`Register a listener for network requests that ${_u(r.requestMatcher)}`:"Register a listener for network requests";case"AWAIT_LISTENER":return r.key?`Wait for the listener ${r.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return r.requestMatcher?`Start recording requests that match ${_u(r.requestMatcher)}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return r.key?`Get the requests that were recorded for ${r.key}`:"Get the requests that were recorded";case"SET_HEADER":return r.name?r.requestMatcher?`Set a ${r.name} header for requests that match ${_u(r.requestMatcher)}`:`Set a ${r.name} header for all requests`:"Set a header";case"MOCK_ROUTE":return r.requestMatcher?`Mock requests that ${_u(r.requestMatcher)}`:"Mock a network route";case"REMOVE_ROUTE_MOCK":return r.key?`Remove the mock with key ${r.key}`:"Remove all route mocks";case"OFFLINE_MODE":return r.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"})(r)}}function WU(r){return typeof r=="object"&&r!==null}function vn(r){if(Array.isArray(r))return r.map(vn);if(WU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=vn(n))}),e}return r}function dl(r,e,t,n){let{negated:o,ignoreCase:i}=n,a=r.trim(),s=e.trim();i&&(a=a.toLowerCase(),s=s.toLowerCase());let c;switch(t){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: ${t}`)}return o?!c:c}function cA(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function Ca(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?ng[r.condition]:og[r.condition]:r.negated?Wn[r.operation]:qn[r.operation]}import{diff as KU}from"deep-object-diff";import{cloneDeep as Lu}from"lodash-es";function bi(r){let e={parentChain:[]};return Mu(r,e),e}function Mu(r,e){let{onPresetAction:t,onSimpleStepContainer:n,onConditional:o,earlyStop:i}=r;for(let a of r.steps)switch(a.type){case"PRESET_ACTION":if(t(a,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(a,e)&&i)return!0;e.parentChain.push(a);for(let c of a.blocks)if(t(c.assertion,e)&&i||Mu({...r,steps:c.steps},e)&&i)return!0;if(Mu({...r,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),Mu({...r,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(n?.(a,e)&&i)return!0;break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function uA(r,e,t,n){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==i[s])return!1;i.shift()}return!!qU([r],t,i).result}function qU(r,e,t=[]){let n,o=[],i=(a,s)=>{let c=JSON.stringify(s.parentChain.map(u=>u.id)),l=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&l?(n=a,o=s.parentChain,!0):!1};return bi({steps:r,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function dA(r,e){e(r);for(let t in r){let n=r[t];n&&(Array.isArray(n)?Ou(n,e):typeof n=="object"&&dA(n,e))}}function Ou(r,e){for(let t of r)t&&(Array.isArray(t)?Ou(t,e):typeof t=="object"&&dA(t,e))}function ig(r,e){if(r.length>e.length)return ig(e,r);for(let t=0;t<r.length;t++)if(r[t]!==e[t])return!1;return!0}function Pu(r){for(let e of r.results)switch(e.type){case"PRESET_ACTION":r.onPresetAction(e);break;case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":r.onSimpleStepContainer?.(e),Pu({...r,results:e.results});break;case"CONDITIONAL":r.onConditional?.(e),e.assertionResult&&r.onPresetAction(e.assertionResult),Pu({...r,results:e.results});break;default:throw new Error(`Unsupported result type: ${e.type}`)}}function xo(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(KU(r,e)).length>0}function xa({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(p,m)=>{try{let h=Gn.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=YU(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 r)switch(p.type){case"RESOLVED_MODULE":{l+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=xa({...t,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}=xa({...t,steps:p.steps,topLevel:!1});a.push(...m),s.push(...h),c.push(...g);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!xc.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}=xa({...t,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}=xa({...t,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 pA(r,e){return e?`${e}:${r}`:r}function YU(r,e){let t=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),r];t.push(i.join(":"))}return t.reverse(),t}function ag(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
34
34
  ${JSON.stringify(t)}`);let n=[];return n.push({key:pA(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function mA(r){let e=new Set;return Ou(r,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let n=t.moduleId;typeof n=="string"&&!e.has(n)&&e.add(n)}}),e}function Nu({cmd:r,newTarget:e,key:t,logger:n,updatedWithAI:o}){if(r.type==="DRAG")if(t!=="fromTarget"&&t!=="toTarget")n.error({cmd:r,newTarget:e,key:t},"Attempted to apply invalid cache to DRAG command");else{let i=r.cache?.updatedAt;r.cache={...r.cache,[t]:e,updatedAt:i&&!o?i:new Date}}else if(t==="target"&&_c(r)){let i=r.cache?.updatedAt;r.cache={...r.cache,target:e,updatedAt:i&&!o?i:new Date}}else n.error({cmd:r,newTarget:e,key:t},"Invalid target cache application")}function ml(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;xo(n,e)&&(t.info({updatedTraces:e,oldCmd:r},"Wrote new memory to assertion command"),r.cache={...r.cache,memory:{type:"GCS_TRACES",traces:e},updatedAt:new Date})}function hA({steps:r}){let e={};return bi({steps:r,onPresetAction:(t,n)=>{let o=t.command;if(!("cache"in o)||!o.cache)return;let i=n.parentChain.filter(c=>c.type==="RESOLVED_MODULE").map(c=>c.id).join(":"),a=pA(o.id,i),s=Gn.parse(o);e[a]=s},onSimpleStepContainer:(t,n)=>{},onConditional:(t,n)=>{}}),e}function pl(r){return{...r,serializedHtml:void 0,nodeOnlySerializedHtml:void 0,screenshotUrl:void 0,boundingBox:void 0,selector:void 0,hybridSelector:void 0,generatedSelectors:void 0,id:-1}}function XU(r,e){return xo(r.memory,e.memory)?{...r,memory:e.memory,updatedAt:e.updatedAt}:r}function sg(r,e){return r?xo(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:pl(e.target),updatedAt:e.updatedAt}}function JU(r,e){let t=Lu(r);return t.fromTarget?xo(r.fromTarget?.memory,e.fromTarget?.memory)&&(t.fromTarget={...t.fromTarget,memory:e.fromTarget?.memory},t.updatedAt=e.updatedAt):(t.fromTarget=e.fromTarget,t.fromTarget&&(t.fromTarget=pl(t.fromTarget),t.updatedAt=e.updatedAt)),t.toTarget?xo(r.toTarget?.memory,e.toTarget?.memory)&&(t.toTarget={...t.toTarget,memory:e.toTarget?.memory},t.updatedAt=e.updatedAt):(t.toTarget=e.toTarget,t.toTarget&&(t.toTarget=pl(t.toTarget),t.updatedAt=e.updatedAt)),t}function gA({newEntries:r,originalCachesMap:e,logger:t}){let n=[];for(let o of r){let i=e[o.key];if(!i||!i.cache){n.push(o);continue}if(o.value.type!==i.type){n.push(o);continue}let a=o.value.cache;if(o.value={...i},!a){n.push(o);continue}if("memory"in a&&a.memory){let s=i.cache&&"memory"in i.cache?i.cache.memory:void 0;xo(s,a.memory)&&(o.value.cache=XU(i.cache,a),n.push(o))}else if("target"in a&&a.target.memory){let s=i.cache&&"memory"in i.cache?i.cache.memory:void 0;if(xo(s,a.target.memory)){let c=fr.safeParse(o.value.cache);o.value.cache=sg(c.data,a),n.push(o)}}else if("fromTarget"in a||"toTarget"in a){let s=Sm.optional().parse(o.value.cache);if(!s)continue;let c={from:s.fromTarget?.memory,to:s.toTarget?.memory},l={from:i.cache&&"fromTarget"in i.cache?i.cache.fromTarget?.memory:void 0,to:i.cache&&"toTarget"in i.cache?i.cache.toTarget?.memory:void 0};xo(l,c)&&(o.value.cache=JU(s,a),n.push(o))}}return n}async function Du({cacheStorage:r,logger:e,schemaVersion:t,stepLists:n,testId:o}){let i=Lu(n.steps),a=Lu(n.beforeSteps)??void 0,s=Lu(n.afterSteps)??void 0,c={steps:i,beforeSteps:a,afterSteps:s};try{await r.resolveStepCacheEntries({testId:o,stepLists:c,schemaVersion:t,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 fA(r){let e=[];for(let t of r){t.sort((a,s)=>a.timestamp-s.timestamp);let n=[],o,i=1;for(let a of t)o&&o.text===a.text&&o.type===a.type&&JSON.stringify(o.args??null)===JSON.stringify(a.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:n.push(o)),o=a,i=1);o&&n.push(o),e.push(n)}return e}import{cloneDeep as wde}from"lodash-es";import lg from"semver";function ku(r,e){if(r!=="0.0.1"&&r!==e[e.length-1].toVersion)throw new Error("Please bump latestSchemaVersion in types package after adding a migration");e.forEach((t,n)=>{if(!lg.valid(t.toVersion)||!lg.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!lg.gt(t.toVersion,t.fromVersion))throw new Error(`Migration '${t.name}' has toVersion <= fromVersion`);if(n===0)return;if(e[n-1].toVersion!==t.fromVersion)throw new Error(`Migration '${t.name}' at index ${n} is not contiguous with previous migration`)})}import QU from"diff-lines";import ZU,{gte as eF}from"semver";function tF(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function cg({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>ZU.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&&eF(l,n)){t.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 SA(i,p),l=p.toVersion}catch(h){throw t.error({err:h,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${h}`)}}let u=QU(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&t.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function SA(r,e){let t=await e.execute(r);for(let n of t)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||tF(i)&&(n[o]=await SA(i,e))}return t}var yA={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 r=>r.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var rF=[yA];ku(Gm,rF);var EA={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>(r=r.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),r=r.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),r)};var bA={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,n=t[t.length-1];return n&&n.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var nF=["target","fromTarget","toTarget"];function TA(r){for(let e of nF){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var vA={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":return TA(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])TA(n);return e}default:return e}})};import{v4 as oF}from"uuid";var AA={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=oF()),e;default:return e}})};import{v4 as RA}from"uuid";var wA={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??RA(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??RA()}})),delete e.commands),e;default:return e}})};var CA={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as iF}from"uuid";var xA={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>("id"in e&&typeof e.id=="string"||(e.id=iF()),e))};import{v4 as _A}from"uuid";var IA={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=_A())}return e.id=_A(),e})};var MA={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as aF}from"uuid";var PA={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=aF()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var OA={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var LA={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&NA(t),e})};function NA(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){NA(r[e]);return}if(typeof r[e]!="string")return;let t=r[e];e==="code"?r[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(r[e]=t.replace(/inputs\./g,"env."))})}var DA={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var kA={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var UA={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var FA={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t)return e;if(t.type==="SELECT_OPTION"){if(t.option===void 0)return e;t.choice={type:"VALUE",value:t.option},t.option=void 0}else if(t.type==="TAB"){if(t.url===void 0)return e;t.action={type:"SUBSTRING",substring:t.url},t.url=void 0}else if(t.type==="WAIT_FOR_URL"){if(t.url===void 0)return e;t.matcher={type:"GLOB",glob:t.url},t.url=void 0}else t.type==="AI_WAIT"&&(t.type="AI_ASSERTION",t.timeout||(t.timeout=10));return e})};var BA={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="MOCK_ROUTE"&&t.type!=="SET_HEADER"&&t.type!=="RECORD_REQUESTS"&&t.type!=="REGISTER_REQUEST_LISTENER"||(t.type==="REGISTER_REQUEST_LISTENER"||t.type==="RECORD_REQUESTS"?t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.pattern}}:(t.type==="SET_HEADER"||t.type==="MOCK_ROUTE")&&t.urlPattern&&(t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.urlPattern}})),e})};var HA={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 r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var zA={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async r=>r.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Uu=new Set(["CLICK","TYPE","SELECT_OPTION"]),GA={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type,o=t?.elementDescriptor;return(o!==void 0||Uu.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Uu.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||Uu.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||Uu.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var jA={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var VA={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type;return n?.startsWith("PRESET_")&&(t.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var $A=[zA,jA,VA,GA,EA,bA,vA,AA,wA,CA,xA,IA,MA,PA,OA,LA,DA,kA,UA,FA,BA,HA];ku(Re,$A);async function _a({metadata:r,steps:e,logger:t,toVersion:n}){return await cg({metadata:r,steps:e,logger:t,toVersion:n,migrations:$A})}import{cloneDeep as Fde}from"lodash-es";import{v4 as Wde}from"uuid";import{cloneDeep as lF}from"lodash-es";import JA from"truncate-json";import{v4 as WA}from"uuid";import{cloneDeep as ape,unset as spe}from"lodash-es";function tn(r){switch(r.type){case"AI_ACTION":return`AI action: ${dt(r.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${dt(r.text,100)}`;case"PRESET_ACTION":return Co(r.command);case"MODULE":return`Module: ${r.id}`;case"RESOLVED_MODULE":return`Module: ${r.name}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section${r.description?`with goal: ${dt(r.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}function Ia(r,e){return r.split(`
35
35
  `).map(t=>" ".repeat(e)+t).join(`
@@ -38,17 +38,17 @@ ${Ia(`Number of sub-steps: ${e}`,2)}`}case"PRESET_ACTION":return Co(r.command,!1
38
38
  `)}case"RESOLVED_MODULE":return`Module: ${r.name}`;case"CONDITIONAL":{let e=["Conditional step"];if("assertionResult"in r&&r.assertionResult&&(e.push(Ia("Conditional check:",2)),e.push(Ia(ug(r.assertionResult),2))),"results"in r&&Array.isArray(r.results)){let t=r.results.length,n="assertionResult"in r&&r.assertionResult?"Branch steps":"Else branch steps";e.push(Ia(`${n}: ${t}`,2))}return e.join(`
39
39
  `)}case"SECTION":{let e="results"in r&&Array.isArray(r.results)?r.results.length:0;return`Section${r.description?`with goal: ${r.description}`:""}
40
40
  ${Ia(`Number of sub-steps: ${e}`,2)}`}default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}var qA=1e3,KA=5e7,cF="[FAILED]";async function YA(r,e,t){if(t){let n=await e.getScreenshot(r,t);if(n)return`data:image/jpeg;base64,${Buffer.from(n).toString("base64")}`}}function uF(r,e){let t=(()=>{switch(r.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":return"AI action";case"PRESET_ACTION":return"Preset action";case"MODULE":return"Module";case"CONDITIONAL":return"Conditional step";case"SECTION":return"Section";default:return(i=>{throw new Error("You missed a case in the switch above")})(r)}})();return QA(r)?r.message||"Section start placeholder":(o=>e?`${e==="start"?"Start":"End"} of ${t}
41
- ${o}`:o)(ug(r))}function dF(r,{unflattenedIndex:e,parentStep:t}){if(!(e===void 0||QA(r))){if(t){let n=`sub-step ${e}`;switch(t.type){case"MODULE":return`${n} within module '${t.moduleName??t.id}'`;case"AI_ACTION":case"AI_ACTION_DYNAMIC":return`${n} within AI action`;case"CONDITIONAL":return`${n} within conditional step`;default:return n}}return`step ${e}`}}function QA(r){return r.type==="PRESET_ACTION"&&r.command?.type==="SUCCESS"&&!!r.message?.match(/^Starting the [\w- ]+ section$/)}function Bu(r,e={}){let t=e.followingStepStart??e.precedingStepEnd??new Date;return{type:"PRESET_ACTION",id:WA(),message:`Starting the ${r.replace(/-/g," ")} section`,startedAt:t,finishedAt:t,status:"SUCCESS",command:{id:WA(),type:"SUCCESS"},results:[]}}function Fu(r,e={}){let{index:t,includeDomState:n=!1,header:o,unflattenedIndex:i,parentStep:a,includeUserFacingStepReference:s}=e,c=uF(r,o),l;r.type==="PRESET_ACTION"&&(l=r.results?.[0]?.elementInteracted);let u=r.message!=="Successfully executed preset action."?r.message:void 0,d=c;r.status==="FAILED"&&(d=`${cF} ${d}`);let p={description:d,startedAt:r.startedAt.toISOString(),finishedAt:r.finishedAt.toISOString(),beforeUrl:r.beforeUrl,afterUrl:r.afterUrl,beforeSnapshot:r.beforeSnapshot,afterSnapshot:r.afterSnapshot,elementInteracted:l,message:u,index:t};if(s&&(p.userFacingStepReference=dF(r,{parentStep:a,unflattenedIndex:i})),r.status==="FAILED"&&n)try{let m=wb.array().parse(r.details);for(let h of m)"pageState"in h&&(p.pageState=h.pageState)}catch{}return p}async function ZA(r,e,t,{addIndices:n=!0,includeDomState:o=!1,flatten:i=!0,maxItemsFromEnd:a=15,indexOffset:s=0,isTopLevelResultList:c=!0,includeUserFacingStepReference:l,parentStep:u}){let d,p=[];for(let m=0;m<t.length;m++){let h=t[m],g=n?m+s:void 0,f=c?m-1:m;switch(h.type){case"PRESET_ACTION":{p.push(Fu(h,{index:g,includeDomState:o,includeUserFacingStepReference:l,header:void 0,unflattenedIndex:f,parentStep:u})),h.status==="FAILED"&&(d=g);break}case"CONDITIONAL":case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":case"SECTION":{if(i){p.push(Fu(h,{index:n?g:void 0,includeDomState:o,includeUserFacingStepReference:l,header:"start",unflattenedIndex:f,parentStep:u})),s+=1;let{failureIndex:y,results:S}=await ZA(r,e,h.results,{addIndices:n,includeDomState:o,includeUserFacingStepReference:l,flatten:i,maxItemsFromEnd:a,indexOffset:s+m,isTopLevelResultList:!1,parentStep:h});p.push(...S),y!==void 0?d=y:h.status==="FAILED"&&(d=g),s+=S.length,p.push(Fu(h,{index:n?s+m:void 0,includeDomState:o,includeUserFacingStepReference:l,parentStep:u,header:"end"}))}else p.push(Fu(h,{index:n?s+m:void 0,includeDomState:o,includeUserFacingStepReference:l,parentStep:u,header:void 0}));break}default:return(S=>{throw new Error("You missed a case in the switch above")})(h)}}return{results:p,failureIndex:d}}async function Ma(r,e,t,{numStepsWithScreenshots:n=5,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,includeUserFacingStepReference:s,flatten:c=!0,maxItemsFromEnd:l=20}){let u=await ZA(r,e,t,{addIndices:o,includeUserFacingStepReference:s,includeDomState:a,flatten:c,maxItemsFromEnd:l,indexOffset:0}),{results:d}=u,{failureIndex:p}=u;p!==void 0&&d.length>0&&(d=d.slice(0,p+1));let m=[],h=0;if(l!==void 0&&d.length>l&&(h=d.length-l),p!==void 0&&p<d.length-1&&r.warn({failureIndex:p,flattenedResultsLength:d.length,lastIndex:d.length-1,isLastIndex:p===d.length-1,offset:h},"PROCESS_RESULTS_FOR_LLM: Failure index check - should not be possible"),p!==void 0&&h>p)throw new Error("Failure index is out of bounds");for(let g=h;g<d.length;g++){let f=d[g],y={description:f.description,startedAt:f.startedAt,finishedAt:f.finishedAt,beforeUrl:f.beforeUrl,afterUrl:f.afterUrl,elementInteracted:f.elementInteracted,userFacingStepReference:f.userFacingStepReference,message:f.message,pageState:f.pageState,index:f.index},S,T;(n===void 0||n>0&&g>=d.length-n)&&(f.afterSnapshot&&(T=await YA(r,e,f.afterSnapshot)),i&&f.beforeSnapshot&&(S=await YA(r,e,f.beforeSnapshot))),y.beforeScreenshot=S,y.afterScreenshot=T,m.push(y)}return{results:m,failureIndex:p!==void 0?p-h:void 0}}function Pa({json:r,keysToRedact:e,maxJsonStringSize:t}){try{if(!r)return r;if(typeof r=="string")return dt(r,t??2e4);if(typeof r=="object"){let{jsonString:n}=JA(JSON.stringify(r,(o,i)=>e?.includes(o)||typeof i=="string"&&i.length>3e4?"REDACTED":i),t??2e4);return JSON.parse(n)}return r}catch{return r}}function dg(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=JA(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.details&&(n.details=void 0),n.type){case"PRESET_ACTION":XA(n);break;case"CONDITIONAL":n.assertionResult&&XA(n.assertionResult),dg(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":{dg(n.results,e);break}default:return(i=>{throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")})(n)}}}function XA(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Hu(r,e){let t=lF(r);if(dg(t,e),t.length>qA)return e.error("Results too long, truncating before insertion"),t.slice(t.length-qA,t.length);let n=JSON.stringify(t);if(n.length>KA)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>KA;)t.splice(0,1),n=JSON.stringify(t);try{return xt.array().parse(JSON.parse(n))}catch(o){throw e.error({serialized:n,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as _pe}from"lodash-es";var pF=/^(?!.*\S+\s+\S+).*$/,mF=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,hF=/style="([^"]*)/g,gF=/data-[\w-]+/g,fF=r=>{switch(r.type){case"AI_ASSERTION":return{type:r.type,assertion:r.assertion};case"DRAG":if(r.fromTarget.type==="description")return{type:r.type,description:r.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(r.target?.type==="description")return{type:r.type,description:r.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function eR(r){let e=fF(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:pF.test(t)&&mF.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:hF.test(t)?{thoughts:"Style tags are not recommended in the command description as they change frequently. Please remove them and describe the target in a different way.",category:"STYLE_TAG"}:gF.test(t)?{thoughts:"Hardcoded data attributes are not recommended in the command description as they change frequently.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:`The element description you provided starts with the command type (${e.type}). This can confuse our AI agents since the element itself is unrelated to the desired action.`,category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}import{diff as SF}from"deep-object-diff";import{diff as rR}from"deep-object-diff";import{cloneDeep as tR}from"lodash-es";import{v4 as pg}from"uuid";async function tt(r){let e=new Map,t=new Set,n=po.parse({steps:r.stepLists.steps??[],beforeSteps:r.stepLists.beforeSteps??void 0,afterSteps:r.stepLists.afterSteps??void 0}),o=tR(n.steps),i=await Ti({...r,steps:o,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),a={stepsToSave:{steps:i.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:i.cachesToSave,moduleUpdates:i.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let c=tR(n[s]);if(!c)continue;let l=await Ti({...r,steps:c,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});a.cachesToSave.push(...l.cachesToSave),a.moduleUpdates.push(...l.moduleUpdates),a.stepsToSave[s]=l.stepsToSave}return a}async function Ti({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:c}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(delete u.index,delete u.aiSuggested,u.id=c?pg():u.id,u.type){case"PRESET_ACTION":{let p=u.command;p.id=c?pg():p.id,"cache"in p&&p.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(ag({id:p.id,orgId:n.orgId,testId:n.testId,value:Gn.parse(p),moduleIdParents:o,moduleStepParents:i}))),delete p.cache),p.thoughts&&delete p.thoughts,l.stepsToSave.push({...u,command:p});break}case"RESOLVED_MODULE":{let p=c?pg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await Ti({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,p],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(f),l.cachesToSave=l.cachesToSave.concat(h),t.has(m)||(t.add(m),l.moduleUpdates.push({...cr.parse(u),steps:Ye.array().parse(g),moduleId:m}));let y=Jr.parse({...u,type:"MODULE",moduleId:m,inputs:u.inputs,id:p,skipped:u.skipped,cacheConfig:u.cacheConfig,envKey:u.envKey});l.stepsToSave.push(y);break}case"AI_ACTION":{if(!u.steps){l.stepsToSave.push(u);break}let{stepsToSave:p,cachesToSave:m}=await Ti({...e,steps:u.steps});try{u.steps=Sr.array().parse(p)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}l.stepsToSave.push(u),l.cachesToSave=l.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{l.stepsToSave.push(u);break}case"CONDITIONAL":{let p=[];for(let h of u.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:y}=await Ti({...e,steps:h.steps});p.push({...h,steps:g}),l.cachesToSave=l.cachesToSave.concat(f),l.moduleUpdates=l.moduleUpdates.concat(y)}let m={...u,elseSteps:void 0,blocks:p};if(u.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Ti({...e,steps:u.elseSteps});m.elseSteps=h,l.cachesToSave=l.cachesToSave.concat(g),l.moduleUpdates=l.moduleUpdates.concat(f)}l.stepsToSave.push(m);break}case"SECTION":{let{stepsToSave:p,cachesToSave:m,moduleUpdates:h}=await Ti({...e,steps:u.steps}),g={...u,steps:p};l.moduleUpdates=l.moduleUpdates.concat(h),l.stepsToSave.push(g),l.cachesToSave=l.cachesToSave.concat(m);break}default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(u)}return l}async function zu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=rR(o,i);if(Object.keys(a).length!==0){r.debug("Updating step caches post-success");try{let{cachesToSave:s}=await tt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries({logger:r,testId:n,entries:s})}catch(s){r.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async function Gu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=rR(o,i);if(Object.keys(a).length===0)return;r.debug("Updating memory post-run failure");let s={};for(let u of["steps","beforeSteps","afterSteps"]){let d=o[u];if(!d||!d.length)continue;let p=hA({steps:d});for(let[m,h]of Object.entries(p))s[m]=h}let{cachesToSave:c}=await tt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});r.debug({newEntries:c.length,originalCaches:Object.keys(s).length},"Comparing caches for memory pruning");let l=gA({newEntries:c,originalCachesMap:s,logger:r});if(l.length){r.debug({prunedCaches:l},"Saving pruned memory post-failure");try{await e.saveStepCacheEntries({logger:r,testId:n,entries:c})}catch(u){r.error({err:u},"Failed to save memory after successful execution. This is not critical, but can impact future performance.")}}}async function oR(r,e){let[t,n]=await Promise.all([tt({stepLists:{beforeSteps:r.beforeSteps??[],steps:r.steps??[],afterSteps:r.afterSteps??[]}}),tt({stepLists:{beforeSteps:e.beforeSteps??[],steps:e.steps??[],afterSteps:e.afterSteps??[]}})]),o=[],i=[],a=["steps","beforeSteps","afterSteps"];for(let s of a){let c=t.stepsToSave[s]??[],l=n.stepsToSave[s]??[];yF(c,l,s,o,i)}return{additions:o,deletions:i}}function nR(r){let e=new Map;for(let t=0;t<r.length;t++){let n=r[t];n&&e.set(n.id,{step:n,index:t})}return e}function yF(r,e,t,n,o){let i=nR(r),a=nR(e);for(let[s,{step:c,index:l}]of a){let u=i.get(s);if(!u)n.push({index:l,section:t,step:c});else{let d=SF(u.step,c);Object.keys(d).length>0&&(n.push({index:l,section:t,step:c}),o.push({index:u.index,section:t,step:u.step}))}}for(let[s,{step:c,index:l}]of i)a.has(s)||o.push({index:l,section:t,step:c})}function iR(r,e){if(!(!r.envs||!r.envs.length)){for(let t of r.envs){let n=t;e in t&&(n[e]&&(t.default=!0),delete n.defaultOnCloud,delete n.defaultOnLocal)}r.envs.some(t=>t.default)||(r.envs[0].default=!0)}}import{cloneDeep as aR}from"lodash-es";async function sR({rawSteps:r,metadata:e,logger:t,callbacks:n}){iR(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await ju({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let c of["beforeSteps","afterSteps"]){let l=r[c];if(!l)continue;let{resolvedSteps:u}=await ju({rawSteps:l,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});s[c]=u}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function vi(r,e,t){let{newVersion:n,steps:o}=await _a({metadata:r,steps:e,logger:t});try{return{steps:Ye.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new ks(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function ju({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await vi(e,r,t),s=[];for(let c of a)s.push(await hl({step:c,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function hl({step:r,callbacks:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"AI_ACTION":return r;case"AI_ACTION_DYNAMIC":return r;case"PRESET_ACTION":return r;case"MODULE":{let c=r.moduleId,l=n[c];if(l)return{...aR(l),...r,type:"RESOLVED_MODULE"};let u=await e.onFetchModule({id:c,logger:t});if(!u)throw new Error(`Could not find module with id ${c}`);let{newVersion:d,steps:p}=await _a({metadata:{id:c,schemaVersion:u.schemaVersion},steps:u.steps,logger:t}),m;try{m=Ye.array().parse(p)}catch(f){throw t.error({type:"zod",err:f,steps:p,newVersion:d,id:c},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>hl({step:f,callbacks:e,logger:t,resolvedModuleCache:n})))}catch(f){throw t.error({err:f,...r},`Failed to recursively resolve module '${u.name}': ${f}`),f}let g={...u,steps:h};return n[c]=aR(g),{...g,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let c of r.blocks){let l=[];for(let u of c.steps)l.push(await hl({step:u,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...c,steps:l})}let i;if(r.elseSteps){i=[];for(let c of r.elseSteps)i.push(await hl({step:c,callbacks:e,logger:t,resolvedModuleCache:n}))}return{...r,blocks:o,elseSteps:i};case"SECTION":let a=[];for(let c of r.steps)a.push(await hl({step:c,callbacks:e,logger:t,resolvedModuleCache:n}));return{...r,steps:a};default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{cloneDeep as EF}from"lodash-es";import{stringify as lR}from"yaml";async function cR({test:r,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let n={id:r.id,name:r.name,description:r.description,baseUrl:r.baseUrl,schemaVersion:r.schemaVersion,advanced:r.advanced,retries:r.retries,envs:r.envs,disabled:r.disabled,labels:r.labels},o={},i=await bF({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:he.TEST,...n,beforeSteps:i.beforeSteps&&i.beforeSteps.length>0?i.beforeSteps:void 0,steps:i.steps,afterSteps:i.afterSteps&&i.afterSteps.length>0?i.afterSteps:void 0};return{test:lR(a),modules:o}}async function bF({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=EF(r);Object.values(o).forEach(s=>{TF(s??[])});let{stepsToSave:i,moduleUpdates:a}=await tt({stepLists:o,createNewCacheIds:n});for(let s of a)t.has(s.name)||(e[s.name]=vF(s),t.add(s.name));return i}function TF(r){bi({steps:r,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function vF(r){let e=cr.parse(r),t={fileType:he.MODULE,...e,schemaVersion:Re,steps:r.steps};return lR(t)}async function ie(r,e){if(!(r<=0))return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function gl({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,c)=>{function l(){clearInterval(a),e?.removeEventListener("abort",l),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",l,{once:!0}),(async()=>{try{s(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",l)}})()})}async function fl({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",s),!i&&a.abort()},e);o?.addEventListener("abort",s,{once:!0});try{return await gl({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function uR(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}function Vu(r){let e=[];for(let t of r)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let n={...t,type:"MODULE"};e.push(Jr.parse(n));break}case"SECTION":{let n={...t,steps:Vu(t.steps)};e.push(Ye.parse(n));break}case"CONDITIONAL":{let n={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Vu(o.steps)})),elseSteps:t.elseSteps?Vu(t.elseSteps):void 0};e.push(oi.parse(n));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function $u(r){return Vu([r])[0]}import AF from"picomatch";var Wu=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||AF(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}case"DOMAIN":{let o=t?.caseInsensitive?e.domain.toLowerCase():e.domain;n=new URL(r).hostname===o;break}}return t?.negated?!n:n},qu=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Oa=r=>{try{return new URL(r),!0}catch{return!1}},dR=r=>!r.toLowerCase().startsWith("http"),La=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Ai(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}async function RF(r){let{logger:e,browserStateStorage:t,generator:n,results:o,error:i,maxItemsFromEnd:a,numStepsWithScreenshots:s,disableCache:c}=r,l=[];if(o.length>0){let{results:d}=await Ma(e,t,o,{numStepsWithScreenshots:s,addIndices:!1,includeUserFacingStepReference:!0,maxItemsFromEnd:a,includeBeforeScreenshots:!0,includeContainerTagsInDescription:!0});l=d}return await n.getTestResultClassification({results:l,errorMessage:i.message,errorStack:i.stack},{disableCache:c??!1,loggerTags:Fe(e)})}async function pR(r){let{logger:e,browserStateStorage:t,generator:n,fullResults:o,failureReason:i,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l}=r,u=o?.results??[];if(i==="SetupFailureError"){let d=(o?.beforeResults??[]).at(0);u=[Bu("setup",{followingStepStart:d?.startedAt}),...o?.beforeResults??[]]}else if(i==="TeardownFailureError"){let d=u.at(-1),p=(o?.afterResults??[])[0],m=Bu("teardown",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...u,m,...o?.afterResults??[]]}else if(u.length<20){let d=(o?.beforeResults??[]).at(-1),p=u.at(0),m=Bu("main-test-body",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...o?.beforeResults??[],m,...u]}if(!t||!u||u.length===0)return{};try{let d=await RF({logger:e,browserStateStorage:t,generator:n,results:u,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l});return{classification:d,aiFailureReason:d.reason}}catch(d){return e.error({err:d},"Failed to classify test result"),{}}}import{v4 as mR}from"uuid";function mg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Ku=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:mg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(mT(e.type)){this.creditsUsedV2+=1;return}let t=uh(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=dh(e.command);this.creditsUsedV1+=n??0}}async flush(e){this.creditsUsedV1>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:mR(),properties:mg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:mR(),properties:mg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as wF}from"lodash-es";function hR(r){let e=wF(r);return bi({steps:e,earlyStop:!1,onPresetAction:t=>{hg(t);let n;if(_c(t.command)&&t.command.cache!==void 0){let i=xF(t.command.cache);i&&"target"in i&&(n=i.target)}let o=t.command;return n!==void 0?o.cache=n:delete o.cache,o.thoughts&&delete o.thoughts,delete o.id,"index"in t&&delete t.index,!1},onConditional:t=>(hg(t),!1),onSimpleStepContainer:t=>{if(t.type==="AI_ACTION"){let n=t,o=t.text;return Object.keys(n).forEach(i=>{delete n[i]}),n.type="AI_ACTION_DYNAMIC",n.text=o,!1}if(hg(t),t.type==="RESOLVED_MODULE"){let n=t;delete n.cacheConfig,delete n.enabled,delete n.defaultCacheKey,delete n.defaultCacheTtl,delete n.defaultCacheAllInvocations,delete n.autoAuth,delete n.advanced}return!1}}),e}function hg(r){let e=r;delete e.aiSuggested,delete e.id,delete e.retries,delete e.skipped}function CF(r){return r.selector?r.selector:r.generatedSelectors?.[0]}function gg(r){let e=CF(r),t=r.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),t&&(n.nodeOnlySerializedHtml=t),Object.keys(n).length?n:void 0}function xF(r){if(!r)return;let e={};if("target"in r)return{target:gg(r.target)};if("fromTarget"in r||"toTarget"in r){let t=r.fromTarget?gg(r.fromTarget):void 0,n=r.toTarget?gg(r.toTarget):void 0;return t&&(e.fromTarget=t),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}function _o({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i,bustOldestCachePercentage:a}){return i?new Eu:new fg(r,e,t,{regenerateCache:n,alwaysSaveCache:o,bustOldestCachePercentage:a})}var fg=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a,bustOldestCachePercentage:s}=o,{gitBranchName:c,gitProtectedBranches:l}=n;this.cacheHeaders=Fh(n),this.readCaches=!i;let u=c&&l.includes(c);a||!u?this.writeCaches=!0:this.writeCaches=!1,u||(this.bustOldestCachePercentage=s)}cacheHeaders;readCaches;writeCaches;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}if(this.bustOldestCachePercentage!==void 0){let s=Object.entries(i).map(([u,d])=>({key:u,time:d.value.cache?.updatedAt?.getTime()??0}));s.sort((u,d)=>u.time-d.time);let c=s.length,l=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));s.slice(0,l).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:l,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches")}for(let s of[t,n,o])s&&xa({steps:s,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await tt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import _F from"path";var IF=new wu(30,60*1e3),bg="https://api.momentic.ai",yg,fR=r=>{bg=r},yr=()=>bg,SR=()=>yg;var Na,Eg,Xu,yR=async r=>{if(yg&&Na&&Xu)return Na;let e=new Je({baseUrl:bg,apiKey:r,logger:E});yg=e;try{let t=await e.getAuthInfo();return Na=t.orgId,Eg=t.userId,Xu=r,Na}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},At=()=>{if(!Na)throw new Error("Your organization ID is invalid.");return Na},Io=()=>{if(!Eg)throw new Error("Your user ID is invalid.");return Eg},Er=()=>{if(!Xu)throw new Error("Your API key is invalid.");return Xu},Tg,Sg,Ju=(r,e)=>{Tg=r,Sg?.abort(),Sg=new AbortController;let t=Sg.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=_F.resolve(r.rootDir,o.envFile);try{if(Yu.lstatSync(i).isSymbolicLink())return;Yu.existsSync(i)&&n.push(i)}catch(a){E.warn({err:a},`Failed to check if env file ${i} exists`)}});try{MF({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){E.error({err:o},"Failed to start config file watchers")}},ae=()=>Tg;function MF({filesToWatch:r,revalidator:e,signal:t,project:n}){E.debug("Starting watch on the following files:"),r.forEach(o=>{E.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(IF.increment("setLocalProject")&&E.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Tg=await Promise.resolve(e(n.configFilePath)))};Yu.watchFile(o,{persistent:!1},i);let a=()=>{Yu.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function xe(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var yl=PF();function Sl(r){let e=ae(),t=Mt.dirname(e.configFilePath);return Mt.join(t,...r)}function LF(r){let e=ae(),t=Mt.dirname(e.configFilePath),n=Mt.relative(t,r);return n?n.split(Mt.sep):[]}function NF(r,e){let t=ir.statSync(r),n=LF(r);return Mh.parse({name:e,absolutePath:r,relativePath:n.join(Mt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}yl.post("/",xe(async(r,e,t)=>{let n;try{n=LT.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Sl(n);if(!ir.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Mt.sep)}`});return}if(!ir.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Mt.sep)}`});return}let a=ae(),s=Array.from(a.config.exclude??[]).concat(hu),l=OF("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Mt.join(o,d);return NF(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));yl.put("/",xe(async(r,e,t)=>{let n;try{n=NT.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Sl(n);if(ir.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Mt.sep)}`,pathSegments:n});return}ir.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Mt.sep)}`,pathSegments:n};e.status(201).json(i)}));yl.patch("/",xe(async(r,e,t)=>{let n,o;try{let l=DT.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Sl(n),a=Sl(o);if(!ir.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Mt.sep)}`});return}if(ir.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Mt.sep)}`});return}let s=Mt.dirname(a);ir.existsSync(s)||ir.mkdirSync(s,{recursive:!0}),ir.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Mt.sep)} to ${o.join(Mt.sep)}`,pathSegments:o};e.status(200).json(c)}));yl.delete("/",xe(async(r,e,t)=>{let n,o=!0;try{let c=kT.parse(r.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Sl(n);if(!ir.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Mt.sep)}`,pathSegments:n});return}if(!ir.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Mt.sep)}`});return}if(o)ir.rmSync(i,{recursive:!0,force:!0});else{if(ir.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}ir.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var vg=yl;import{Router as BB}from"express";import{diff as FF}from"deep-object-diff";import nn from"fs";import wi from"path";import Da from"yaml";import{z as TR}from"zod";import{execSync as DF}from"child_process";function Kn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,E.debug({postSaveCommand:n},"Executing post-save hook command");try{DF(n,{encoding:"utf-8"})}catch(o){E.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as ER}from"deep-object-diff";import An from"fs";import{cloneDeep as kF}from"lodash-es";import El from"path";import{v4 as UF}from"uuid";import bl from"yaml";function br({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!An.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=An.readFileSync(i,"utf-8"),s=bl.parse(a),c;if(r.name&&r.name!==s.name){let m=`${De(r.name)}.module.yaml`;if(c=El.join(El.dirname(i),m),An.existsSync(c))throw new Error(`A conflicting file '${r.name}' already exists at path '${c}'`)}let l={...r,schemaVersion:e},u=vn({fileType:he.MODULE,...Lh.parse(l),steps:Ye.array().parse(r.steps)}),d=ER(u,s);if(d&&Object.keys(d).length===0&&!o){E.debug(`Skipping save for module ${r.moduleId} since there are no changes`);return}let p=bl.stringify(u);An.writeFileSync(i,p,"utf-8"),c&&An.renameSync(i,c),Kn(c||i,n.config)}function bR({moduleId:r,content:e,momenticFiles:t,project:n,logger:o}){let i=t.modules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${r} that could not be found on disk`);let a=Yn(i,o),s={...a,...e},c=vn({fileType:he.MODULE,...Lh.parse(s),steps:a.steps}),l=ER(c,a);if(l&&Object.keys(l).length===0){E.debug(`Skipping save for module ${r} since there are no changes`);return}let u=bl.stringify(c);An.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${De(e.name)}.module.yaml`;if(d=El.join(El.dirname(i),p),An.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);An.renameSync(i,d)}Kn(d||i,n.config)}async function Qu({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=De(r),s=El.join(o,`${a}.module.yaml`),c=UF(),{stepsToSave:l}=await tt({stepLists:{steps:n}}),u={fileType:he.MODULE,schemaVersion:Re,moduleId:c,name:r,description:e,enabled:t,steps:l.steps},d=bl.stringify(u);return An.writeFileSync(s,d,"utf-8"),Kn(s,i.config),{moduleId:c,name:r,description:e,enabled:t,steps:n}}function Yn(r,e){let t=An.readFileSync(r,"utf-8"),n=bl.parse(t);try{return Eh.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic module`),o}}async function rn(r,e,t,n){let o=Yn(r.fullFilePath,t),{resolvedSteps:i}=await ju({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:s})=>{let c=e.modules[s]?.fullFilePath;if(c)return Yn(c,t)}}}),a={...o,steps:i};return n&&(n[r.id]=kF(a)),a}async function Zu(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await rn(n,r,e,t)})),Array.from(Object.values(t))}async function vR({test:r,name:e,folder:t}){let n=await cR({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${De(e)}.test.yaml`,a=wi.join(t,i);return nn.writeFileSync(a,n.test,"utf-8"),a}function Ag(r,e,t){let n=wi.join(t.rootDir,r);if(!nn.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=nn.readFileSync(n,"utf-8"),i=Da.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${De(e.name)}.test.yaml`;if(a=wi.join(wi.dirname(r),p),s=wi.join(t.rootDir,a),nn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=Nr.parse(c),u={fileType:he.TEST,...Nr.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=Da.stringify(u);return nn.writeFileSync(n,d,"utf-8"),s&&nn.renameSync(n,s),Kn(n,t.config),{newRelativeTestPath:a}}function pr({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=wi.join(n.rootDir,r);if(!nn.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=nn.readFileSync(i,"utf-8"),s=Da.parse(a),c=Nr.parse({...s,schemaVersion:t}),l=Ye.array().or(TR.undefined()).parse(e.beforeSteps),u=Ye.array().parse(e.steps),d=Ye.array().or(TR.undefined()).parse(e.afterSteps),p=vn({fileType:he.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=FF(p,s);if(m&&Object.keys(m).length===0&&!o){E.debug(`Skipping save for test ${c.name} since there are no changes`);return}let h=Da.stringify(p);nn.writeFileSync(i,h,"utf-8"),E.debug(`Saving test ${c.name} to ${i}`),Kn(i,n.config)}function Tl(r,e){let t=wi.join(e.rootDir,r);if(!t)throw new Error(`Could not find test with path ${r} in Momentic project (${e.rootDir})`);let n;try{n=nn.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
42
- `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Da.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return Kt.parse(o)}function Ci(r,e,t){let n=t.project.rootDir,o;try{o=nn.readFileSync(r,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Da.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${r} is missing steps`);return i}async function lt(r,e,t){let n=Ci(r,e,t),o;try{o=Nr.parse(n)}catch(a){throw new Error(`Test ${r} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await sR({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=t.modules[a]?.fullFilePath;if(c)return Yn(c,s)}}});return i}import BF from"@dotenvx/dotenvx";import HF from"fs";import AR from"path";function ed(r,e){return(r.config.environments??[]).map(t=>xi(t.name,r,e))}function RR(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function zF(r){let{envVariables:e,project:t}=r;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=RR(i);s&&(n[o]=s);continue}let a;try{a=HF.readFileSync(AR.resolve(t.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&&E.debug(n,"Set environment variables with interpolation from project configuration"),n}function GF(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=BF.config({path:AR.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function xi(r,e,t){let n=(e.config.environments??[]).find(c=>c.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);if(!n.baseUrl)throw new Error(`Browser environment ${r} does not have a baseUrl configured`);let o={[yt]:RR(n.baseUrl)},i=zF({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=GF({project:e,envFile:n.envFile,logger:t});return Object.assign(o,a),n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o,browser:n.browser}}import{existsSync as tB,readFileSync as rB,readdirSync as nB,writeFileSync as oB}from"fs";import{glob as iB}from"glob";import _i,{dirname as xR}from"path";import{cwd as _g}from"process";import _R from"yaml";import{z as je}from"zod";import wR from"fs";import{glob as jF}from"glob";import vl from"path";import VF from"yaml";import{z as Rg}from"zod";var CR=!1,wg=["**/*.test.yaml","**/*.module.yaml"],Cg=Rg.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),xg=15,$F=Rg.object({fileType:Rg.nativeEnum(he)});async function Z(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??wg,o=Array.from(r.config.exclude??[]).concat(hu),i=AbortSignal.timeout(5e3),a;try{a=await jF(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:xg,nodir:!0,signal:i})}catch(s){throw E.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=WF(r.rootDir,s,t,e?En:E);c&&(t.duplicateEntities[c.id]=c.paths)}return CR=!0,t}function WF(r,e,t,n){let o=vl.join(r,e),i=qF(o,n);if(!i)return;let a=KF(i,o,n);if(!a)return;let s=$F.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=YF(o,n);if(!l)return;let u=XF(e,o,l);switch(c){case he.TEST:try{return JF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case he.MODULE:try{return QF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case he.MOBILE_TEST:try{return eB(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case he.MOBILE_MODULE:try{return ZF(a,t,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 qF(r,e){try{return wR.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function KF(r,e,t){try{let n=VF.parse(r);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){t.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function YF(r,e){try{return wR.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function XF(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:vl.sep,fullPathSegments:e.split(vl.sep),relativePathSegments:r.split(vl.sep),fileName:vl.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function JF(r,e,t,n,o){let i=Nr.parse(r),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:he.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function QF(r,e,t,n,o){let i=cr.parse(r),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:he.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!CR&&De(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 ZF(r,e,t,n,o){let i=cu.parse(r),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=t.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:he.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function eB(r,e,t,n,o){let i=ya.parse(r),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=t.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:he.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}var ka="momentic.config.yaml",Ig="momentic.workspace.yaml",aB=je.object({projects:je.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),sB=je.union([je.string(),je.object({fromFile:je.string(),json:je.boolean().optional()})]),lB=je.object({name:Cg,baseUrl:je.string().optional().describe("Optional for mobile tests"),envFile:je.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:je.record(je.string(),sB).optional(),inheritFromShell:je.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:li.optional().describe("NB: most things should use project-level configuration only")}),cB=je.object({postSave:je.string().optional()}),uB=je.object({name:Cg,include:je.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:je.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:je.string().optional(),reporterDir:je.string().optional(),outputDir:je.string().optional(),recordVideo:je.boolean().optional(),retries:je.number().optional().describe("number of retries per test"),parallel:je.number().optional().describe("degree of parallelism"),environments:je.array(lB).optional(),gitMainBranch:je.string().optional(),gitProtectedBranches:je.string().array().optional(),ai:Nh.optional(),browser:li.optional(),emulator:vh.optional(),advanced:Dh.optional(),hooks:cB.optional()});function IR(r,e){let t;try{t=rB(r,"utf-8")}catch(o){E.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=_R.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){E.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function Mg(r){let e=IR(r,"project configuration");if(e!==void 0)try{return uB.parse(e)}catch(t){E.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function dB(r){let e=IR(r,"workspace configuration");if(e!==void 0)try{return aB.parse(e)}catch(t){E.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function pB(){let r=[],e=_g(),t=_i.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=_i.basename(e);if(mu.includes(i))return E.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of nB(e))if(a.endsWith(ka)){let s=_i.join(e,a),c=Mg(s);c&&r.push({configFilePath:s,config:c,rootDir:xR(s)})}if(r.length)return r;if(e=_i.dirname(e),e===t)break}return r}async function Rt(r={}){let{configFilePath:e,nameFilter:t}=r,n=await Pg(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
41
+ ${o}`:o)(ug(r))}function dF(r,{unflattenedIndex:e,parentStep:t}){if(!(e===void 0||QA(r))){if(t){let n=`sub-step ${e}`;switch(t.type){case"MODULE":return`${n} within module '${t.moduleName??t.id}'`;case"AI_ACTION":case"AI_ACTION_DYNAMIC":return`${n} within AI action`;case"CONDITIONAL":return`${n} within conditional step`;default:return n}}return`step ${e}`}}function QA(r){return r.type==="PRESET_ACTION"&&r.command?.type==="SUCCESS"&&!!r.message?.match(/^Starting the [\w- ]+ section$/)}function Bu(r,e={}){let t=e.followingStepStart??e.precedingStepEnd??new Date;return{type:"PRESET_ACTION",id:WA(),message:`Starting the ${r.replace(/-/g," ")} section`,startedAt:t,finishedAt:t,status:"SUCCESS",command:{id:WA(),type:"SUCCESS"},results:[]}}function Fu(r,e={}){let{index:t,includeDomState:n=!1,header:o,unflattenedIndex:i,parentStep:a,includeUserFacingStepReference:s}=e,c=uF(r,o),l;r.type==="PRESET_ACTION"&&(l=r.results?.[0]?.elementInteracted);let u=r.message!=="Successfully executed preset action."?r.message:void 0,d=c;r.status==="FAILED"&&(d=`${cF} ${d}`);let p={description:d,startedAt:r.startedAt.toISOString(),finishedAt:r.finishedAt.toISOString(),beforeUrl:r.beforeUrl,afterUrl:r.afterUrl,beforeSnapshot:r.beforeSnapshot,afterSnapshot:r.afterSnapshot,elementInteracted:l,message:u,index:t};if(s&&(p.userFacingStepReference=dF(r,{parentStep:a,unflattenedIndex:i})),r.status==="FAILED"&&n)try{let m=wb.array().parse(r.details);for(let h of m)"pageState"in h&&(p.pageState=h.pageState)}catch{}return p}async function ZA(r,e,t,{addIndices:n=!0,includeDomState:o=!1,flatten:i=!0,maxItemsFromEnd:a=15,indexOffset:s=0,isTopLevelResultList:c=!0,includeUserFacingStepReference:l,parentStep:u}){let d,p=[];for(let m=0;m<t.length;m++){let h=t[m],g=n?m+s:void 0,f=c?m-1:m;switch(h.type){case"PRESET_ACTION":{p.push(Fu(h,{index:g,includeDomState:o,includeUserFacingStepReference:l,header:void 0,unflattenedIndex:f,parentStep:u})),h.status==="FAILED"&&(d=g);break}case"CONDITIONAL":case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":case"SECTION":{if(i){p.push(Fu(h,{index:n?g:void 0,includeDomState:o,includeUserFacingStepReference:l,header:"start",unflattenedIndex:f,parentStep:u})),s+=1;let{failureIndex:y,results:S}=await ZA(r,e,h.results,{addIndices:n,includeDomState:o,includeUserFacingStepReference:l,flatten:i,maxItemsFromEnd:a,indexOffset:s+m,isTopLevelResultList:!1,parentStep:h});p.push(...S),y!==void 0?d=y:h.status==="FAILED"&&(d=g),s+=S.length,p.push(Fu(h,{index:n?s+m:void 0,includeDomState:o,includeUserFacingStepReference:l,parentStep:u,header:"end"}))}else p.push(Fu(h,{index:n?s+m:void 0,includeDomState:o,includeUserFacingStepReference:l,parentStep:u,header:void 0}));break}default:return(S=>{throw new Error("You missed a case in the switch above")})(h)}}return{results:p,failureIndex:d}}async function Ma(r,e,t,{numStepsWithScreenshots:n=5,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,includeUserFacingStepReference:s,flatten:c=!0,maxItemsFromEnd:l=20}){let u=await ZA(r,e,t,{addIndices:o,includeUserFacingStepReference:s,includeDomState:a,flatten:c,maxItemsFromEnd:l,indexOffset:0}),{results:d}=u,{failureIndex:p}=u;p!==void 0&&d.length>0&&(d=d.slice(0,p+1));let m=[],h=0;if(l!==void 0&&d.length>l&&(h=d.length-l),p!==void 0&&p<d.length-1&&r.warn({failureIndex:p,flattenedResultsLength:d.length,lastIndex:d.length-1,isLastIndex:p===d.length-1,offset:h},"PROCESS_RESULTS_FOR_LLM: Failure index check - should not be possible"),p!==void 0&&h>p)throw new Error("Failure index is out of bounds");for(let g=h;g<d.length;g++){let f=d[g],y={description:f.description,startedAt:f.startedAt,finishedAt:f.finishedAt,beforeUrl:f.beforeUrl,afterUrl:f.afterUrl,elementInteracted:f.elementInteracted,userFacingStepReference:f.userFacingStepReference,message:f.message,pageState:f.pageState,index:f.index},S,T;(n===void 0||n>0&&g>=d.length-n)&&(f.afterSnapshot&&(T=await YA(r,e,f.afterSnapshot)),i&&f.beforeSnapshot&&(S=await YA(r,e,f.beforeSnapshot))),y.beforeScreenshot=S,y.afterScreenshot=T,m.push(y)}return{results:m,failureIndex:p!==void 0?p-h:void 0}}function Pa({json:r,keysToRedact:e,maxJsonStringSize:t}){try{if(!r)return r;if(typeof r=="string")return dt(r,t??2e4);if(typeof r=="object"){let{jsonString:n}=JA(JSON.stringify(r,(o,i)=>e?.includes(o)||typeof i=="string"&&i.length>3e4?"REDACTED":i),t??2e4);return JSON.parse(n)}return r}catch{return r}}function dg(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=JA(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.details&&(n.details=void 0),n.type){case"PRESET_ACTION":XA(n);break;case"CONDITIONAL":n.assertionResult&&XA(n.assertionResult),dg(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":{dg(n.results,e);break}default:return(i=>{throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")})(n)}}}function XA(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Hu(r,e){let t=lF(r);if(dg(t,e),t.length>qA)return e.error("Results too long, truncating before insertion"),t.slice(t.length-qA,t.length);let n=JSON.stringify(t);if(n.length>KA)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>KA;)t.splice(0,1),n=JSON.stringify(t);try{return xt.array().parse(JSON.parse(n))}catch(o){throw e.error({serialized:n,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as _pe}from"lodash-es";var pF=/^(?!.*\S+\s+\S+).*$/,mF=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,hF=/style="([^"]*)/g,gF=/data-[\w-]+/g,fF=r=>{switch(r.type){case"AI_ASSERTION":return{type:r.type,assertion:r.assertion};case"DRAG":if(r.fromTarget.type==="description")return{type:r.type,description:r.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(r.target?.type==="description")return{type:r.type,description:r.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function eR(r){let e=fF(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:pF.test(t)&&mF.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:hF.test(t)?{thoughts:"Style tags are not recommended in the command description as they change frequently. Please remove them and describe the target in a different way.",category:"STYLE_TAG"}:gF.test(t)?{thoughts:"Hardcoded data attributes are not recommended in the command description as they change frequently.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:`The element description you provided starts with the command type (${e.type}). This can confuse our AI agents since the element itself is unrelated to the desired action.`,category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}import{diff as SF}from"deep-object-diff";import{diff as rR}from"deep-object-diff";import{cloneDeep as tR}from"lodash-es";import{v4 as pg}from"uuid";async function tt(r){let e=new Map,t=new Set,n=po.parse({steps:r.stepLists.steps??[],beforeSteps:r.stepLists.beforeSteps??void 0,afterSteps:r.stepLists.afterSteps??void 0}),o=tR(n.steps),i=await Ti({...r,steps:o,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),a={stepsToSave:{steps:i.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:i.cachesToSave,moduleUpdates:i.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let c=tR(n[s]);if(!c)continue;let l=await Ti({...r,steps:c,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});a.cachesToSave.push(...l.cachesToSave),a.moduleUpdates.push(...l.moduleUpdates),a.stepsToSave[s]=l.stepsToSave}return a}async function Ti({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:c}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(delete u.index,delete u.aiSuggested,u.id=c?pg():u.id,u.type){case"PRESET_ACTION":{let p=u.command;p.id=c?pg():p.id,"cache"in p&&p.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(ag({id:p.id,orgId:n.orgId,testId:n.testId,value:Gn.parse(p),moduleIdParents:o,moduleStepParents:i}))),delete p.cache),p.thoughts&&delete p.thoughts,l.stepsToSave.push({...u,command:p});break}case"RESOLVED_MODULE":{let p=c?pg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await Ti({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,p],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(f),l.cachesToSave=l.cachesToSave.concat(h),t.has(m)||(t.add(m),l.moduleUpdates.push({...cr.parse(u),steps:Ye.array().parse(g),moduleId:m}));let y=Jr.parse({...u,type:"MODULE",moduleId:m,inputs:u.inputs,id:p,skipped:u.skipped,cacheConfig:u.cacheConfig,envKey:u.envKey});l.stepsToSave.push(y);break}case"AI_ACTION":{if(!u.steps){l.stepsToSave.push(u);break}let{stepsToSave:p,cachesToSave:m}=await Ti({...e,steps:u.steps});try{u.steps=Sr.array().parse(p)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}l.stepsToSave.push(u),l.cachesToSave=l.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{l.stepsToSave.push(u);break}case"CONDITIONAL":{let p=[];for(let h of u.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:y}=await Ti({...e,steps:h.steps});p.push({...h,steps:g}),l.cachesToSave=l.cachesToSave.concat(f),l.moduleUpdates=l.moduleUpdates.concat(y)}let m={...u,elseSteps:void 0,blocks:p};if(u.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Ti({...e,steps:u.elseSteps});m.elseSteps=h,l.cachesToSave=l.cachesToSave.concat(g),l.moduleUpdates=l.moduleUpdates.concat(f)}l.stepsToSave.push(m);break}case"SECTION":{let{stepsToSave:p,cachesToSave:m,moduleUpdates:h}=await Ti({...e,steps:u.steps}),g={...u,steps:p};l.moduleUpdates=l.moduleUpdates.concat(h),l.stepsToSave.push(g),l.cachesToSave=l.cachesToSave.concat(m);break}default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(u)}return l}async function zu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=rR(o,i);if(Object.keys(a).length!==0){r.debug("Updating step caches post-success");try{let{cachesToSave:s}=await tt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries({logger:r,testId:n,entries:s})}catch(s){r.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async function Gu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=rR(o,i);if(Object.keys(a).length===0)return;r.debug("Updating memory post-run failure");let s={};for(let u of["steps","beforeSteps","afterSteps"]){let d=o[u];if(!d||!d.length)continue;let p=hA({steps:d});for(let[m,h]of Object.entries(p))s[m]=h}let{cachesToSave:c}=await tt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});r.debug({newEntries:c.length,originalCaches:Object.keys(s).length},"Comparing caches for memory pruning");let l=gA({newEntries:c,originalCachesMap:s,logger:r});if(l.length){r.debug({prunedCaches:l},"Saving pruned memory post-failure");try{await e.saveStepCacheEntries({logger:r,testId:n,entries:c})}catch(u){r.error({err:u},"Failed to save memory after successful execution. This is not critical, but can impact future performance.")}}}async function oR(r,e){let[t,n]=await Promise.all([tt({stepLists:{beforeSteps:r.beforeSteps??[],steps:r.steps??[],afterSteps:r.afterSteps??[]}}),tt({stepLists:{beforeSteps:e.beforeSteps??[],steps:e.steps??[],afterSteps:e.afterSteps??[]}})]),o=[],i=[],a=["steps","beforeSteps","afterSteps"];for(let s of a){let c=t.stepsToSave[s]??[],l=n.stepsToSave[s]??[];yF(c,l,s,o,i)}return{additions:o,deletions:i}}function nR(r){let e=new Map;for(let t=0;t<r.length;t++){let n=r[t];n&&e.set(n.id,{step:n,index:t})}return e}function yF(r,e,t,n,o){let i=nR(r),a=nR(e);for(let[s,{step:c,index:l}]of a){let u=i.get(s);if(!u)n.push({index:l,section:t,step:c});else{let d=SF(u.step,c);Object.keys(d).length>0&&(n.push({index:l,section:t,step:c}),o.push({index:u.index,section:t,step:u.step}))}}for(let[s,{step:c,index:l}]of i)a.has(s)||o.push({index:l,section:t,step:c})}function iR(r,e){if(!(!r.envs||!r.envs.length)){for(let t of r.envs){let n=t;e in t&&(n[e]&&(t.default=!0),delete n.defaultOnCloud,delete n.defaultOnLocal)}r.envs.some(t=>t.default)||(r.envs[0].default=!0)}}import{cloneDeep as aR}from"lodash-es";async function sR({rawSteps:r,metadata:e,logger:t,callbacks:n}){iR(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await ju({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let c of["beforeSteps","afterSteps"]){let l=r[c];if(!l)continue;let{resolvedSteps:u}=await ju({rawSteps:l,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});s[c]=u}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function vi(r,e,t){let{newVersion:n,steps:o}=await _a({metadata:r,steps:e,logger:t});try{return{steps:Ye.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new ks(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function ju({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await vi(e,r,t),s=[];for(let c of a)s.push(await hl({step:c,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function hl({step:r,callbacks:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"AI_ACTION":return r;case"AI_ACTION_DYNAMIC":return r;case"PRESET_ACTION":return r;case"MODULE":{let c=r.moduleId,l=n[c];if(l)return{...aR(l),...r,type:"RESOLVED_MODULE"};let u=await e.onFetchModule({id:c,logger:t});if(!u)throw new Error(`Could not find module with id ${c}`);let{newVersion:d,steps:p}=await _a({metadata:{id:c,schemaVersion:u.schemaVersion},steps:u.steps,logger:t}),m;try{m=Ye.array().parse(p)}catch(f){throw t.error({type:"zod",err:f,steps:p,newVersion:d,id:c},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>hl({step:f,callbacks:e,logger:t,resolvedModuleCache:n})))}catch(f){throw t.error({err:f,...r},`Failed to recursively resolve module '${u.name}': ${f}`),f}let g={...u,steps:h};return n[c]=aR(g),{...g,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let c of r.blocks){let l=[];for(let u of c.steps)l.push(await hl({step:u,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...c,steps:l})}let i;if(r.elseSteps){i=[];for(let c of r.elseSteps)i.push(await hl({step:c,callbacks:e,logger:t,resolvedModuleCache:n}))}return{...r,blocks:o,elseSteps:i};case"SECTION":let a=[];for(let c of r.steps)a.push(await hl({step:c,callbacks:e,logger:t,resolvedModuleCache:n}));return{...r,steps:a};default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{cloneDeep as EF}from"lodash-es";import{stringify as lR}from"yaml";async function cR({test:r,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let n={id:r.id,name:r.name,description:r.description,baseUrl:r.baseUrl,schemaVersion:r.schemaVersion,advanced:r.advanced,retries:r.retries,envs:r.envs,disabled:r.disabled,labels:r.labels},o={},i=await bF({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:me.TEST,...n,beforeSteps:i.beforeSteps&&i.beforeSteps.length>0?i.beforeSteps:void 0,steps:i.steps,afterSteps:i.afterSteps&&i.afterSteps.length>0?i.afterSteps:void 0};return{test:lR(a),modules:o}}async function bF({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=EF(r);Object.values(o).forEach(s=>{TF(s??[])});let{stepsToSave:i,moduleUpdates:a}=await tt({stepLists:o,createNewCacheIds:n});for(let s of a)t.has(s.name)||(e[s.name]=vF(s),t.add(s.name));return i}function TF(r){bi({steps:r,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function vF(r){let e=cr.parse(r),t={fileType:me.MODULE,...e,schemaVersion:Re,steps:r.steps};return lR(t)}async function ie(r,e){if(!(r<=0))return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function gl({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,c)=>{function l(){clearInterval(a),e?.removeEventListener("abort",l),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",l,{once:!0}),(async()=>{try{s(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",l)}})()})}async function fl({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",s),!i&&a.abort()},e);o?.addEventListener("abort",s,{once:!0});try{return await gl({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function uR(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}function Vu(r){let e=[];for(let t of r)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let n={...t,type:"MODULE"};e.push(Jr.parse(n));break}case"SECTION":{let n={...t,steps:Vu(t.steps)};e.push(Ye.parse(n));break}case"CONDITIONAL":{let n={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Vu(o.steps)})),elseSteps:t.elseSteps?Vu(t.elseSteps):void 0};e.push(oi.parse(n));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function $u(r){return Vu([r])[0]}import AF from"picomatch";var Wu=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||AF(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}case"DOMAIN":{let o=t?.caseInsensitive?e.domain.toLowerCase():e.domain;n=new URL(r).hostname===o;break}}return t?.negated?!n:n},qu=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Oa=r=>{try{return new URL(r),!0}catch{return!1}},dR=r=>!r.toLowerCase().startsWith("http"),La=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Ai(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}async function RF(r){let{logger:e,browserStateStorage:t,generator:n,results:o,error:i,maxItemsFromEnd:a,numStepsWithScreenshots:s,disableCache:c}=r,l=[];if(o.length>0){let{results:d}=await Ma(e,t,o,{numStepsWithScreenshots:s,addIndices:!1,includeUserFacingStepReference:!0,maxItemsFromEnd:a,includeBeforeScreenshots:!0,includeContainerTagsInDescription:!0});l=d}return await n.getTestResultClassification({results:l,errorMessage:i.message,errorStack:i.stack},{disableCache:c??!1,loggerTags:Fe(e)})}async function pR(r){let{logger:e,browserStateStorage:t,generator:n,fullResults:o,failureReason:i,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l}=r,u=o?.results??[];if(i==="SetupFailureError"){let d=(o?.beforeResults??[]).at(0);u=[Bu("setup",{followingStepStart:d?.startedAt}),...o?.beforeResults??[]]}else if(i==="TeardownFailureError"){let d=u.at(-1),p=(o?.afterResults??[])[0],m=Bu("teardown",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...u,m,...o?.afterResults??[]]}else if(u.length<20){let d=(o?.beforeResults??[]).at(-1),p=u.at(0),m=Bu("main-test-body",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...o?.beforeResults??[],m,...u]}if(!t||!u||u.length===0)return{};try{let d=await RF({logger:e,browserStateStorage:t,generator:n,results:u,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l});return{classification:d,aiFailureReason:d.reason}}catch(d){return e.error({err:d},"Failed to classify test result"),{}}}import{v4 as mR}from"uuid";function mg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Ku=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:mg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(mT(e.type)){this.creditsUsedV2+=1;return}let t=uh(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=dh(e.command);this.creditsUsedV1+=n??0}}async flush(e){this.creditsUsedV1>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:mR(),properties:mg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:mR(),properties:mg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as wF}from"lodash-es";function hR(r){let e=wF(r);return bi({steps:e,earlyStop:!1,onPresetAction:t=>{hg(t);let n;if(_c(t.command)&&t.command.cache!==void 0){let i=xF(t.command.cache);i&&"target"in i&&(n=i.target)}let o=t.command;return n!==void 0?o.cache=n:delete o.cache,o.thoughts&&delete o.thoughts,delete o.id,"index"in t&&delete t.index,!1},onConditional:t=>(hg(t),!1),onSimpleStepContainer:t=>{if(t.type==="AI_ACTION"){let n=t,o=t.text;return Object.keys(n).forEach(i=>{delete n[i]}),n.type="AI_ACTION_DYNAMIC",n.text=o,!1}if(hg(t),t.type==="RESOLVED_MODULE"){let n=t;delete n.cacheConfig,delete n.enabled,delete n.defaultCacheKey,delete n.defaultCacheTtl,delete n.defaultCacheAllInvocations,delete n.autoAuth,delete n.advanced}return!1}}),e}function hg(r){let e=r;delete e.aiSuggested,delete e.id,delete e.retries,delete e.skipped}function CF(r){return r.selector?r.selector:r.generatedSelectors?.[0]}function gg(r){let e=CF(r),t=r.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),t&&(n.nodeOnlySerializedHtml=t),Object.keys(n).length?n:void 0}function xF(r){if(!r)return;let e={};if("target"in r)return{target:gg(r.target)};if("fromTarget"in r||"toTarget"in r){let t=r.fromTarget?gg(r.fromTarget):void 0,n=r.toTarget?gg(r.toTarget):void 0;return t&&(e.fromTarget=t),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}function _o({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i,bustOldestCachePercentage:a}){return i?new Eu:new fg(r,e,t,{regenerateCache:n,alwaysSaveCache:o,bustOldestCachePercentage:a})}var fg=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a,bustOldestCachePercentage:s}=o,{gitBranchName:c,gitProtectedBranches:l}=n;this.cacheHeaders=Fh(n),this.readCaches=!i;let u=c&&l.includes(c);a||!u?this.writeCaches=!0:this.writeCaches=!1,u||(this.bustOldestCachePercentage=s)}cacheHeaders;readCaches;writeCaches;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}if(this.bustOldestCachePercentage!==void 0){let s=Object.entries(i).map(([u,d])=>({key:u,time:d.value.cache?.updatedAt?.getTime()??0}));s.sort((u,d)=>u.time-d.time);let c=s.length,l=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));s.slice(0,l).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:l,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches")}for(let s of[t,n,o])s&&xa({steps:s,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await tt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import _F from"path";var IF=new wu(30,60*1e3),bg="https://api.momentic.ai",yg,fR=r=>{bg=r},yr=()=>bg,SR=()=>yg;var Na,Eg,Xu,yR=async r=>{if(yg&&Na&&Xu)return Na;let e=new Je({baseUrl:bg,apiKey:r,logger:E});yg=e;try{let t=await e.getAuthInfo();return Na=t.orgId,Eg=t.userId,Xu=r,Na}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},At=()=>{if(!Na)throw new Error("Your organization ID is invalid.");return Na},Io=()=>{if(!Eg)throw new Error("Your user ID is invalid.");return Eg},Er=()=>{if(!Xu)throw new Error("Your API key is invalid.");return Xu},Tg,Sg,Ju=(r,e)=>{Tg=r,Sg?.abort(),Sg=new AbortController;let t=Sg.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=_F.resolve(r.rootDir,o.envFile);try{if(Yu.lstatSync(i).isSymbolicLink())return;Yu.existsSync(i)&&n.push(i)}catch(a){E.warn({err:a},`Failed to check if env file ${i} exists`)}});try{MF({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){E.error({err:o},"Failed to start config file watchers")}},ae=()=>Tg;function MF({filesToWatch:r,revalidator:e,signal:t,project:n}){E.debug("Starting watch on the following files:"),r.forEach(o=>{E.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(IF.increment("setLocalProject")&&E.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Tg=await Promise.resolve(e(n.configFilePath)))};Yu.watchFile(o,{persistent:!1},i);let a=()=>{Yu.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function xe(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var yl=PF();function Sl(r){let e=ae(),t=Mt.dirname(e.configFilePath);return Mt.join(t,...r)}function LF(r){let e=ae(),t=Mt.dirname(e.configFilePath),n=Mt.relative(t,r);return n?n.split(Mt.sep):[]}function NF(r,e){let t=ir.statSync(r),n=LF(r);return Mh.parse({name:e,absolutePath:r,relativePath:n.join(Mt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}yl.post("/",xe(async(r,e,t)=>{let n;try{n=LT.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Sl(n);if(!ir.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Mt.sep)}`});return}if(!ir.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Mt.sep)}`});return}let a=ae(),s=Array.from(a.config.exclude??[]).concat(hu),l=OF("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Mt.join(o,d);return NF(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));yl.put("/",xe(async(r,e,t)=>{let n;try{n=NT.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Sl(n);if(ir.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Mt.sep)}`,pathSegments:n});return}ir.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Mt.sep)}`,pathSegments:n};e.status(201).json(i)}));yl.patch("/",xe(async(r,e,t)=>{let n,o;try{let l=DT.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Sl(n),a=Sl(o);if(!ir.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Mt.sep)}`});return}if(ir.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Mt.sep)}`});return}let s=Mt.dirname(a);ir.existsSync(s)||ir.mkdirSync(s,{recursive:!0}),ir.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Mt.sep)} to ${o.join(Mt.sep)}`,pathSegments:o};e.status(200).json(c)}));yl.delete("/",xe(async(r,e,t)=>{let n,o=!0;try{let c=kT.parse(r.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Sl(n);if(!ir.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Mt.sep)}`,pathSegments:n});return}if(!ir.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Mt.sep)}`});return}if(o)ir.rmSync(i,{recursive:!0,force:!0});else{if(ir.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}ir.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var vg=yl;import{Router as BB}from"express";import{diff as FF}from"deep-object-diff";import nn from"fs";import wi from"path";import Da from"yaml";import{z as TR}from"zod";import{execSync as DF}from"child_process";function Kn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,E.debug({postSaveCommand:n},"Executing post-save hook command");try{DF(n,{encoding:"utf-8"})}catch(o){E.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as ER}from"deep-object-diff";import An from"fs";import{cloneDeep as kF}from"lodash-es";import El from"path";import{v4 as UF}from"uuid";import bl from"yaml";function br({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!An.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=An.readFileSync(i,"utf-8"),s=bl.parse(a),c;if(r.name&&r.name!==s.name){let m=`${De(r.name)}.module.yaml`;if(c=El.join(El.dirname(i),m),An.existsSync(c))throw new Error(`A conflicting file '${r.name}' already exists at path '${c}'`)}let l={...r,schemaVersion:e},u=vn({fileType:me.MODULE,...Lh.parse(l),steps:Ye.array().parse(r.steps)}),d=ER(u,s);if(d&&Object.keys(d).length===0&&!o){E.debug(`Skipping save for module ${r.moduleId} since there are no changes`);return}let p=bl.stringify(u);An.writeFileSync(i,p,"utf-8"),c&&An.renameSync(i,c),Kn(c||i,n.config)}function bR({moduleId:r,content:e,momenticFiles:t,project:n,logger:o}){let i=t.modules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${r} that could not be found on disk`);let a=Yn(i,o),s={...a,...e},c=vn({fileType:me.MODULE,...Lh.parse(s),steps:a.steps}),l=ER(c,a);if(l&&Object.keys(l).length===0){E.debug(`Skipping save for module ${r} since there are no changes`);return}let u=bl.stringify(c);An.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${De(e.name)}.module.yaml`;if(d=El.join(El.dirname(i),p),An.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);An.renameSync(i,d)}Kn(d||i,n.config)}async function Qu({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=De(r),s=El.join(o,`${a}.module.yaml`),c=UF(),{stepsToSave:l}=await tt({stepLists:{steps:n}}),u={fileType:me.MODULE,schemaVersion:Re,moduleId:c,name:r,description:e,enabled:t,steps:l.steps},d=bl.stringify(u);return An.writeFileSync(s,d,"utf-8"),Kn(s,i.config),{moduleId:c,name:r,description:e,enabled:t,steps:n}}function Yn(r,e){let t=An.readFileSync(r,"utf-8"),n=bl.parse(t);try{return Eh.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic module`),o}}async function rn(r,e,t,n){let o=Yn(r.fullFilePath,t),{resolvedSteps:i}=await ju({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:s})=>{let c=e.modules[s]?.fullFilePath;if(c)return Yn(c,t)}}}),a={...o,steps:i};return n&&(n[r.id]=kF(a)),a}async function Zu(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await rn(n,r,e,t)})),Array.from(Object.values(t))}async function vR({test:r,name:e,folder:t}){let n=await cR({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${De(e)}.test.yaml`,a=wi.join(t,i);return nn.writeFileSync(a,n.test,"utf-8"),a}function Ag(r,e,t){let n=wi.join(t.rootDir,r);if(!nn.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=nn.readFileSync(n,"utf-8"),i=Da.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${De(e.name)}.test.yaml`;if(a=wi.join(wi.dirname(r),p),s=wi.join(t.rootDir,a),nn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=Nr.parse(c),u={fileType:me.TEST,...Nr.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=Da.stringify(u);return nn.writeFileSync(n,d,"utf-8"),s&&nn.renameSync(n,s),Kn(n,t.config),{newRelativeTestPath:a}}function pr({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=wi.join(n.rootDir,r);if(!nn.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=nn.readFileSync(i,"utf-8"),s=Da.parse(a),c=Nr.parse({...s,schemaVersion:t}),l=Ye.array().or(TR.undefined()).parse(e.beforeSteps),u=Ye.array().parse(e.steps),d=Ye.array().or(TR.undefined()).parse(e.afterSteps),p=vn({fileType:me.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=FF(p,s);if(m&&Object.keys(m).length===0&&!o){E.debug(`Skipping save for test ${c.name} since there are no changes`);return}let h=Da.stringify(p);nn.writeFileSync(i,h,"utf-8"),E.debug(`Saving test ${c.name} to ${i}`),Kn(i,n.config)}function Tl(r,e){let t=wi.join(e.rootDir,r);if(!t)throw new Error(`Could not find test with path ${r} in Momentic project (${e.rootDir})`);let n;try{n=nn.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
42
+ `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Da.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return Kt.parse(o)}function Ci(r,e,t){let n=t.project.rootDir,o;try{o=nn.readFileSync(r,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Da.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${r} is missing steps`);return i}async function lt(r,e,t){let n=Ci(r,e,t),o;try{o=Nr.parse(n)}catch(a){throw new Error(`Test ${r} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await sR({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=t.modules[a]?.fullFilePath;if(c)return Yn(c,s)}}});return i}import BF from"@dotenvx/dotenvx";import HF from"fs";import AR from"path";function ed(r,e){return(r.config.environments??[]).map(t=>xi(t.name,r,e))}function RR(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function zF(r){let{envVariables:e,project:t}=r;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=RR(i);s&&(n[o]=s);continue}let a;try{a=HF.readFileSync(AR.resolve(t.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&&E.debug(n,"Set environment variables with interpolation from project configuration"),n}function GF(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=BF.config({path:AR.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function xi(r,e,t){let n=(e.config.environments??[]).find(c=>c.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);if(!n.baseUrl)throw new Error(`Browser environment ${r} does not have a baseUrl configured`);let o={[yt]:RR(n.baseUrl)},i=zF({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=GF({project:e,envFile:n.envFile,logger:t});return Object.assign(o,a),n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o,browser:n.browser}}import{existsSync as tB,readFileSync as rB,readdirSync as nB,writeFileSync as oB}from"fs";import{glob as iB}from"glob";import _i,{dirname as xR}from"path";import{cwd as _g}from"process";import _R from"yaml";import{z as je}from"zod";import wR from"fs";import{glob as jF}from"glob";import vl from"path";import VF from"yaml";import{z as Rg}from"zod";var CR=!1,wg=["**/*.test.yaml","**/*.module.yaml"],Cg=Rg.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),xg=15,$F=Rg.object({fileType:Rg.nativeEnum(me)});async function Z(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??wg,o=Array.from(r.config.exclude??[]).concat(hu),i=AbortSignal.timeout(5e3),a;try{a=await jF(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:xg,nodir:!0,signal:i})}catch(s){throw E.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=WF(r.rootDir,s,t,e?En:E);c&&(t.duplicateEntities[c.id]=c.paths)}return CR=!0,t}function WF(r,e,t,n){let o=vl.join(r,e),i=qF(o,n);if(!i)return;let a=KF(i,o,n);if(!a)return;let s=$F.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=YF(o,n);if(!l)return;let u=XF(e,o,l);switch(c){case me.TEST:try{return JF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case me.MODULE:try{return QF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case me.MOBILE_TEST:try{return eB(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case me.MOBILE_MODULE:try{return ZF(a,t,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 qF(r,e){try{return wR.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function KF(r,e,t){try{let n=VF.parse(r);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){t.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function YF(r,e){try{return wR.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function XF(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:vl.sep,fullPathSegments:e.split(vl.sep),relativePathSegments:r.split(vl.sep),fileName:vl.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function JF(r,e,t,n,o){let i=Nr.parse(r),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:me.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function QF(r,e,t,n,o){let i=cr.parse(r),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:me.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!CR&&De(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 ZF(r,e,t,n,o){let i=cu.parse(r),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=t.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:me.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function eB(r,e,t,n,o){let i=ya.parse(r),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=t.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:me.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}var ka="momentic.config.yaml",Ig="momentic.workspace.yaml",aB=je.object({projects:je.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),sB=je.union([je.string(),je.object({fromFile:je.string(),json:je.boolean().optional()})]),lB=je.object({name:Cg,baseUrl:je.string().optional().describe("Optional for mobile tests"),envFile:je.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:je.record(je.string(),sB).optional(),inheritFromShell:je.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:li.optional().describe("NB: most things should use project-level configuration only")}),cB=je.object({postSave:je.string().optional()}),uB=je.object({name:Cg,include:je.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:je.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:je.string().optional(),reporterDir:je.string().optional(),outputDir:je.string().optional(),recordVideo:je.boolean().optional(),retries:je.number().optional().describe("number of retries per test"),parallel:je.number().optional().describe("degree of parallelism"),environments:je.array(lB).optional(),gitMainBranch:je.string().optional(),gitProtectedBranches:je.string().array().optional(),ai:Nh.optional(),browser:li.optional(),emulator:vh.optional(),advanced:Dh.optional(),hooks:cB.optional()});function IR(r,e){let t;try{t=rB(r,"utf-8")}catch(o){E.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=_R.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){E.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function Mg(r){let e=IR(r,"project configuration");if(e!==void 0)try{return uB.parse(e)}catch(t){E.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function dB(r){let e=IR(r,"workspace configuration");if(e!==void 0)try{return aB.parse(e)}catch(t){E.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function pB(){let r=[],e=_g(),t=_i.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=_i.basename(e);if(mu.includes(i))return E.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of nB(e))if(a.endsWith(ka)){let s=_i.join(e,a),c=Mg(s);c&&r.push({configFilePath:s,config:c,rootDir:xR(s)})}if(r.length)return r;if(e=_i.dirname(e),e===t)break}return r}async function Rt(r={}){let{configFilePath:e,nameFilter:t}=r,n=await Pg(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
43
43
  ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return E.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function mB(r){let e=dB(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ka}`)),n=AbortSignal.timeout(2e3),o;try{o=await iB(t,{absolute:!1,cwd:_g(),dotRelative:!1,maxDepth:xg,nodir:!0,signal:n})}catch(a){throw E.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${Ig} is misconfigured.`),a}let i=[];for(let a of o){let s=_i.join(_g(),a),c=Mg(s);c&&i.push({configFilePath:s,config:c,rootDir:xR(s)})}return i}async function Pg(r){if(r){r=_i.resolve(r);let t=Mg(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:_i.dirname(r)}]}if(tB(Ig)){let t=await mB(Ig);if(t)return t}return pB()}function Mo(r,e){let t=_R.stringify(r);oB(e,t)}import Ua from"fs";import Og from"path";import{z as Lg}from"zod";var MR="golden/visual-diff",PR="reports",OR="test-results";var hB=Lg.object({width:Lg.number(),height:Lg.number()}),Fa=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let n=Og.join(e.rootDir,e.config.goldenFileDir??MR);this.defaultGoldenScreenshotDir=n,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,n){if(t.screenshot?.data?.startsWith("https://")){let a=await fetch(t.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Og.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Ua.mkdirSync(Og.dirname(o),{recursive:!0}),Ua.writeFileSync(o,n.buffer),Ua.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Ua.existsSync(o)){let a=Ua.readFileSync(o),s=hB.parse(JSON.parse(Ua.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new I("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as gB}from"node:child_process";import{promisify as fB}from"node:util";import SB from"simple-git";var Ve=SB(),LR=fB(gB);async function yB(r){let e=await Qe(r,Ve.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
44
- `)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function EB(r,e,t){try{let o=t["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 LR("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 LR("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function bB(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return EB(r,e,t);if(o)return}catch{}}function td(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Qe(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function TB(){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"}async function vB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.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?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function AB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.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?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function RB(r){let[e,t,n,o]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?td(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function wB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?td(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function CB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?td(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function xB(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Qe(r,Ve.revparse(["HEAD"])),Qe(r,Ve.revparse(["--short","HEAD"])),Qe(r,Ve.revparse(["--abbrev-ref","HEAD"])),Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"])),e?Qe(r,Ve.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),yB(r)]),d=l?await Qe(r,Ve.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),h=i?td(i):void 0,g=u["user.email"]||void 0,f=u["user.name"]||void 0,y=u["user.username"]||void 0,S=await bB(r,i,u)??y??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:S,gitLocalEmail:g,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?h:void 0,gitlabProjectPath:m?h:void 0,pipelineId:void 0}}async function _B(){let r=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:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}async function IB(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Xn(r,e){let t=TB();if(!t)return xB(r,e);switch(t){case"GithubActions":return vB(r);case"GitlabCI":return AB(r);case"CircleCI":return RB(r);case"Buildkite":return wB(r);case"AzureDevOps":return CB(r);case"GCPCloudBuild":return _B()}}async function MB(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.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(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function PB(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.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(t,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){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function OB(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await PB(r,e,n,o,t)}else if(t.gitlabProjectPath)return await MB(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function kr(r,e,t){let n=await IB(t),o=await Xn(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await OB(r,e,i);return{...n,...o,...a}}async function NR(){try{return!!(await Ve.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as ISe}from"deep-object-diff";import{cloneDeep as PSe}from"lodash-es";import{v4 as jSe}from"uuid";import $Se from"yaml";import cye from"yaml";import dye from"zod";import{randomUUID as LB}from"crypto";import Po from"fs";import Ba from"path";var DR=new Set([".DS_Store","__MACOSX"]),kR={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function NB(r,e,t){if(kR[t]){let i=kR[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var Ng=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. 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 UR(r,e){try{let t=Ba.join(e,"metadata.json");return bu.parse(JSON.parse(Po.readFileSync(t,"utf-8")))}catch{throw new Ng(r,e)}}function FR(r,e,t){let n=LB(),o=r.child({runGroupId:n});Po.rmSync(e,{recursive:!0,force:!0});let i=Po.readdirSync(t).filter(c=>!DR.has(c)).map(c=>Ba.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);Po.mkdirSync(e,{recursive:!0});let a={...UR(t,i[0]),id:n};for(let c of i){let l=Ba.join(c,"runs");if(!Po.existsSync(l))continue;let u=UR(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=NB(a,u,m)}let d=Po.readdirSync(l);for(let p of d){if(DR.has(p))continue;let m=Ba.join(l,p),h=Ba.join(e,"runs",p);Po.cpSync(m,h,{recursive:!0})}}let s=Ba.join(e,"metadata.json");Po.writeFileSync(s,JSON.stringify(a,null,2))}import BR from"adm-zip";import Dg from"fs";import rd from"path";function DB(r){let e=new BR,t=rd.join(r,"metadata.json"),n=bu.parse(JSON.parse(Dg.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Dg.readdirSync(rd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new BR(rd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(rd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function nd(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Dg.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new xu(e);try{let{runGroupId:i,buffer:a}=DB(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.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",t.error(`Failed to upload test results: ${a}.`);return}}import kB from"adm-zip";import Bt from"fs";import Tr from"path";var Al=class r{constructor(e){this.filePath=e;Bt.rmSync(this.filePath,{recursive:!0,force:!0}),Bt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Tr.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){Bt.mkdirSync(Tr.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Tr.join(this.filePath,e);if(Bt.existsSync(t))return Bt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Tr.join(this.filePath,t);try{Bt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Tr.join(this.filePath,e);return Bt.createWriteStream(t)}createRunArchive(e){return new kg(Tr.join(this.filePath,"runs"),e)}},kg=class{constructor(e,t){this.filePath=e;this.tempPath=Tr.join(e,`.${t}`),this.finalPath=Tr.join(e,`${t}.zip`),Bt.rmSync(this.tempPath,{recursive:!0,force:!0}),Bt.rmSync(this.finalPath,{recursive:!0,force:!0}),Bt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Tr.join(this.tempPath,e);if(Bt.existsSync(t))return Bt.readFileSync(t)}mkdir(e){Bt.mkdirSync(Tr.join(this.tempPath,e),{recursive:!0})}cd(e){return new Al(Tr.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Tr.join(this.tempPath,t);Bt.writeFileSync(o,n)}createFileStream(e){let t=Tr.join(this.tempPath,e);return Bt.createWriteStream(t)}close(){let e=new kB;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Bt.writeFileSync(this.finalPath,t),Bt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import{hostname as UB}from"os";var FB="2.26.0",Rl=va({app:"desktop-server",hostname:UB(),disableConsoleLogs:!0}).child({cliVersion:FB});(async()=>{try{let r=await Xn(Rl);r.gitBranchName&&Rl.addBinding("branch",r.gitBranchName)}catch{}})();var HR=BB();HR.get("/",async(r,e)=>{let t=ae(),n=SR();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await kr(Rl,n,t);e.status(200).json(o)});var Ug=HR;import Lq from"events";import AP,{Router as Nq}from"express";import Dq from"http";import kq from"path";import{Server as tW}from"socket.io";var HB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{e.info({sessionId:n},"Cancel event received");let o=t.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},zR={event:"cancel",createHandler:HB};var zB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.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})}}},GR={event:"fetchA11yTree",createHandler:zB};var GB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.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})}}},jR={event:"fetchDom",createHandler:GB};var jB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),t.removeSession(n,e)}},VR={event:"disconnect",createHandler:jB};function on(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=VB(t);$B(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await WB(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function VB(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":t=r[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){t=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(t)break}let n=r[r.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function $B(r,e,t){e&&(r.beforeUrl=e.beforeUrl),t&&(r.afterUrl=t.afterUrl,r.data=t.data,t.status!=="SUCCESS"&&(r.message=t.message))}async function WB(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as nH}from"crypto";import{faker as qB}from"@faker-js/faker";import KB from"assert";import YB from"axios";import*as XB from"child_process";import JB from"moment";import*as QB from"otpauth";import ZB from"pg";async function $R(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=nu(n,e);t.push(...o)}),t}function eH(r,e){if(!r&&!e)return;let t;if(r){let{url:o,options:i}=r;t=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:t,response:n}}async function tH(r,e){switch(r){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let t=[];return e.headers.forEach((o,i)=>{t.push([i,o])}),{status:e.status,headers:t,body:await e.text()}}else throw new Error("Result is not a Response object")}}var rH=Object.getPrototypeOf(async function(){}).constructor;async function WR(r,e,t){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=(T,b)=>{o[T]=b,l[T]=b},d={},p=(T,b)=>{o[T]=b,d[T]=b},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 rH("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(YB,JB,c.fakerInstance??qB,KB,ZB,m,h,QB,XB,$R,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,eH(a,s),...Object.values(i??{}))),f=!0,y,S;try{let T=await H(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});y=await tH(e.options.responseSerialization??"RAW",T)}catch(T){t.error({err:T,env:o,evalCode:n},`[${r}] Error executing code: ${T}`),f=!1,T instanceof Ro?S=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:S=T instanceof Error?T.message:`${T}`}return{result:y,variableUpdates:l,persistentVariableUpdates:d,success:f,error:S}}async function qR({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=bo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=nH(),p=await WR(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return E.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as oH,randomUUID as iH}from"crypto";import aH from"fetch-retry";var sH=aH(global.fetch,{retries:3,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),KR=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,YR=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function XR({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=bo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!KR)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!YR)throw new Error("Missing lambda auth secret.");let g=oH("sha256",YR).update(r).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let y={id:iH(),orgId:r,momenticLambdaAuthHash:g,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await H(sH(KR,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)}),{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(S){m=S}}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=fT.parse(await p.json())}catch(y){throw new Error(`Code evaluation server returned invalid response: ${y}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Oo(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await XR(r);else if(r.localTools)e=await qR({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
44
+ `)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function EB(r,e,t){try{let o=t["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 LR("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 LR("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function bB(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return EB(r,e,t);if(o)return}catch{}}function td(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Qe(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function TB(){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"}async function vB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.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?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function AB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.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?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function RB(r){let[e,t,n,o]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?td(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function wB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?td(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function CB(r){let[e,t,n]=await Promise.all([Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?td(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function xB(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Qe(r,Ve.revparse(["HEAD"])),Qe(r,Ve.revparse(["--short","HEAD"])),Qe(r,Ve.revparse(["--abbrev-ref","HEAD"])),Qe(r,Ve.listRemote(["--get-url","origin"])),Qe(r,Ve.show(["--no-patch","--format=%ci"])),Qe(r,Ve.show(["-s","--pretty=%B"])),Qe(r,Ve.show(["-s","--pretty=%an"])),e?Qe(r,Ve.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),yB(r)]),d=l?await Qe(r,Ve.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),h=i?td(i):void 0,g=u["user.email"]||void 0,f=u["user.name"]||void 0,y=u["user.username"]||void 0,S=await bB(r,i,u)??y??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:S,gitLocalEmail:g,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?h:void 0,gitlabProjectPath:m?h:void 0,pipelineId:void 0}}async function _B(){let r=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:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}async function IB(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Xn(r,e){let t=TB();if(!t)return xB(r,e);switch(t){case"GithubActions":return vB(r);case"GitlabCI":return AB(r);case"CircleCI":return RB(r);case"Buildkite":return wB(r);case"AzureDevOps":return CB(r);case"GCPCloudBuild":return _B()}}async function MB(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.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(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function PB(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.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(t,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){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function OB(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await PB(r,e,n,o,t)}else if(t.gitlabProjectPath)return await MB(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function kr(r,e,t){let n=await IB(t),o=await Xn(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await OB(r,e,i);return{...n,...o,...a}}async function NR(){try{return!!(await Ve.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as ISe}from"deep-object-diff";import{cloneDeep as PSe}from"lodash-es";import{v4 as jSe}from"uuid";import $Se from"yaml";import cye from"yaml";import dye from"zod";import{randomUUID as LB}from"crypto";import Po from"fs";import Ba from"path";var DR=new Set([".DS_Store","__MACOSX"]),kR={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function NB(r,e,t){if(kR[t]){let i=kR[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var Ng=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. 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 UR(r,e){try{let t=Ba.join(e,"metadata.json");return bu.parse(JSON.parse(Po.readFileSync(t,"utf-8")))}catch{throw new Ng(r,e)}}function FR(r,e,t){let n=LB(),o=r.child({runGroupId:n});Po.rmSync(e,{recursive:!0,force:!0});let i=Po.readdirSync(t).filter(c=>!DR.has(c)).map(c=>Ba.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);Po.mkdirSync(e,{recursive:!0});let a={...UR(t,i[0]),id:n};for(let c of i){let l=Ba.join(c,"runs");if(!Po.existsSync(l))continue;let u=UR(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=NB(a,u,m)}let d=Po.readdirSync(l);for(let p of d){if(DR.has(p))continue;let m=Ba.join(l,p),h=Ba.join(e,"runs",p);Po.cpSync(m,h,{recursive:!0})}}let s=Ba.join(e,"metadata.json");Po.writeFileSync(s,JSON.stringify(a,null,2))}import BR from"adm-zip";import Dg from"fs";import rd from"path";function DB(r){let e=new BR,t=rd.join(r,"metadata.json"),n=bu.parse(JSON.parse(Dg.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Dg.readdirSync(rd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new BR(rd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(rd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function nd(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Dg.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new xu(e);try{let{runGroupId:i,buffer:a}=DB(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.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",t.error(`Failed to upload test results: ${a}.`);return}}import kB from"adm-zip";import Bt from"fs";import Tr from"path";var Al=class r{constructor(e){this.filePath=e;Bt.rmSync(this.filePath,{recursive:!0,force:!0}),Bt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Tr.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){Bt.mkdirSync(Tr.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Tr.join(this.filePath,e);if(Bt.existsSync(t))return Bt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Tr.join(this.filePath,t);try{Bt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Tr.join(this.filePath,e);return Bt.createWriteStream(t)}createRunArchive(e){return new kg(Tr.join(this.filePath,"runs"),e)}},kg=class{constructor(e,t){this.filePath=e;this.tempPath=Tr.join(e,`.${t}`),this.finalPath=Tr.join(e,`${t}.zip`),Bt.rmSync(this.tempPath,{recursive:!0,force:!0}),Bt.rmSync(this.finalPath,{recursive:!0,force:!0}),Bt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Tr.join(this.tempPath,e);if(Bt.existsSync(t))return Bt.readFileSync(t)}mkdir(e){Bt.mkdirSync(Tr.join(this.tempPath,e),{recursive:!0})}cd(e){return new Al(Tr.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Tr.join(this.tempPath,t);Bt.writeFileSync(o,n)}createFileStream(e){let t=Tr.join(this.tempPath,e);return Bt.createWriteStream(t)}close(){let e=new kB;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Bt.writeFileSync(this.finalPath,t),Bt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import{hostname as UB}from"os";var FB="2.27.0",Rl=va({app:"desktop-server",hostname:UB(),disableConsoleLogs:!0}).child({cliVersion:FB});(async()=>{try{let r=await Xn(Rl);r.gitBranchName&&Rl.addBinding("branch",r.gitBranchName)}catch{}})();var HR=BB();HR.get("/",async(r,e)=>{let t=ae(),n=SR();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await kr(Rl,n,t);e.status(200).json(o)});var Ug=HR;import Lq from"events";import AP,{Router as Nq}from"express";import Dq from"http";import kq from"path";import{Server as tW}from"socket.io";var HB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{e.info({sessionId:n},"Cancel event received");let o=t.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},zR={event:"cancel",createHandler:HB};var zB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.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})}}},GR={event:"fetchA11yTree",createHandler:zB};var GB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.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})}}},jR={event:"fetchDom",createHandler:GB};var jB=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),t.removeSession(n,e)}},VR={event:"disconnect",createHandler:jB};function on(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=VB(t);$B(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await WB(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function VB(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":t=r[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){t=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(t)break}let n=r[r.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function $B(r,e,t){e&&(r.beforeUrl=e.beforeUrl),t&&(r.afterUrl=t.afterUrl,r.data=t.data,t.status!=="SUCCESS"&&(r.message=t.message))}async function WB(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as nH}from"crypto";import{faker as qB}from"@faker-js/faker";import KB from"assert";import YB from"axios";import*as XB from"child_process";import JB from"moment";import*as QB from"otpauth";import ZB from"pg";async function $R(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=nu(n,e);t.push(...o)}),t}function eH(r,e){if(!r&&!e)return;let t;if(r){let{url:o,options:i}=r;t=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:t,response:n}}async function tH(r,e){switch(r){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let t=[];return e.headers.forEach((o,i)=>{t.push([i,o])}),{status:e.status,headers:t,body:await e.text()}}else throw new Error("Result is not a Response object")}}var rH=Object.getPrototypeOf(async function(){}).constructor;async function WR(r,e,t){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=(T,b)=>{o[T]=b,l[T]=b},d={},p=(T,b)=>{o[T]=b,d[T]=b},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 rH("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(YB,JB,c.fakerInstance??qB,KB,ZB,m,h,QB,XB,$R,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,eH(a,s),...Object.values(i??{}))),f=!0,y,S;try{let T=await H(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});y=await tH(e.options.responseSerialization??"RAW",T)}catch(T){t.error({err:T,env:o,evalCode:n},`[${r}] Error executing code: ${T}`),f=!1,T instanceof Ro?S=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:S=T instanceof Error?T.message:`${T}`}return{result:y,variableUpdates:l,persistentVariableUpdates:d,success:f,error:S}}async function qR({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=bo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=nH(),p=await WR(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return E.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as oH,randomUUID as iH}from"crypto";import aH from"fetch-retry";var sH=aH(global.fetch,{retries:3,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),KR=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,YR=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function XR({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=bo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!KR)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!YR)throw new Error("Missing lambda auth secret.");let g=oH("sha256",YR).update(r).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let y={id:iH(),orgId:r,momenticLambdaAuthHash:g,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await H(sH(KR,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)}),{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(S){m=S}}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=fT.parse(await p.json())}catch(y){throw new Error(`Code evaluation server returned invalid response: ${y}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Oo(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await XR(r);else if(r.localTools)e=await qR({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
45
45
  ${e.error}
46
46
  Code received:
47
47
  ${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as lH}from"lodash-es";async function ar(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=bo,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),h;try{h=await Oo({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:r.localTools,signal:i})}catch(f){throw o.error({err:f,value:t},"Error evaluating template string"),f}if(h===void 0&&!c)throw new I("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 od(r){return JR(r)}async function JR({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in r){if(e.includes(s))continue;let c=!1;if(t)if(t.includes(s))c=!0;else continue;let l=r[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await ar({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),r[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await JR({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function QR(r,e){for(let{path:t,original:n}of e)lH(r,t,n)}import cH from"fetch-retry";var Rbe=process.env.MAILINATOR_API_KEY,wbe=cH(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import{hostname as SH}from"os";import{cloneDeep as ew}from"lodash-es";async function tw(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>wy(e.cache)?e.cache:void 0,a=i(),s=ew(a),c=(g=!1)=>{if(a=i(),!!a)if(g){let f=sg(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<t;){u++,u>1&&await ie(p,o),o?.throwIfAborted(),a=i();let{result:g,elementWasFound:f}=await ZR({cacheToUse:a,params:r});if(d=g,m=f,g.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new I("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&yc(a.target)){let g=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await ZR({cacheToUse:g,params:r});d=f,d.success||c(!0)}let h=i();return d.success&&h?.target&&!m&&(h.target=pl(h.target),h.updatedAt=new Date),d}async function ZR({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!co(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=cA(t.assertion),l,u=!1,d=ew(r);try{let{elementInteractedDisplayString:p,result:m,thoughts:h}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async g=>uH(g.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:si(t),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 I)||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 uH(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await dH(r,e.assertion)}async function dH(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:dt(a,500,!0)},!dl(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Ca(e);t=!1,n=new I("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:dt(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await r.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new I("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!dl(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Ca(e);t=!1,e.operation==="EXISTS"?n=new I("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new I("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.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},mn*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:mn*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:mn*1e3});break}case"FOCUSED":{t=await r.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(t=e.negated?!t:t,!t){let a=Ca(e);n=new I("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!dl(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Ca(e);t=!1,n=new I("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!dl(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Ca(e);t=!1,e.operation==="EXISTS"?n=new I("AssertionFailureError",`The style property ${e.property} ${s}`):n=new I("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:t,data:o,err:n}}function rw(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as pH}from"jimp";async function wl(r,e){let t=await r.screenshot(e),n=await pH.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as nw}from"jimp";import Fg from"jpeg-js";import mH from"pixelmatch";async function ow({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!co(t.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;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async W=>wl(o,{locator:W.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await wl(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,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 G=`${l.width}x${l.height}`,W=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${G}) does not match saved screenshot dimensions (${W}) - 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 nw.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await nw.fromBuffer(u.buffer),h={width:u.width,height:u.height},g,f=p.width*p.height,y=h.width*h.height,S=Math.abs(p.height-h.height),T=Math.abs(p.width-h.width);if(f>y){let G=d.cover({w:h.width,h:h.height});l.buffer=await G.getBuffer("image/jpeg"),g="current",l.width=h.width,l.height=h.height}else if(y>f){let G=m.cover({w:p.width,h:p.height});u.buffer=await G.getBuffer("image/jpeg"),g="saved"}let b={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=t.threshold??.1,x=mH(Fg.decode(u.buffer).data,Fg.decode(l.buffer).data,b.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,_=x>v*100,P=`Visual diff of ${x.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${v*100}%.`;if(g&&(P+=` The ${g} screenshot was cropped since it was taller by ${S} pixels and wider by ${T} pixels.`),_)throw new I("ActionFailureError",P);return{fail:_,thoughts:P,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Fg.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var hH=3e4;function gH(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function iw({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??hH/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([m,h])=>m&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{a.append(m,h)});let s=a.toString(),c;if(Oa(r.url)&&(c=r.url),t&&La(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new I("ActionFailureError",`Invalid URL: ${r.url}`);e.info({url:c,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let u=await H((async()=>{let m=s?`${c}?${s}`:c;try{let h=gH(r);return await n(m,{headers:{...h.contentType?{"Content-Type":h.contentType}:{},...i},method:r.method,body:h.content})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new I("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!u.ok){let m;try{m=await u.text()}catch(h){m=`Failed to read response body: ${h}`}throw new I("ActionFailureError",`Fetch request failed with status ${u.status}: ${m}`)}let d={};u.headers.forEach((m,h)=>{d[h]=m});let p={status:u.status,headers:d};if(u.headers.get("content-type")?.includes("json"))try{p.json=await u.json()}catch{}else u.headers.get("content-type")?.includes("text")&&(p.text=await u.text());return p}var fH=5e3;async function id({timeout:r=mn,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await aw(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 ie(s,e.signal),s=Math.min(Math.floor(s*1.5),fH);else return i}return i=await aw(e),i}async function aw({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(sw,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.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(sw,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?Wn.CONTAINS:qn.CONTAINS;a=new I("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new I("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function sw({value:r,negated:e,returnHtml:t}){let n=document.documentElement.outerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var Bg=async r=>{let{step:e,resolvedInputs:t}=r.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=r.fixtures,c=s.browser,{orgId:l,runId:u}=r.inputs,d=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),n.info(Pa({json:{inputs:t,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||"",y=await ar({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});g={orgId:l,cacheKeys:[y,...Object.entries(t).map(([T,b])=>`${T}:${b}`)]},n.info({original:f,keyParams:g},"Module cache key params");let S=Date.now();for(;Date.now()-S<GT;){d?.throwIfAborted();let T=await i.getCacheResult(g);if(T){n.info({cacheResult:dt(T,1e3,!0)},"Got result from module execution cache"),p=ad(e,t,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(T),m=!0;break}else n.info({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${SH()};runId:${u}`},d);if(b.acquired){h=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ie(2500+Math.random()*1e4,d)}}try{if(!p)p=await yH(r);else if(e.autoAuth){let f=ou.safeParse(p.data);if(!f.success)throw new I("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 y=!1,S=e.advanced?.cacheInvalidation;if(S&&S.type==="PAGE_CHECK"){let T={type:"CONTENT",value:S.substring},b=await id({timeout:mn,assertion:T,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});b.success?n.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(n.info({invalResult:b},"Invalidating cached result due to page check failure"),y=!0)}if(g&&y)return await i.deleteCacheResult(g),Bg(r)}}finally{try{h!==void 0&&!m&&p?.status==="SUCCESS"&&await EH({step:e,result:p,browser:s.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return p},yH=async r=>{let{step:e,tracer:t}=r.moduleParams,n=ad(e,r.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await r.executeStepList({...r,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,on({asyncTasks:r.work.asyncTasks,nestedResults:a,result:n,logger:r.fixtures.logger}),n};function ad(r,e,t){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:r.id,moduleId:r.moduleId,moduleName:r.name,startedAt:new Date,cacheConfig:r.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:t}}async function lw({orgId:r,step:e,context:t,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 Oo({orgId:r,code:c,fragment:!0,context:t,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new I("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function EH({step:r,result:e,browser:t,cacheKeyPrefix:n,logger:o,storage:i}){let a=r.cacheConfig?.cacheExpiryMs;(!a||a===Iv)&&(a=r.defaultCacheTtl??Mv);let s;r.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:Pa({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function Ii(r,e,t){return bH(r,e,t)}async function bH(r,e,t){let n=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof I?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,r.type==="RESOLVED_MODULE"){let c=ad(r,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...$u(r),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Ha(r,e){let t=!1;try{return r&&!r.state.failureRecoveryDisabled&&(r.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{r&&t&&(r.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as oj}from"lodash-es";import{randomUUID as cw}from"crypto";import{diff as TH}from"deep-object-diff";import{cloneDeep as uw}from"lodash-es";var sd=async r=>{let{step:e,tracer:t}=r.presetParams,{logger:n,controller:o,context:i}=r.fixtures,{collectDebugData:a}=r.options,{testMetadata:s}=r.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?uw(e.command.cache):{},d=o.browser.url(),p=new Date,m,h=cw(),g=cw();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let b=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:l,snapshotId:h,html:b})}}catch(b){l.debug({err:b},"Failed to take before screenshot, continuing...")}let f,y,S,T=eu();try{let b=await o.executePresetCommand(T,t,e.command,i,s?.advanced.disableAICaching??!1);b.beforeScreenshotOverride&&(m=b.beforeScreenshotOverride),S=b.afterScreenshotOverride;let v=new Date,C=o.browser.url();y={beforeUrl:d,afterUrl:C,startedAt:p,finishedAt:v,viewport:o.browser.getViewport(),status:b.fail?"FAILED":"SUCCESS",elementInteracted:b.elementInteracted},f={...e,message:b.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:C,finishedAt:v,startedAt:p,status:b.fail?"FAILED":"SUCCESS",data:b.data,results:[y],details:T.details},"assertion"in e.command&&(f.message=b.thoughts||"Assertion passed.")}catch(b){l.error({message:b.message,stack:b.stack},`Failed executing preset step ${Co(e.command)}`);let v=o.browser.url(),C=new Date,x=b instanceof Error?b.message:`${b}`;y={beforeUrl:d,afterUrl:v,startedAt:p,finishedAt:C,viewport:o.browser.getViewport(),status:b instanceof DOMException&&b.name==="AbortError"?"CANCELLED":"FAILED",message:x},f={...e,startedAt:p,finishedAt:C,beforeUrl:d,afterUrl:v,status:b instanceof DOMException&&b.name==="AbortError"?"CANCELLED":"FAILED",message:x,failureReason:b instanceof I?b.reason:void 0,results:[y],details:T.details}}finally{let b="cache"in e.command&&e.command.cache?uw(e.command.cache):{},v=TH(u,b);v&&Object.keys(v).length>0&&l.info({diffs:v},"Updated cache")}if(a)try{if(S||(S=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let b=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:l,snapshotId:g,html:b})}}catch(b){l.debug({err:b},"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 y.beforeSnapshot=h,f.beforeSnapshot=h,y.afterSnapshot=g,f.afterSnapshot=g,m&&t.attachBeforeScreenshot({logger:l,snapshotId:h,screenshot:m}),S&&t.attachAfterScreenshot({logger:l,snapshotId:g,screenshot:S}),f};async function dw(r){let{step:e,tracer:t}=r.conditionalParams,{logger:n,controller:o}=r.fixtures,i=new Date,a=$u(e),s=e.elseSteps,c=!0,l=[],u,d=eu();for(let f=0;f<e.blocks.length;f++){n.info(`Evaluating condition ${f} in conditional step`);let y=e.blocks[f];try{let S=await sd({...r,presetParams:{tracer:t,step:y.assertion}});l.push(S),u=S,S.status==="SUCCESS"?(n.info(`Condition ${f} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,s=y.steps):n.info(S.message,`Condition ${f} resolved to false`)}catch(S){n.info({err:S},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(s)c&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let f={...a,assertionResult:u,status:"SUCCESS",startedAt:i,data:l[l.length-1]?.data,message:l[l.length-1]?.message,results:[],finishedAt:new Date,details:d.details};return on({asyncTasks:r.work.asyncTasks,nestedResults:[...l],result:f,logger:n}),f}n.info(`Executing ${s.length} steps in the selected conditional block`);let p=await r.conditionalParams.tracer.startSubSteps(),m=await r.executeStepList({...r,listParams:{steps:s,containerName:"conditional block",tracer:p}}),g={...a,assertionResult:u,...m,startedAt:i,finishedAt:new Date};return on({asyncTasks:r.work.asyncTasks,nestedResults:[...l,...m.results],result:g,logger:n}),g}import{randomUUID as pw}from"crypto";var mw=async r=>{let{tracer:e}=r.aiStepParams,{controller:t,logger:n}=r.fixtures;await t.browser.waitForDOMStability();let o=await t.browser.screenshot({}),i=await vH(r);i.finishedAt=new Date,on({asyncTasks:r.work.asyncTasks,result:i,nestedResults:i.results,logger:r.fixtures.logger});let a=await t.browser.screenshot({}),s=pw();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:n,snapshotId:s,screenshot:o});let c=pw();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},vH=async r=>{let{step:e,tracer:t}=r.aiStepParams,{controller:n,context:o,logger:i}=r.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new I("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await t.startSubSteps(),{status:l}=await r.executeStepList({...r,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 Hg}from"crypto";var hw=15,AH=7,gw=async r=>{let{tracer:e}=r.aiStepParams,{logger:t,controller:n}=r.fixtures;await n.browser.waitForDOMStability();let o=await n.browser.screenshot({quality:75}),i=await RH(r);i.finishedAt=new Date,on({asyncTasks:r.work.asyncTasks,result:i,nestedResults:i.results,logger:r.fixtures.logger});let a=await n.browser.screenshot({quality:75}),s=Hg();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:t,snapshotId:s,screenshot:o});let c=Hg();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:t,snapshotId:c,screenshot:a}),i},RH=async r=>{let{step:e,tracer:t}=r.aiStepParams,{testMetadata:n,orgId:o}=r.inputs,{controller:i,context:a,logger:s,codeEvalTools:c}=r.fixtures,{step:l}=r.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 ar({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=[],y=0,S=0,T,b;for(;;){if(y>hw)return p.message=`Exceeded the maximum number of commands allowed per AI step (${hw})`,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:y===0?void 0:g,history:f,logger:d,langfuseSessionId:u,lastError:b}),{evaluation:C,reasoning:x,summary:_}=v;d.info(v,"Got AI evaluation");let P=p.results[y-1]?.id;switch(C.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${x}`,p.status="SUCCESS",P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:`${_}
48
48
  ${x}`}),p;case"RIGHT_TRACK":{T=void 0,y===0?l.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:x}):P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:x});break}case"WRONG_TRACK":{if(T=`${x}
49
49
  ${C.feedback}`,S++,S>=AH)return p.message=`Our AI agent requires additional information to achieve this goal:
50
50
  ${x}
51
- ${C.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${x}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:p.message}),p}let G=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:y,lastActionHint:T},`Generating new sub-command ${y} within AI action`);let W,U;try{({command:W,reasoning:U}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:T,langfuseSessionId:u})),d.info({command:W,reasoning:U},"Got proposed command")}finally{clearTimeout(G)}if(W.type==="FAILURE")return clearTimeout(G),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${U}`,p;let j={id:Hg(),type:"PRESET_ACTION",command:W},Q={substepIndex:y+1,message:U||"Generated new command."};l.onDynamicCommandGenerated?.({...Q,step:j,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${y} within AI step: ${Co(W)}`);let Y=await t.startSubSteps(),q=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[j],tracer:Y}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let nt=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(q),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${nt.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:Co(W),elementInteracted:q.results[0]?.elementInteracted,thoughts:U});let Be={substepIndex:y,output:{...q,message:q.message??"Successfully executed preset action."},step:j,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(Be),await t.finish({output:$c.parse(q),step:q,message:q.message,attempt:1}),q.status==="FAILED")if(p.status="FAILED",p.message=q.message,S<3)S++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${q.message}`;else return p;else if(q.status==="CANCELLED")return p.status="CANCELLED",p.message=q.message,p;y++}};import{randomUUID as JG}from"crypto";import zve,{multistream as jve}from"pino";import $ve from"pino-pretty";var Kve=5*1024,wH="...[truncated]",Yve=Buffer.byteLength(wH,"utf8");import{PostHog as CH}from"posthog-node";async function fw(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let s=await H(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var ld=class r extends nl{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new CH("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await fw(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await fw(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as xH}from"node:crypto";import{PostHog as _H}from"posthog-node";var cd=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new _H("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new r({...this.bindings,...e},this.options)}track(e,t){if(!Wb(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:n,...o}=e;return this.client.capture({distinctId:xH(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import{execSync as IH}from"child_process";import za from"os";import MH from"v8";var Sw,Rn,yw=za.platform(),PH=za.cpus().map(r=>({model:r.model,speed:r.speed})).reduce((r,e)=>(r[e.model]={speed:e.speed},r.totalCores=(r.totalCores??0)+1,r),{}),ud=r=>{try{let e={},t=!1,n=OH(),o=LH(),i=`${Math.round(n.freePercentage*100)}%`;n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),t=!0);let a=`${o?Math.round(o.idle):"unknown"}%`;o&&o?.total>80&&(t=!0);let s=MH.getHeapStatistics(),c=s.used_heap_size,l=s.heap_size_limit;c/l>.9&&(t=!0),t?(r.warn({memory:n,cpu:o,heapStats:s,...e},"Critical resource usage metrics detected"),yi&&E.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}},Ew=r=>{ud(r),setTimeout(()=>ud(r),5e3)};function bw(r){if(!Dr)return ud(r),{interval:setInterval(()=>ud(r),2e4),cpuMetadata:PH,platform:yw}}function OH(){let r=za.totalmem(),e=yw==="darwin"?NH():(()=>{let n=za.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function LH(){let r=za.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!Rn)return Rn=t,null;let n={user:t.user-Rn.user,nice:t.nice-Rn.nice,sys:t.sys-Rn.sys,idle:t.idle-Rn.idle,irq:t.irq-Rn.irq,total:t.total-Rn.total};return Sw={measurementTime:e,intervalMs:e-Rn.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},Rn=t,Sw}function NH(){try{let r=IH("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),t=r.match(/page size of (\d+) bytes/)?.[1],n=t?Number.parseInt(t,10):4096,o=u=>{let p=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return p?Number.parseInt(p,10):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),c=i*n,l=(a+s)*n;return{availableMemory:c+l,rawFreeMemory:c,cachedMemory:l}}catch{let e=za.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var dd=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function DH(r){if(!r||r.length===0)return{};let e={};for(let t of r){let n=t.indexOf(":");if(n>-1){let o=t.slice(0,n).trim(),i=t.slice(n+1).trim();o&&(e[o]=i);continue}e[t]=!0}return e}function pd(r,e){let t=DH(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var qw="=",fd=";",Qg=",";var Kw=8192;var $a={};jO($a,{getKeyPairs:()=>h1,parseKeyPairsIntoRecord:()=>g1,parsePairKeyValue:()=>Yw,serializeKeyPairs:()=>m1});$e();var p1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function m1(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Qg:"")+t;return n.length>Kw?e:n},"")}function h1(r){return r.getAllEntries().map(function(e){var t=p1(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=fd+o.metadata.toString()),i})}function Yw(r){var e=r.split(fd);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(qw);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=Gg(e.join(fd))),{key:o,value:i,metadata:a}}}}}function g1(r){return typeof r!="string"||r.length===0?{}:r.split(Qg).map(function(e){return Yw(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}$e();var Sd;(function(r){r.AlwaysOff="always_off",r.AlwaysOn="always_on",r.ParentBasedAlwaysOff="parentbased_always_off",r.ParentBasedAlwaysOn="parentbased_always_on",r.ParentBasedTraceIdRatio="parentbased_traceidratio",r.TraceIdRatio="traceidratio"})(Sd||(Sd={}));var f1=",",S1=["OTEL_SDK_DISABLED"];function y1(r){return S1.indexOf(r)>-1}var E1=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function b1(r){return E1.indexOf(r)>-1}var T1=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function v1(r){return T1.indexOf(r)>-1}var Zg=1/0,ef=128,A1=128,R1=128,tf={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:rt.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:A1,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:R1,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:Sd.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative"};function w1(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function C1(r,e,t,n,o){if(n===void 0&&(n=-1/0),o===void 0&&(o=1/0),typeof t[r]<"u"){var i=Number(t[r]);isNaN(i)||(i<n?e[r]=n:i>o?e[r]=o:e[r]=i)}}function x1(r,e,t,n){n===void 0&&(n=f1);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var _1={ALL:rt.ALL,VERBOSE:rt.VERBOSE,DEBUG:rt.DEBUG,INFO:rt.INFO,WARN:rt.WARN,ERROR:rt.ERROR,NONE:rt.NONE};function I1(r,e,t){var n=t[r];if(typeof n=="string"){var o=_1[n.toUpperCase()];o!=null&&(e[r]=o)}}function Xw(r){var e={};for(var t in tf){var n=t;switch(n){case"OTEL_LOG_LEVEL":I1(n,e,r);break;default:if(y1(n))w1(n,e,r);else if(b1(n))C1(n,e,r);else if(v1(n))x1(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Ht(){var r=Xw(process.env);return Object.assign({},tf,r)}function Jw(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function yd(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=Jw(r.charCodeAt(n)),i=Jw(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var Qw="1.25.1";var M1="deployment.environment";var P1="process.runtime.name";var O1="service.name";var L1="service.instance.id";var N1="telemetry.sdk.name",D1="telemetry.sdk.language",k1="telemetry.sdk.version";var Zw=M1;var eC=P1;var Ed=O1;var tC=L1;var Ol=N1,Ll=D1,Nl=k1;var U1="nodejs";var rC=U1;var Wa,bd=(Wa={},Wa[Ol]="opentelemetry",Wa[eC]="node",Wa[Ll]=rC,Wa[Nl]=Qw,Wa);var F1=9,B1=6,H1=Math.pow(10,B1),z1=Math.pow(10,F1);function nC(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*H1);return[t,n]}function oC(r){return r[0]*z1+r[1]}function Dl(r){return r[0]*1e6+r[1]/1e3}var Pi;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Pi||(Pi={}));var iC=function(){function r(){var e=this;this._promise=new Promise(function(t,n){e._resolve=t,e._reject=n})}return Object.defineProperty(r.prototype,"promise",{get:function(){return this._promise},enumerable:!1,configurable:!0}),r.prototype.resolve=function(e){this._resolve(e)},r.prototype.reject=function(e){this._reject(e)},r}();var G1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},j1=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},aC=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new iC}return Object.defineProperty(r.prototype,"isCalled",{get:function(){return this._isCalled},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"promise",{get:function(){return this._deferred.promise},enumerable:!1,configurable:!0}),r.prototype.call=function(){for(var e,t=this,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(!this._isCalled){this._isCalled=!0;try{Promise.resolve((e=this._callback).call.apply(e,j1([this._that],G1(n),!1))).then(function(i){return t._deferred.resolve(i)},function(i){return t._deferred.reject(i)})}catch(i){this._deferred.reject(i)}}return this._deferred.promise},r}();var Ur;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Ur||(Ur={}));var Jt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Jt||(Jt={}));var V1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}();var Iwe=function(r){V1(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function sC(r,e){for(var t=0,n=r.length-1;n-t>1;){var o=Math.trunc((n+t)/2);r[o]<=e?t=o:n=o-1}return r[n]<=e?n:r[t]<=e?t:-1}$e();var Fr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(Fr||(Fr={}));var lC=function(){function r(){this.kind=Fr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var ge;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ge||(ge={}));var $1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function W1(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var rf=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=W1(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=sC(this._boundaries,e);this._current.buckets.counts[t+1]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var nf=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Fr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new rf(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new rf(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new rf(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.HISTOGRAM,dataPoints:n.map(function(i){var a=$1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ge.GAUGE||e.type===ge.UP_DOWN_COUNTER||e.type===ge.OBSERVABLE_GAUGE||e.type===ge.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();$e();var of=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},af=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},sf=function(){function r(e,t,n,o){e===void 0&&(e=new q1),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var q1=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,af([n,this._counts.length-t],of(this._counts.slice(t)),!1)),o.splice.apply(o,af([0,t],of(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(af([],of(this._counts),!1))},r}();var cC=52,K1=2146435072,Y1=1048575,lf=1023,Td=-lf+1,vd=lf,kl=Math.pow(2,-1022);function Ad(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&K1)>>20;return n-lf}function Rd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&Y1)*Math.pow(2,32);return o+n}function Ul(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function dC(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var X1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Lo=function(r){X1(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var mC=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<kl)return this._minNormalLowerBoundaryIndex();var t=Ad(e),n=this._rightShift(Rd(e)-1,cC);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Lo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Lo("overflow: "+e+" is > maximum lower boundary: "+n);return Ul(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Td>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return vd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var hC=function(){function r(e){this._scale=e,this._scaleFactor=Ul(Math.LOG2E,e),this._inverseFactor=Ul(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=kl)return this._minNormalLowerBoundaryIndex()-1;if(Rd(e)===0){var t=Ad(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Lo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return kl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Lo("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Td<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(vd+1<<this._scale)-1},r}();var gC=-10,fC=20,J1=Array.from({length:31},function(r,e){return e>10?new hC(e-10):new mC(e-10)});function cf(r){if(r>fC||r<gC)throw new Lo("expected scale >= "+gC+" && <= "+fC+", got: "+r);return J1[r+10]}var Q1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wd=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),Z1=20,ez=160,uf=2,tz=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=ez),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new sf),u===void 0&&(u=new sf),d===void 0&&(d=cf(Z1)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<uf&&($.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+uf),this._maxSize=uf)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=dC(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=cf(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=wd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=wd.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new wd(0,-1);var o=t-n;return new wd(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var SC=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Fr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new tz(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Q1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ge.GAUGE||e.type===ge.UP_DOWN_COUNTER||e.type===ge.OBSERVABLE_GAUGE||e.type===ge.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var rz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},df=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=nC(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var yC=function(){function r(){this.kind=Fr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new df(e)},r.prototype.merge=function(e,t){var n=Dl(t.sampleTime)>=Dl(e.sampleTime)?t:e;return new df(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Dl(t.sampleTime)>=Dl(e.sampleTime)?t:e;return new df(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.GAUGE,dataPoints:n.map(function(i){var a=rz(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var nz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fl=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var pf=function(){function r(e){this.monotonic=e,this.kind=Fr.SUM}return r.prototype.createAccumulation=function(e){return new Fl(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Fl(t.startTime,this.monotonic,o,t.reset):new Fl(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Fl(t.startTime,this.monotonic,o,!0):new Fl(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.SUM,dataPoints:n.map(function(i){var a=nz(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Oi=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Cn=function(){function r(){}return r.Drop=function(){return CC},r.Sum=function(){return xC},r.LastValue=function(){return _C},r.Histogram=function(){return IC},r.ExponentialHistogram=function(){return oz},r.Default=function(){return iz},r}();var EC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new lC,e}(Cn);var bC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ge.COUNTER:case ge.OBSERVABLE_COUNTER:case ge.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new pf(!0),e.NON_MONOTONIC_INSTANCE=new pf(!1),e}(Cn);var TC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new yC,e}(Cn);var vC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new nf([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Cn);var AC=function(r){Oi(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new nf(this._boundaries,this._recordMinMax)},e}(Cn);var RC=function(r){Oi(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new SC(this._maxSize,this._recordMinMax)},e}(Cn);var wC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ge.COUNTER:case ge.UP_DOWN_COUNTER:case ge.OBSERVABLE_COUNTER:case ge.OBSERVABLE_UP_DOWN_COUNTER:return xC;case ge.GAUGE:case ge.OBSERVABLE_GAUGE:return _C;case ge.HISTOGRAM:return t.advice.explicitBucketBoundaries?new AC(t.advice.explicitBucketBoundaries):IC}return $.warn("Unable to recognize instrument type: "+t.type),CC},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Cn);var CC=new EC,xC=new bC,_C=new TC,IC=new vC,oz=new RC,iz=new wC;$e();function Cd(){return"unknown_service:"+process.argv0}var No=function(){return No=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},No.apply(this,arguments)},az=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},sz=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},lz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mf=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return $.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[Ed]=Cd(),e[Ll]=bd[Ll],e[Ol]=bd[Ol],e[Nl]=bd[Nl],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&$.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return az(this,void 0,void 0,function(){return sz(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=No(No({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=lz(a,2),l=c[0],u=c[1];return No(No(No(No({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Li;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Li||(Li={}));$e();var cz=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},uz=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},hf=function(){return Ur.CUMULATIVE},MC=function(r){switch(r){case ge.COUNTER:case ge.OBSERVABLE_COUNTER:case ge.GAUGE:case ge.HISTOGRAM:case ge.OBSERVABLE_GAUGE:return Ur.DELTA;case ge.UP_DOWN_COUNTER:case ge.OBSERVABLE_UP_DOWN_COUNTER:return Ur.CUMULATIVE}},PC=function(r){switch(r){case ge.COUNTER:case ge.HISTOGRAM:return Ur.DELTA;case ge.GAUGE:case ge.UP_DOWN_COUNTER:case ge.OBSERVABLE_UP_DOWN_COUNTER:case ge.OBSERVABLE_COUNTER:case ge.OBSERVABLE_GAUGE:return Ur.CUMULATIVE}};function dz(){var r=Ht(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?hf:e==="delta"?MC:e==="lowmemory"?PC:($.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),hf)}function pz(r){return r!=null?r===Li.DELTA?MC:r===Li.LOWMEMORY?PC:hf:dz()}function mz(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Cn.Default()}}var OC=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=mz(t),this._aggregationTemporalitySelector=pz(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return cz(this,void 0,void 0,function(){return uz(this,function(e){switch(e.label){case 0:return[4,this._otlpExporter.shutdown()];case 1:return e.sent(),[2]}})})},r.prototype.forceFlush=function(){return Promise.resolve()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r}();$e();$e();var hz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},LC=1e4,NC=5,DC=1e3,kC=5e3,UC=1.5;function Bl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=hz(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):$.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function gf(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function ff(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return $.warn("Could not parse export URL: '"+r+"'"),r}}function Sf(r){return typeof r=="number"?r<=0?yf(r,LC):r:gz()}function gz(){var r,e=Number((r=Ht().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Ht().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?yf(e,LC):e}function yf(r,e){return $.warn("Timeout must be greater than 0",r),e}function FC(r){var e=[429,502,503,504];return e.includes(r)}function BC(r){if(r==null)return-1;var e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;var t=new Date(r).getTime()-Date.now();return t>=0?t:0}var HC=function(){function r(e){e===void 0&&(e={}),this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname=="string"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new aC(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Sf(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Pi.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Pi.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Pi.SUCCESS})}).catch(function(n){t({code:Pi.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{$.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return $.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();$e();import*as Ef from"url";import*as _d from"http";import*as Id from"https";import*as zC from"zlib";import{Readable as Sz}from"stream";var Do;(function(r){r.NONE="none",r.GZIP="gzip"})(Do||(Do={}));var fz=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),qa=function(r){fz(e,r);function e(t,n,o){var i=r.call(this,t)||this;return i.name="OTLPExporterError",i.data=o,i.code=n,i}return e}(Error);var xd=function(){return xd=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},xd.apply(this,arguments)};function bf(r,e,t,n,o){var i=r.timeoutMillis,a=new Ef.URL(r.url),s=Number(process.versions.node.split(".")[0]),c,l,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,l.destroyed){var g=new qa("Request Timeout");o(g)}else s>=14?l.destroy():l.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:xd({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?_d.request:Id.request,h=function(g,f){switch(g===void 0&&(g=NC),f===void 0&&(f=DC),l=m(p,function(S){var T="";S.on("data",function(b){return T+=b}),S.on("aborted",function(){if(u){var b=new qa("Request Timeout");o(b)}}),S.on("end",function(){if(u===!1)if(S.statusCode&&S.statusCode<299)$.debug("statusCode: "+S.statusCode,T),n(),clearTimeout(d),clearTimeout(c);else if(S.statusCode&&FC(S.statusCode)&&g>0){var b=void 0;f=UC*f,S.headers["retry-after"]?b=BC(S.headers["retry-after"]):b=Math.round(Math.random()*(kC-f)+f),c=setTimeout(function(){h(g-1,f)},b)}else{var v=new qa(S.statusMessage,S.statusCode,T);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(S){if(u){var T=new qa("Request Timeout",S.code);o(T)}else o(S);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var S=new qa("Request Timeout");o(S)}clearTimeout(d),clearTimeout(c)}),r.compression){case Do.GZIP:{l.setHeader("Content-Encoding","gzip");var y=yz(e);y.on("error",o).pipe(zC.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};h()}function yz(r){var e=new Sz;return e.push(r),e.push(null),e}function Tf(r){if(r.httpAgentOptions&&r.keepAlive===!1){$.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Ef.URL(r.url),t=e.protocol==="http:"?_d.Agent:Id.Agent;return new t(xd({keepAlive:!0},r.httpAgentOptions))}catch(n){$.error("collector exporter failed to create http agent. err: "+n.message);return}}function vf(r){if(r)return r;var e=Ht().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Ht().OTEL_EXPORTER_OTLP_COMPRESSION;return e===Do.GZIP?Do.GZIP:Do.NONE}$e();var Ez=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Md=function(r){Ez(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&$.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,Bl(t.headers),$a.parseKeyPairsIntoRecord(Ht().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=Tf(t),i.compression=vf(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){$.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;bf(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,l)}).then(n,o);this._sendingPromises.push(a);var s=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(s,s)},e.prototype.onShutdown=function(){},e}(HC);function jC(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function bz(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function VC(r){var e=jC(r);return bz(e)}function Tz(r){var e=jC(r);return e.toString()}var vz=typeof BigInt<"u"?Tz:oC;function GC(r){return r}function $C(r){if(r!==void 0)return yd(r)}var Az={encodeHrTime:VC,encodeSpanContext:yd,encodeOptionalSpanContext:$C};function WC(r){var e,t;if(r===void 0)return Az;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?VC:vz,encodeSpanContext:o?GC:yd,encodeOptionalSpanContext:o?GC:$C}}var Rz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function qC(r){return{name:r.name,version:r.version}}function Ka(r){return Object.keys(r).map(function(e){return KC(e,r[e])})}function KC(r,e){return{key:r,value:YC(e)}}function YC(r){var e=typeof r;return e==="string"?{stringValue:r}:e==="number"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e==="boolean"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(YC)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=Rz(t,2),o=n[0],i=n[1];return KC(o,i)})}}:{}}function XC(r){return{attributes:Ka(r.attributes),droppedAttributesCount:0}}$e();function QC(r,e){var t=WC(e);return{resource:XC(r.resource),schemaUrl:void 0,scopeMetrics:wz(r.scopeMetrics,t)}}function wz(r,e){return Array.from(r.map(function(t){return{scope:qC(t.scope),metrics:t.metrics.map(function(n){return Cz(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function Cz(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=Mz(r.aggregationTemporality);switch(r.dataPointType){case Jt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:JC(r,e)};break;case Jt.GAUGE:t.gauge={dataPoints:JC(r,e)};break;case Jt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:_z(r,e)};break;case Jt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:Iz(r,e)};break}return t}function xz(r,e,t){var n={attributes:Ka(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case vr.INT:n.asInt=r.value;break;case vr.DOUBLE:n.asDouble=r.value;break}return n}function JC(r,e){return r.dataPoints.map(function(t){return xz(t,r.descriptor.valueType,e)})}function _z(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ka(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function Iz(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ka(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function Mz(r){switch(r){case Ur.DELTA:return 1;case Ur.CUMULATIVE:return 2}}function ZC(r,e){return{resourceMetrics:r.map(function(t){return QC(t,e)})}}var Af={serializeRequest:function(r){var e=ZC(r,{useLongBits:!1}),t=new TextEncoder;return t.encode(JSON.stringify(e))},deserializeResponse:function(r){var e=new TextDecoder;return JSON.parse(e.decode(r))}};var ex="0.52.1";var tx=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ya=function(){return Ya=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Ya.apply(this,arguments)},rx="v1/metrics",Pz="http://localhost:4318/"+rx,Oz={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+ex},Lz=function(r){tx(e,r);function e(t){var n=r.call(this,t,Af,"application/json")||this;return n.headers=Ya(Ya(Ya(Ya({},n.headers),Oz),$a.parseKeyPairsIntoRecord(Ht().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Bl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Ht().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?ff(Ht().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Ht().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?gf(Ht().OTEL_EXPORTER_OTLP_ENDPOINT,rx):Pz},e}(Md),nx=function(r){tx(e,r);function e(t){return r.call(this,new Lz(t),t)||this}return e}(OC);var Xa;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Xa||(Xa={}));var xn;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(xn||(xn={}));$e();var Nz=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),ox=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},ix=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Dz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},kz=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Uz=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function ax(r){return r!=null}function Pd(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function sx(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Rf=function(r){Nz(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function ko(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Rf("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function lx(r){return ox(this,void 0,void 0,function(){var e=this;return ix(this,function(t){return[2,Promise.all(r.map(function(n){return ox(e,void 0,void 0,function(){var o,i;return ix(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return[2]}})})}))]})})}function cx(r){return r.status==="rejected"}function wf(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,kz([],Dz(e(n)),!1))}),t}function ux(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=Uz(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(s){t={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function dx(r,e){for(var t=0,n=r.length-1,o=r.length;n>=t;){var i=t+Math.trunc((n-t)/2);r[i]<e?t=i+1:(o=i,n=i-1)}return o}function px(r,e){return r.toLowerCase()===e.toLowerCase()}$e();var Br;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(Br||(Br={}));var Cf=function(){function r(){this.kind=Br.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();$e();var Ce;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(Ce||(Ce={}));function _n(r,e,t){var n,o,i,a;return Bz(r)||$.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:vr.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function mx(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function hx(r,e){return px(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var Fz=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function Bz(r){return r.match(Fz)!=null}var Hz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function zz(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var Od=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=zz(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=dx(this._boundaries,e);this._current.buckets.counts[t]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ld=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Br.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Od(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new Od(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new Od(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.HISTOGRAM,dataPoints:n.map(function(i){var a=Hz(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ce.GAUGE||e.type===Ce.UP_DOWN_COUNTER||e.type===Ce.OBSERVABLE_GAUGE||e.type===Ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();$e();var xf=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},_f=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},If=function(){function r(e,t,n,o){e===void 0&&(e=new Gz),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var Gz=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,_f([n,this._counts.length-t],xf(this._counts.slice(t)),!1)),o.splice.apply(o,_f([0,t],xf(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(_f([],xf(this._counts),!1))},r}();var gx=52,jz=2146435072,Vz=1048575,Mf=1023,Nd=-Mf+1,Dd=Mf,Hl=Math.pow(2,-1022);function kd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&jz)>>20;return n-Mf}function Ud(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&Vz)*Math.pow(2,32);return o+n}function zl(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Sx(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var $z=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Uo=function(r){$z(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Ex=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Hl)return this._minNormalLowerBoundaryIndex();var t=kd(e),n=this._rightShift(Ud(e)-1,gx);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Uo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Uo("overflow: "+e+" is > maximum lower boundary: "+n);return zl(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Nd>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Dd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var bx=function(){function r(e){this._scale=e,this._scaleFactor=zl(Math.LOG2E,e),this._inverseFactor=zl(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Hl)return this._minNormalLowerBoundaryIndex()-1;if(Ud(e)===0){var t=kd(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Uo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Hl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Uo("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Nd<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Dd+1<<this._scale)-1},r}();var Tx=-10,vx=20,Wz=Array.from({length:31},function(r,e){return e>10?new bx(e-10):new Ex(e-10)});function Pf(r){if(r>vx||r<Tx)throw new Uo("expected scale >= "+Tx+" && <= "+vx+", got: "+r);return Wz[r+10]}var qz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fd=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),Kz=20,Yz=160,Of=2,Ax=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=Yz),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new If),u===void 0&&(u=new If),d===void 0&&(d=Pf(Kz)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Of&&($.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Of),this._maxSize=Of)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=Sx(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Pf(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Fd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Fd.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Fd(0,-1);var o=t-n;return new Fd(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var Lf=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Br.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Ax(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=qz(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ce.GAUGE||e.type===Ce.UP_DOWN_COUNTER||e.type===Ce.OBSERVABLE_GAUGE||e.type===Ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();$e();var Xz=jg("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function Rx(r){return r.setValue(Xz,!0)}$e();function wx(){return function(r){$.error(Jz(r))}}function Jz(r){return typeof r=="string"?r:JSON.stringify(Qz(r))}function Qz(r){for(var e={},t=r;t!==null;)Object.getOwnPropertyNames(t).forEach(function(n){if(!e[n]){var o=t[n];o&&(e[n]=String(o))}}),t=Object.getPrototypeOf(t);return e}var Zz=wx();function Bd(r){try{Zz(r)}catch{}}var Cx="1.30.1";var eG="process.runtime.name";var tG="service.name";var rG="telemetry.sdk.name",nG="telemetry.sdk.language",oG="telemetry.sdk.version";var xx=eG;var _x=tG;var Gl=rG,jl=nG,Vl=oG;var iG="nodejs";var Ix=iG;var Ja,Ni=(Ja={},Ja[Gl]="opentelemetry",Ja[xx]="node",Ja[jl]=Ix,Ja[Vl]=Cx,Ja);function $l(r){r.unref()}var pG=9,mG=6,hG=Math.pow(10,mG),L_e=Math.pow(10,pG);function Di(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*hG);return[t,n]}function Qa(r){return r[0]*1e6+r[1]/1e3}var Wl;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Wl||(Wl={}));$e();function Mx(r,e){return new Promise(function(t){Va.with(Rx(Va.active()),function(){r.export(e,function(n){t(n)})})})}var Px={_export:Mx};var gG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Hd=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=Di(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Nf=function(){function r(){this.kind=Br.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Hd(e)},r.prototype.merge=function(e,t){var n=Qa(t.sampleTime)>=Qa(e.sampleTime)?t:e;return new Hd(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Qa(t.sampleTime)>=Qa(e.sampleTime)?t:e;return new Hd(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.GAUGE,dataPoints:n.map(function(i){var a=gG(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var fG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Za=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var zd=function(){function r(e){this.monotonic=e,this.kind=Br.SUM}return r.prototype.createAccumulation=function(e){return new Za(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Za(t.startTime,this.monotonic,o,t.reset):new Za(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Za(t.startTime,this.monotonic,o,!0):new Za(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.SUM,dataPoints:n.map(function(i){var a=fG(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var ki=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Hr=function(){function r(){}return r.Drop=function(){return Fx},r.Sum=function(){return Bx},r.LastValue=function(){return Hx},r.Histogram=function(){return zx},r.ExponentialHistogram=function(){return SG},r.Default=function(){return yG},r}();var Ox=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Cf,e}(Hr);var Lx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ce.COUNTER:case Ce.OBSERVABLE_COUNTER:case Ce.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new zd(!0),e.NON_MONOTONIC_INSTANCE=new zd(!1),e}(Hr);var Nx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Nf,e}(Hr);var Dx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Ld([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Hr);var ql=function(r){ki(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new Ld(this._boundaries,this._recordMinMax)},e}(Hr);var kx=function(r){ki(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new Lf(this._maxSize,this._recordMinMax)},e}(Hr);var Ux=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ce.COUNTER:case Ce.UP_DOWN_COUNTER:case Ce.OBSERVABLE_COUNTER:case Ce.OBSERVABLE_UP_DOWN_COUNTER:return Bx;case Ce.GAUGE:case Ce.OBSERVABLE_GAUGE:return Hx;case Ce.HISTOGRAM:return t.advice.explicitBucketBoundaries?new ql(t.advice.explicitBucketBoundaries):zx}return $.warn("Unable to recognize instrument type: "+t.type),Fx},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Hr);var Fx=new Ox,Bx=new Lx,Hx=new Nx,zx=new Dx,SG=new kx,yG=new Ux;var Gx=function(r){return Hr.Default()},jx=function(r){return Xa.CUMULATIVE};var Df=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},kf=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Vx=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},EG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},$x=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:Gx,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:jx,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector}return r.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},r.prototype.onInitialized=function(){},r.prototype.collect=function(e){return Df(this,void 0,void 0,function(){var t,n,o,i,a,s;return kf(this,function(c){switch(c.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return[4,Promise.all(EG([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],Vx(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=Vx.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(wf(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(wf(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Df(this,void 0,void 0,function(){return kf(this,function(t){switch(t.label){case 0:return this._shutdown?($.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,ko(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Df(this,void 0,void 0,function(){return kf(this,function(t){switch(t.label){case 0:return this._shutdown?($.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,ko(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();$e();var bG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Gd=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},jd=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},TG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},vG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Uf=function(r){bG(e,r);function e(t){var n,o,i,a,s=r.call(this,{aggregationSelector:(n=t.exporter.selectAggregation)===null||n===void 0?void 0:n.bind(t.exporter),aggregationTemporalitySelector:(o=t.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(t.exporter),metricProducers:t.metricProducers})||this;if(t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<t.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=t.exporter,s}return e.prototype._runOnce=function(){return Gd(this,void 0,void 0,function(){var t;return jd(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,ko(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Rf?($.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Bd(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Gd(this,void 0,void 0,function(){var o,i,a,s,c,l;return jd(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=$).error.apply(l,vG(["PeriodicExportingMetricReader: metrics collection errors"],TG(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),$.debug("Error while resolving async portion of resource: ",s),Bd(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,Px._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==Wl.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+c.error+")");return[2]}})})},e.prototype.onInitialized=function(){var t=this;this._interval=setInterval(function(){t._runOnce()},this._exportInterval),$l(this._interval)},e.prototype.onForceFlush=function(){return Gd(this,void 0,void 0,function(){return jd(this,function(t){switch(t.label){case 0:return[4,this._runOnce()];case 1:return t.sent(),[4,this._exporter.forceFlush()];case 2:return t.sent(),[2]}})})},e.prototype.onShutdown=function(){return Gd(this,void 0,void 0,function(){return jd(this,function(t){switch(t.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return t.sent(),[4,this._exporter.shutdown()];case 2:return t.sent(),[2]}})})},e}($x);$e();$e();function Vd(){return"unknown_service:"+process.argv0}var Fo=function(){return Fo=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Fo.apply(this,arguments)},AG=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},RG=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},wG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$d=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return $.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[_x]=Vd(),e[jl]=Ni[jl],e[Gl]=Ni[Gl],e[Vl]=Ni[Vl],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&$.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return AG(this,void 0,void 0,function(){return RG(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Fo(Fo({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=wG(a,2),l=c[0],u=c[1];return Fo(Fo(Fo(Fo({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Wx=function(){function r(){this._registeredViews=[]}return r.prototype.addView=function(e){this._registeredViews.push(e)},r.prototype.findViews=function(e,t){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,e)&&n._matchMeter(i.meterSelector,t)});return o},r.prototype._matchInstrument=function(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)},r.prototype._matchMeter=function(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))},r}();$e();var Ui=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Wd=function(){function r(e,t){this._writableMetricStorage=e,this._descriptor=t}return r.prototype._record=function(e,t,n){if(t===void 0&&(t={}),n===void 0&&(n=Va.active()),typeof e!="number"){$.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===vr.INT&&!Number.isInteger(e)&&($.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,Di(Date.now()))},r}();var qx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){this._record(t,n,o)},e}(Wd);var Kx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){$.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wd);var Yx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){this._record(t,n,o)},e}(Wd);var Xx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){$.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wd);var qd=function(){function r(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}return r.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this)},r.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this)},r}();var Jx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);var Qx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);var Zx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);function Kl(r){return r instanceof qd}var e_=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=_n(e,Ce.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new Yx(o,n)},r.prototype.createHistogram=function(e,t){var n=_n(e,Ce.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new Xx(o,n)},r.prototype.createCounter=function(e,t){var n=_n(e,Ce.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Kx(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=_n(e,Ce.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new qx(o,n)},r.prototype.createObservableGauge=function(e,t){var n=_n(e,Ce.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Qx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=_n(e,Ce.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Jx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=_n(e,Ce.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Zx(n,o,this._meterSharedState.observableRegistry)},r.prototype.addBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)},r.prototype.removeBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)},r}();var Kd=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=_n(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var CG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),t_=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},xG=function(){function r(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}return r.prototype.get=function(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)},r.prototype.getOrDefault=function(e,t){var n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);var o=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o),o},r.prototype.set=function(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)},r.prototype.has=function(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)},r.prototype.keys=function(){var e,t;return t_(this,function(n){switch(n.label){case 0:e=this._keyMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},r.prototype.entries=function(){var e,t;return t_(this,function(n){switch(n.label){case 0:e=this._valueMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[this._keyMap.get(t.value[0]),t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},Object.defineProperty(r.prototype,"size",{get:function(){return this._valueMap.size},enumerable:!1,configurable:!0}),r}();var an=function(r){CG(e,r);function e(){return r.call(this,Pd)||this}return e}(xG);var _G=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yd=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new an,this._cumulativeMemoStorage=new an,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Pd(this._overflowAttributes)}return r.prototype.record=function(e,t,n,o){var i=this,a=this._activeCollectionStorage.get(t);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(t,a)}a?.record(e)},r.prototype.batchCumulate=function(e,t){var n=this;Array.from(e.entries()).forEach(function(o){var i=_G(o,3),a=i[0],s=i[1],c=i[2],l=n._aggregator.createAccumulation(t);l?.record(s);var u=l;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}else if(n._cumulativeMemoStorage.size>=n._cardinalityLimit&&(a=n._overflowAttributes,c=n._overflowHashCode,n._cumulativeMemoStorage.has(a,c))){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}if(n._activeCollectionStorage.has(a,c)){var p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,u)}n._cumulativeMemoStorage.set(a,l,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new an,e},r}();var Ff=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},r_=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Xd=function(){function r(e,t){var n=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return r.prototype.buildMetrics=function(e,t,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),l=c.collectionTime;s=c.aggregationTemporality,s===Xa.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,l)}else s=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=IG(a);if(u.length!==0)return this._aggregator.toMetricData(t,s,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=Ff(o),a=i.next();!a.done;a=i.next()){var s=a.value,c=this._unreportedAccumulations.get(s);c===void 0&&(c=[],this._unreportedAccumulations.set(s,c)),c.push(e)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}},r.prototype._getMergedUnreportedAccumulations=function(e){var t,n,o=new an,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Ff(i),s=a.next();!s.done;s=a.next()){var c=s.value;o=r.merge(o,c,this._aggregator)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return o},r.merge=function(e,t,n){for(var o=e,i=t.entries(),a=i.next();a.done!==!0;){var s=r_(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,l);o.set(c,p,u)}else o.set(c,l,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=Ff(e.keys()),s=a.next();!s.done;s=a.next()){var c=r_(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function IG(r){return Array.from(r.entries())}var MG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),PG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},n_=function(r){MG(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Yd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Xd(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new an;Array.from(t.entries()).forEach(function(a){var s=PG(a,2),c=s[0],l=s[1];i.set(o._attributesProcessor.process(c),l)}),this._deltaMetricStorage.batchCumulate(i,n)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Kd);$e();function Bf(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
51
+ ${C.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${x}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:p.message}),p}let G=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:y,lastActionHint:T},`Generating new sub-command ${y} within AI action`);let W,U;try{({command:W,reasoning:U}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:T,langfuseSessionId:u})),d.info({command:W,reasoning:U},"Got proposed command")}finally{clearTimeout(G)}if(W.type==="FAILURE")return clearTimeout(G),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${U}`,p;let j={id:Hg(),type:"PRESET_ACTION",command:W},Q={substepIndex:y+1,message:U||"Generated new command."};l.onDynamicCommandGenerated?.({...Q,step:j,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${y} within AI step: ${Co(W)}`);let Y=await t.startSubSteps(),q=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[j],tracer:Y}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let nt=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(q),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${nt.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:Co(W),elementInteracted:q.results[0]?.elementInteracted,thoughts:U});let Be={substepIndex:y,output:{...q,message:q.message??"Successfully executed preset action."},step:j,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(Be),await t.finish({output:$c.parse(q),step:q,message:q.message,attempt:1}),q.status==="FAILED")if(p.status="FAILED",p.message=q.message,S<3)S++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${q.message}`;else return p;else if(q.status==="CANCELLED")return p.status="CANCELLED",p.message=q.message,p;y++}};import{randomUUID as JG}from"crypto";import zve,{multistream as jve}from"pino";import $ve from"pino-pretty";var Kve=5*1024,wH="...[truncated]",Yve=Buffer.byteLength(wH,"utf8");import{PostHog as CH}from"posthog-node";async function fw(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let s=await H(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var ld=class r extends nl{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new CH("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await fw(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await fw(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as xH}from"node:crypto";import{PostHog as _H}from"posthog-node";var cd=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new _H("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new r({...this.bindings,...e},this.options)}track(e,t){if(!Wb(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:n,...o}=e;return this.client.capture({distinctId:xH(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import{execSync as IH}from"child_process";import za from"os";import MH from"v8";var Sw,Rn,yw=za.platform(),PH=za.cpus().map(r=>({model:r.model,speed:r.speed})).reduce((r,e)=>(r[e.model]={speed:e.speed},r.totalCores=(r.totalCores??0)+1,r),{}),ud=r=>{try{let e={},t=!1,n=OH(),o=LH(),i=`${Math.round(n.freePercentage*100)}%`;n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),t=!0);let a=`${o?Math.round(o.idle):"unknown"}%`;o&&o?.total>80&&(t=!0);let s=MH.getHeapStatistics(),c=s.used_heap_size,l=s.heap_size_limit;c/l>.9&&(t=!0),t?(r.warn({memory:n,cpu:o,heapStats:s,...e},"Critical resource usage metrics detected"),yi&&E.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}},Ew=r=>{ud(r),setTimeout(()=>ud(r),5e3)};function bw(r){if(!Dr)return ud(r),{interval:setInterval(()=>ud(r),2e4),cpuMetadata:PH,platform:yw}}function OH(){let r=za.totalmem(),e=yw==="darwin"?NH():(()=>{let n=za.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function LH(){let r=za.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!Rn)return Rn=t,null;let n={user:t.user-Rn.user,nice:t.nice-Rn.nice,sys:t.sys-Rn.sys,idle:t.idle-Rn.idle,irq:t.irq-Rn.irq,total:t.total-Rn.total};return Sw={measurementTime:e,intervalMs:e-Rn.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},Rn=t,Sw}function NH(){try{let r=IH("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),t=r.match(/page size of (\d+) bytes/)?.[1],n=t?Number.parseInt(t,10):4096,o=u=>{let p=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return p?Number.parseInt(p,10):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),c=i*n,l=(a+s)*n;return{availableMemory:c+l,rawFreeMemory:c,cachedMemory:l}}catch{let e=za.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var dd=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function DH(r){if(!r||r.length===0)return{};let e={};for(let t of r){let n=t.indexOf(":");if(n>-1){let o=t.slice(0,n).trim(),i=t.slice(n+1).trim();o&&(e[o]=i);continue}e[t]=!0}return e}function pd(r,e){let t=DH(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var qw="=",fd=";",Qg=",";var Kw=8192;var $a={};jO($a,{getKeyPairs:()=>hz,parseKeyPairsIntoRecord:()=>gz,parsePairKeyValue:()=>Yw,serializeKeyPairs:()=>mz});$e();var pz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function mz(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Qg:"")+t;return n.length>Kw?e:n},"")}function hz(r){return r.getAllEntries().map(function(e){var t=pz(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=fd+o.metadata.toString()),i})}function Yw(r){var e=r.split(fd);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(qw);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=Gg(e.join(fd))),{key:o,value:i,metadata:a}}}}}function gz(r){return typeof r!="string"||r.length===0?{}:r.split(Qg).map(function(e){return Yw(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}$e();var Sd;(function(r){r.AlwaysOff="always_off",r.AlwaysOn="always_on",r.ParentBasedAlwaysOff="parentbased_always_off",r.ParentBasedAlwaysOn="parentbased_always_on",r.ParentBasedTraceIdRatio="parentbased_traceidratio",r.TraceIdRatio="traceidratio"})(Sd||(Sd={}));var fz=",",Sz=["OTEL_SDK_DISABLED"];function yz(r){return Sz.indexOf(r)>-1}var Ez=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function bz(r){return Ez.indexOf(r)>-1}var Tz=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function vz(r){return Tz.indexOf(r)>-1}var Zg=1/0,ef=128,Az=128,Rz=128,tf={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:rt.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Zg,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:ef,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:Az,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:Rz,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:Sd.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative"};function wz(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function Cz(r,e,t,n,o){if(n===void 0&&(n=-1/0),o===void 0&&(o=1/0),typeof t[r]<"u"){var i=Number(t[r]);isNaN(i)||(i<n?e[r]=n:i>o?e[r]=o:e[r]=i)}}function xz(r,e,t,n){n===void 0&&(n=fz);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var _z={ALL:rt.ALL,VERBOSE:rt.VERBOSE,DEBUG:rt.DEBUG,INFO:rt.INFO,WARN:rt.WARN,ERROR:rt.ERROR,NONE:rt.NONE};function Iz(r,e,t){var n=t[r];if(typeof n=="string"){var o=_z[n.toUpperCase()];o!=null&&(e[r]=o)}}function Xw(r){var e={};for(var t in tf){var n=t;switch(n){case"OTEL_LOG_LEVEL":Iz(n,e,r);break;default:if(yz(n))wz(n,e,r);else if(bz(n))Cz(n,e,r);else if(vz(n))xz(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Ht(){var r=Xw(process.env);return Object.assign({},tf,r)}function Jw(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function yd(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=Jw(r.charCodeAt(n)),i=Jw(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var Qw="1.25.1";var Mz="deployment.environment";var Pz="process.runtime.name";var Oz="service.name";var Lz="service.instance.id";var Nz="telemetry.sdk.name",Dz="telemetry.sdk.language",kz="telemetry.sdk.version";var Zw=Mz;var eC=Pz;var Ed=Oz;var tC=Lz;var Ol=Nz,Ll=Dz,Nl=kz;var Uz="nodejs";var rC=Uz;var Wa,bd=(Wa={},Wa[Ol]="opentelemetry",Wa[eC]="node",Wa[Ll]=rC,Wa[Nl]=Qw,Wa);var Fz=9,Bz=6,Hz=Math.pow(10,Bz),zz=Math.pow(10,Fz);function nC(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Hz);return[t,n]}function oC(r){return r[0]*zz+r[1]}function Dl(r){return r[0]*1e6+r[1]/1e3}var Pi;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Pi||(Pi={}));var iC=function(){function r(){var e=this;this._promise=new Promise(function(t,n){e._resolve=t,e._reject=n})}return Object.defineProperty(r.prototype,"promise",{get:function(){return this._promise},enumerable:!1,configurable:!0}),r.prototype.resolve=function(e){this._resolve(e)},r.prototype.reject=function(e){this._reject(e)},r}();var Gz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},jz=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},aC=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new iC}return Object.defineProperty(r.prototype,"isCalled",{get:function(){return this._isCalled},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"promise",{get:function(){return this._deferred.promise},enumerable:!1,configurable:!0}),r.prototype.call=function(){for(var e,t=this,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(!this._isCalled){this._isCalled=!0;try{Promise.resolve((e=this._callback).call.apply(e,jz([this._that],Gz(n),!1))).then(function(i){return t._deferred.resolve(i)},function(i){return t._deferred.reject(i)})}catch(i){this._deferred.reject(i)}}return this._deferred.promise},r}();var Ur;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Ur||(Ur={}));var Jt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Jt||(Jt={}));var Vz=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}();var Iwe=function(r){Vz(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function sC(r,e){for(var t=0,n=r.length-1;n-t>1;){var o=Math.trunc((n+t)/2);r[o]<=e?t=o:n=o-1}return r[n]<=e?n:r[t]<=e?t:-1}$e();var Fr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(Fr||(Fr={}));var lC=function(){function r(){this.kind=Fr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var he;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(he||(he={}));var $z=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function Wz(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var rf=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=Wz(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=sC(this._boundaries,e);this._current.buckets.counts[t+1]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var nf=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Fr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new rf(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new rf(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new rf(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.HISTOGRAM,dataPoints:n.map(function(i){var a=$z(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===he.GAUGE||e.type===he.UP_DOWN_COUNTER||e.type===he.OBSERVABLE_GAUGE||e.type===he.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();$e();var of=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},af=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},sf=function(){function r(e,t,n,o){e===void 0&&(e=new qz),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var qz=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,af([n,this._counts.length-t],of(this._counts.slice(t)),!1)),o.splice.apply(o,af([0,t],of(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(af([],of(this._counts),!1))},r}();var cC=52,Kz=2146435072,Yz=1048575,lf=1023,Td=-lf+1,vd=lf,kl=Math.pow(2,-1022);function Ad(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&Kz)>>20;return n-lf}function Rd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&Yz)*Math.pow(2,32);return o+n}function Ul(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function dC(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var Xz=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Lo=function(r){Xz(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var mC=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<kl)return this._minNormalLowerBoundaryIndex();var t=Ad(e),n=this._rightShift(Rd(e)-1,cC);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Lo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Lo("overflow: "+e+" is > maximum lower boundary: "+n);return Ul(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Td>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return vd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var hC=function(){function r(e){this._scale=e,this._scaleFactor=Ul(Math.LOG2E,e),this._inverseFactor=Ul(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=kl)return this._minNormalLowerBoundaryIndex()-1;if(Rd(e)===0){var t=Ad(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Lo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return kl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Lo("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Td<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(vd+1<<this._scale)-1},r}();var gC=-10,fC=20,Jz=Array.from({length:31},function(r,e){return e>10?new hC(e-10):new mC(e-10)});function cf(r){if(r>fC||r<gC)throw new Lo("expected scale >= "+gC+" && <= "+fC+", got: "+r);return Jz[r+10]}var Qz=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wd=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),Zz=20,e1=160,uf=2,t1=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=e1),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new sf),u===void 0&&(u=new sf),d===void 0&&(d=cf(Zz)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<uf&&($.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+uf),this._maxSize=uf)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=dC(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=cf(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=wd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=wd.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new wd(0,-1);var o=t-n;return new wd(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var SC=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Fr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new t1(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Qz(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===he.GAUGE||e.type===he.UP_DOWN_COUNTER||e.type===he.OBSERVABLE_GAUGE||e.type===he.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var r1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},df=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=nC(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var yC=function(){function r(){this.kind=Fr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new df(e)},r.prototype.merge=function(e,t){var n=Dl(t.sampleTime)>=Dl(e.sampleTime)?t:e;return new df(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Dl(t.sampleTime)>=Dl(e.sampleTime)?t:e;return new df(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.GAUGE,dataPoints:n.map(function(i){var a=r1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var n1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fl=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var pf=function(){function r(e){this.monotonic=e,this.kind=Fr.SUM}return r.prototype.createAccumulation=function(e){return new Fl(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Fl(t.startTime,this.monotonic,o,t.reset):new Fl(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Fl(t.startTime,this.monotonic,o,!0):new Fl(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Jt.SUM,dataPoints:n.map(function(i){var a=n1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Oi=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Cn=function(){function r(){}return r.Drop=function(){return CC},r.Sum=function(){return xC},r.LastValue=function(){return _C},r.Histogram=function(){return IC},r.ExponentialHistogram=function(){return o1},r.Default=function(){return i1},r}();var EC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new lC,e}(Cn);var bC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case he.COUNTER:case he.OBSERVABLE_COUNTER:case he.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new pf(!0),e.NON_MONOTONIC_INSTANCE=new pf(!1),e}(Cn);var TC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new yC,e}(Cn);var vC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new nf([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Cn);var AC=function(r){Oi(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new nf(this._boundaries,this._recordMinMax)},e}(Cn);var RC=function(r){Oi(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new SC(this._maxSize,this._recordMinMax)},e}(Cn);var wC=function(r){Oi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case he.COUNTER:case he.UP_DOWN_COUNTER:case he.OBSERVABLE_COUNTER:case he.OBSERVABLE_UP_DOWN_COUNTER:return xC;case he.GAUGE:case he.OBSERVABLE_GAUGE:return _C;case he.HISTOGRAM:return t.advice.explicitBucketBoundaries?new AC(t.advice.explicitBucketBoundaries):IC}return $.warn("Unable to recognize instrument type: "+t.type),CC},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Cn);var CC=new EC,xC=new bC,_C=new TC,IC=new vC,o1=new RC,i1=new wC;$e();function Cd(){return"unknown_service:"+process.argv0}var No=function(){return No=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},No.apply(this,arguments)},a1=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},s1=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},l1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mf=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return $.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[Ed]=Cd(),e[Ll]=bd[Ll],e[Ol]=bd[Ol],e[Nl]=bd[Nl],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&$.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return a1(this,void 0,void 0,function(){return s1(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=No(No({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=l1(a,2),l=c[0],u=c[1];return No(No(No(No({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Li;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Li||(Li={}));$e();var c1=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},u1=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},hf=function(){return Ur.CUMULATIVE},MC=function(r){switch(r){case he.COUNTER:case he.OBSERVABLE_COUNTER:case he.GAUGE:case he.HISTOGRAM:case he.OBSERVABLE_GAUGE:return Ur.DELTA;case he.UP_DOWN_COUNTER:case he.OBSERVABLE_UP_DOWN_COUNTER:return Ur.CUMULATIVE}},PC=function(r){switch(r){case he.COUNTER:case he.HISTOGRAM:return Ur.DELTA;case he.GAUGE:case he.UP_DOWN_COUNTER:case he.OBSERVABLE_UP_DOWN_COUNTER:case he.OBSERVABLE_COUNTER:case he.OBSERVABLE_GAUGE:return Ur.CUMULATIVE}};function d1(){var r=Ht(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?hf:e==="delta"?MC:e==="lowmemory"?PC:($.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),hf)}function p1(r){return r!=null?r===Li.DELTA?MC:r===Li.LOWMEMORY?PC:hf:d1()}function m1(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Cn.Default()}}var OC=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=m1(t),this._aggregationTemporalitySelector=p1(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return c1(this,void 0,void 0,function(){return u1(this,function(e){switch(e.label){case 0:return[4,this._otlpExporter.shutdown()];case 1:return e.sent(),[2]}})})},r.prototype.forceFlush=function(){return Promise.resolve()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r}();$e();$e();var h1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},LC=1e4,NC=5,DC=1e3,kC=5e3,UC=1.5;function Bl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=h1(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):$.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function gf(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function ff(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return $.warn("Could not parse export URL: '"+r+"'"),r}}function Sf(r){return typeof r=="number"?r<=0?yf(r,LC):r:g1()}function g1(){var r,e=Number((r=Ht().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Ht().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?yf(e,LC):e}function yf(r,e){return $.warn("Timeout must be greater than 0",r),e}function FC(r){var e=[429,502,503,504];return e.includes(r)}function BC(r){if(r==null)return-1;var e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;var t=new Date(r).getTime()-Date.now();return t>=0?t:0}var HC=function(){function r(e){e===void 0&&(e={}),this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname=="string"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new aC(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Sf(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Pi.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Pi.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Pi.SUCCESS})}).catch(function(n){t({code:Pi.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{$.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return $.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();$e();import*as Ef from"url";import*as _d from"http";import*as Id from"https";import*as zC from"zlib";import{Readable as S1}from"stream";var Do;(function(r){r.NONE="none",r.GZIP="gzip"})(Do||(Do={}));var f1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),qa=function(r){f1(e,r);function e(t,n,o){var i=r.call(this,t)||this;return i.name="OTLPExporterError",i.data=o,i.code=n,i}return e}(Error);var xd=function(){return xd=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},xd.apply(this,arguments)};function bf(r,e,t,n,o){var i=r.timeoutMillis,a=new Ef.URL(r.url),s=Number(process.versions.node.split(".")[0]),c,l,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,l.destroyed){var g=new qa("Request Timeout");o(g)}else s>=14?l.destroy():l.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:xd({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?_d.request:Id.request,h=function(g,f){switch(g===void 0&&(g=NC),f===void 0&&(f=DC),l=m(p,function(S){var T="";S.on("data",function(b){return T+=b}),S.on("aborted",function(){if(u){var b=new qa("Request Timeout");o(b)}}),S.on("end",function(){if(u===!1)if(S.statusCode&&S.statusCode<299)$.debug("statusCode: "+S.statusCode,T),n(),clearTimeout(d),clearTimeout(c);else if(S.statusCode&&FC(S.statusCode)&&g>0){var b=void 0;f=UC*f,S.headers["retry-after"]?b=BC(S.headers["retry-after"]):b=Math.round(Math.random()*(kC-f)+f),c=setTimeout(function(){h(g-1,f)},b)}else{var v=new qa(S.statusMessage,S.statusCode,T);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(S){if(u){var T=new qa("Request Timeout",S.code);o(T)}else o(S);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var S=new qa("Request Timeout");o(S)}clearTimeout(d),clearTimeout(c)}),r.compression){case Do.GZIP:{l.setHeader("Content-Encoding","gzip");var y=y1(e);y.on("error",o).pipe(zC.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};h()}function y1(r){var e=new S1;return e.push(r),e.push(null),e}function Tf(r){if(r.httpAgentOptions&&r.keepAlive===!1){$.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Ef.URL(r.url),t=e.protocol==="http:"?_d.Agent:Id.Agent;return new t(xd({keepAlive:!0},r.httpAgentOptions))}catch(n){$.error("collector exporter failed to create http agent. err: "+n.message);return}}function vf(r){if(r)return r;var e=Ht().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Ht().OTEL_EXPORTER_OTLP_COMPRESSION;return e===Do.GZIP?Do.GZIP:Do.NONE}$e();var E1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Md=function(r){E1(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&$.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,Bl(t.headers),$a.parseKeyPairsIntoRecord(Ht().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=Tf(t),i.compression=vf(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){$.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;bf(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,l)}).then(n,o);this._sendingPromises.push(a);var s=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(s,s)},e.prototype.onShutdown=function(){},e}(HC);function jC(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function b1(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function VC(r){var e=jC(r);return b1(e)}function T1(r){var e=jC(r);return e.toString()}var v1=typeof BigInt<"u"?T1:oC;function GC(r){return r}function $C(r){if(r!==void 0)return yd(r)}var A1={encodeHrTime:VC,encodeSpanContext:yd,encodeOptionalSpanContext:$C};function WC(r){var e,t;if(r===void 0)return A1;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?VC:v1,encodeSpanContext:o?GC:yd,encodeOptionalSpanContext:o?GC:$C}}var R1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function qC(r){return{name:r.name,version:r.version}}function Ka(r){return Object.keys(r).map(function(e){return KC(e,r[e])})}function KC(r,e){return{key:r,value:YC(e)}}function YC(r){var e=typeof r;return e==="string"?{stringValue:r}:e==="number"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e==="boolean"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(YC)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=R1(t,2),o=n[0],i=n[1];return KC(o,i)})}}:{}}function XC(r){return{attributes:Ka(r.attributes),droppedAttributesCount:0}}$e();function QC(r,e){var t=WC(e);return{resource:XC(r.resource),schemaUrl:void 0,scopeMetrics:w1(r.scopeMetrics,t)}}function w1(r,e){return Array.from(r.map(function(t){return{scope:qC(t.scope),metrics:t.metrics.map(function(n){return C1(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function C1(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=M1(r.aggregationTemporality);switch(r.dataPointType){case Jt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:JC(r,e)};break;case Jt.GAUGE:t.gauge={dataPoints:JC(r,e)};break;case Jt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:_1(r,e)};break;case Jt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:I1(r,e)};break}return t}function x1(r,e,t){var n={attributes:Ka(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case vr.INT:n.asInt=r.value;break;case vr.DOUBLE:n.asDouble=r.value;break}return n}function JC(r,e){return r.dataPoints.map(function(t){return x1(t,r.descriptor.valueType,e)})}function _1(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ka(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function I1(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ka(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function M1(r){switch(r){case Ur.DELTA:return 1;case Ur.CUMULATIVE:return 2}}function ZC(r,e){return{resourceMetrics:r.map(function(t){return QC(t,e)})}}var Af={serializeRequest:function(r){var e=ZC(r,{useLongBits:!1}),t=new TextEncoder;return t.encode(JSON.stringify(e))},deserializeResponse:function(r){var e=new TextDecoder;return JSON.parse(e.decode(r))}};var ex="0.52.1";var tx=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ya=function(){return Ya=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Ya.apply(this,arguments)},rx="v1/metrics",P1="http://localhost:4318/"+rx,O1={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+ex},L1=function(r){tx(e,r);function e(t){var n=r.call(this,t,Af,"application/json")||this;return n.headers=Ya(Ya(Ya(Ya({},n.headers),O1),$a.parseKeyPairsIntoRecord(Ht().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Bl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Ht().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?ff(Ht().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Ht().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?gf(Ht().OTEL_EXPORTER_OTLP_ENDPOINT,rx):P1},e}(Md),nx=function(r){tx(e,r);function e(t){return r.call(this,new L1(t),t)||this}return e}(OC);var Xa;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Xa||(Xa={}));var xn;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(xn||(xn={}));$e();var N1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),ox=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},ix=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},D1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},k1=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},U1=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function ax(r){return r!=null}function Pd(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function sx(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Rf=function(r){N1(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function ko(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Rf("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function lx(r){return ox(this,void 0,void 0,function(){var e=this;return ix(this,function(t){return[2,Promise.all(r.map(function(n){return ox(e,void 0,void 0,function(){var o,i;return ix(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return[2]}})})}))]})})}function cx(r){return r.status==="rejected"}function wf(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,k1([],D1(e(n)),!1))}),t}function ux(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=U1(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(s){t={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function dx(r,e){for(var t=0,n=r.length-1,o=r.length;n>=t;){var i=t+Math.trunc((n-t)/2);r[i]<e?t=i+1:(o=i,n=i-1)}return o}function px(r,e){return r.toLowerCase()===e.toLowerCase()}$e();var Br;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(Br||(Br={}));var Cf=function(){function r(){this.kind=Br.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();$e();var Ce;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(Ce||(Ce={}));function _n(r,e,t){var n,o,i,a;return B1(r)||$.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:vr.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function mx(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function hx(r,e){return px(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var F1=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function B1(r){return r.match(F1)!=null}var H1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function z1(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var Od=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=z1(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=dx(this._boundaries,e);this._current.buckets.counts[t]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ld=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Br.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Od(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new Od(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new Od(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.HISTOGRAM,dataPoints:n.map(function(i){var a=H1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ce.GAUGE||e.type===Ce.UP_DOWN_COUNTER||e.type===Ce.OBSERVABLE_GAUGE||e.type===Ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();$e();var xf=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},_f=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},If=function(){function r(e,t,n,o){e===void 0&&(e=new G1),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var G1=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,_f([n,this._counts.length-t],xf(this._counts.slice(t)),!1)),o.splice.apply(o,_f([0,t],xf(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(_f([],xf(this._counts),!1))},r}();var gx=52,j1=2146435072,V1=1048575,Mf=1023,Nd=-Mf+1,Dd=Mf,Hl=Math.pow(2,-1022);function kd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&j1)>>20;return n-Mf}function Ud(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&V1)*Math.pow(2,32);return o+n}function zl(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Sx(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var $1=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Uo=function(r){$1(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Ex=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Hl)return this._minNormalLowerBoundaryIndex();var t=kd(e),n=this._rightShift(Ud(e)-1,gx);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Uo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Uo("overflow: "+e+" is > maximum lower boundary: "+n);return zl(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Nd>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Dd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var bx=function(){function r(e){this._scale=e,this._scaleFactor=zl(Math.LOG2E,e),this._inverseFactor=zl(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Hl)return this._minNormalLowerBoundaryIndex()-1;if(Ud(e)===0){var t=kd(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Uo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Hl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Uo("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Nd<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Dd+1<<this._scale)-1},r}();var Tx=-10,vx=20,W1=Array.from({length:31},function(r,e){return e>10?new bx(e-10):new Ex(e-10)});function Pf(r){if(r>vx||r<Tx)throw new Uo("expected scale >= "+Tx+" && <= "+vx+", got: "+r);return W1[r+10]}var q1=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fd=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),K1=20,Y1=160,Of=2,Ax=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=Y1),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new If),u===void 0&&(u=new If),d===void 0&&(d=Pf(K1)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Of&&($.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Of),this._maxSize=Of)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=Sx(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Pf(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Fd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Fd.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Fd(0,-1);var o=t-n;return new Fd(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var Lf=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Br.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Ax(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=q1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ce.GAUGE||e.type===Ce.UP_DOWN_COUNTER||e.type===Ce.OBSERVABLE_GAUGE||e.type===Ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();$e();var X1=jg("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function Rx(r){return r.setValue(X1,!0)}$e();function wx(){return function(r){$.error(J1(r))}}function J1(r){return typeof r=="string"?r:JSON.stringify(Q1(r))}function Q1(r){for(var e={},t=r;t!==null;)Object.getOwnPropertyNames(t).forEach(function(n){if(!e[n]){var o=t[n];o&&(e[n]=String(o))}}),t=Object.getPrototypeOf(t);return e}var Z1=wx();function Bd(r){try{Z1(r)}catch{}}var Cx="1.30.1";var eG="process.runtime.name";var tG="service.name";var rG="telemetry.sdk.name",nG="telemetry.sdk.language",oG="telemetry.sdk.version";var xx=eG;var _x=tG;var Gl=rG,jl=nG,Vl=oG;var iG="nodejs";var Ix=iG;var Ja,Ni=(Ja={},Ja[Gl]="opentelemetry",Ja[xx]="node",Ja[jl]=Ix,Ja[Vl]=Cx,Ja);function $l(r){r.unref()}var pG=9,mG=6,hG=Math.pow(10,mG),L_e=Math.pow(10,pG);function Di(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*hG);return[t,n]}function Qa(r){return r[0]*1e6+r[1]/1e3}var Wl;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Wl||(Wl={}));$e();function Mx(r,e){return new Promise(function(t){Va.with(Rx(Va.active()),function(){r.export(e,function(n){t(n)})})})}var Px={_export:Mx};var gG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Hd=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=Di(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Nf=function(){function r(){this.kind=Br.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Hd(e)},r.prototype.merge=function(e,t){var n=Qa(t.sampleTime)>=Qa(e.sampleTime)?t:e;return new Hd(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Qa(t.sampleTime)>=Qa(e.sampleTime)?t:e;return new Hd(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.GAUGE,dataPoints:n.map(function(i){var a=gG(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var fG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Za=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var zd=function(){function r(e){this.monotonic=e,this.kind=Br.SUM}return r.prototype.createAccumulation=function(e){return new Za(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Za(t.startTime,this.monotonic,o,t.reset):new Za(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Za(t.startTime,this.monotonic,o,!0):new Za(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.SUM,dataPoints:n.map(function(i){var a=fG(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var ki=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Hr=function(){function r(){}return r.Drop=function(){return Fx},r.Sum=function(){return Bx},r.LastValue=function(){return Hx},r.Histogram=function(){return zx},r.ExponentialHistogram=function(){return SG},r.Default=function(){return yG},r}();var Ox=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Cf,e}(Hr);var Lx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ce.COUNTER:case Ce.OBSERVABLE_COUNTER:case Ce.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new zd(!0),e.NON_MONOTONIC_INSTANCE=new zd(!1),e}(Hr);var Nx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Nf,e}(Hr);var Dx=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Ld([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Hr);var ql=function(r){ki(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new Ld(this._boundaries,this._recordMinMax)},e}(Hr);var kx=function(r){ki(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new Lf(this._maxSize,this._recordMinMax)},e}(Hr);var Ux=function(r){ki(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ce.COUNTER:case Ce.UP_DOWN_COUNTER:case Ce.OBSERVABLE_COUNTER:case Ce.OBSERVABLE_UP_DOWN_COUNTER:return Bx;case Ce.GAUGE:case Ce.OBSERVABLE_GAUGE:return Hx;case Ce.HISTOGRAM:return t.advice.explicitBucketBoundaries?new ql(t.advice.explicitBucketBoundaries):zx}return $.warn("Unable to recognize instrument type: "+t.type),Fx},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Hr);var Fx=new Ox,Bx=new Lx,Hx=new Nx,zx=new Dx,SG=new kx,yG=new Ux;var Gx=function(r){return Hr.Default()},jx=function(r){return Xa.CUMULATIVE};var Df=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},kf=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Vx=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},EG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},$x=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:Gx,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:jx,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector}return r.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},r.prototype.onInitialized=function(){},r.prototype.collect=function(e){return Df(this,void 0,void 0,function(){var t,n,o,i,a,s;return kf(this,function(c){switch(c.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return[4,Promise.all(EG([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],Vx(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=Vx.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(wf(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(wf(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Df(this,void 0,void 0,function(){return kf(this,function(t){switch(t.label){case 0:return this._shutdown?($.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,ko(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Df(this,void 0,void 0,function(){return kf(this,function(t){switch(t.label){case 0:return this._shutdown?($.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,ko(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();$e();var bG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Gd=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},jd=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},TG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},vG=function(r,e,t){if(t||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 r.concat(i||Array.prototype.slice.call(e))},Uf=function(r){bG(e,r);function e(t){var n,o,i,a,s=r.call(this,{aggregationSelector:(n=t.exporter.selectAggregation)===null||n===void 0?void 0:n.bind(t.exporter),aggregationTemporalitySelector:(o=t.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(t.exporter),metricProducers:t.metricProducers})||this;if(t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<t.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=t.exporter,s}return e.prototype._runOnce=function(){return Gd(this,void 0,void 0,function(){var t;return jd(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,ko(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Rf?($.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Bd(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Gd(this,void 0,void 0,function(){var o,i,a,s,c,l;return jd(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=$).error.apply(l,vG(["PeriodicExportingMetricReader: metrics collection errors"],TG(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),$.debug("Error while resolving async portion of resource: ",s),Bd(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,Px._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==Wl.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+c.error+")");return[2]}})})},e.prototype.onInitialized=function(){var t=this;this._interval=setInterval(function(){t._runOnce()},this._exportInterval),$l(this._interval)},e.prototype.onForceFlush=function(){return Gd(this,void 0,void 0,function(){return jd(this,function(t){switch(t.label){case 0:return[4,this._runOnce()];case 1:return t.sent(),[4,this._exporter.forceFlush()];case 2:return t.sent(),[2]}})})},e.prototype.onShutdown=function(){return Gd(this,void 0,void 0,function(){return jd(this,function(t){switch(t.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return t.sent(),[4,this._exporter.shutdown()];case 2:return t.sent(),[2]}})})},e}($x);$e();$e();function Vd(){return"unknown_service:"+process.argv0}var Fo=function(){return Fo=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Fo.apply(this,arguments)},AG=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},RG=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},wG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$d=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return $.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[_x]=Vd(),e[jl]=Ni[jl],e[Gl]=Ni[Gl],e[Vl]=Ni[Vl],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&$.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return AG(this,void 0,void 0,function(){return RG(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Fo(Fo({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=wG(a,2),l=c[0],u=c[1];return Fo(Fo(Fo(Fo({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Wx=function(){function r(){this._registeredViews=[]}return r.prototype.addView=function(e){this._registeredViews.push(e)},r.prototype.findViews=function(e,t){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,e)&&n._matchMeter(i.meterSelector,t)});return o},r.prototype._matchInstrument=function(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)},r.prototype._matchMeter=function(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))},r}();$e();var Ui=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Wd=function(){function r(e,t){this._writableMetricStorage=e,this._descriptor=t}return r.prototype._record=function(e,t,n){if(t===void 0&&(t={}),n===void 0&&(n=Va.active()),typeof e!="number"){$.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===vr.INT&&!Number.isInteger(e)&&($.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,Di(Date.now()))},r}();var qx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){this._record(t,n,o)},e}(Wd);var Kx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){$.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wd);var Yx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){this._record(t,n,o)},e}(Wd);var Xx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){$.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wd);var qd=function(){function r(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}return r.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this)},r.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this)},r}();var Jx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);var Qx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);var Zx=function(r){Ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qd);function Kl(r){return r instanceof qd}var e_=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=_n(e,Ce.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new Yx(o,n)},r.prototype.createHistogram=function(e,t){var n=_n(e,Ce.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new Xx(o,n)},r.prototype.createCounter=function(e,t){var n=_n(e,Ce.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Kx(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=_n(e,Ce.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new qx(o,n)},r.prototype.createObservableGauge=function(e,t){var n=_n(e,Ce.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Qx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=_n(e,Ce.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Jx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=_n(e,Ce.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Zx(n,o,this._meterSharedState.observableRegistry)},r.prototype.addBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)},r.prototype.removeBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)},r}();var Kd=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=_n(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var CG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),t_=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},xG=function(){function r(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}return r.prototype.get=function(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)},r.prototype.getOrDefault=function(e,t){var n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);var o=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o),o},r.prototype.set=function(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)},r.prototype.has=function(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)},r.prototype.keys=function(){var e,t;return t_(this,function(n){switch(n.label){case 0:e=this._keyMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},r.prototype.entries=function(){var e,t;return t_(this,function(n){switch(n.label){case 0:e=this._valueMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[this._keyMap.get(t.value[0]),t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},Object.defineProperty(r.prototype,"size",{get:function(){return this._valueMap.size},enumerable:!1,configurable:!0}),r}();var an=function(r){CG(e,r);function e(){return r.call(this,Pd)||this}return e}(xG);var _G=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yd=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new an,this._cumulativeMemoStorage=new an,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Pd(this._overflowAttributes)}return r.prototype.record=function(e,t,n,o){var i=this,a=this._activeCollectionStorage.get(t);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(t,a)}a?.record(e)},r.prototype.batchCumulate=function(e,t){var n=this;Array.from(e.entries()).forEach(function(o){var i=_G(o,3),a=i[0],s=i[1],c=i[2],l=n._aggregator.createAccumulation(t);l?.record(s);var u=l;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}else if(n._cumulativeMemoStorage.size>=n._cardinalityLimit&&(a=n._overflowAttributes,c=n._overflowHashCode,n._cumulativeMemoStorage.has(a,c))){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}if(n._activeCollectionStorage.has(a,c)){var p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,u)}n._cumulativeMemoStorage.set(a,l,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new an,e},r}();var Ff=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},r_=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Xd=function(){function r(e,t){var n=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return r.prototype.buildMetrics=function(e,t,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),l=c.collectionTime;s=c.aggregationTemporality,s===Xa.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,l)}else s=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=IG(a);if(u.length!==0)return this._aggregator.toMetricData(t,s,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=Ff(o),a=i.next();!a.done;a=i.next()){var s=a.value,c=this._unreportedAccumulations.get(s);c===void 0&&(c=[],this._unreportedAccumulations.set(s,c)),c.push(e)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}},r.prototype._getMergedUnreportedAccumulations=function(e){var t,n,o=new an,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Ff(i),s=a.next();!s.done;s=a.next()){var c=s.value;o=r.merge(o,c,this._aggregator)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return o},r.merge=function(e,t,n){for(var o=e,i=t.entries(),a=i.next();a.done!==!0;){var s=r_(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,l);o.set(c,p,u)}else o.set(c,l,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=Ff(e.keys()),s=a.next();!s.done;s=a.next()){var c=r_(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function IG(r){return Array.from(r.entries())}var MG=function(){var r=function(e,t){return r=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])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),PG=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),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&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},n_=function(r){MG(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Yd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Xd(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new an;Array.from(t.entries()).forEach(function(a){var s=PG(a,2),c=s[0],l=s[1];i.set(o._attributesProcessor.process(c),l)}),this._deltaMetricStorage.batchCumulate(i,n)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Kd);$e();function Bf(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
52
52
  `),r.type!==e.type&&(t+=" - Type '"+r.type+"' does not match '"+e.type+`'
53
53
  `),r.valueType!==e.valueType&&(t+=" - Value Type '"+r.valueType+"' does not match '"+e.valueType+`'
54
54
  `),r.description!==e.description&&(t+=" - Description '"+r.description+"' does not match '"+e.description+`'
@@ -283,7 +283,9 @@ var momenticConstants = {
283
283
  "aria-controls",
284
284
  "d"
285
285
  ],
286
- ineligibleElementAttribute: "momentic-ineligible"
286
+ ineligibleElementAttribute: "momentic-ineligible",
287
+ serializedElementForCachingTruncateLength: 500,
288
+ serializedElementForLoggingTruncateLength: 150
287
289
  };
288
290
  function addMomenticConstantsToWindow() {
289
291
  const customWindow = window;
@@ -983,7 +985,7 @@ function determineBestMatchingCssSelector({
983
985
  break;
984
986
  }
985
987
  const serializedElement = serializeElementOnlyWithText(elm2, {
986
- truncateToLength: 150
988
+ truncateToLength: momenticConstants.serializedElementForLoggingTruncateLength
987
989
  });
988
990
  log += serializedElement;
989
991
  log += "\\n=======================\\n";
@@ -993,7 +995,7 @@ function determineBestMatchingCssSelector({
993
995
  }
994
996
  const elm = matchingElements[0];
995
997
  logs.push(
996
- \`Selector '\${selector}' matched exactly one element: \${serializeElementOnlyWithText(elm, { truncateToLength: 150 })}\`
998
+ \`Selector '\${selector}' matched exactly one element: \${serializeElementOnlyWithText(elm, { truncateToLength: momenticConstants.serializedElementForLoggingTruncateLength })}\`
997
999
  );
998
1000
  const matchingSelectors = matchResultMap.get(elm) ?? [];
999
1001
  matchingSelectors.push(selector);
@@ -1004,7 +1006,7 @@ function determineBestMatchingCssSelector({
1004
1006
  for (const [key, selectors2] of matchResultMap.entries()) {
1005
1007
  if (!key.getAttribute("data-momentic-id") && !visualFlagOn) {
1006
1008
  logs.push(
1007
- \`Element has no data-momentic-id, skipping: \${serializeElementOnlyWithText(key, { truncateToLength: 150 })}\`
1009
+ \`Element has no data-momentic-id, skipping: \${serializeElementOnlyWithText(key, { truncateToLength: momenticConstants.serializedElementForLoggingTruncateLength })}\`
1008
1010
  );
1009
1011
  continue;
1010
1012
  }
@@ -1013,8 +1015,8 @@ function determineBestMatchingCssSelector({
1013
1015
  bestElementSelectors = selectors2;
1014
1016
  } else if (bestElement && selectors2.length === bestElementSelectors.length) {
1015
1017
  logs.push(
1016
- \`Two elements have the same CSS selector matches, refusing to choose either: \${serializeElementOnlyWithText(key, { truncateToLength: 150 })}
1017
- \${serializeElementOnlyWithText(bestElement, { truncateToLength: 150 })}\`
1018
+ \`Two elements have the same CSS selector matches, refusing to choose either: \${serializeElementOnlyWithText(key, { truncateToLength: momenticConstants.serializedElementForLoggingTruncateLength })}
1019
+ \${serializeElementOnlyWithText(bestElement, { truncateToLength: momenticConstants.serializedElementForLoggingTruncateLength })}\`
1018
1020
  );
1019
1021
  bestElement = void 0;
1020
1022
  bestElementSelectors = [];
@@ -1249,7 +1251,12 @@ function evaluateCachedElementMatch(params) {
1249
1251
  };
1250
1252
  }
1251
1253
  }
1252
- const serializedCandidate = customWindow.serializeElementOnlyWithText(bestElement);
1254
+ const serializedCandidate = customWindow.serializeElementOnlyWithText(
1255
+ bestElement,
1256
+ {
1257
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
1258
+ }
1259
+ );
1253
1260
  const ratioThreshold = ldistThreshold;
1254
1261
  const lRatio = customWindow.ldist(serializedCandidate, cachedElementSerialized) / Math.min(serializedCandidate.length, cachedElementSerialized.length);
1255
1262
  let lRatioWithoutClass;
@@ -1263,7 +1270,8 @@ function evaluateCachedElementMatch(params) {
1263
1270
  ""
1264
1271
  );
1265
1272
  serializedCandidateWithoutClass = customWindow.serializeElementOnlyWithText(bestElement, {
1266
- removeClassName: true
1273
+ removeClassName: true,
1274
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
1267
1275
  });
1268
1276
  lRatioWithoutClass = customWindow.ldist(
1269
1277
  serializedCandidateWithoutClass,
@@ -1425,7 +1433,12 @@ function generateHtmlCacheAttributes(ele, opts) {
1425
1433
  const serializedHtml = customWindow.serializeElementWithContext(ele);
1426
1434
  logTimings.serializedHtml = Date.now() - serializedHtmlStart;
1427
1435
  const nodeOnlySerializedHtmlStart = Date.now();
1428
- const nodeOnlySerializedHtml = customWindow.serializeElementOnlyWithText(ele);
1436
+ const nodeOnlySerializedHtml = customWindow.serializeElementOnlyWithText(
1437
+ ele,
1438
+ {
1439
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
1440
+ }
1441
+ );
1429
1442
  logTimings.nodeOnlySerializedHtml = Date.now() - nodeOnlySerializedHtmlStart;
1430
1443
  let hybridSelector;
1431
1444
  if (opts?.generateHybridSelector) {
@@ -1496,7 +1509,6 @@ function addEvaluateCssSelectorsScript() {
1496
1509
  cacheMissReason: "not-enough-selectors-matched" /* NotEnoughSelectorsMatched */
1497
1510
  };
1498
1511
  }
1499
- const bestElementSerialized = customWindow.serializeElementOnlyWithText(bestElement);
1500
1512
  const { matches: doesCachedElementMatch, cacheMissReason } = evaluateCachedElementMatch({
1501
1513
  bestElement,
1502
1514
  cachedElementSerialized,
@@ -1512,6 +1524,12 @@ function addEvaluateCssSelectorsScript() {
1512
1524
  }
1513
1525
  const boundingBox = bestElement.getBoundingClientRect();
1514
1526
  const textContent = bestElement.textContent;
1527
+ const bestElementSerialized = customWindow.serializeElementOnlyWithText(
1528
+ bestElement,
1529
+ {
1530
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
1531
+ }
1532
+ );
1515
1533
  return {
1516
1534
  logs,
1517
1535
  result: {
@@ -1783,7 +1801,8 @@ function processElementNode(node, originalElement) {
1783
1801
  processElementAttributes(node, {
1784
1802
  removeInputValues: false,
1785
1803
  removeStateAttributes: false,
1786
- removeAutoGeneratedId: false
1804
+ removeAutoGeneratedId: false,
1805
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
1787
1806
  });
1788
1807
  if (originalElement.tagName.toLowerCase() === "svg" && customWindow._MOMENTIC_ICON_KNOWLEDGE_BASE) {
1789
1808
  const svgHash = customWindow.serializeSvgToHash?.(
@@ -2626,8 +2645,12 @@ function addEvaluateHybridSelectorScript() {
2626
2645
  secondBestStrength = strength.totalStrength;
2627
2646
  }
2628
2647
  }
2629
- const winnerSerialized = winner ? customWindow.serializeElementOnlyWithText?.(winner) : null;
2630
- const secondBestSerialized = secondBest ? customWindow.serializeElementOnlyWithText?.(secondBest) : null;
2648
+ const winnerSerialized = winner ? customWindow.serializeElementOnlyWithText?.(winner, {
2649
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
2650
+ }) : null;
2651
+ const secondBestSerialized = secondBest ? customWindow.serializeElementOnlyWithText?.(secondBest, {
2652
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
2653
+ }) : null;
2631
2654
  if (!winner) {
2632
2655
  logs.push(\`No winner was found at all\`);
2633
2656
  return {
@@ -2899,7 +2922,12 @@ var findClosestElementByLDist = ({
2899
2922
  if (bannedTags.has(element.tagName.toLowerCase())) {
2900
2923
  continue;
2901
2924
  }
2902
- const serializedCandidate = customWindow.serializeElementOnlyWithText(element);
2925
+ const serializedCandidate = customWindow.serializeElementOnlyWithText(
2926
+ element,
2927
+ {
2928
+ truncateToLength: momenticConstants.serializedElementForCachingTruncateLength
2929
+ }
2930
+ );
2903
2931
  if (serializedCandidate.length !== nodeOnlySerializedHtml.length) {
2904
2932
  continue;
2905
2933
  }
@@ -4193,12 +4221,12 @@ function registerAllMomenticListeners() {
4193
4221
 
4194
4222
  // src/html/index.ts
4195
4223
  registerAllMomenticListeners();
4196
- `};var Gr={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-qa","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-sticky-stack-name","data-popup-origin","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-index","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-labelledby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["data-test-id","data-testid","id","name","href","aria-describedby","aria-labelledby","aria-description","data-row","data-col","data-index","data-row-index","data-col-index","for","title","alt","aria-label","aria-modal"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"],bannedAiRequiredCacheAttributes:["id","data-momentic-id","href","name","x","y","width","height","aria-keyshortcuts","data-ved","aria-controls","d"],ineligibleElementAttribute:"momentic-ineligible"};var D_="BoundingBoxMovedError",k_="ZeroOpacityError",ap="visual_actions",Zn="data-momentic-id";function U_(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
4224
+ `};var Gr={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-qa","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-sticky-stack-name","data-popup-origin","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-index","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-labelledby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["data-test-id","data-testid","id","name","href","aria-describedby","aria-labelledby","aria-description","data-row","data-col","data-index","data-row-index","data-col-index","for","title","alt","aria-label","aria-modal"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"],bannedAiRequiredCacheAttributes:["id","data-momentic-id","href","name","x","y","width","height","aria-keyshortcuts","data-ved","aria-controls","d"],ineligibleElementAttribute:"momentic-ineligible",serializedElementForCachingTruncateLength:500,serializedElementForLoggingTruncateLength:150};var D_="BoundingBoxMovedError",k_="ZeroOpacityError",ap="visual_actions",Zn="data-momentic-id";function U_(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
4197
4225
  `,o);a>0&&a<n&&(o=a);let s=i,c=0;for(;c<1e3&&s>n&&r[s]!==`
4198
4226
  `;)c++,s--;return s>n&&r[s]===`
4199
4227
  `&&(i=s),r.slice(o,i)}function ln(r){let e=typeof r=="string"?r:r.toString();return`[${Zn}="${e}"]`}import{execSync as n$}from"child_process";import{randomUUID as xS}from"crypto";import{diff as _S}from"deep-object-diff";import{existsSync as yp,readFileSync as o$,readdirSync as i$,statSync as tM,writeFileSync as a$}from"fs";import{Jimp as rM}from"jimp";import s$ from"js-beautify";import{cloneDeep as as}from"lodash-es";import l$ from"mime";import{platform as c$}from"os";import{basename as nM,extname as u$,join as d$}from"path";import{v4 as p$}from"uuid";import{rmSync as EI}from"fs";import{basename as aV,join as sV}from"path";import{errors as lV}from"playwright-core";import{devices as mj}from"playwright-core";var F_=2,rs=8e3;var Fi=250,_t=500;var B_=5e3,H_=250,se=3e3,Ie=2e3,le=1e3,Wf=3e4,sp=8e3,z_=10,qf=.05;var G_=6e4,j_=new Set(["about:blank","chrome-error://chromewebdata/"]);var Kf=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Yf=1e4,Xl=500,lp=mj["Desktop Chrome"].userAgent,ns=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as hj,rmSync as V_,statSync as gj}from"fs";import*as Zf from"node:fs";import fj from"nodejs-file-downloader";import{tmpdir as Sj}from"os";import Bo,{basename as yj,dirname as Ej}from"path";var eS="file://",Qf=Bo.join(Sj(),"momentic","downloads"),Jf=1e4,bj=50*1024*1024;async function $_(r){let{uri:e}=r;if(e.startsWith(eS))return vj(r);if(e.startsWith("http"))return Rj(r);if(UT)return Aj(r);throw new I("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function Tj(r,e){let t=Bo.join(Qf,r,e.slice(eS.length)),n=Bo.join(Qf,r),o=t.startsWith(n);if(!Zf.existsSync(t)||!o)throw new I("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function vj({uri:r,orgId:e}){let t=Tj(e,r);return{filePath:t,cleanup:()=>{V_(Ej(t),{recursive:!0,force:!0})}}}async function Aj({uri:r}){let e=Bo.resolve(r);if(!Zf.existsSync(e))throw new I("UserConfigurationError",`The referenced file (${r}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function Rj({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=yj(n.href),i=rS(o),a=Bo.extname(i);if(vT.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=tS(t),c,l;for(let h=1;h<=3;h++){let g=new fj({url:r,fileName:i,directory:s,maxAttempts:1,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:Jf});try{let{downloadStatus:f,filePath:y}=await H(g.download(),{milliseconds:Jf,message:`Download timed out after ${Jf}ms`});if(f!=="COMPLETE"||!y)throw new Error(`Download ended in non-success status: ${f}`);c=y;break}catch(f){l=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${l instanceof Error?l.message:l}`);let u=c,p=gj(u).size;if(p>bj)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:p,filePath:u,fileName:i},"Downloaded file to disk");let m;return{filePath:u,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>V_(s,{recursive:!0,force:!0}),10*60*1e3)}}}function W_(r,e){return`${eS}${r}/${e}`}function tS(r){let e=Math.random().toString(36).substring(4),t=Bo.join(Qf,r,e);return hj(t,{recursive:!0}),t}function rS(r){let e=Bo.extname(r),t=Bo.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function cn(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:le})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}async function q_(r,e){let t=r.evaluate(async()=>{let i=window,a={};try{let s=await indexedDB.databases();for(let c of s){if(!c.name)continue;let l=await i.exportIdbToObject?.(c.name,c.version);l&&(a[c.name]=l)}return[a,void 0]}catch(s){return[void 0,s.message]}}),[n,o]=await H(t,{milliseconds:se});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function K_(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await H(n,{milliseconds:se})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function Y_(r,e){try{let t=r.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(n=>{n.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await H(t,{milliseconds:se})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function X_(r,e,t,n,o){try{await wj(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function wj(r,e,t,n){let o=n.text();o.length>Xl&&(o=o.slice(0,Xl)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Xl?i.push(c.slice(0,Xl)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}nS(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function nS(r,e,t,n){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>Yf&&(i[t]=i[t].slice(Math.floor(Yf/2)),i[t]?.push({url:r.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...n,tabIndex:t,timestamp:o})}async function jr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await gl({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import Cj from"truncate-json";var xj="[redacted due to size]",_j=5e3,Ij=1e6,Q_=1e3;function Z_(r,e,t,n){try{t?.({id:e,startedDateTime:new Date().toISOString(),title:void 0,pageTimings:{}})}catch(o){r.warn({err:o},"Unexpected error in onHarPage callback")}}async function oS(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await tI(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:rI(t).timings}}async function eI(r,e,t,n,o){let i={},s=((await t.headerValue("content-type"))?.toLowerCase()??void 0)?.split(";")[0]??void 0;if(n)try{i=await kj({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await tI(t),status:t.status(),statusText:t.statusText(),content:i,redirectURL:t.headers().location,_mocked:!1};r.response=c,r.response&&n&&(r.response.bodySize=n.responseBodySize,r.response.headersSize=n.responseHeadersSize,r.response.content.size=n.responseBodySize);let l=e.timing();r.startedDateTime=new Date(l.startTime).toISOString();let{timings:u,total:d}=rI(l);r.time=d,r.timings=u}function J_(r){try{return new Date(r).toISOString()}catch{return}}function Mj(r){let e={name:"",value:""},t=!0;for(let n of r.split(/; */)){let o=n.indexOf("="),i=o!==-1?n.substring(0,o).trim():n.trim(),a=o!==-1?n.substring(o+1,n.length).trim():"";if(t){t=!1,e.name=Mn(i,!1),e.value=Mn(a,!1);continue}i==="Domain"&&(e.domain=Mn(a,!1)),i==="Expires"&&(e.expires=J_(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=J_(Date.now()+ +a*1e3)),i==="Path"&&(e.path=Mn(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function tI(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(Mj)??[];return{headers:Object.entries(e).map(([n,o])=>({name:Mn(n,!1),value:Mn(o,!1)})),cookies:t}}async function cp(r,e,t,n){let o=await r.headerValue("content-type")??"application/octet-stream";if(t&&(e.request.bodySize=t.requestBodySize,e.request.headersSize=t.requestHeadersSize),!n&&t&&t.requestBodySize>Q_){e.request.postData={mimeType:o,text:"",params:[],_redactedReason:"Request body redacted due to size"};return}let i=r.postData();if(!i)return;let a={mimeType:o,text:Mn(i,n),params:[]};if(o==="application/x-www-form-urlencoded"){let s=new URLSearchParams(i.toString());for(let[c,l]of s.entries())a.params.push({name:Mn(c,n),value:l?Mn(l,n):void 0})}e.request.postData=a}var Pj=["image","font","video","audio"],Oj=["javascript"],Lj=["text"],Nj=["json","xml","html"];function Dj(r){let[e,t]=r.split("/");return e&&Pj.includes(e)||t&&Oj.some(n=>t.includes(n))?!1:!!(e&&Lj.includes(e)||t&&Nj.some(n=>t.includes(n)))}async function kj({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!Dj(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=Q_?o._redactedReason="Response body redacted due to size":o.text=Mn(await r.text(),n),o}function Mn(r,e){let t=e?Ij:_j;try{let n=JSON.parse(r),{jsonString:o}=Cj(r,t);return o}catch{return r.length>t?r.slice(0,t)+xj:r}}function Bi(r){return r<0?0:r}function rI(r){return{timings:{blocked:Bi(r.domainLookupStart),dns:Bi(r.domainLookupEnd-r.domainLookupStart),connect:Bi(r.connectEnd-r.connectStart),send:Bi(r.responseStart-r.requestStart),wait:0,receive:Bi(r.responseEnd-r.responseStart),ssl:Bi(r.connectEnd-r.secureConnectionStart)},total:Bi(r.responseEnd)}}function nI(){return async r=>{let{fragment:e,code:t,context:n}=r,{env:o}=n||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function wt({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await H(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}import{errors as Uj}from"playwright-core";async function Hi({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await r(i)}catch(c){if(c instanceof Uj.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await Fj(c,i.locator,n,t);else throw c}throw s instanceof I?s:new I("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function Fj(r,e,t,n){return r.message.includes("attempt #")?Bj(r,e,t,n):Hj(r)}async function Bj(r,e,t,n){let o=r.message.split(/- retrying \w+ action, attempt #\d+/).filter(c=>c.length>0);if(!o.length)return n.warn({err:r},"Failed to parse Playwright error message for translation, returning raw message"),r;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
4200
4228
  `,";").replace(/\s+/g," ");let a="",s=await cn(e,n,150);if(s&&(a=`Target element HTML: ${dt(s,100,!0)}`),i.includes("element is not enabled"))return new I("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}});if(i.includes("intercepts pointer events")){let c="",l=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(l){let u=(await t.state.getRoot()).locator(ln(l)),d=await cn(u,n,150);d&&(c=`Covering element HTML: ${dt(d,100,!0)}`)}return new I("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${a}
4201
- ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:se});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new I("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new I("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function Hj(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new I("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as qj}from"child_process";import lI from"dedent";import{existsSync as Ql,mkdirSync as uS,readdirSync as Kj,rmSync as cI}from"fs";import{homedir as uI}from"os";import{basename as Yj,join as zo,resolve as Xj}from"path";import{chromium as dI}from"playwright-core";import{addExtra as Jj}from"playwright-extra";import Qj from"puppeteer-extra-plugin-recaptcha";function oI(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:s}of r)(!s||s.matches({url:n.url(),method:n.method()}))&&(o[i]=a);await t.fallback({headers:o})}catch(o){e.warn({err:o},"Failed to apply custom headers to request, continuing")}}}import{randomUUID as Gj}from"crypto";function iI(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function aI(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c}=r;await cp(i,n,void 0,!0);let l={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(h=>[h.name,h.value]),body:n.request.postData?.text}},u;if(t.fetchOriginalResponse){let h=await e.fetch();u={body:await h.text(),options:{status:h.status(),statusText:h.statusText(),headers:Object.entries(await h.headers())}}}let d=await zj(t,l,u),p={};d.headers.forEach((h,g)=>{p[g]=h});let m={body:await d.text(),contentType:d.headers.get("content-type")||"text/plain",headers:p,status:d.status};await e.fulfill(m);try{n.response={status:m.status,statusText:d.statusText,headers:Object.entries(m.headers).map(([h,g])=>({name:h,value:g})),cookies:[],content:{mimeType:m.contentType,text:m.body},_mocked:!0},o?.(a,n);for(let h of Object.values(s))h.matches(n)&&h.onRequestComplete(a,n)}catch(h){h.message.includes("has been closed")||c.warn({err:h},"Failed to add response to HAR")}}async function zj(r,e,t){try{return await r.generateResponse(e,t)}catch(n){let o=n instanceof Error?n.message:`${n}`;return new Response(o,{status:500,headers:{"Content-Type":"text/plain"}})}}async function iS(r){try{await jj(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function jj(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s}=r,c=Gj(),l=!1,u=await oS(e,n);try{o?.(c,u);for(let p of Object.values(a))p.matches(u)&&(l=!0,p.onRequestStart(c,u))}catch(p){i.warn({err:p},"Failed to add request to HAR")}let d=iI(n,s);d?await aI({logger:i,route:t,mock:d,entry:u,onHarEntry:o,request:n,requestId:c,requestRecorders:a}):await Vj({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:u,requestId:c,neverRedact:l})}async function Vj({route:r,request:e,onHarEntry:t,logger:n,requestRecorders:o,entry:i,requestId:a,neverRedact:s}){await r.continue();try{let c=await e.response(),l;try{await c?.finished()}catch{}try{l=await e.sizes()}catch{}if(i&&await cp(e,i,l,s),!c||!i)return;await eI(i,e,c,l,s),t?.(a,i);for(let u of Object.values(o))u.matches(i)&&u.onRequestComplete(a,i)}catch(c){c.message.includes("has been closed")||n.warn({err:c},"Failed to add response to HAR")}}async function $j(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function Wj(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}function up(r){return{request:{url:r.request.url,method:r.request.method,headers:r.request.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.request.postData?r.request.postData.mimeType.includes("json")?{json:JSON.parse(r.request.postData.text)}:{text:r.request.postData.text}:{}},response:r.response?{status:r.response.status,headers:r.response.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.response.content?r.response.content.mimeType?.includes("json")&&r.response.content.text?{json:JSON.parse(r.response.content.text)}:{text:r.response.content.text}:{}}:void 0}}async function aS(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Wj(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await $j(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Ho=class{requestMatcher;constructor(e){this.requestMatcher=e}matches(e){let{url:t,method:n}=e;return this.requestMatcher.method&&this.requestMatcher.method.toLowerCase()!==n.toLowerCase()?!1:Wu(t,this.requestMatcher.urlMatcher)}};function Jl(r){let e=new URL(r.request().url());return/^127\./.test(e.hostname)||/^192\.168\./.test(e.hostname)||/^10\./.test(e.hostname)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(e.hostname)||e.hostname==="localhost"?r.abort():r.fallback()}import{homedir as sS,platform as lS}from"os";import{join as cS}from"path";function dp(){let r=[];if(lS()==="linux"){let e=sS();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(cS(e,".config",t,"Crash Reports"))})}else if(lS()==="darwin"){let e=sS();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(cS(e,"Library","Application Support",t,"Crashpad"))})}else if(lS()==="win32"){let e=sS();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(cS(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function sI(){return[{name:"fs_optout",value:"1",domain:".fullstory.com",path:"/",expires:Date.now()/1e3+365*24*60*60,httpOnly:!1,secure:!0,sameSite:"None"}]}var dS=zo(uI(),"momentic","chromium"),pI=Jj(dI);pI.use(Qj({provider:{id:"2captcha",token:ns},visualFeedback:!0}));var Zj=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],eV=["--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],tV=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-webgl2","--disable-audio-input","--disable-audio-output"];async function mI({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,iconKnowledgeBase:a,callbacks:s,videoOptions:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let l;switch(o.browserType){case"Google Chrome":l="chrome";break;case"Chrome for Testing":l=void 0;break;case"Chromium":l="chromium";break;default:l="chromium";break}let u=[...eV];!Dr&&nV()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},p={...i??{},geolocation:i?.geolocation||So,locale:i?.locale||go,timezoneId:i?.timezoneId||fo,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??lp,viewport:i?.viewport??qt,serviceWorkers:"block",storageState:{cookies:[...sI()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(p.storageState.origins=Object.entries(o.initialLocalStorage).map(([S,T])=>({origin:S,localStorage:Object.entries(T).map(([b,v])=>({name:b,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let m=null,h,g,f={systemDevicePixelRatio:i?.deviceScaleFactor,isNewHeadless:!1};(l==="chrome"||l==="chromium")&&(f.isNewHeadless=!0,d.headless&&u.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&u.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`);try{let S=dp();S.forEach(T=>{if(!Ql(T))return;["new","pending","completed"].forEach(v=>{let C=zo(T,v);if(!Ql(C))return;let x=Kj(C);for(let _=0;_<x.length;_++){let P=zo(C,x[_]);cI(P,{force:!0})}})}),S.forEach(T=>{Ql(T)||uS(T,{recursive:!0});let b=zo(T,`write-test-${Date.now()}`);uS(b,{recursive:!0}),cI(b,{recursive:!0,force:!0})}),u.push(...Zj)}catch(S){e.warn({err:S},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...tV);let y=o.localChromeExtensionPaths?.map(S=>S.startsWith("~")?zo(uI(),S.slice(1)):S);if(y?.length){if(l===void 0)throw new I("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of y){let C=zo(v,"manifest.json");if(!Ql(C))throw new I("UserConfigurationError",`Chrome extension path ${C} does not exist.`)}if(Dr)throw new I("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let S=zo(dS,`momentic-session-${Date.now()}`);if(!Ql(S))try{uS(S,{recursive:!0})}catch(v){throw new I("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${dS} folder: ${v}`)}let T=[...u],b=y.map(v=>Xj(v)).join(",");T.push(`--disable-extensions-except=${b}`),p?.deviceScaleFactor&&T.push(`--force-device-scale-factor=${p.deviceScaleFactor}`,`--device-scale-factor=${p.deviceScaleFactor}`),p.viewport&&T.push(`--window-size=${p.viewport.width},${p.viewport.height}`),h=await dI.launchPersistentContext(zo(dS,`momentic-session-${Date.now()}`),{...d,...p,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:T,baseURL:r}),e.info({sharedContextOptions:p,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:T,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),g=h.pages()[0]}else{m=await pI.launch({...d,args:u});let S={...p,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};h=await m.newContext(S),e.info({contextArgs:S,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),g=await h.newPage()}if(c){let S=await g.video()?.path();if(S){let T=Yj(S);c.onVideoPageChange({videoName:T})}}Dr&&await h.route("**",Jl);try{let S=m?.version();e.info({browserVersion:S},"Got browser version")}catch(S){e.warn({err:S},"Could not get browser version string")}return{browser:m,context:h,page:g,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||qt,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function rV(){if(process.platform!=="linux")return null;try{let e=qj("df -k /dev/shm",{encoding:"utf8"}).trim().split(/\r?\n/),n=e[e.length-1]?.trim().split(/\s+/)??[];if(!n||n.length<2)return null;let o=parseInt(n[1],10);return Number.isNaN(o)||o<=0?null:o/1024}catch{return null}}function nV(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=rV();return t==null?!1:t<128}function pS(r,e=!1){let t=lI`window._MOMENTIC_BROWSER = true;
4229
+ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:se});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new I("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new I("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function Hj(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new I("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as qj}from"child_process";import lI from"dedent";import{existsSync as Ql,mkdirSync as uS,readdirSync as Kj,rmSync as cI}from"fs";import{homedir as uI}from"os";import{basename as Yj,join as zo,resolve as Xj}from"path";import{chromium as dI}from"playwright-core";import{addExtra as Jj}from"playwright-extra";import Qj from"puppeteer-extra-plugin-recaptcha";function oI(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:s}of r)(!s||s.matches({url:n.url(),method:n.method()}))&&(o[i]=a);await t.fallback({headers:o})}catch(o){e.warn({err:o},"Failed to apply custom headers to request, continuing")}}}import{randomUUID as Gj}from"crypto";function iI(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function aI(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c}=r;await cp(i,n,void 0,!0);let l={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(h=>[h.name,h.value]),body:n.request.postData?.text}},u;if(t.fetchOriginalResponse){let h=await e.fetch();u={body:await h.text(),options:{status:h.status(),statusText:h.statusText(),headers:Object.entries(await h.headers())}}}let d=await zj(t,l,u),p={};d.headers.forEach((h,g)=>{p[g]=h});let m={body:await d.text(),contentType:d.headers.get("content-type")||"text/plain",headers:p,status:d.status};await e.fulfill(m);try{n.response={status:m.status,statusText:d.statusText,headers:Object.entries(m.headers).map(([h,g])=>({name:h,value:g})),cookies:[],content:{mimeType:m.contentType,text:m.body},_mocked:!0},o?.(a,n);for(let h of Object.values(s))h.matches(n)&&h.onRequestComplete(a,n)}catch(h){h.message.includes("has been closed")||c.warn({err:h},"Failed to add response to HAR")}}async function zj(r,e,t){try{return await r.generateResponse(e,t)}catch(n){let o=n instanceof Error?n.message:`${n}`;return new Response(o,{status:500,headers:{"Content-Type":"text/plain"}})}}async function iS(r){try{await jj(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function jj(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s}=r,c=Gj(),l=!1,u=await oS(e,n);try{o?.(c,u);for(let p of Object.values(a))p.matches(u)&&(l=!0,p.onRequestStart(c,u))}catch(p){i.warn({err:p},"Failed to add request to HAR")}let d=iI(n,s);d?await aI({logger:i,route:t,mock:d,entry:u,onHarEntry:o,request:n,requestId:c,requestRecorders:a}):await Vj({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:u,requestId:c,neverRedact:l})}async function Vj({route:r,request:e,onHarEntry:t,logger:n,requestRecorders:o,entry:i,requestId:a,neverRedact:s}){await r.continue();try{let c=await e.response(),l;try{await c?.finished()}catch{}try{l=await e.sizes()}catch{}if(i&&await cp(e,i,l,s),!c||!i)return;await eI(i,e,c,l,s),t?.(a,i);for(let u of Object.values(o))u.matches(i)&&u.onRequestComplete(a,i)}catch(c){c.message.includes("has been closed")||n.warn({err:c},"Failed to add response to HAR")}}async function $j(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function Wj(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}function up(r){return{request:{url:r.request.url,method:r.request.method,headers:r.request.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.request.postData?r.request.postData.mimeType.includes("json")?{json:JSON.parse(r.request.postData.text)}:{text:r.request.postData.text}:{}},response:r.response?{status:r.response.status,headers:r.response.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.response.content?r.response.content.mimeType?.includes("json")&&r.response.content.text?{json:JSON.parse(r.response.content.text)}:{text:r.response.content.text}:{}}:void 0}}async function aS(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Wj(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await $j(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Ho=class{requestMatcher;constructor(e){this.requestMatcher=e}matches(e){let{url:t,method:n}=e;return this.requestMatcher.method&&this.requestMatcher.method.toLowerCase()!==n.toLowerCase()?!1:Wu(t,this.requestMatcher.urlMatcher)}};function Jl(r){let e=new URL(r.request().url());if(/^127\./.test(e.hostname)||/^192\.168\./.test(e.hostname)||/^10\./.test(e.hostname)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(e.hostname)||e.hostname==="localhost"||e.hostname==="0.0.0.0")return r.abort();if(e.hostname.startsWith("[")&&e.hostname.endsWith("]")){let t=e.hostname.slice(1,-1).toLowerCase();if(t==="::1"||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd"))return r.abort()}return r.fallback()}import{homedir as sS,platform as lS}from"os";import{join as cS}from"path";function dp(){let r=[];if(lS()==="linux"){let e=sS();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(cS(e,".config",t,"Crash Reports"))})}else if(lS()==="darwin"){let e=sS();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(cS(e,"Library","Application Support",t,"Crashpad"))})}else if(lS()==="win32"){let e=sS();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(cS(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function sI(){return[{name:"fs_optout",value:"1",domain:".fullstory.com",path:"/",expires:Date.now()/1e3+365*24*60*60,httpOnly:!1,secure:!0,sameSite:"None"}]}var dS=zo(uI(),"momentic","chromium"),pI=Jj(dI);pI.use(Qj({provider:{id:"2captcha",token:ns},visualFeedback:!0}));var Zj=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],eV=["--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],tV=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-webgl2","--disable-audio-input","--disable-audio-output"];async function mI({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,iconKnowledgeBase:a,callbacks:s,videoOptions:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let l;switch(o.browserType){case"Google Chrome":l="chrome";break;case"Chrome for Testing":l=void 0;break;case"Chromium":l="chromium";break;default:l="chromium";break}let u=[...eV];!Dr&&nV()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},p={...i??{},geolocation:i?.geolocation||So,locale:i?.locale||go,timezoneId:i?.timezoneId||fo,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??lp,viewport:i?.viewport??qt,serviceWorkers:"block",storageState:{cookies:[...sI()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(p.storageState.origins=Object.entries(o.initialLocalStorage).map(([S,T])=>({origin:S,localStorage:Object.entries(T).map(([b,v])=>({name:b,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let m=null,h,g,f={systemDevicePixelRatio:i?.deviceScaleFactor,isNewHeadless:!1};(l==="chrome"||l==="chromium")&&(f.isNewHeadless=!0,d.headless&&u.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&u.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`);try{let S=dp();S.forEach(T=>{if(!Ql(T))return;["new","pending","completed"].forEach(v=>{let C=zo(T,v);if(!Ql(C))return;let x=Kj(C);for(let _=0;_<x.length;_++){let P=zo(C,x[_]);cI(P,{force:!0})}})}),S.forEach(T=>{Ql(T)||uS(T,{recursive:!0});let b=zo(T,`write-test-${Date.now()}`);uS(b,{recursive:!0}),cI(b,{recursive:!0,force:!0})}),u.push(...Zj)}catch(S){e.warn({err:S},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...tV);let y=o.localChromeExtensionPaths?.map(S=>S.startsWith("~")?zo(uI(),S.slice(1)):S);if(y?.length){if(l===void 0)throw new I("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of y){let C=zo(v,"manifest.json");if(!Ql(C))throw new I("UserConfigurationError",`Chrome extension path ${C} does not exist.`)}if(Dr)throw new I("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let S=zo(dS,`momentic-session-${Date.now()}`);if(!Ql(S))try{uS(S,{recursive:!0})}catch(v){throw new I("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${dS} folder: ${v}`)}let T=[...u],b=y.map(v=>Xj(v)).join(",");T.push(`--disable-extensions-except=${b}`),p?.deviceScaleFactor&&T.push(`--force-device-scale-factor=${p.deviceScaleFactor}`,`--device-scale-factor=${p.deviceScaleFactor}`),p.viewport&&T.push(`--window-size=${p.viewport.width},${p.viewport.height}`),h=await dI.launchPersistentContext(zo(dS,`momentic-session-${Date.now()}`),{...d,...p,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:T,baseURL:r}),e.info({sharedContextOptions:p,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:T,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),g=h.pages()[0]}else{m=await pI.launch({...d,args:u});let S={...p,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};h=await m.newContext(S),e.info({contextArgs:S,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),g=await h.newPage()}if(c){let S=await g.video()?.path();if(S){let T=Yj(S);c.onVideoPageChange({videoName:T})}}Dr&&await h.route("**",Jl);try{let S=m?.version();e.info({browserVersion:S},"Got browser version")}catch(S){e.warn({err:S},"Could not get browser version string")}return{browser:m,context:h,page:g,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||qt,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function rV(){if(process.platform!=="linux")return null;try{let e=qj("df -k /dev/shm",{encoding:"utf8"}).trim().split(/\r?\n/),n=e[e.length-1]?.trim().split(/\s+/)??[];if(!n||n.length<2)return null;let o=parseInt(n[1],10);return Number.isNaN(o)||o<=0?null:o/1024}catch{return null}}function nV(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=rV();return t==null?!1:t<128}function pS(r,e=!1){let t=lI`window._MOMENTIC_BROWSER = true;
4202
4230
  window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(r)};
4203
4231
  window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t+=lI`
4204
4232
  window._fs_namespace = window._fs_namespace || 'FS';
@@ -4208,7 +4236,8 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4208
4236
  value: FSNoop,
4209
4237
  writable: false,
4210
4238
  configurable: false,
4211
- });`),t}async function hI(r){try{return await oV(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function oV({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:le}),o=await cn(r,e,500),i=await r.boundingBox({timeout:le});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5||n!=="input")return;if(t)try{let c=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await c.waitFor({state:"visible",timeout:le}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let l=window,u=c.parentElement;if(!u)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.getBoundingClientRect(),p=u.getBoundingClientRect();if(p.width===0||p.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,d.left-p.left),p.width-1),y:Math.min(Math.max(1,d.top-p.top),p.height-1)},h=l._MOMENTIC_FEATURE_FLAGS?.[ap],g=c.getAttribute(Zn),f=!h&&g?ln(g):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:m,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:le});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:le}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var fI=["date","datetime-local","month","time","week"],gI={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function SI(r){try{await H(iV(r),{milliseconds:se})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function iV({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await wt({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:le,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!gI[i])return;gI[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as mr}from"zod";var yI=mr.object({doubleClick:mr.boolean().optional(),rightClick:mr.boolean().optional(),force:mr.boolean().optional(),waitForDownload:mr.boolean().optional(),delayMs:mr.number().optional(),downloadTimeoutMs:mr.number().optional(),relativePosition:mr.object({x:mr.number(),y:mr.number()}).optional()}),$De=mr.object({repeat:mr.number().optional(),convertMeta:mr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:mr.number().optional()});async function pp({locator:r,callbacks:e,logger:t,timeoutMs:n=le}){try{await mS(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let m=window.getComputedStyle(d,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=d.getBoundingClientRect();return!(!h.height||!h.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let c=i.style.getPropertyValue("outline"),l=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let u=`momentic${Math.floor(Math.random()*1e7)}`;a[u]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",c,l),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[u](),a.removeHighlightFunctions?.[u]&&delete a.removeHighlightFunctions[u]},5e3)),a.removeHighlightFunctions[u]=a[u]},void 0,{timeout:n});return await H(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function mS(r,e=le){let t=await r.state.getRoot();await wt({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function hS(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Hi({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>bI({...r,targetingResult:t,useVisualClick:e})})}async function cV(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await uV(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function uV(r,e){let{logger:t,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:le});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:le}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),bI({...e,targetingResult:{locator:a},redirectionAttempts:n+1})}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function dV(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=yI.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await hV({targetingResult:t,position:n,options:o,logger:e,isAndroid:r.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function pV(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await hI({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;s&&!a&&t.hints?.relativeXYToLocator&&(a=t.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:se,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:se,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(fV(u))o.warn({err:u},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:u},"Error clicking on locator, attempting to recover..."),cV(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function bI(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??Wf;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof lV.TimeoutError?new I("ActionFailureError",`Download did not complete in ${u}ms`):new I("ActionFailureError",`Download failed: ${d.message}`)}})());try{await pp({locator:a.locator,callbacks:n,logger:t,timeoutMs:le})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await dV(r):l=(await pV(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new I("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await H(s,{milliseconds:e.downloadTimeoutMs??Wf});if(u instanceof Error)throw u;return{downloadedFile:await gV(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function mV(r,e){let t=await r.locator.boundingBox({timeout:se});if(!t){let i=await cn(r.locator,e,500);throw new I("ActionFailureError",`${_m}${i?`: ${i}`:""}`)}if(r.hints?.relativeXYToLocator){let i=t.x+r.hints.relativeXYToLocator.x,a=t.y+r.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function hV({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:se}),d=r.relativePosition.x,p=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:se});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await mV(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=r?.rightClick?"right":"left",l=r?.delayMs??25;return r?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l}),{clickX:o,clickY:i,reason:a}}async function gV(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=rS(r.suggestedFilename()),i=e();await r.saveAs(sV(i,o)),EI(n,{force:!0}),setTimeout(()=>{EI(i,{recursive:!0,force:!0})},5*60*1e3);let a=W_(aV(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function fV(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as SV}from"os";var yV={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function EV(){let r=SV();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function TI(r){return JSON.stringify(r.split("+").sort())}function mp(r,e){let t=EV(),n=TI(r);for(let o of Object.values(yV))if(Object.values(o).some(i=>TI(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function gS({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await wt({root:r,fn:([d,p,m,h])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*h),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"scrolling page"});else{let d=e.viewportSize()||qt,p=await wt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"computing page height"}),[m,h,g]=await wt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let y=f.getBoundingClientRect();return[f.scrollTop,y.x,y.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<Ie;){a?.throwIfAborted();let y=await H(e.evaluate(()=>document.body.scrollHeight),{milliseconds:le}),[S,T,b]=await H(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let C=v.getBoundingClientRect();return[v.scrollTop,C.x,C.y]}),{milliseconds:le});if(y===p&&S===m&&T===h&&b===g)break;p=y,m=S,h=T,g=b,await ie(_t)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function fS(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await ie(_t)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function vI(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await bV(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await ie(s??Fi),await e.mouse.up()}async function AI(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await ie(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,sp):500),await r.mouse.up()}async function bV(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:p,endX:m,endY:h,stepCount:g,delayMs:f})=>{let y=document.elementFromPoint(d,p)??document.body??document.documentElement,T=window._momenticMobileUtilities.dispatchTouch;T(y,"touchstart",d,p);for(let b=1;b<=g;b+=1){let v=d+(m-d)*b/g,C=p+(h-p)*b/g;T(y,"touchmove",v,C),await new Promise(x=>setTimeout(x,Math.floor((f??500)/g)))}T(y,"touchend",m,h)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as _V}from"crypto";import{cloneDeep as ES}from"lodash-es";function Go(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as TV}from"crypto";var vV="v1";function SS(r,e){if(r.tagName.toLowerCase()==="svg"&&!RV(r))try{let t=RI(r,e),n=AV(JSON.stringify(t));return{version:vV,json:t,hash:n}}catch{return}}function AV(r){return TV("md5").update(r).digest("hex")}function RI(r,e){let t=r.tagName.toLowerCase(),n=wV(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=RI(a,e);s&&o.children.push(s)}}return o}function RV(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function wV(r){let e={},t=r.attributes;for(let n of Object.keys(t))Gr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var zi={r:147,g:196,b:125,a:.55},CI={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:zi,paddingColor:zi,borderColor:zi,marginColor:zi,eventTargetColor:zi,shapeColor:zi,shapeMarginColor:zi,showInfo:!0,showAccessibilityInfo:!0};function xI({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=CV({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function CV({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((x,_)=>{u[x]=_});let d=l.styles,p=l.bounds??[],m=c.nodes,h=m.contentDocumentIndex??{index:[],value:[]},g=m.backendNodeId??[],f=m.attributes??[],y=m.parentIndex??[],S=m.nodeName??[],T=m.nodeType??[],b=m.pseudoType??{index:[],value:[]},v=m.inputChecked??{index:[]},C=e[c.frameId];for(let x=0;x<g.length;x++){let _=g[x],P=T[x],G=f[x]??[],W=y[x]!==void 0&&y[x]>=0?y[x]:void 0,U=W!==void 0?g[W]:void 0,j=U!==void 0?a[U]:void 0,Q=b.index.indexOf(x),Y=Q!==-1?e[b.value[Q]]:void 0,Ee=u[x],q;Ee?q=p[Ee]??[]:q=[];let nt=S[x]!==void 0?e[S[x]]?.toLowerCase():void 0;if(!nt){s.warn({backendNodeId:_,frameId:C,frameIndex:o,nodeBounds:q},"DOM node has no tag name");continue}let Be={backendNodeId:_,psuedoType:Y,nodeType:P,frameIndex:o,parentFrameId:C,ownedFrameId:void 0,bounds:{x:q[0]??null,y:q[1]??null,width:q[2]??null,height:q[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:U??null,tagName:nt,parent:j??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};j&&j.childrenBackendIds.push(_);let qe=h.index.indexOf(x);if(qe!==-1){let _e=h.value[qe];i[_e]=Be;let ne=r[_e]?.frameId;Be.ownedFrameId=ne!==void 0?e[ne]:void 0}for(let _e of Object.keys(Be.bounds)){let ne=_e;Be.bounds[ne]!==null&&(Be.bounds[ne]/=n)}let Lt=Ee!==void 0?d[Ee]??[]:[];for(let _e=0;_e<Lt.length&&!(_e>=t.length);_e++){let ne=Lt[_e];if(ne===void 0||isNaN(ne))continue;let Gt=e[ne];if(Gt===void 0)continue;let Dn=t[_e];Be.computedStyles[Dn]=Gt}for(let _e=0;_e<G.length;_e+=2){let ne=G[_e],Gt=G[_e+1];if(!ne||!Gt)continue;let Dn=e[ne],kn=e[Gt];!Dn||!kn||(Be.attributes[Dn]=kn)}v.index.includes(x)&&(Be.attributes.checked="true"),a[Be.backendNodeId]=Be}return a[g[0]]}function yS(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${yS(t,e)}${a}`}return r.mPathSelector=n,n}function wI(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var xV=["html","#document","#document-fragment"];function _I({node:r,domGraph:e}){let t=[],n=r,o=wI(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=wI(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,xV.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function II(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function MI(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Ie});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Ie}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Ie})).attributes,i=Go(o,Zn);if(!i)throw new Error(`Could not find attribute ${Zn} for object ${e}`);return i}var IV=["focusable","keyshortcuts","controls","live","relevant","orientation"],MV=["selected","readonly","modal","required","invalid"],PV=["id","name","role","content"],PI=["absolute","fixed","sticky"],OV=["i","label"],LV=["path"],NV=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],NI=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],DI=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],DV=["menulistpopup","statictext","inlinetextbox"],kV=80,OI=100,kI=50,vS=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],UV=["cite"],FV={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},BV={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},LI={indentLevel:0},bS=class r{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&t.length<kI?t:""),this.role=this.role||(e.domNode.attributes.role??""),jV(this.properties,e.domNode,e.importantProperties)}$V(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&LV.includes(this.domNode.tagName)||this.ignoredReasons.some(n=>DI.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>zI(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>GI(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&OV.includes(this.domNode.tagName)||NV.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Gr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>HI(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}serialize(e=LI){let t=Object.assign({},LI,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=ES(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(v=>!v.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let v=g.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===m&&(m="")}let f=vS.includes(this.role)||UV.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
4239
+ });`),`${t}
4240
+ //# sourceURL=momentic-injected/extra-scripts.js`}async function hI(r){try{return await oV(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function oV({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:le}),o=await cn(r,e,500),i=await r.boundingBox({timeout:le});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5||n!=="input")return;if(t)try{let c=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await c.waitFor({state:"visible",timeout:le}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let l=window,u=c.parentElement;if(!u)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.getBoundingClientRect(),p=u.getBoundingClientRect();if(p.width===0||p.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,d.left-p.left),p.width-1),y:Math.min(Math.max(1,d.top-p.top),p.height-1)},h=l._MOMENTIC_FEATURE_FLAGS?.[ap],g=c.getAttribute(Zn),f=!h&&g?ln(g):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:m,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:le});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:le}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var fI=["date","datetime-local","month","time","week"],gI={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function SI(r){try{await H(iV(r),{milliseconds:se})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function iV({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await wt({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:le,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!gI[i])return;gI[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as mr}from"zod";var yI=mr.object({doubleClick:mr.boolean().optional(),rightClick:mr.boolean().optional(),force:mr.boolean().optional(),waitForDownload:mr.boolean().optional(),delayMs:mr.number().optional(),downloadTimeoutMs:mr.number().optional(),relativePosition:mr.object({x:mr.number(),y:mr.number()}).optional()}),$De=mr.object({repeat:mr.number().optional(),convertMeta:mr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:mr.number().optional()});async function pp({locator:r,callbacks:e,logger:t,timeoutMs:n=le}){try{await mS(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let m=window.getComputedStyle(d,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=d.getBoundingClientRect();return!(!h.height||!h.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let c=i.style.getPropertyValue("outline"),l=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let u=`momentic${Math.floor(Math.random()*1e7)}`;a[u]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",c,l),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[u](),a.removeHighlightFunctions?.[u]&&delete a.removeHighlightFunctions[u]},5e3)),a.removeHighlightFunctions[u]=a[u]},void 0,{timeout:n});return await H(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function mS(r,e=le){let t=await r.state.getRoot();await wt({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function hS(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Hi({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>bI({...r,targetingResult:t,useVisualClick:e})})}async function cV(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await uV(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function uV(r,e){let{logger:t,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:le});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:le}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),bI({...e,targetingResult:{locator:a},redirectionAttempts:n+1})}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function dV(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=yI.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await hV({targetingResult:t,position:n,options:o,logger:e,isAndroid:r.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function pV(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await hI({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;s&&!a&&t.hints?.relativeXYToLocator&&(a=t.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:se,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:se,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(fV(u))o.warn({err:u},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:u},"Error clicking on locator, attempting to recover..."),cV(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function bI(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??Wf;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof lV.TimeoutError?new I("ActionFailureError",`Download did not complete in ${u}ms`):new I("ActionFailureError",`Download failed: ${d.message}`)}})());try{await pp({locator:a.locator,callbacks:n,logger:t,timeoutMs:le})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await dV(r):l=(await pV(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new I("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await H(s,{milliseconds:e.downloadTimeoutMs??Wf});if(u instanceof Error)throw u;return{downloadedFile:await gV(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function mV(r,e){let t=await r.locator.boundingBox({timeout:se});if(!t){let i=await cn(r.locator,e,500);throw new I("ActionFailureError",`${_m}${i?`: ${i}`:""}`)}if(r.hints?.relativeXYToLocator){let i=t.x+r.hints.relativeXYToLocator.x,a=t.y+r.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function hV({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:se}),d=r.relativePosition.x,p=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:se});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await mV(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=r?.rightClick?"right":"left",l=r?.delayMs??25;return r?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l}),{clickX:o,clickY:i,reason:a}}async function gV(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=rS(r.suggestedFilename()),i=e();await r.saveAs(sV(i,o)),EI(n,{force:!0}),setTimeout(()=>{EI(i,{recursive:!0,force:!0})},5*60*1e3);let a=W_(aV(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function fV(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as SV}from"os";var yV={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function EV(){let r=SV();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function TI(r){return JSON.stringify(r.split("+").sort())}function mp(r,e){let t=EV(),n=TI(r);for(let o of Object.values(yV))if(Object.values(o).some(i=>TI(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function gS({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await wt({root:r,fn:([d,p,m,h])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*h),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"scrolling page"});else{let d=e.viewportSize()||qt,p=await wt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"computing page height"}),[m,h,g]=await wt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let y=f.getBoundingClientRect();return[f.scrollTop,y.x,y.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ie,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<Ie;){a?.throwIfAborted();let y=await H(e.evaluate(()=>document.body.scrollHeight),{milliseconds:le}),[S,T,b]=await H(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let C=v.getBoundingClientRect();return[v.scrollTop,C.x,C.y]}),{milliseconds:le});if(y===p&&S===m&&T===h&&b===g)break;p=y,m=S,h=T,g=b,await ie(_t)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function fS(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await ie(_t)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function vI(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await bV(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await ie(s??Fi),await e.mouse.up()}async function AI(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await ie(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,sp):500),await r.mouse.up()}async function bV(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:p,endX:m,endY:h,stepCount:g,delayMs:f})=>{let y=document.elementFromPoint(d,p)??document.body??document.documentElement,T=window._momenticMobileUtilities.dispatchTouch;T(y,"touchstart",d,p);for(let b=1;b<=g;b+=1){let v=d+(m-d)*b/g,C=p+(h-p)*b/g;T(y,"touchmove",v,C),await new Promise(x=>setTimeout(x,Math.floor((f??500)/g)))}T(y,"touchend",m,h)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as _V}from"crypto";import{cloneDeep as ES}from"lodash-es";function Go(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as TV}from"crypto";var vV="v1";function SS(r,e){if(r.tagName.toLowerCase()==="svg"&&!RV(r))try{let t=RI(r,e),n=AV(JSON.stringify(t));return{version:vV,json:t,hash:n}}catch{return}}function AV(r){return TV("md5").update(r).digest("hex")}function RI(r,e){let t=r.tagName.toLowerCase(),n=wV(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=RI(a,e);s&&o.children.push(s)}}return o}function RV(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function wV(r){let e={},t=r.attributes;for(let n of Object.keys(t))Gr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var zi={r:147,g:196,b:125,a:.55},CI={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:zi,paddingColor:zi,borderColor:zi,marginColor:zi,eventTargetColor:zi,shapeColor:zi,shapeMarginColor:zi,showInfo:!0,showAccessibilityInfo:!0};function xI({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=CV({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function CV({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((x,_)=>{u[x]=_});let d=l.styles,p=l.bounds??[],m=c.nodes,h=m.contentDocumentIndex??{index:[],value:[]},g=m.backendNodeId??[],f=m.attributes??[],y=m.parentIndex??[],S=m.nodeName??[],T=m.nodeType??[],b=m.pseudoType??{index:[],value:[]},v=m.inputChecked??{index:[]},C=e[c.frameId];for(let x=0;x<g.length;x++){let _=g[x],P=T[x],G=f[x]??[],W=y[x]!==void 0&&y[x]>=0?y[x]:void 0,U=W!==void 0?g[W]:void 0,j=U!==void 0?a[U]:void 0,Q=b.index.indexOf(x),Y=Q!==-1?e[b.value[Q]]:void 0,Ee=u[x],q;Ee?q=p[Ee]??[]:q=[];let nt=S[x]!==void 0?e[S[x]]?.toLowerCase():void 0;if(!nt){s.warn({backendNodeId:_,frameId:C,frameIndex:o,nodeBounds:q},"DOM node has no tag name");continue}let Be={backendNodeId:_,psuedoType:Y,nodeType:P,frameIndex:o,parentFrameId:C,ownedFrameId:void 0,bounds:{x:q[0]??null,y:q[1]??null,width:q[2]??null,height:q[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:U??null,tagName:nt,parent:j??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};j&&j.childrenBackendIds.push(_);let qe=h.index.indexOf(x);if(qe!==-1){let _e=h.value[qe];i[_e]=Be;let ne=r[_e]?.frameId;Be.ownedFrameId=ne!==void 0?e[ne]:void 0}for(let _e of Object.keys(Be.bounds)){let ne=_e;Be.bounds[ne]!==null&&(Be.bounds[ne]/=n)}let Lt=Ee!==void 0?d[Ee]??[]:[];for(let _e=0;_e<Lt.length&&!(_e>=t.length);_e++){let ne=Lt[_e];if(ne===void 0||isNaN(ne))continue;let Gt=e[ne];if(Gt===void 0)continue;let Dn=t[_e];Be.computedStyles[Dn]=Gt}for(let _e=0;_e<G.length;_e+=2){let ne=G[_e],Gt=G[_e+1];if(!ne||!Gt)continue;let Dn=e[ne],kn=e[Gt];!Dn||!kn||(Be.attributes[Dn]=kn)}v.index.includes(x)&&(Be.attributes.checked="true"),a[Be.backendNodeId]=Be}return a[g[0]]}function yS(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${yS(t,e)}${a}`}return r.mPathSelector=n,n}function wI(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var xV=["html","#document","#document-fragment"];function _I({node:r,domGraph:e}){let t=[],n=r,o=wI(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=wI(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,xV.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function II(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function MI(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Ie});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Ie}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Ie})).attributes,i=Go(o,Zn);if(!i)throw new Error(`Could not find attribute ${Zn} for object ${e}`);return i}var IV=["focusable","keyshortcuts","controls","live","relevant","orientation"],MV=["selected","readonly","modal","required","invalid"],PV=["id","name","role","content"],PI=["absolute","fixed","sticky"],OV=["i","label"],LV=["path"],NV=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],NI=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],DI=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],DV=["menulistpopup","statictext","inlinetextbox"],kV=80,OI=100,kI=50,vS=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],UV=["cite"],FV={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},BV={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},LI={indentLevel:0},bS=class r{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&t.length<kI?t:""),this.role=this.role||(e.domNode.attributes.role??""),jV(this.properties,e.domNode,e.importantProperties)}$V(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&LV.includes(this.domNode.tagName)||this.ignoredReasons.some(n=>DI.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>zI(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>GI(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&OV.includes(this.domNode.tagName)||NV.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Gr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>HI(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}serialize(e=LI){let t=Object.assign({},LI,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=ES(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(v=>!v.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let v=g.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===m&&(m="")}let f=vS.includes(this.role)||UV.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
4212
4241
  `;let y=`${u}<${p}`;!a&&!f&&(y+=` id="${this.id}"`);let S=s??!1;if((l.multiline||l.contenteditable)&&this.children.length>0&&(S=!0),d&&d!=="generic"&&d!==p&&!(FV[d]??[]).includes(p)&&(y+=` role=${JSON.stringify(d)}`),m&&(y+=` name=${JSON.stringify(m)}`),this.content&&!S&&(y+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isIneligible()&&(y+=` ${Gr.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,C=Math.round(v.x??0),x=Math.round(v.y??0),_=Math.round((v.x??0)+(v.width??0)),P=Math.round((v.y??0)+(v.height??0));y+=` bounds=[${C} ${x} ${_} ${P}]`}let T=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-T>1e3)throw new Error(`Serialization for the HTML element with tag ${p} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([v,C])=>{if(!IV.includes(v)){{if(MV.includes(v)&&(!C||C==="false"))return;if(v==="value"&&S&&(l.type==="text"||this.role==="textbox"))return;if(v==="level"&&`${C}`=="1")return;if(v==="url"&&l.src&&p==="img")return;if(v==="url"&&l.href&&p==="a")return;if(v==="editable"&&C==="plaintext")return;if(v==="type"&&C===p)return;if(c&&!BV[v])return}typeof C=="string"?y+=` ${v}="${dt(C,OI,!0)}"`:typeof C=="boolean"?C?y+=` ${v}`:y+=` ${v}={false}`:typeof C<"u"&&(y+=` ${v}={${dt(JSON.stringify(C),OI,!0)}}`)}})}if(p==="::before"||p==="::after"){let v="";for(let C of this.children)v+=C.serialize({...e,indentLevel:n,neighbors:0});return v}let b=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||b)y+=` />
4213
4242
  `;else{let v="";for(let x of this.children)v+=x.serialize({...e,indentLevel:n+2,neighbors:0});let C=v.trim();C.length<=kV&&!C.includes(`
4214
4243
  `)?y+=`>${C}</${p}>
@@ -4216,14 +4245,16 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4216
4245
  ${v}${u}</${p}>
4217
4246
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let v=this.parent.children.findIndex(_=>_.id===this.id),C=v>0?this.parent.children[v-1]?.serialize({...e,neighbors:0}):"",x=v<this.parent.children.length-1?this.parent.children[v+1]?.serialize({...e,neighbors:0}):"";return`${C||""}
4218
4247
  ${y}
4219
- ${x||""}`}return y}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:ES(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=ES(this.properties),e}},TS=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(t);return new r(s,n,o,i)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(vS.includes(i.role)&&a)return c}let o=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}pruneToSerializedCharLimit(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n=c=>c.role==="StaticText"||c.role==="ListMarker",o=new WeakMap,i=(c,l)=>{if(o.has(c))return o.get(c);let u=c.serialize({indentLevel:l,noChildren:!0});return o.set(c,u),u},a=(c,l,u)=>{let d=c.shallowClone();d.children=[];let p=i(c,l).length;if(u<=p)return{clone:d,used:p};if(n(c)||c.children.length===0)return{clone:d,used:p};let m=p,h=u-m;for(let g of c.children){let f=l+2,y=i(g,f).length;if(h<y)break;let{clone:S,used:T}=a(g,f,h);if(T>h)break;d.children.push(S),S.parent=d,m+=T,h-=T}return{clone:d,used:m}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function HV(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function zV(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?(fu({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?(fu({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function UI({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:s,showZeroOpacityElements:c,filterByViewport:l,viewportDetails:u,useMPaths:d,importantProperties:p,allowedA11yIgnoreReasonsOverride:m,cdpClient:h,logger:g,callId:f}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let y=(Y,Ee={})=>{},S=r.backendDOMNodeId,T=DV.includes(r.role?.value?.toLowerCase()??"");if(!T&&S===void 0)return y("Filtering out node since it doesn't exist in the DOM"),[];let b=S?i.backendIdToNode[S]:void 0;if(!T&&!b)try{let Y=await H(h.send({method:"DOM.describeNode",params:{backendNodeId:S}}),{milliseconds:750,fallback:()=>{g.debug("Timeout getting node from CDP while processing a11y tree")}});if(Y&&Y.node.nodeName.toLowerCase()==="slot"&&Y.node.distributedNodes?.length)g.debug({redirectedDomNode:b,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:Y},"Redirecting node to assigned slot");else return y("Filtering out node since it doesn't exist in the DOM",{cdpResult:Y}),[]}catch(Y){return y("Filtering out node since it doesn't exist in the DOM",{err:Y}),[]}if(b&&e&&l&&u&&r.backendDOMNodeId&&!zV(b,u,g,f))return b.momenticIgnored=!0,[];if(b&&b.computedStyles.display==="none")return b.momenticIgnored=!0,[];if(b&&b.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&b.tagName.toLowerCase()!=="input")return b.momenticIgnored=!0,[];if(c===!1)return b.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",C=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",x=new bS({domNode:b,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:C,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(Y=>(m??NI).includes(Y.name)||DI.includes(Y.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+HV(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),_=n,P=a[t],G=t;if(b?.tagName.toLowerCase()==="iframe"&&b.ownedFrameId){let Y=n.childFrames.find(nt=>nt.frameId===b.ownedFrameId),Ee=o[Y?.frameId??""]?.root,q=a[Y?.frameId??""];if(Y&&Ee&&q){r.childIds&&r.childIds.length>0&&g.debug("Replacing existing node's children with children from the iframe");let nt=Ee;r.childIds=nt.childIds,_=Y,P=q,G=Y.frameId}}let W=b?.childrenBackendIds?.length??0,U=(r.childIds??[]).filter(Y=>!!P.get(parseInt(Y))).length;if(W>U){let Y=r.childIds?.map(q=>P.get(parseInt(q))).filter(Boolean).map(q=>q?.backendDOMNodeId).filter(q=>q!==void 0)??[],Ee=0;for(let q of b?.childrenBackendIds??[]){if(Y.includes(q)){Ee=(r.childIds?.findIndex(_e=>P.get(parseInt(_e))?.backendDOMNodeId===q)??0)+1;continue}let nt=i.backendIdToNode[q];if(!nt||nt?.tagName.toLowerCase()!=="svg")continue;let Be=Math.floor(-1*Math.random()*1e7),qe={nodeId:Be.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:q,frameId:G,role:{type:"string",value:"graphics-symbol"}};P.set(Be,qe),r.childIds||(r.childIds=[]),r.childIds.splice(Ee,0,Be.toString()),Ee++}}if(r.childIds?.length===1&&b){let Y=P.get(parseInt(r.childIds[0])),Ee=Y?.role?.value,q=b.childrenBackendIds;if(Y&&Ee==="StaticText"&&q.length===1){let nt=i.backendIdToNode[q[0]];if(nt?.tagName?.toLowerCase()==="span"){let Be=Math.floor(-1*Math.random()*1e7).toString(),qe={nodeId:Be,parentId:r.nodeId,ignored:!1,backendDOMNodeId:nt.backendNodeId,frameId:G,childIds:[Y.nodeId]};Y.parentId=Be,P.set(parseInt(Be),qe),r.childIds=[Be]}}}for(let Y of r.childIds??[]){if(!Y)continue;let Ee=P.get(parseInt(Y));if(!Ee)continue;let q=await UI({node:Ee,parent:x,domGraph:i,axGraph:o,frameId:G,frameContext:_,inputNodeMap:a,cdpClient:h,logger:g,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});q.length&&(x.children=x.children.concat(q))}if(x.role==="StaticText"&&(x.children=[]),x.children.length===1&&x.children[0].role==="StaticText"){let Y=x.name,Ee=x.children[0]?.name;(Y===Ee||!Ee)&&(x.children=[])}let j=[];for(let Y=x.children.length-1;Y>=0;Y--){let Ee=x.children[Y];if(Ee.role!=="StaticText"){j.push(Ee);continue}if(Y===0||x.children[Y-1].role!=="StaticText"){j.push(Ee);continue}x.children[Y-1].name+=Ee.name}if(x.children=j.reverse(),!x.isInteresting(p)&&r.parentId)return b&&(b.momenticIgnored=!0),x.children;for(let Y of x.children)Y.parent=x;return VV(x),b&&d&&yS(b,i),[x]}function FI({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:c,startId:l=1}){r.id=l,l+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:vS.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(s[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let p=SS(d,i),m=p?c[p.hash]:void 0,h=m?m.description:void 0;m&&(r.properties["data-momentic-description"]=h)}for(let p of r.children)l=FI({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function BI({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:p,allowedA11yIgnoreReasonsOverride:m}){let h=t??"root",g=r[h]?.root;if(!g)throw new Error("A11y tree has no root");let f=_V(),y=x=>{let _=x.allNodes.filter(G=>!G.ignoredReasons?.find(U=>(m??NI).includes(U.name))),P=new Map;return _.forEach(G=>{P.set(parseInt(G.nodeId),G)}),P},S={};Object.entries(r).forEach(([x,_])=>{S[x]=y(_)});let T=await UI({node:g,domGraph:e,parent:null,inputNodeMap:S,axGraph:r,frameId:h,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:m});if(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let b={},v={},C={};return FI({node:T[0],a11yIdNodeMap:b,dataMomenticIdMap:v,selectorToNodeMap:C,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new TS(T[0],b,v,C)}function GV(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<kI&&!Gr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(HI(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=parseInt(e);if(!isNaN(o))return o}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function jV(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||PV.includes(a);if((Gr.relevantElementAttributes.includes(a)||zI(a,t))&&!c){let u=GV(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&PI.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of PI)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of t?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function VV(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(dt(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let m=u.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>dt(h.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),p&&(m.properties.col||(m.properties.col=i[h])))})}}}function $V(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function HI(r,e){if(e&&GI(r,e))return!0;if(Gr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(Gr.alwaysInterestingClassNames.includes(r))return!0;for(let t of Gr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function zI(r,e){if(e?.attributes?.includes(r))return!0;for(let t of e?.attributes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}function GI(r,e){if(e?.classes?.includes(r))return!0;for(let t of e?.classes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}var hp=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await H(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new I("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ie(_t),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await H(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new I("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await H(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new I("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await H(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await H(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new I("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await H(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await H(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var os="<empty>";function WV(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function $I(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||WV(r.url)}async function qV(r,e){let t=await r.send({timeout:se,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:se,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function is({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:rs,method:"Page.getFrameTree",params:{}}),r.send({timeout:rs,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if($I(d.frame))return null;try{return await WI({cdpClient:r,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function WI({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await qV(r,a),c=s.attributes??[],l=null,u=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=Go(c,h);g&&(u.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(l=g))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},m=(e.childFrames??[]).map(async(h,g)=>{if($I(h.frame))return null;try{return await WI({cdpClient:r,rawFrameTree:h,indices:[...t,g],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${g} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(m)).filter(h=>h!==null),d}async function KV(r){try{return await r.owner().count()===1}catch{return!1}}async function YV(r){try{return await r.count()===1}catch{return!1}}async function Pn(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let l of t){let u=!1;for(let d of[...l.locationData.attributeSelectors,os]){let p=o.frameLocator(d===os?"iframe":`iframe[${d}]`);if(await KV(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new I("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,os]){let u=o.locator(l===os?"iframe":`iframe[${l}]`);if(await YV(u)){a=u,i.push(l);break}}if(!a)throw new I("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:le}),c=await s.asElement().contentFrame();if(!c)throw new I("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function jI(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function qI({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===os?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===os?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),c=jI(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),c=jI(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let a=o;for(let s=0;s<t.indices.length-1;s++)a=a[t.indices[s]]?.childFrames??[];if(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new xr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function gp(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function AS(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function KI(r){let e=AS(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function YI(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function XI({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await XV({frameElementHandle:n,logger:e,signal:t})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function XV({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await fl({promiseGenerator:async()=>r.evaluate(async i=>{let a=i.scrollTop;i.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(c=>setTimeout(c,250));let s=Date.now();for(;Date.now()-s<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(l=>setTimeout(l,250))}}),timeoutMs:Ie,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}var RS=()=>{let r,e,t=new Promise((n,o)=>{r=n,e=o});return{resolve:r,reject:e,value:t}};var JI=(r,e)=>{let t=r.name??`batcher:${Math.random().toString(16).slice(2)})`,n=r.scheduler??JV(10),o=globalThis.__BATSHIT_DEVTOOLS__?.for(t),i=e??{seq:0,batch:new Set,currentRequest:RS(),timer:void 0,start:null,latest:null,abortController:new AbortController};o?.create({seq:i.seq});let a=()=>{i.batch=new Set,i.currentRequest=RS(),i.timer=void 0,i.start=null,i.latest=null,i.abortController=new AbortController},s=()=>{let d=i.seq,p=r.fetcher([...i.batch],i.abortController.signal),m=i.currentRequest;return o?.fetch({seq:d,batch:[...i.batch]}),a(),p.then(h=>{o?.data({seq:d,data:h}),m.resolve(h)}).catch(h=>{o?.error({seq:d,error:h}),m.reject(h)}),i.seq++,p};return{fetch:d=>{i.start||(i.start=Date.now()),i.latest=Date.now(),i.batch.add(d),clearTimeout(i.timer);let p=n(i.start,i.latest,i.batch.size);if(o?.queue({seq:i.seq,query:d,batch:[...i.batch],scheduled:p,latest:i.latest,start:i.start}),p==="immediate"){let m=i.currentRequest;return s(),m.value.then(h=>r.resolver(h,d))}else return p==="never"?i.currentRequest.value.then(m=>r.resolver(m,d)):(i.timer=setTimeout(s,p),i.currentRequest.value.then(m=>r.resolver(m,d)))},next:()=>{s()},abort:()=>{i.abortController.abort(),i.currentRequest.reject(new DOMException("Aborted","AbortError")),a()}}};var JV=r=>(e,t)=>{let n=t-e;return r-n};var QI=({windowMs:r,maxBatchSize:e})=>(t,n,o)=>{if(o>=e)return"immediate";let i=n-t;return r-i};import{reduce as QV}from"lodash-es";var ZV=100,e$=2e3;function ZI(r){return JI({fetcher:async t=>{r(QV(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:QI({windowMs:e$,maxBatchSize:ZV})})}async function eM({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(h=>h.url());i.debug({frameUrl:l,...r},"Passive click event captured on element");let p,m;if(l)try{let h=await n.frameElement();p=await H(h?.boundingBox(),{milliseconds:se})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as On}from"crypto";import t$ from"js-beautify";var r$=["Dead"],fp=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:On(),type:"PRESET_ACTION",command:zn(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:Fe(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=t$.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=U_(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...Fe(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,command:h},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:n}=e;if(r$.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=zn("TYPE");i={id:On(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=zn("PRESS");i={id:On(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:On(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:On(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=zn(l);u.deltaY=Math.abs(i);let d={id:On(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=zn(l);u.deltaX=Math.abs(i);let d={id:On(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};import{z as wS}from"zod";var iUe=wS.object({type:wS.literal("url"),url:wS.string()});var Sp=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let h=m[0]?.trim(),g=m[1]?.trim();if(h===void 0||g===void 0){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(h)||this.computedStylesToFetch.push(h)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),n=AS(e),{frame:o,mPathSelectorTokens:i}=await Pn(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await is({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await qI({page:t,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(gp(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:gp(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await XI({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await is({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[H(n.evaluate(e,t),{milliseconds:Ie})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Pn(c,n).then(({frame:u})=>H(u.evaluate(e,t),{milliseconds:Ie})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await is({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await jr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new I("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jr({fn:()=>is({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await jr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let l=await jr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await jr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await jr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(p=>p>750)&&n.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:En,filterByViewport:!1,flagNotActionableNodes:!1}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=_I({node:o,domGraph:this.domGraph});return II(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:Ie});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await MI(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(ln(o))}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await is({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof I&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await ie(_t,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:gp(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=Go(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Pn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Pn(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new I("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await BI({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Pn(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await wt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Ie,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(Go(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Go(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:se,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:se,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(m){i.warn({err:m},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let c,l;for(let m=0;m<3;m++)try{l=await jr({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(h){c=h,i.warn({err:h},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:g}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!g)continue}catch(g){if(g.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${m.frameId} with url ${m.url}, allowing it to be fetched: ${g}`)}d.push(...m.childFrames);let h=async()=>{try{let g=await jr({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=g}catch(g){i.warn({err:g,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(h())}return await Promise.all(p),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Ie}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:t,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:se}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ie(_t,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new I("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return xI({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=KI(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function CS(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var Vr=class r{static USER_AGENT=lp;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:p,onVideoPageChange:m}){Bv(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=p,this.onVideoPageChange=m}registerAbortSignal(e){this.abortSignal=e}async initialize({grantPermissions:e,runInitScripts:t,timingRecorder:n}){if(this.contextInitialized)return;let o={[ap]:this.userBrowserSettings.visualActions},i=[];if(this.userControlledBrowserSettings.extraHeaders&&i.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e){let u=["clipboard-read","clipboard-write","microphone","camera","geolocation"];Dr||u.push("local-network-access"),i.push(this.context.grantPermissions(u))}i.push(this.context.addInitScript({content:$f.htmlUtilsLibJs}),this.context.addInitScript({content:pS(o,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let a=u=>this.handleNewPageEvent(u);this.context.on("page",a),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",a)});let s=!1;if(t){let u=async()=>{let d=Date.now();try{await Promise.all([this.page.addScriptTag({content:$f.htmlUtilsLibJs}),this.page.addScriptTag({content:pS(o,this.userBrowserSettings.disableFullStory)})])}catch(p){if(p instanceof Error&&p.message.includes("Content Security Policy"))this.logger.warn({err:p},"Content Security Policy error from adding Momentic scripts, reloading page instead"),s=!0;else throw p}(n??{})["add-init-scripts"]=Date.now()-d};i.push(u())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&c$()==="darwin"&&n$("system_profiler SPDisplaysDataType").toString().includes("Retina"))E.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let u=async()=>{let d=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(n??{})["fetch-dpr"]=Date.now()-d};i.push(u())}let c=Date.now();await H(Promise.all(i),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let l=Date.now();(n??{})["ops-attach"]=l-c,s&&await this.page.reload(),this.cdpClient=await hp.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(n??{})["cdp-init"]=Date.now()-l,await this.initializeScreencast(),this.stateManager=new Sp({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init(e){let t=await mI(e),n=new r(t);return await n.initialize({grantPermissions:!0,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}let u=c?.url(),d=new r({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await fS(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=xS(),o=`${e}-${n}`,i=Date.now(),a=!1,s=async()=>{try{await H(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(c){c.name!=="AbortError"&&!this.closed&&this.logger.error({err:c,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],a=!0}};this.pageLoadPromises[o]=s().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Ai(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=xS(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);this.userBrowserSettings.disableBrowserMonitoring||e.on("console",a=>{X_(e,o,this.debugData,a,this.logger)});let i=async()=>{this.userBrowserSettings.disableBrowserMonitoring||(Z_(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=ZI(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await iS({pageId:t,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",oI(this.customHeaders,this.logger))),Dr&&await e.route("**/*",Jl),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)} (${n})`;if(!t||t==="about:blank"||!Ai(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await H(mS(this.getBrowserCallbacks()),{milliseconds:le})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<rs;){a++,n?.throwIfAborted();try{if(await wt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:le,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ie(_t),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),wt({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:t});if(a.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(t<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await ie(Fi),this.screenshot({...e,retries:t-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??Ie}),c=Buffer.from(s.data,"base64"),l=await rM.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&a$(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:se});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=p;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{let y=await rM.fromBuffer(c),S=y.bitmap.width,T=y.bitmap.height;m=Math.max(0,Math.min(m,S-1)),h=Math.max(0,Math.min(h,T-1)),g=Math.max(1,Math.min(g,S-m)),f=Math.max(1,Math.min(f,T-h)),c=await y.crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(y){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${y}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){dR(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await ie(_t),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:le})}if(!i)throw new I("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(j_.has(s))throw new I("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await wt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:le,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},n=!1){let o=await this.getActivePageOrFrame();await SI({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ie(Fi),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??Uy}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Ie})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:Ie})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return pp({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:le}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await Y_(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:le});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:le,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await K_(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await q_(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new I("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return fS(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,delete t.serializedForm,delete t.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:t,locator:n,startingBoundingBox:o,allowNotActionableNodesOverride:i,logger:a=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let s=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});s?(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(s){if(s instanceof gn)throw a.warn({err:s},"Cache attributes disqualify found element"),s;a.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(s){a.debug({err:s},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Kf.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:se})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:se});if(!s||!s.width||!s.height)throw new I("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:se});o.text=s?.trim()}if(n?.attributes&&n.attributes.length>0){let s={};for(let c of n.attributes){let l=c.trim().toLowerCase();if(!(!l||Gr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:se});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new I("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new I("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,p,m;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let S=c.parentFrame,{cache:T,config:b}=await this.stateManager.getAutoFrameDetailsFromHandle(S);d=T,p=b,u=b.frame,m="auto iframe"}else c.parentFrame&&l?(p=l,u=await this.getActivePageOrFrame(),m="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),m="should not be possible");let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:u,node:c}),g={id:e,inputDescription:t??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:Fe(i),frameCache:d},f,y=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:YI(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),y=!0),await this.updateCacheWithNewNodeDetails({node:c,target:g,locator:h,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:g,root:u,locator:h,logger:i}));try{return{resolution:{locator:h,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:g,frameConfig:p,frameConfigSource:m}}finally{y&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let m,h=!1,g=Date.now();for(;Date.now()-g<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(f),h=!0;break}catch(f){m=f,await ie(_t,a)}if(!h)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,p;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:m,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(h){if(h instanceof Us)break;if(h instanceof gn){if(d++,d>2)throw i.error({err:h},"Got multiple cache disqualification errors, giving up"),h;i.warn({err:h},"Got cache disqualification error, waiting and retrying resolution"),await ie(_t,a)}a?.throwIfAborted(),m&&i.warn({err:h},`Could not resolve target using primary cache only (x${u})`),await ie(_t,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=as(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),p;if(t.generatedSelectors||t.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(h){p=h,h instanceof xr&&(l.push(...h.decisions),u=h.cacheMissReason)}if(m)return{...m,pageState:void 0,decisions:[...l,...m.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:as(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(m)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Fe(o),m;u=u??"secondary-resolution-failed"}throw new xr(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Us("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:En,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:qf,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await wt({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,p,m=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};m.push(v),p="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,C=d.workingSelectors.slice(0,5);m.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:C}),n.debug({reason:v,workingSelectors:C},"Resolved with CSS selectors"),p="CSS_SELECTOR"}else throw m.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&m.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new xr("Cache evaluation failed",m,l.cacheMissReason);let h,g,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let C=v.join(" > ");h=e.locator(C),g=this.stateManager.getNodeUsingMPathSelector(C)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),g=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?h=e.locator(d.workingSelectors[0]):h=e.locator(ln(f));else throw new I("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[y,S]=await Promise.all([h.textContent(),h.boundingBox()]);if((y??"")!==(d.textContent??""))throw n.warn({currentTextContent:y,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!S||Math.abs(S.height-d.boundingBox.height)>1||Math.abs(S.width-d.boundingBox.width)>1||Math.abs((S.x??0)-(d.boundingBox.x??0))>1||Math.abs((S.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:S,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let T=as(t);await this.updateCacheWithNewNodeDetails({node:g,target:t,locator:h,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let b=_S(T,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(n),t.cacheResolutionUpdateSource=p),{a11yNode:g,displayString:d.serializedElement,locator:h,decisions:m}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),c=Date.now(),l=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),l++;let p=s.locator(n),m;try{return await p.waitFor({state:"attached",timeout:le}),m=await cn(p,o,500)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:p,displayString:m,decisions:d}}catch(h){let g=h.message;u=new I("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ie(_t,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:se});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!t||!n||!c||!l){this.logger.debug({oldX:t,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:t,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<z_){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await wt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Ie,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(qf*t.nodeOnlySerializedHtml.length);if(l&&l.closestDistance&&l.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${l.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:l.closestDistance,closestElement:l.closestNodeSerialized})}else{if(l?.error)throw new Error(l.error);if(l?.dataMomenticId||l?.mPathSelector){let d=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(ln(d));else if(l.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),m=e.locator(l.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=l.closestNodeSerialized??await cn(m,o,500)??"unknown element";o.warn({result:l,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance");let g=as(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=_S(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${u} string comparison distance of the saved element.`,logs:l.logs,distance:l.closestDistance,closestElement:h,savedElement:t.nodeOnlySerializedHtml}),{locator:m,a11yNode:p,displayString:h,decisions:n,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`)}}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let s=t.screenshotUrl,c=t.role??"";if(s&&Kf.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=p$(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:p}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),m=d.boundingBox?.width,h=d.boundingBox?.height;if(!m||!h)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=d.id,f=this.stateManager.a11yIdToNodeMap[g],y=as(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let S=_S(y,t);return S&&Object.keys(S).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:S,templateMatch:u},"Updated cache after template matching resolution")),{locator:p,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:le})??"",i=fI.some(a=>a===o.toLowerCase());return await hS({targetingResult:t,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return hS({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),Wu(s,t,n)){a=!0;break}await ie(_t,this.abortSignal)}if(!a)throw new I("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Iu(t)} in ${o}ms.
4248
+ ${x||""}`}return y}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:ES(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=ES(this.properties),e}},TS=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(t);return new r(s,n,o,i)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(vS.includes(i.role)&&a)return c}let o=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}pruneToSerializedCharLimit(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n=c=>c.role==="StaticText"||c.role==="ListMarker",o=new WeakMap,i=(c,l)=>{if(o.has(c))return o.get(c);let u=c.serialize({indentLevel:l,noChildren:!0});return o.set(c,u),u},a=(c,l,u)=>{let d=c.shallowClone();d.children=[];let p=i(c,l).length;if(u<=p)return{clone:d,used:p};if(n(c)||c.children.length===0)return{clone:d,used:p};let m=p,h=u-m;for(let g of c.children){let f=l+2,y=i(g,f).length;if(h<y)break;let{clone:S,used:T}=a(g,f,h);if(T>h)break;d.children.push(S),S.parent=d,m+=T,h-=T}return{clone:d,used:m}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function HV(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function zV(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?(fu({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?(fu({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function UI({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:s,showZeroOpacityElements:c,filterByViewport:l,viewportDetails:u,useMPaths:d,importantProperties:p,allowedA11yIgnoreReasonsOverride:m,cdpClient:h,logger:g,callId:f}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let y=(Y,Ee={})=>{},S=r.backendDOMNodeId,T=DV.includes(r.role?.value?.toLowerCase()??"");if(!T&&S===void 0)return y("Filtering out node since it doesn't exist in the DOM"),[];let b=S?i.backendIdToNode[S]:void 0;if(!T&&!b)try{let Y=await H(h.send({method:"DOM.describeNode",params:{backendNodeId:S}}),{milliseconds:750,fallback:()=>{g.debug("Timeout getting node from CDP while processing a11y tree")}});if(Y&&Y.node.nodeName.toLowerCase()==="slot"&&Y.node.distributedNodes?.length)g.debug({redirectedDomNode:b,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:Y},"Redirecting node to assigned slot");else return y("Filtering out node since it doesn't exist in the DOM",{cdpResult:Y}),[]}catch(Y){return y("Filtering out node since it doesn't exist in the DOM",{err:Y}),[]}if(b&&e&&l&&u&&r.backendDOMNodeId&&!zV(b,u,g,f))return b.momenticIgnored=!0,[];if(b&&b.computedStyles.display==="none")return b.momenticIgnored=!0,[];if(b&&b.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&b.tagName.toLowerCase()!=="input")return b.momenticIgnored=!0,[];if(c===!1)return b.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",C=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",x=new bS({domNode:b,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:C,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(Y=>(m??NI).includes(Y.name)||DI.includes(Y.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+HV(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),_=n,P=a[t],G=t;if(b?.tagName.toLowerCase()==="iframe"&&b.ownedFrameId){let Y=n.childFrames.find(nt=>nt.frameId===b.ownedFrameId),Ee=o[Y?.frameId??""]?.root,q=a[Y?.frameId??""];if(Y&&Ee&&q){r.childIds&&r.childIds.length>0&&g.debug("Replacing existing node's children with children from the iframe");let nt=Ee;r.childIds=nt.childIds,_=Y,P=q,G=Y.frameId}}let W=b?.childrenBackendIds?.length??0,U=(r.childIds??[]).filter(Y=>!!P.get(parseInt(Y))).length;if(W>U){let Y=r.childIds?.map(q=>P.get(parseInt(q))).filter(Boolean).map(q=>q?.backendDOMNodeId).filter(q=>q!==void 0)??[],Ee=0;for(let q of b?.childrenBackendIds??[]){if(Y.includes(q)){Ee=(r.childIds?.findIndex(_e=>P.get(parseInt(_e))?.backendDOMNodeId===q)??0)+1;continue}let nt=i.backendIdToNode[q];if(!nt||nt?.tagName.toLowerCase()!=="svg")continue;let Be=Math.floor(-1*Math.random()*1e7),qe={nodeId:Be.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:q,frameId:G,role:{type:"string",value:"graphics-symbol"}};P.set(Be,qe),r.childIds||(r.childIds=[]),r.childIds.splice(Ee,0,Be.toString()),Ee++}}if(r.childIds?.length===1&&b){let Y=P.get(parseInt(r.childIds[0])),Ee=Y?.role?.value,q=b.childrenBackendIds;if(Y&&Ee==="StaticText"&&q.length===1){let nt=i.backendIdToNode[q[0]];if(nt?.tagName?.toLowerCase()==="span"){let Be=Math.floor(-1*Math.random()*1e7).toString(),qe={nodeId:Be,parentId:r.nodeId,ignored:!1,backendDOMNodeId:nt.backendNodeId,frameId:G,childIds:[Y.nodeId]};Y.parentId=Be,P.set(parseInt(Be),qe),r.childIds=[Be]}}}for(let Y of r.childIds??[]){if(!Y)continue;let Ee=P.get(parseInt(Y));if(!Ee)continue;let q=await UI({node:Ee,parent:x,domGraph:i,axGraph:o,frameId:G,frameContext:_,inputNodeMap:a,cdpClient:h,logger:g,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});q.length&&(x.children=x.children.concat(q))}if(x.role==="StaticText"&&(x.children=[]),x.children.length===1&&x.children[0].role==="StaticText"){let Y=x.name,Ee=x.children[0]?.name;(Y===Ee||!Ee)&&(x.children=[])}let j=[];for(let Y=x.children.length-1;Y>=0;Y--){let Ee=x.children[Y];if(Ee.role!=="StaticText"){j.push(Ee);continue}if(Y===0||x.children[Y-1].role!=="StaticText"){j.push(Ee);continue}x.children[Y-1].name+=Ee.name}if(x.children=j.reverse(),!x.isInteresting(p)&&r.parentId)return b&&(b.momenticIgnored=!0),x.children;for(let Y of x.children)Y.parent=x;return VV(x),b&&d&&yS(b,i),[x]}function FI({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:c,startId:l=1}){r.id=l,l+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:vS.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(s[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let p=SS(d,i),m=p?c[p.hash]:void 0,h=m?m.description:void 0;m&&(r.properties["data-momentic-description"]=h)}for(let p of r.children)l=FI({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function BI({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:p,allowedA11yIgnoreReasonsOverride:m}){let h=t??"root",g=r[h]?.root;if(!g)throw new Error("A11y tree has no root");let f=_V(),y=x=>{let _=x.allNodes.filter(G=>!G.ignoredReasons?.find(U=>(m??NI).includes(U.name))),P=new Map;return _.forEach(G=>{P.set(parseInt(G.nodeId),G)}),P},S={};Object.entries(r).forEach(([x,_])=>{S[x]=y(_)});let T=await UI({node:g,domGraph:e,parent:null,inputNodeMap:S,axGraph:r,frameId:h,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:m});if(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let b={},v={},C={};return FI({node:T[0],a11yIdNodeMap:b,dataMomenticIdMap:v,selectorToNodeMap:C,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new TS(T[0],b,v,C)}function GV(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<kI&&!Gr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(HI(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=parseInt(e);if(!isNaN(o))return o}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function jV(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||PV.includes(a);if((Gr.relevantElementAttributes.includes(a)||zI(a,t))&&!c){let u=GV(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&PI.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of PI)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of t?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function VV(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(dt(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let m=u.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>dt(h.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),p&&(m.properties.col||(m.properties.col=i[h])))})}}}function $V(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function HI(r,e){if(e&&GI(r,e))return!0;if(Gr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(Gr.alwaysInterestingClassNames.includes(r))return!0;for(let t of Gr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function zI(r,e){if(e?.attributes?.includes(r))return!0;for(let t of e?.attributes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}function GI(r,e){if(e?.classes?.includes(r))return!0;for(let t of e?.classes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}var hp=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await H(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new I("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ie(_t),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await H(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new I("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await H(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new I("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await H(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await H(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new I("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await H(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await H(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var os="<empty>";function WV(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function $I(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||WV(r.url)}async function qV(r,e){let t=await r.send({timeout:se,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:se,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function is({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:rs,method:"Page.getFrameTree",params:{}}),r.send({timeout:rs,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if($I(d.frame))return null;try{return await WI({cdpClient:r,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function WI({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await qV(r,a),c=s.attributes??[],l=null,u=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=Go(c,h);g&&(u.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(l=g))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},m=(e.childFrames??[]).map(async(h,g)=>{if($I(h.frame))return null;try{return await WI({cdpClient:r,rawFrameTree:h,indices:[...t,g],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${g} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(m)).filter(h=>h!==null),d}async function KV(r){try{return await r.owner().count()===1}catch{return!1}}async function YV(r){try{return await r.count()===1}catch{return!1}}async function Pn(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let l of t){let u=!1;for(let d of[...l.locationData.attributeSelectors,os]){let p=o.frameLocator(d===os?"iframe":`iframe[${d}]`);if(await KV(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new I("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,os]){let u=o.locator(l===os?"iframe":`iframe[${l}]`);if(await YV(u)){a=u,i.push(l);break}}if(!a)throw new I("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:le}),c=await s.asElement().contentFrame();if(!c)throw new I("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function jI(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function qI({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===os?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===os?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),c=jI(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),c=jI(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let a=o;for(let s=0;s<t.indices.length-1;s++)a=a[t.indices[s]]?.childFrames??[];if(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Pn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new xr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function gp(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function AS(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function KI(r){let e=AS(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function YI(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function XI({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await XV({frameElementHandle:n,logger:e,signal:t})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function XV({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await fl({promiseGenerator:async()=>r.evaluate(async i=>{let a=i.scrollTop;i.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(c=>setTimeout(c,250));let s=Date.now();for(;Date.now()-s<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(l=>setTimeout(l,250))}}),timeoutMs:Ie,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}var RS=()=>{let r,e,t=new Promise((n,o)=>{r=n,e=o});return{resolve:r,reject:e,value:t}};var JI=(r,e)=>{let t=r.name??`batcher:${Math.random().toString(16).slice(2)})`,n=r.scheduler??JV(10),o=globalThis.__BATSHIT_DEVTOOLS__?.for(t),i=e??{seq:0,batch:new Set,currentRequest:RS(),timer:void 0,start:null,latest:null,abortController:new AbortController};o?.create({seq:i.seq});let a=()=>{i.batch=new Set,i.currentRequest=RS(),i.timer=void 0,i.start=null,i.latest=null,i.abortController=new AbortController},s=()=>{let d=i.seq,p=r.fetcher([...i.batch],i.abortController.signal),m=i.currentRequest;return o?.fetch({seq:d,batch:[...i.batch]}),a(),p.then(h=>{o?.data({seq:d,data:h}),m.resolve(h)}).catch(h=>{o?.error({seq:d,error:h}),m.reject(h)}),i.seq++,p};return{fetch:d=>{i.start||(i.start=Date.now()),i.latest=Date.now(),i.batch.add(d),clearTimeout(i.timer);let p=n(i.start,i.latest,i.batch.size);if(o?.queue({seq:i.seq,query:d,batch:[...i.batch],scheduled:p,latest:i.latest,start:i.start}),p==="immediate"){let m=i.currentRequest;return s(),m.value.then(h=>r.resolver(h,d))}else return p==="never"?i.currentRequest.value.then(m=>r.resolver(m,d)):(i.timer=setTimeout(s,p),i.currentRequest.value.then(m=>r.resolver(m,d)))},next:()=>{s()},abort:()=>{i.abortController.abort(),i.currentRequest.reject(new DOMException("Aborted","AbortError")),a()}}};var JV=r=>(e,t)=>{let n=t-e;return r-n};var QI=({windowMs:r,maxBatchSize:e})=>(t,n,o)=>{if(o>=e)return"immediate";let i=n-t;return r-i};import{reduce as QV}from"lodash-es";var ZV=100,e$=2e3;function ZI(r){return JI({fetcher:async t=>{r(QV(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:QI({windowMs:e$,maxBatchSize:ZV})})}async function eM({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(h=>h.url());i.debug({frameUrl:l,...r},"Passive click event captured on element");let p,m;if(l)try{let h=await n.frameElement();p=await H(h?.boundingBox(),{milliseconds:se})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as On}from"crypto";import t$ from"js-beautify";var r$=["Dead"],fp=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:On(),type:"PRESET_ACTION",command:zn(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=zn(i);a={id:On(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:Fe(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=t$.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=U_(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...Fe(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,command:h},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:n}=e;if(r$.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=zn("TYPE");i={id:On(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=zn("PRESS");i={id:On(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:On(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:On(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=zn(l);u.deltaY=Math.abs(i);let d={id:On(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=zn(l);u.deltaX=Math.abs(i);let d={id:On(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};import{z as wS}from"zod";var iUe=wS.object({type:wS.literal("url"),url:wS.string()});var Sp=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let h=m[0]?.trim(),g=m[1]?.trim();if(h===void 0||g===void 0){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(h)||this.computedStylesToFetch.push(h)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),n=AS(e),{frame:o,mPathSelectorTokens:i}=await Pn(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await is({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await qI({page:t,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(gp(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:gp(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await XI({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await is({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[H(n.evaluate(e,t),{milliseconds:Ie})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Pn(c,n).then(({frame:u})=>H(u.evaluate(e,t),{milliseconds:Ie})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await is({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await jr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new I("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jr({fn:()=>is({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await jr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let l=await jr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await jr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await jr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(p=>p>750)&&n.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:En,filterByViewport:!1,flagNotActionableNodes:!1}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=_I({node:o,domGraph:this.domGraph});return II(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:Ie});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await MI(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(ln(o))}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await is({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof I&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await ie(_t,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:gp(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=Go(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Pn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Pn(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new I("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await BI({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Pn(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await wt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Ie,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(Go(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Go(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:se,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:se,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(m){i.warn({err:m},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let c,l;for(let m=0;m<3;m++)try{l=await jr({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(h){c=h,i.warn({err:h},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:g}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!g)continue}catch(g){if(g.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${m.frameId} with url ${m.url}, allowing it to be fetched: ${g}`)}d.push(...m.childFrames);let h=async()=>{try{let g=await jr({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=g}catch(g){i.warn({err:g,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(h())}return await Promise.all(p),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Ie}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jr({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:t,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:se}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ie(_t,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new I("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return xI({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=KI(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function CS(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var Vr=class r{static USER_AGENT=lp;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:p,onVideoPageChange:m}){Bv(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=p,this.onVideoPageChange=m}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let t=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){t();return}this.abortSignal.addEventListener("abort",t),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",t)}}async initialize({grantPermissions:e,runInitScripts:t,timingRecorder:n}){if(this.contextInitialized)return;let o={[ap]:this.userBrowserSettings.visualActions},i=[];if(this.userControlledBrowserSettings.extraHeaders&&i.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e){let u=["clipboard-read","clipboard-write","microphone","camera","geolocation"];Dr||u.push("local-network-access"),i.push(this.context.grantPermissions(u))}i.push(this.context.addInitScript({content:`${$f.htmlUtilsLibJs}
4249
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:pS(o,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let a=u=>this.handleNewPageEvent(u);this.context.on("page",a),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",a)});let s=!1;if(t){let u=async()=>{let d=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${$f.htmlUtilsLibJs}
4250
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:pS(o,this.userBrowserSettings.disableFullStory)})])}catch(p){if(p instanceof Error&&p.message.includes("Content Security Policy"))this.logger.warn({err:p},"Content Security Policy error from adding Momentic scripts, reloading page instead"),s=!0;else throw p}(n??{})["add-init-scripts"]=Date.now()-d};i.push(u())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&c$()==="darwin"&&n$("system_profiler SPDisplaysDataType").toString().includes("Retina"))E.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let u=async()=>{let d=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(n??{})["fetch-dpr"]=Date.now()-d};i.push(u())}let c=Date.now();await H(Promise.all(i),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let l=Date.now();(n??{})["ops-attach"]=l-c,s&&await this.page.reload(),this.cdpClient=await hp.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(n??{})["cdp-init"]=Date.now()-l,await this.initializeScreencast(),this.stateManager=new Sp({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init(e){let t=await mI(e),n=new r(t);return await n.initialize({grantPermissions:!0,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}let u=c?.url(),d=new r({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await fS(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=xS(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await H(t(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Ai(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=xS(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{X_(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(Z_(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=ZI(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await iS({pageId:t,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",oI(this.customHeaders,this.logger))),Dr&&await e.route("**/*",Jl),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)} (${n})`;if(!t||t==="about:blank"||!Ai(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await H(mS(this.getBrowserCallbacks()),{milliseconds:le})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<rs;){a++,n?.throwIfAborted();try{if(await wt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:le,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ie(_t),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),wt({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:t});if(a.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(t<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await ie(Fi),this.screenshot({...e,retries:t-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??Ie}),c=Buffer.from(s.data,"base64"),l=await rM.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&a$(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:se});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=p;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{let y=await rM.fromBuffer(c),S=y.bitmap.width,T=y.bitmap.height;m=Math.max(0,Math.min(m,S-1)),h=Math.max(0,Math.min(h,T-1)),g=Math.max(1,Math.min(g,S-m)),f=Math.max(1,Math.min(f,T-h)),c=await y.crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(y){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${y}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){dR(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await ie(_t),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:le})}if(!i)throw new I("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(j_.has(s))throw new I("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await wt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:le,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},n=!1){let o=await this.getActivePageOrFrame();await SI({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ie(Fi),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??Uy}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Ie})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:Ie})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return pp({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:le}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await Y_(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:le});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:le,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await K_(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await q_(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new I("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return fS(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,delete t.serializedForm,delete t.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:t,locator:n,startingBoundingBox:o,allowNotActionableNodesOverride:i,logger:a=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let s=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});s?(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(s){if(s instanceof gn)throw a.warn({err:s},"Cache attributes disqualify found element"),s;a.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(s){a.debug({err:s},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Kf.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:se})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:se});if(!s||!s.width||!s.height)throw new I("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:se});o.text=s?.trim()}if(n?.attributes&&n.attributes.length>0){let s={};for(let c of n.attributes){let l=c.trim().toLowerCase();if(!(!l||Gr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:se});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new I("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new I("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,p,m;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let S=c.parentFrame,{cache:T,config:b}=await this.stateManager.getAutoFrameDetailsFromHandle(S);d=T,p=b,u=b.frame,m="auto iframe"}else c.parentFrame&&l?(p=l,u=await this.getActivePageOrFrame(),m="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),m="should not be possible");let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:u,node:c}),g={id:e,inputDescription:t??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:Fe(i),frameCache:d},f,y=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:YI(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),y=!0),await this.updateCacheWithNewNodeDetails({node:c,target:g,locator:h,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:g,root:u,locator:h,logger:i}));try{return{resolution:{locator:h,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:g,frameConfig:p,frameConfigSource:m}}finally{y&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let m,h=!1,g=Date.now();for(;Date.now()-g<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(f),h=!0;break}catch(f){m=f,await ie(_t,a)}if(!h)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,p;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:m,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(h){if(h instanceof Us)break;if(h instanceof gn){if(d++,d>2)throw i.error({err:h},"Got multiple cache disqualification errors, giving up"),h;i.warn({err:h},"Got cache disqualification error, waiting and retrying resolution"),await ie(_t,a)}a?.throwIfAborted(),m&&i.warn({err:h},`Could not resolve target using primary cache only (x${u})`),await ie(_t,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=as(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),p;if(t.generatedSelectors||t.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(h){p=h,h instanceof xr&&(l.push(...h.decisions),u=h.cacheMissReason)}if(m)return{...m,pageState:void 0,decisions:[...l,...m.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:as(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(m)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Fe(o),m;u=u??"secondary-resolution-failed"}throw new xr(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Us("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:En,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:qf,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await wt({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,p,m=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};m.push(v),p="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,C=d.workingSelectors.slice(0,5);m.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:C}),n.debug({reason:v,workingSelectors:C},"Resolved with CSS selectors"),p="CSS_SELECTOR"}else throw m.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&m.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new xr("Cache evaluation failed",m,l.cacheMissReason);let h,g,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let C=v.join(" > ");h=e.locator(C),g=this.stateManager.getNodeUsingMPathSelector(C)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),g=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?h=e.locator(d.workingSelectors[0]):h=e.locator(ln(f));else throw new I("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[y,S]=await Promise.all([h.textContent(),h.boundingBox()]);if((y??"")!==(d.textContent??""))throw n.warn({currentTextContent:y,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!S||Math.abs(S.height-d.boundingBox.height)>1||Math.abs(S.width-d.boundingBox.width)>1||Math.abs((S.x??0)-(d.boundingBox.x??0))>1||Math.abs((S.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:S,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let T=as(t);await this.updateCacheWithNewNodeDetails({node:g,target:t,locator:h,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let b=_S(T,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(n),t.cacheResolutionUpdateSource=p),{a11yNode:g,displayString:d.serializedElement,locator:h,decisions:m}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),c=Date.now(),l=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),l++;let p=s.locator(n),m;try{return await p.waitFor({state:"attached",timeout:le}),m=await cn(p,o,500)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:p,displayString:m,decisions:d}}catch(h){let g=h.message;u=new I("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ie(_t,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:se});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!t||!n||!c||!l){this.logger.debug({oldX:t,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:t,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<z_){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await wt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Ie,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(qf*t.nodeOnlySerializedHtml.length);if(l&&l.closestDistance&&l.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${l.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:l.closestDistance,closestElement:l.closestNodeSerialized})}else{if(l?.error)throw new Error(l.error);if(l?.dataMomenticId||l?.mPathSelector){let d=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(ln(d));else if(l.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),m=e.locator(l.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=l.closestNodeSerialized??await cn(m,o,500)??"unknown element";o.warn({result:l,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance");let g=as(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=_S(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${u} string comparison distance of the saved element.`,logs:l.logs,distance:l.closestDistance,closestElement:h,savedElement:t.nodeOnlySerializedHtml}),{locator:m,a11yNode:p,displayString:h,decisions:n,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`)}}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let s=t.screenshotUrl,c=t.role??"";if(s&&Kf.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=p$(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:p}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),m=d.boundingBox?.width,h=d.boundingBox?.height;if(!m||!h)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=d.id,f=this.stateManager.a11yIdToNodeMap[g],y=as(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let S=_S(y,t);return S&&Object.keys(S).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Fe(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:S,templateMatch:u},"Updated cache after template matching resolution")),{locator:p,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:le})??"",i=fI.some(a=>a===o.toLowerCase());return await hS({targetingResult:t,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return hS({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),Wu(s,t,n)){a=!0;break}await ie(_t,this.abortSignal)}if(!a)throw new I("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Iu(t)} in ${o}ms.
4220
4251
  Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,n={}){await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:se});if(!o)throw new I("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await ie(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Ie):500),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:se});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+t,{steps:n}),await ie(Fi),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Hi({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:se});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Hi({func:t=>t.locator.focus({timeout:Ie}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await wt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:le,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Hi({func:t=>t.locator.blur({timeout:Ie}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,n=!1){await this.highlight(e.locator),await Hi({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new I("UserConfigurationError",`Page index ${t.index} is not a number`)}await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?Number(t.index):void 0},{force:n,timeout:se})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=mp(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async keyDown(e,t){if(t.convertMeta){let n=mp(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of CS(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=mp(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of CS(e))await this.page.keyboard.up(n)}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForDOMStability()}async getBrowserState(e){let{maxAttempts:t=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:En;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,p;for(;d<t;){d++;try{return await H(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(m){if(s?.throwIfAborted(),p=m instanceof Error?m.message:`${m}`,d>=t)throw m;u.warn({err:m,url:this.url()},"Error getting a11y tree, retrying...")}}throw new I("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await wt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:se,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=p=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await ie(Fi,this.abortSignal),s)try{let d=await this.screenshot(c);if(!d.equals(s)){s=d,l=!1;continue}l=!0}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<H_)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await AI(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e,t,n,o,i){await vI({page:this.page,deltaX:e,deltaY:t,steps:n,delayMs:o,visualTarget:i,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:se}),n=await H(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Ie});process.platform==="darwin"&&n===1&&(n=F_);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let S=0;S<s.length;S++)if(c[S]===e){d=l.indexOf(S);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,h=0,g=0]=u[d];p/=n,m/=n,h/=n,g/=n;let f=p+h/2,y=m+g/2;return{centerX:f,centerY:y}}async scrollVertical(e){return gS({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return gS({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,t){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=nM(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await ie(_t)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new I("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
4221
4252
  Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Ai(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=nu(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}async solveCaptcha(){await this.getBrowserState({allowNotActionableNodesOverride:!0});let e;for(let s of Object.values(this.stateManager.a11yIdToNodeMap))if(s.role==="image"&&s.name.toLowerCase().includes("captcha")){if(!s.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,s.backendNodeId);break}if(!e){let s=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!s.captchas||!s.captchas.length)throw new Error("No captchas found on the page");return}let t=await e.screenshot({type:"jpeg",animations:"allow",caret:"hide",quality:100,timeout:se}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:ns,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let s=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},s),new Error(s)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<G_;){await ie(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:ns,taskId:o})});if(!s.ok){let l=`Captcha solution API returned error response: ${s.statusText}`;throw this.logger.error({text:await s.text()},l),new Error(l)}let c=await s.json();if(c.errorId){let l=`Captcha solution API returned error ID ${c.errorId}`;throw this.logger.error(l),new Error(l)}if(c.status==="ready"){a=c.solution.text;break}}if(!a)throw new Error("Captcha solution timed out");return a}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await H(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&eM({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Ai(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},_t);let s=async()=>{clearInterval(t)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,t,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:le})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await fl({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new I("UserInfrastructureError",`The page with URL ${dt(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await fl({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return s$.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await wt({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:Ie,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new I("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n,o=Ie){let i=await this.getActivePageOrFrame();return wt({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=bo}){let i=nI(),a={code:e,fragment:t,context:n},{result:s}=await H(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new I("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:Ie});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:le})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>1)throw new I("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*t),d=Math.ceil(i*n),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:le,params:{highlightConfig:CI,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:le,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:le})}catch{}}async getTargetFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(t,e);return this.getTargetFromBackendNodeId({root:t,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:t,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[Zn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(ln(a)),c;o.bounds.x!==null&&o.bounds.y!==null&&(c={x:o.bounds.x,y:o.bounds.y,width:o.bounds.width??0,height:o.bounds.height??0});let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:s}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await H(this.performTargetRedirectionHelper(e,t,n),{milliseconds:se})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now();if(n===void 0&&(n=await e.boundingBox({timeout:se})??void 0),!n){let T=await cn(e,t,500);t.error(`Attempted to click on element with no bounding box: ${T}`);return}let{x:i,y:a,width:s,height:c}=n,l=this.getViewport();if(i<0||a<0||!l||i+s>l.width||a+c>l.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let u=await this.getActivePageOrFrame(),{dataMomenticId:d,mPathSelector:p,error:m,serializedElement:h,foundElementRelativePoint:g,force:f,logs:y}=await e.evaluate(T=>{let b=window;if(!b.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return b.performTargetRedirection(T)},void 0,{timeout:le}),S=Date.now()-o;if(m){t.warn({error:m,serializedElement:h,duration:S,force:f,logs:y},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:h,duration:S,force:f,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(ln(d)),hints:{relativeXYToLocator:g,force:f}};if(p)return t.info({newMPathSelector:p,serializedElement:h,duration:S,force:f,logs:y},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(p),hints:{relativeXYToLocator:g,force:f}};if(g)return t.info({foundElementRelativePoint:g,serializedElement:h,duration:S,force:f,logs:y},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:g,force:f}};if(f)return t.info({serializedElement:h,duration:S,force:f,logs:y},"Forcing click on original element"),{locator:e,hints:{force:f}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:Ie});if("error"in s&&s.error)throw s.error.startsWith(D_)?new Dc(s.error):s.error.startsWith(k_)?new kc(s.error):new Error(s.error);return s.warnings.length&&t.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,t){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,t,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*t),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:le})}async scrollFromPositionPercentages(e,t,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!ns}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,nS(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!yp(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(c),this.logToUserConsole(this.page,"error",c);return}let n=t?.trim()||nM(e),o=o$(e),i=u$(e),a=_h[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!yp(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:l$.getType(e)||"application/octet-stream"},{timeout:sp})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=l;let p=atob(l),m=new Array(p.length);for(let g=0;g<p.length;g++)m[g]=p.charCodeAt(g);let h=new Uint8Array(m);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([h],{type:u})}isSameEntry(g){return g.name===this.name}queryPermission(g){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(g){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let g=new Blob([h]);return new File([g],d.momenticFileName,{type:u})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){this.cdpClient.loadEventLogs.length>0&&(this.cdpClient.loadEventLogs=[]);let t={...this.debugData};return this.debugData={logsPerPage:[]},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t){this.requestRecorders[e]=t}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,n){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:n})}registerMock(e,t,n,o){let i=e??xS();return this.mocks[i]={matcher:t,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??B_}get userBrowserSettings(){return as(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??rs}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=dp();for(let t of e)if(!(!yp(t)||!tM(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=d$(t,o);return yp(i)&&tM(i).isDirectory()&&i$(i).length>0})))return t}};import L$ from"fetch-cookie";import{cloneDeep as yM}from"lodash-es";import{CookieJar as N$}from"tough-cookie";import{randomUUID as y$}from"crypto";var aM={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},sM={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},iM=/<(\S+) id="(\d+)".*?>/g,m$=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,lM=["h1","h2","section","footer","nav","aside","form","label","dialog"],h$=[...lM,"span","div","h3"],g$=["table","select","form","ul","ol","menu","pre","code","dialog"],f$=["table","form","dialog","nav","section","ul","select"];function Ep(r){return S$(r)}function S$({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4222
4253
  `),l=0,u=[],d=0,p=[],m=[],h=!1;for(;l<c.length;){h&&(s.push({ids:p,content:u.join(`
4223
4254
  `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],h=!1);let g=c[l],f=Ge(g);d+=f,g.length>a&&(g=g.slice(0,a));let T=Array.from(g.matchAll(iM)).map(Q=>Q&&Q.length>=3?{tagName:Q[1],id:Q[2]}:void 0).filter(Q=>!!Q),v=Array.from(g.matchAll(m$)).map(Q=>Q&&(Q[2]||Q[4])).filter(Q=>!!Q);v.reverse();let C=g.replace(/ id="[0-9]+"/g,"");u.push(C);for(let Q of T)p.push(Q.id),m.push(Q);for(let Q of v){let Y=m[m.length-1];Y&&Y.tagName===Q&&m.pop()}let x=m.some(Q=>g$.includes(Q.tagName)),_=c[l+1]??"",P=Ge(_),W=Array.from(_.matchAll(iM)).map(Q=>Q&&Q.length>2?Q[1]:void 0).filter(Q=>!!Q),U=W.some(Q=>lM.includes(Q)),j=W.some(Q=>h$.includes(Q));d+P>=i&&(h=!0),d>=n&&(U&&!x||v.some(Q=>f$.includes(Q)))&&(h=!0),d>=o&&j&&!x&&(h=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4224
4255
  `),tokenLength:d}),s.forEach((g,f)=>{let y=g.ids[0],S=g.ids[g.ids.length-1];r.debug({tokenLength:g.tokenLength,minId:y,maxId:S},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var E$=75e4,bp=3e5;async function Gi(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=t,l=r.tree,u=r.serializedTree,d=Ge(u);if(d>E$)try{let p=Ep({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await T$({...r,tokenLimit:bp-1e4,chunks:p.chunks}),u=l.serialize();let m=Ge(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(bp*Ao),u=l.serialize();let m=Ge(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>bp)try{if(o){let p=Ep({serializedTree:u,options:sM,logger:i}),m=y$();l=await H(b$({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let h=Ge(u);i.info({oldTokens:d,newTokens:h,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=h}else{let p=Ep({serializedTree:u,options:aM,logger:i});l=await H(v$({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=Ge(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(bp*Ao),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function b$({type:r,callId:e,chunks:t,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:t,description:n,type:r,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:Fe(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function T$(r){let{description:e,fixtures:t,tree:n}=r,{generator:o,logger:i,signal:a}=t;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:Fe(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,h)=>m+h.tokenLength,0)>r.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 v$(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:s,signal:c}=t,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:Fe(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 MS(r,e){if(!r.description)throw new I("UserConfigurationError","Cannot locate element with empty description");return zr({action:async()=>A$(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function A$(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u}=r,{ctx:d,orgId:p,browser:m,localCodeEvalTools:h,generator:g,abortSignal:f}=e,y=r.description,S=r.useMemory&&!t;n&&(y=await ar({orgId:p,s:y,context:n,localTools:h,signal:f,logger:l})),a&&(y=w$(y,a));let{serializedTree:T,tree:b}=await In(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),v,C=Date.now(),x;for(;!v&&Date.now()-C<3e3;){f.throwIfAborted();try{v=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(q){x=q}}if(!v)throw new I("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${x?.message}`);let _=T,P=!1,W=`data:image/jpeg;base64,${v.toString("base64")}`;_=await Gi({type:"locator",description:y,screenshot:W,serializedTree:T,options:{aiPageFiltering:c},tree:b,fixtures:{generator:g,signal:f,logger:l,orgId:p}}),_!==T&&(P=!0);let U=await g.getElementLocation({browserState:_,goal:y,screenshot:W,source:a,memory:S?s:void 0},{disableCache:t,abortSignal:f,loggerTags:Fe(l),useMemory:S});l.debug({usedRag:P,result:U},"Got locator result");let j=U.id>0;if(d?.details?.push({type:"AI_LOCATION",matched:j,pageState:_,ragUsed:P,thoughts:U.thoughts}),!j)throw new aa(`Could not find any relevant element: ${U.thoughts}`,U.updatedMemory?{type:"GCS_TRACES",traces:U.updatedMemory}:void 0);let{resolution:Q,target:Y,frameConfig:Ee}=await m.createTargetFromA11yId({id:U.id,requirements:U.requirements,additionalElements:U.additionalElements,description:y,targetSource:"AI",logger:l});if(Q.a11yNode?.properties?.hidden&&Q.a11yNode?.properties?.hidden!=="false")throw new I("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${Q.displayString}`);return S&&(U.updatedMemory?Y.memory={type:"GCS_TRACES",traces:U.updatedMemory}:s&&(Y.memory=s)),{thoughts:U.thoughts,target:Y,resolution:Q,frameConfig:Ee,screenshot:W}}var R$=["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:"],cM="<select> element:",uM="text input or contenteditable element:",dM="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:",pM="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:",IS=[cM,uM,dM,pM,...R$];function mM(r,e){if(r===e)return!0;for(let t of IS){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(IS.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!IS.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function w$(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${cM} ${r}`;case"TYPE":return`${uM} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${dM}
4225
4256
  ${r}`;case"ELEMENT_CHECK":return`${pM}
4226
- ${r}`;default:return r}}var C$=15;async function Tp({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=C$}){if(!r.assertion.trim())throw new I("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=uR(c),u=0,d=Date.now(),p,m,h;try{await zr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let g;for(;u<a&&(!g||g-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await ie(l,n.abortSignal),g=Date.now();let f=!1;try{if(p=await zr({action:async()=>{let S=await hM(s,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?(f=!0,p):(m=S,gM({command:r,state:S,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),p?.success){p?.updatedMemory&&ml(r,p.updatedMemory,t);break}else throw p?.thoughts?new I("AssertionFailureError",p.thoughts):new I("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(y){n.abortSignal.throwIfAborted(),h=y instanceof Error?y:new Error(`${y}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:y},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await zr({action:async()=>gM({command:r,state:await hM(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(p?.updatedMemory&&ml(r,p.updatedMemory,t),!p?.success){let f=`AI check still failing after ${u} attempts.`;throw h&&(f+=` Latest result: ${h.message}`),new I("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function hM(r,e,t){let[n,o]=await Promise.all([In(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function gM({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,y=f.toString("base64"),S=u.url(),T=r.contextChoice??"MULTIMODAL",b=h;T!=="VISION_ONLY"&&(b=await Gi({type:"assertion",serializedTree:h,tree:g,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),b!==h&&(m.ragUsed=!0),m.pageState=b);let v={goal:r.assertion,url:S,memory:o?r.cache?.memory:void 0,browserState:b,screenshot:y,contextChoice:T,source:c},x=await(T==="VISION_ONLY"?(_,P)=>d.getVisualAssertionResult(_,P):(_,P)=>d.getAssertionResult(_,P))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:Fe(l)});return(x.result||i)&&x.relevantElements&&(m.relevantElementsSerialized=x.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await x$(x.relevantElements,u,l)),{success:x.result,thoughts:x.thoughts,afterScreenshotOverride:f,updatedMemory:o?x.updatedMemory:void 0}}async function x$(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await H(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var _$=75e4,vp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function fM(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await I$(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof vp?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ie(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function I$(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await ie(o.smartWaitingTimeout,n);return}if(!e.description)throw new I("UserConfigurationError","Cannot locate element with empty description");await H(M$(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function M$(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await zr({action:async()=>P$(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function P$(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await ar({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await In(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Ge(p)>_$)throw new vp;s.throwIfAborted();let h;try{h=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(S){throw new I("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: ${S instanceof Error?S.message:S}`)}let f=`data:image/jpeg;base64,${h.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:Fe(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}var O$=3e4;async function SM({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??O$/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Oa(r.url)&&(s=r.url),t&&La(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new I("ActionFailureError",`Invalid URL: ${r.url}`);let l=await H((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new I("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 I("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new I("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new I("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 jo=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,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=t,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:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([In(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 Gi({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:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Fe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([In(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 Gi({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:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Fe(a)},langfuseSessionId:s})}catch(h){throw new I("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return In(this.browser,e)}async locateElement(e){return await MS({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return zr({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,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:t,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:t,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:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new I("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await zr({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:t})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&Cm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Im(i)||xm(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Mm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof gn&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof I?n:new I("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new I("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:t.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 ie(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,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,y=!1,S=yM(e.cache);if((!S||l)&&!dm(o))throw new I("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"),y=!0,S=void 0),S&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&S.targetSource==="HEURISTIC_HEALED"&&(y=!0,S=void 0),S?.inputDescription&&!mM(o.elementDescriptor,S.inputDescription)&&(h.warn({old:S.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),y=!0,S=void 0);let T=v=>!!v&&yc(v),b=!0;if(!T(S)){b=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:y,memory:s.memory,useMemory:g},"Prompting AI for an updated element location"),(y||!i)&&await fM({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:h,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await MS({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(t))}catch(_){if(_ instanceof aa&&_.updatedLocatorMemory){let P={id:-1,...i,memory:_.updatedLocatorMemory};Nu({cmd:c,key:d,newTarget:P,logger:h,updatedWithAI:!0})}throw new I("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let C=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),x=await a(C);return Nu({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=Fe(h)),{result:x,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,S,{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 C=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),x=await a(C);if(Pt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.26.0"]),Nu({cmd:c,key:d,newTarget:S,logger:h,updatedWithAI:!1}),b){let _=v.decisions.filter(P=>P.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let P=_[0].type;n.recordTargetAutoHeal({healType:P})}}return{result:x,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let C="unknown";v instanceof xr&&v.cacheMissReason&&(C=v.cacheMissReason),Pt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.26.0",`missReason:${C}`]);let x=!1;if((v instanceof gn||Cm(v)||Im(v)||Mm(v)||OE(v)||xm(v)||LE(v))&&(x=!0),v instanceof I&&!x)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 S.memory&&Ec(S.memory)&&(_=S.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:_,retriesWithAI:f,targetHealingInProgress:!0}})}throw new I("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return wl(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ie(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 I("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Ky(n)?await this.browser.waitForDOMStability({timeout:Ie}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:le}),this.options?.autoFollowNewTabs&&await I_({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{QR(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>tS(e)}}async resolveCommandTemplateStrings(e,t){return od({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,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()?Tp({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 I("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new I("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Tp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new I("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=Fv(n.schema);if(f)throw new I("UserConfigurationError",f)}let h=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let f=await this.generator.getTextExtraction({goal:n.goal,browserState:h,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Fe(a)});if(f.result==="NOT_FOUND")throw new I("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new I("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let y=f.message;throw y.includes("MaxGenerationLengthExceededError")?new I("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."):y.includes("AIProviderError")&&y.includes("time")?new I("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:f}}):f}}case"NAVIGATE":if(!Oa(n.url)&&!La(n.url,this.browser.baseUrl))throw new I("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let c=await this.browser.solveCaptcha();c&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:h=>this.browser.click(h,this.createCallbacksForBrowser(this.orgId),{}),options:{...n,targetName:"target",disableCache:i}}),await this.browser.type(c,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let h,g;if(n.target&&pn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});h=S,g=T}let f=this.browser.getViewport()?.height??qt.height,y=this.browser.getViewport()?.width??qt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??f));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??f);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??y));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??y);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new I("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let h=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:h},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new I("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await ie(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(pn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let h=this.browser.url(),{elementInteractedDisplayString:g,result:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:y,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return qu(h,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(pn(n.fromTarget)&&pn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(pn(n.fromTarget)||pn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:h,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(f,y)=>this.browser.dragAndDrop(f.locator,y.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],thoughts:g}}case"MOUSE_DRAG":{let h=parseInt(n.deltaX),g=parseInt(n.deltaY),f=n.steps??5;if(isNaN(h)||isNaN(g))throw new I("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&pn(n.target)){await this.browser.mouseDragUsingVisualCoordinates(h,g,f,void 0,n.target.pixels);break}let y,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async v=>this.browser.mouseDrag(h,g,f,v.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});y=T,S=b}else await this.browser.mouseDrag(h,g,f,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:S}}case"SELECT_OPTION":{if(!co(n.target))throw new Error("Select with x/y is not supported yet");let h=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:h},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:si(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"TAB":{let h={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,h);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 u=await this.browser.setCookie(n.value);a.debug({results:u},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let h;try{n.environment==="BROWSER"?(h=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:h},"Executed JavaScript in browser")):h=await Oo({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 g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new I("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(h)}catch(g){throw new I("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:h}}case"TYPE":{if(n.target&&pn(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 h=this.browser.url(),g,f,y=yM(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(y){let{elementInteractedDisplayString:b,thoughts:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:y,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{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:si(n)}});g=b,f=v}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f};return qu(h,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(pn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.hover(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"FOCUS":{if(!co(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.focus(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"BLUR":{if(n.target&&!co(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:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:f=>this.browser.blur(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return qu(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let h=new N$,g=L$(fetch,h),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await iw({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g}),cookies:Qb(h,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await SM({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return ow({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:h=>this.wrapElementTargetingCommand(h)});case"FILE_UPLOAD":{let h,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,h=await $_({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,h=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!h)throw new I("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...h,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let h;if(!n.storageState.trim())h=void 0;else if(h=await Oo({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof h!="object")throw new I("ActionFailureError",`Credentials must evaluate to an object (received ${typeof h} instead)`);let g;try{g=ou.optional().parse(h)}catch(f){throw new I("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let h=(n.timeout??mn)*1e3,g=this.generator.getAgentConfig()?.assertion;if(rw(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let y={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,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Tp({command:y,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{y.cache?.memory&&ml(n,y.cache?.memory.traces,a)}}let f=await tw({command:n,tracer:t,timeoutMs:h,targetingWrapper:y=>this.wrapElementTargetingCommand(y),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!f.success,data:f.data,elementInteracted:f.elementInteractedDisplayString,thoughts:f.err?.message??f.thoughts??`Element assertion ${f.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let h=await zr({action:async()=>id({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:!h.success,data:h.data,thoughts:h.success?"Page assertion passed.":h.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let h=new Ho(n.requestMatcher),g=this.browser.registerRequestListener(h);return this.registeredListeners[n.key]=g.then(async f=>await aS(f)).catch(f=>{a.error({err:f},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let h=this.registeredListeners[n.key];if(!h)throw new I("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await H(h,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let h=new Ho(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>h.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,f)=>{this.recordedRequests[n.key][g]=up(f)},onRequestComplete:(g,f)=>{this.recordedRequests[n.key][g]=up(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let h=this.recordedRequests[n.key];if(!h)throw new I("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(h),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let h;return n.requestMatcher&&(h=new Ho(n.requestMatcher)),this.browser.setHeader(n.name,n.value,h),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Ho(n.requestMatcher),async(g,f)=>{let y=await Oo({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:f},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=gT.parse(y);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(h=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new fp({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})}};import{cloneDeep as D$}from"lodash-es";var k$={showOverlay:!1},Ap=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:n,clientIp:o,browserBehavior:D$(k$),socket:a}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){t.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){t.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function EM(r,e,t,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 y=c;c=void 0;let S=g.url(),T=f.toEditorDisplayCopy();JSON.stringify(T)===JSON.stringify(a)&&S===l&&o>i||(r.emit("browserState",{logsPerPage:y?.logsPerPage,viewport:g.getViewport(),url:S,iframeSrcUrls:s??[],context:T,isInPageLoad:g.isInPageLoad}),o=Date.now()),l=S,a=T}catch(y){if(!r.connected)return;let S=y instanceof Error?y.message:`${y}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:y,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let g=n.getSession(e),f=g?.controller?.browser;if(!f||f.closed){t.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(y=>y.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 y=await f.getAllFrameUrls(),S=f.retrieveAndClearDebugData();m(y,S)&&(s=y,c=S,i=Date.now())}catch(y){t.warn({err:y},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var U$=3;async function bM({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=r.id,h=r.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 y=await a(g,e),S=await s(g,e),T=await l(g,e),b=await t(g),{testMetadata:v,baseUrl:C,envName:x,browserConfig:_,aiSettings:P,environmentVariables:G,localCodeEvalTools:W}=await ji({testId:h,orgId:g,logger:e,storage:b,authorization:c,settings:T}),U=p.getSession(m);if(U)return e.info("Associating connection with existing session (likely reconnect)"),await U.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let j=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:j,event:"connect",args:r.handshake.query},"Websocket event (connect)"),j&&p.getCurrentConnectionsByIp(j)>=U$)throw e.error({clientIp:j,sessions:p.getCurrentSessionsByIp(),...r.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(j);try{await F$({socket:r,baseUrl:C,envName:x,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:G,clientIp:j,devicePixelRatio:i,storage:b,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:W,generator:y,enricher:S,browserConfig:_,aiSettings:P,globalE2eStateManager:p})}catch(Q){throw e.warn({err:Q},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(j),Q}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function F$({socket:r,baseUrl:e,envName:t,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:y,globalE2eStateManager:S}){let T={viewport:o.advanced?.viewport??qt,locale:o.advanced?.locale??go,timezoneId:o.advanced?.timezone??fo,geolocation:o.advanced?.geolocation??So,colorScheme:o.advanced?.colorScheme};n&&(T.deviceScaleFactor=n);let b=o.id,v=await op({settings:h,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:b});let C=await Vr.init({baseUrl:e,userBrowserSettings:v,enricher:y,storage:c,logger:s,contextArgs:T,iconKnowledgeBase:null,callbacks:{onTabsChange:(W,U)=>{r.emit("tabs",{tabs:W,activeTab:U})},onScreencastFrame:(W,U)=>{let j=r;Dr&&(j=r.compress(!0)),j.emit("screenshot",{buffer:W},()=>{U()})},onSvgsCollected:W=>{r.emit("newIconDetected",{numIcons:W.newSvgs.length}),c.saveNewIcons(W,s)},onNetworkLogs:W=>{r.emit("networkLogs",{harEntries:W})}}});await C.navigate({url:e,initialNavigation:!0});let x=new jo({browser:C,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}),_=EM(r,a,s,S),P=async()=>{_.timers.forEach(W=>clearInterval(W))},G=new nr({baseUrl:e,testName:o.name,currentUrl:x.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await C.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:Vr.USER_AGENT,viewport:x.browser.getViewport(),sessionId:a}),S.registerSession({controller:x,context:G,sessionId:a,cleanup:P,clientIp:f,socket:r})}async function ji({testId:r,orgId:e,logger:t,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(r,t);if(!a)throw new Error(`Test metadata could not found for test ${r}`);let s;o?.type==="API_KEY"&&(s=new Tn({httpClient:new Ft({...o,logger:t,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),l;c&&(l=await n.fetchEnvironment(c.name,t));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||l?.variables?.[yt];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await ip({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:t,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 PS=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Pt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"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 eo({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},eo=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,t]of Object.entries(this.stepFrequenciesByType))Pt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,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 PS({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},Rp=class{constructor(e,t,n,o){this.socket=e;this.storage=t;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 eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var OS={currentlyExecutingRequests:{}},H$=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),s,c=await ji({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=OS.currentlyExecutingRequests[l]??0;OS.currentlyExecutingRequests[l]=u+1,s=await z$({...r,...e,...c,done:t})}finally{r.logger.info({result:s,sessionId:r.metadata.sessionId},"Test execution complete"),OS.currentlyExecutingRequests[l]--}},z$=async({socket:r,steps:e,baseUrl:t,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:y,globalE2eStateManager:S})=>{let{testId:T,sessionId:b,orgId:v}=u,C=b,x=S.getSession(b);if(!x)throw new Error("No active session found");let{controller:_,context:P}=x;_.setOpen(),d=d.child({testId:T,orgId:v,sessionId:b,runId:C}),d.info({steps:e.map(ne=>`${ne.type}${"command"in ne?` - ${ne.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:P,browserConfig:l,aiSettings:c},"Socket execution parameters");let G=h??{},W=async()=>{o&&(await _.browser.reset({newUrl:t}),P.reset({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:G,envName:p,testName:m}))},U=await s(v),j=await y(v),Q=async()=>{let ne=Date.now();try{await j.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:T,stepLists:{steps:e},logger:d})}catch(Gt){d.error({err:Gt},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{Pt.distribution("cache-resolution",Date.now()-ne,["executor:editor"])}};try{await gl({promiseGenerator:async()=>Promise.all([W(),Q()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(ne){if(r.emit("finished"),ne.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${ne}`)}let Y=B$(e),Ee={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},q={orgId:v,runId:C,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},nt={controller:_,context:P,storage:U,codeEvalTools:g,usageTracker:new ga,logger:d},Be={test:{},step:{onDynamicAIActionStatusUpdateEvent:ne=>{r.emit("dynamicCommandStatusUpdate",ne)},onDynamicAIActionEvaluatingEvent:ne=>{r.emit("dynamicCommandEvaluating",ne)},onDynamicCommandGenerated:ne=>{r.emit("dynamicCommandGenerated",ne)},onDynamicCommandExecuted:ne=>{r.emit("dynamicCommandExecuted",ne)}}},qe=new Rp(r,U,v,T),Lt=await np({fixtures:nt,options:Ee,callbacks:Be,inputs:q,testParams:{tracer:qe}}),_e={logger:d,cacheStorage:j,orgId:v,testId:T,originalStepsWithCaches:{steps:Y},updatedStepsWithCaches:{steps:e}};return Lt?.status==="PASSED"?await zu(_e):Lt?.status==="FAILED"&&await Gu(_e),await qe.finish(),f?.(Lt),Lt.status};var TM={event:"execute",createHandler:H$};import{cloneDeep as G$}from"lodash-es";var j$=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=G$(e),s=eR(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},vM={event:"lintStep",createHandler:j$};var V$=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;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 t(i),f=pi.parse(u.advanced??{}),y={},S;if(c){if("useSelector"in l&&l.useSelector)try{let T=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);S=T.resolution.locator,y={target:T.target,thoughts:T.thoughts}}catch(T){e.warn({err:T},"Failed resolving target with selector"),s({err:`Failed locating element: ${T.message}`,decisions:T instanceof xr?T.decisions:void 0});return}else try{let T=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:si(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&Ec(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});y={target:T.target,thoughts:T.thoughts},S=T.resolution.locator}catch(T){(async()=>{try{let b=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:T,html:b.slice(0,1e5)},"Failed locating element with AI")}catch(b){e.warn({err:b},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${T.message}`});return}if(l.type==="SELECT_OPTION"&&S)try{y.options=await m.browser.getSelectOptions(S)}catch(T){e.warn({err:T},"Failed getting select options"),s({err:`Failed getting select options: ${T.message}`});return}e.info({result:y},"Locate handler result")}if(d)try{let{buffer:T,width:b,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:S}),C=await g.uploadScreenshot(T);y.screenshot={data:C,width:b,height:v},e.info({width:b,height:v},"Captured screenshot during locate")}catch(T){e.error({err:T},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${T.message}`});return}if(s({result:y}),S)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(S),m.browser.highlight(S)])}catch(T){e.warn({err:T},"Error highlighting element, continuing...")}}},AM={event:"locate",createHandler:V$};var $$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let s=t.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")}}},RM={event:"mouseClickEvent",createHandler:$$};var W$=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;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,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let h=new AbortController;h.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(y){t.warn({err:y},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(y,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:y,stepId:c,parentStepIdChain:l,command:S.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:t,testId:s,orgId:a,callbacks:{onActionReceived:y=>f("clickReceived",y),onStepRecorded:y=>f("descriptionGenerated",y)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},wM={event:"recordTargetClick",createHandler:W$};var q$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.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}}},CM={event:"keyDownEvent",createHandler:q$};var K$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.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}}},xM={event:"keyUpEvent",createHandler:K$};var Y$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,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=t.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")}}},_M={event:"mouseMoveEvent",createHandler:Y$};var X$=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;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)=>{t.emit("stepRecorded",{stepId:c,step:g,offset:f})},onStepRecorded:(g,f)=>{t.emit("stepRecorded",{stepId:c,step:g,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:h}}},IM={event:"recordingStart",createHandler:X$};var J$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{let o=t.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}},MM={event:"recordingStop",createHandler:J$};var Q$=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;t.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:h}=await ji({testId:l,orgId:d,logger:t,storage:m,authorization:o,settings:p}),g=a.getSession(u);if(!g){r.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let y=f.browser.getViewport();t.info({baseUrl:h,viewport:y},`Session refreshed for test ${l} at ${h}`),c()},PM={event:"refresh",createHandler:Q$};var Z$=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;t.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,t),d=await n(l),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await ji({testId:s,orgId:l,logger:t,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){r.emit("error",{message:"No session to reset"});return}let{controller:y,context:S}=f;await y.browser.reset({newUrl:p});let T=y.browser.baseUrl;S.reset({baseUrl:T,currentUrl:y.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let b=y.browser.getViewport(),v=Vr.USER_AGENT;t.info({baseUrl:p,viewport:b},`Session reset for test ${s} at ${T}`),r.emit("session",{url:T,userAgent:v,viewport:b,sessionId:c})},OM={event:"reset",createHandler:Z$};var eW=({metadata:r,globalE2eStateManager:e})=>{let{sessionId:t}=r;return async({url:n})=>{let o=e.getSession(t);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},LM={event:"switchTab",createHandler:eW};async function NM(r){return bM(r)}var DM=[VR,TM,AM,OM,PM,zR,LM,vM,wM,IM,MM,_M,RM,CM,xM,jR,GR];var kM=r=>{let{logger:e}=r,t=new tW(r.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await NM({...r,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}DM.forEach(i=>rW(i,{...r,socket:n,metadata:o,logger:e}))}),t},rW=(r,e)=>{let t=r.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(r.event)||e.logger.debug({...e.metadata,event:r.event},`Websocket event (${r.event})`);let i=a=>{e.logger.error({event:r.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=t.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(r.event,n)};import{Router as sW}from"express";import{Router as oW}from"express";import tc from"fs";import ec from"path";import{v4 as iW}from"uuid";import aW from"yaml";import{hostname as nW}from"os";var Zl="2.26.0",Ze=va({app:"desktop-server",hostname:nW(),disableConsoleLogs:!0}).child({cliVersion:Zl});(async()=>{try{let r=await Xn(Ze);r.gitBranchName&&Ze.addBinding("branch",r.gitBranchName)}catch{}})();var ss=oW();async function LS(r){return(await Zu(r,Ze)).map(n=>{let o=r.modules[n.moduleId];if(!o){E.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)}ss.get("/",xe(async(r,e)=>{let t=ae(),n=await Z(t),o=await LS(n);e.status(200).json(o)}));ss.post("/",xe(async(r,e)=>{let t;try{t=IT.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{mo(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=ae(),o=(await Z(n)).modules;if(Object.values(o).find(s=>s.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=ec.join(n.rootDir,t.folderPath??"");if(!tc.existsSync(i)||!tc.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Qu({...t,folder:i,project:n});e.status(201).json(a)}));ss.get("/:moduleId",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Z(ae()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await rn(n,t,E);e.json(o)}catch(o){e.status(400).json({err:o})}}));ss.post("/:moduleId/duplicate",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=_T.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{mo(t.name)}catch(g){e.status(400).json({error:g.message});return}let n=ae(),o=await Z(n),i=o.modules[r.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(g=>g.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let a=await rn(i,o,E),s=ec.join(n.rootDir,ec.dirname(i.relativePath));if(!tc.existsSync(s)||!tc.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=De(t.name),l=ec.join(s,`${c}.module.yaml`),u=iW(),{stepsToSave:d}=await tt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:At()}}),p={fileType:he.MODULE,schemaVersion:Re,moduleId:u,name:t.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=aW.stringify(p);tc.writeFileSync(l,m,"utf-8");let h={relativeFilePath:ec.relative(n.rootDir,l)};e.status(201).json(h)}));ss.patch("/:moduleId/metadata",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=MT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ae(),o=await Z(n);bR({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:E,project:n}),e.status(201).json({message:"ok"})}));var UM=ss;var FM=sW();FM.get("/",xe(async(r,e)=>{let t=ae(),n=await Z(t),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 LS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var BM=FM;import{Router as lW}from"express";var NS=lW();NS.get("/",xe((r,e)=>{let t=ed(ae(),Ze);e.status(200).json(t)}));NS.get("/names",xe((r,e)=>{let n=ae().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var HM=NS;import{Router as cW}from"express";var zM=cW();zM.get("/",xe((r,e)=>{let t={userId:Io(),orgId:At(),cliVersion:Zl??"0.0.0"};e.status(200).json(t)}));var GM=zM;import{StreamableHTTPServerTransport as Eq}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as bq}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as Tq}from"crypto";import{Router as vq}from"express";import{McpServer as Sq}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as yq}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as hW}from"ai";import _p from"dedent";import{z as Vo}from"zod";import{tool as uW}from"ai";import{z as dW}from"zod";var wp=(r,e)=>({builder:n=>uW({description:r.schema.description,inputSchema:dW.object(r.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:r.schema.name,input:o,err:a.content.map(s=>s.text).join(`
4257
+ ${r}`;default:return r}}var C$=15;async function Tp({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=C$}){if(!r.assertion.trim())throw new I("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=uR(c),u=0,d=Date.now(),p,m,h;try{await zr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let g;for(;u<a&&(!g||g-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await ie(l,n.abortSignal),g=Date.now();let f=!1;try{if(p=await zr({action:async()=>{let S=await hM(s,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?(f=!0,p):(m=S,gM({command:r,state:S,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),p?.success){p?.updatedMemory&&ml(r,p.updatedMemory,t);break}else throw p?.thoughts?new I("AssertionFailureError",p.thoughts):new I("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(y){n.abortSignal.throwIfAborted(),h=y instanceof Error?y:new Error(`${y}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:y},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await zr({action:async()=>gM({command:r,state:await hM(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(p?.updatedMemory&&ml(r,p.updatedMemory,t),!p?.success){let f=`AI check still failing after ${u} attempts.`;throw h&&(f+=` Latest result: ${h.message}`),new I("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function hM(r,e,t){let[n,o]=await Promise.all([In(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function gM({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,y=f.toString("base64"),S=u.url(),T=r.contextChoice??"MULTIMODAL",b=h;T!=="VISION_ONLY"&&(b=await Gi({type:"assertion",serializedTree:h,tree:g,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),b!==h&&(m.ragUsed=!0),m.pageState=b);let v={goal:r.assertion,url:S,memory:o?r.cache?.memory:void 0,browserState:b,screenshot:y,contextChoice:T,source:c},x=await(T==="VISION_ONLY"?(_,P)=>d.getVisualAssertionResult(_,P):(_,P)=>d.getAssertionResult(_,P))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:Fe(l)});return(x.result||i)&&x.relevantElements&&(m.relevantElementsSerialized=x.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await x$(x.relevantElements,u,l)),{success:x.result,thoughts:x.thoughts,afterScreenshotOverride:f,updatedMemory:o?x.updatedMemory:void 0}}async function x$(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await H(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var _$=75e4,vp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function fM(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await I$(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof vp?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ie(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function I$(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await ie(o.smartWaitingTimeout,n);return}if(!e.description)throw new I("UserConfigurationError","Cannot locate element with empty description");await H(M$(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function M$(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await zr({action:async()=>P$(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function P$(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await ar({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await In(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Ge(p)>_$)throw new vp;s.throwIfAborted();let h;try{h=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(S){throw new I("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: ${S instanceof Error?S.message:S}`)}let f=`data:image/jpeg;base64,${h.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:Fe(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}var O$=3e4;async function SM({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??O$/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Oa(r.url)&&(s=r.url),t&&La(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new I("ActionFailureError",`Invalid URL: ${r.url}`);let l=await H((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new I("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 I("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new I("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new I("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 jo=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,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=t,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:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([In(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 Gi({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:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Fe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([In(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 Gi({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:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Fe(a)},langfuseSessionId:s})}catch(h){throw new I("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return In(this.browser,e)}async locateElement(e){return await MS({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return zr({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,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:t,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:t,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:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new I("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await zr({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:t})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&Cm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Im(i)||xm(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Mm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof gn&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof I?n:new I("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new I("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:t.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 ie(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,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,y=!1,S=yM(e.cache);if((!S||l)&&!dm(o))throw new I("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"),y=!0,S=void 0),S&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&S.targetSource==="HEURISTIC_HEALED"&&(y=!0,S=void 0),S?.inputDescription&&!mM(o.elementDescriptor,S.inputDescription)&&(h.warn({old:S.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),y=!0,S=void 0);let T=v=>!!v&&yc(v),b=!0;if(!T(S)){b=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:y,memory:s.memory,useMemory:g},"Prompting AI for an updated element location"),(y||!i)&&await fM({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:h,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await MS({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(t))}catch(_){if(_ instanceof aa&&_.updatedLocatorMemory){let P={id:-1,...i,memory:_.updatedLocatorMemory};Nu({cmd:c,key:d,newTarget:P,logger:h,updatedWithAI:!0})}throw new I("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let C=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),x=await a(C);return Nu({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=Fe(h)),{result:x,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,S,{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 C=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),x=await a(C);if(Pt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.27.0"]),Nu({cmd:c,key:d,newTarget:S,logger:h,updatedWithAI:!1}),b){let _=v.decisions.filter(P=>P.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let P=_[0].type;n.recordTargetAutoHeal({healType:P})}}return{result:x,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let C="unknown";v instanceof xr&&v.cacheMissReason&&(C=v.cacheMissReason),Pt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.27.0",`missReason:${C}`]);let x=!1;if((v instanceof gn||Cm(v)||Im(v)||Mm(v)||OE(v)||xm(v)||LE(v))&&(x=!0),v instanceof I&&!x)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 S.memory&&Ec(S.memory)&&(_=S.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:_,retriesWithAI:f,targetHealingInProgress:!0}})}throw new I("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return wl(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ie(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 I("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Ky(n)?await this.browser.waitForDOMStability({timeout:Ie}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:le}),this.options?.autoFollowNewTabs&&await I_({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{QR(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>tS(e)}}async resolveCommandTemplateStrings(e,t){return od({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,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()?Tp({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 I("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new I("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Tp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new I("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=Fv(n.schema);if(f)throw new I("UserConfigurationError",f)}let h=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let f=await this.generator.getTextExtraction({goal:n.goal,browserState:h,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Fe(a)});if(f.result==="NOT_FOUND")throw new I("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new I("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let y=f.message;throw y.includes("MaxGenerationLengthExceededError")?new I("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."):y.includes("AIProviderError")&&y.includes("time")?new I("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:f}}):f}}case"NAVIGATE":if(!Oa(n.url)&&!La(n.url,this.browser.baseUrl))throw new I("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let c=await this.browser.solveCaptcha();c&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:h=>this.browser.click(h,this.createCallbacksForBrowser(this.orgId),{}),options:{...n,targetName:"target",disableCache:i}}),await this.browser.type(c,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let h,g;if(n.target&&pn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});h=S,g=T}let f=this.browser.getViewport()?.height??qt.height,y=this.browser.getViewport()?.width??qt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??f));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??f);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??y));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??y);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new I("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let h=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:h},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new I("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await ie(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(pn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let h=this.browser.url(),{elementInteractedDisplayString:g,result:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:y,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return qu(h,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(pn(n.fromTarget)&&pn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(pn(n.fromTarget)||pn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:h,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(f,y)=>this.browser.dragAndDrop(f.locator,y.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],thoughts:g}}case"MOUSE_DRAG":{let h=parseInt(n.deltaX),g=parseInt(n.deltaY),f=n.steps??5;if(isNaN(h)||isNaN(g))throw new I("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&pn(n.target)){await this.browser.mouseDragUsingVisualCoordinates(h,g,f,void 0,n.target.pixels);break}let y,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async v=>this.browser.mouseDrag(h,g,f,v.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});y=T,S=b}else await this.browser.mouseDrag(h,g,f,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:S}}case"SELECT_OPTION":{if(!co(n.target))throw new Error("Select with x/y is not supported yet");let h=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:h},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:si(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"TAB":{let h={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,h);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 u=await this.browser.setCookie(n.value);a.debug({results:u},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let h;try{n.environment==="BROWSER"?(h=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:h},"Executed JavaScript in browser")):h=await Oo({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 g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new I("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(h)}catch(g){throw new I("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:h}}case"TYPE":{if(n.target&&pn(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 h=this.browser.url(),g,f,y=yM(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(y){let{elementInteractedDisplayString:b,thoughts:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:y,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{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:si(n)}});g=b,f=v}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f};return qu(h,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(pn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.hover(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"FOCUS":{if(!co(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.focus(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"BLUR":{if(n.target&&!co(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:h,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:f=>this.browser.blur(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return qu(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let h=new N$,g=L$(fetch,h),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await iw({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g}),cookies:Qb(h,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await SM({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return ow({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:h=>this.wrapElementTargetingCommand(h)});case"FILE_UPLOAD":{let h,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,h=await $_({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,h=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!h)throw new I("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...h,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let h;if(!n.storageState.trim())h=void 0;else if(h=await Oo({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof h!="object")throw new I("ActionFailureError",`Credentials must evaluate to an object (received ${typeof h} instead)`);let g;try{g=ou.optional().parse(h)}catch(f){throw new I("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let h=(n.timeout??mn)*1e3,g=this.generator.getAgentConfig()?.assertion;if(rw(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let y={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,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Tp({command:y,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{y.cache?.memory&&ml(n,y.cache?.memory.traces,a)}}let f=await tw({command:n,tracer:t,timeoutMs:h,targetingWrapper:y=>this.wrapElementTargetingCommand(y),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!f.success,data:f.data,elementInteracted:f.elementInteractedDisplayString,thoughts:f.err?.message??f.thoughts??`Element assertion ${f.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let h=await zr({action:async()=>id({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:!h.success,data:h.data,thoughts:h.success?"Page assertion passed.":h.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let h=new Ho(n.requestMatcher),g=this.browser.registerRequestListener(h);return this.registeredListeners[n.key]=g.then(async f=>await aS(f)).catch(f=>{a.error({err:f},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let h=this.registeredListeners[n.key];if(!h)throw new I("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await H(h,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let h=new Ho(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>h.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,f)=>{this.recordedRequests[n.key][g]=up(f)},onRequestComplete:(g,f)=>{this.recordedRequests[n.key][g]=up(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let h=this.recordedRequests[n.key];if(!h)throw new I("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(h),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let h;return n.requestMatcher&&(h=new Ho(n.requestMatcher)),this.browser.setHeader(n.name,n.value,h),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Ho(n.requestMatcher),async(g,f)=>{let y=await Oo({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:f},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=gT.parse(y);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(h=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new fp({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Fe(this.logger)})}};import{cloneDeep as D$}from"lodash-es";var k$={showOverlay:!1},Ap=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:n,clientIp:o,browserBehavior:D$(k$),socket:a}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){t.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){t.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function EM(r,e,t,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 y=c;c=void 0;let S=g.url(),T=f.toEditorDisplayCopy();JSON.stringify(T)===JSON.stringify(a)&&S===l&&o>i||(r.emit("browserState",{logsPerPage:y?.logsPerPage,viewport:g.getViewport(),url:S,iframeSrcUrls:s??[],context:T,isInPageLoad:g.isInPageLoad}),o=Date.now()),l=S,a=T}catch(y){if(!r.connected)return;let S=y instanceof Error?y.message:`${y}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:y,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let g=n.getSession(e),f=g?.controller?.browser;if(!f||f.closed){t.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(y=>y.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 y=await f.getAllFrameUrls(),S=f.retrieveAndClearDebugData();m(y,S)&&(s=y,c=S,i=Date.now())}catch(y){t.warn({err:y},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var U$=3;async function bM({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=r.id,h=r.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 y=await a(g,e),S=await s(g,e),T=await l(g,e),b=await t(g),{testMetadata:v,baseUrl:C,envName:x,browserConfig:_,aiSettings:P,environmentVariables:G,localCodeEvalTools:W}=await ji({testId:h,orgId:g,logger:e,storage:b,authorization:c,settings:T}),U=p.getSession(m);if(U)return e.info("Associating connection with existing session (likely reconnect)"),await U.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let j=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:j,event:"connect",args:r.handshake.query},"Websocket event (connect)"),j&&p.getCurrentConnectionsByIp(j)>=U$)throw e.error({clientIp:j,sessions:p.getCurrentSessionsByIp(),...r.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(j);try{await F$({socket:r,baseUrl:C,envName:x,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:G,clientIp:j,devicePixelRatio:i,storage:b,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:W,generator:y,enricher:S,browserConfig:_,aiSettings:P,globalE2eStateManager:p})}catch(Q){throw e.warn({err:Q},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(j),Q}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function F$({socket:r,baseUrl:e,envName:t,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:y,globalE2eStateManager:S}){let T={viewport:o.advanced?.viewport??qt,locale:o.advanced?.locale??go,timezoneId:o.advanced?.timezone??fo,geolocation:o.advanced?.geolocation??So,colorScheme:o.advanced?.colorScheme};n&&(T.deviceScaleFactor=n);let b=o.id,v=await op({settings:h,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:b});let C=await Vr.init({baseUrl:e,userBrowserSettings:v,enricher:y,storage:c,logger:s,contextArgs:T,iconKnowledgeBase:null,callbacks:{onTabsChange:(W,U)=>{r.emit("tabs",{tabs:W,activeTab:U})},onScreencastFrame:(W,U)=>{let j=r;Dr&&(j=r.compress(!0)),j.emit("screenshot",{buffer:W},()=>{U()})},onSvgsCollected:W=>{r.emit("newIconDetected",{numIcons:W.newSvgs.length}),c.saveNewIcons(W,s)},onNetworkLogs:W=>{r.emit("networkLogs",{harEntries:W})}}});await C.navigate({url:e,initialNavigation:!0});let x=new jo({browser:C,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}),_=EM(r,a,s,S),P=async()=>{_.timers.forEach(W=>clearInterval(W))},G=new nr({baseUrl:e,testName:o.name,currentUrl:x.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await C.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:Vr.USER_AGENT,viewport:x.browser.getViewport(),sessionId:a}),S.registerSession({controller:x,context:G,sessionId:a,cleanup:P,clientIp:f,socket:r})}async function ji({testId:r,orgId:e,logger:t,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(r,t);if(!a)throw new Error(`Test metadata could not found for test ${r}`);let s;o?.type==="API_KEY"&&(s=new Tn({httpClient:new Ft({...o,logger:t,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),l;c&&(l=await n.fetchEnvironment(c.name,t));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||l?.variables?.[yt];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await ip({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:t,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 PS=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Pt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"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 eo({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},eo=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,t]of Object.entries(this.stepFrequenciesByType))Pt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,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 PS({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},Rp=class{constructor(e,t,n,o){this.socket=e;this.storage=t;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 eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new eo({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var OS={currentlyExecutingRequests:{}},H$=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),s,c=await ji({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=OS.currentlyExecutingRequests[l]??0;OS.currentlyExecutingRequests[l]=u+1,s=await z$({...r,...e,...c,done:t})}finally{r.logger.info({result:s,sessionId:r.metadata.sessionId},"Test execution complete"),OS.currentlyExecutingRequests[l]--}},z$=async({socket:r,steps:e,baseUrl:t,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:y,globalE2eStateManager:S})=>{let{testId:T,sessionId:b,orgId:v}=u,C=b,x=S.getSession(b);if(!x)throw new Error("No active session found");let{controller:_,context:P}=x;_.setOpen(),d=d.child({testId:T,orgId:v,sessionId:b,runId:C}),d.info({steps:e.map(ne=>`${ne.type}${"command"in ne?` - ${ne.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:P,browserConfig:l,aiSettings:c},"Socket execution parameters");let G=h??{},W=async()=>{o&&(await _.browser.reset({newUrl:t}),P.reset({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:G,envName:p,testName:m}))},U=await s(v),j=await y(v),Q=async()=>{let ne=Date.now();try{await j.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:T,stepLists:{steps:e},logger:d})}catch(Gt){d.error({err:Gt},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{Pt.distribution("cache-resolution",Date.now()-ne,["executor:editor"])}};try{await gl({promiseGenerator:async()=>Promise.all([W(),Q()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(ne){if(r.emit("finished"),ne.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${ne}`)}let Y=B$(e),Ee={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},q={orgId:v,runId:C,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},nt={controller:_,context:P,storage:U,codeEvalTools:g,usageTracker:new ga,logger:d},Be={test:{},step:{onDynamicAIActionStatusUpdateEvent:ne=>{r.emit("dynamicCommandStatusUpdate",ne)},onDynamicAIActionEvaluatingEvent:ne=>{r.emit("dynamicCommandEvaluating",ne)},onDynamicCommandGenerated:ne=>{r.emit("dynamicCommandGenerated",ne)},onDynamicCommandExecuted:ne=>{r.emit("dynamicCommandExecuted",ne)}}},qe=new Rp(r,U,v,T),Lt=await np({fixtures:nt,options:Ee,callbacks:Be,inputs:q,testParams:{tracer:qe}}),_e={logger:d,cacheStorage:j,orgId:v,testId:T,originalStepsWithCaches:{steps:Y},updatedStepsWithCaches:{steps:e}};return Lt?.status==="PASSED"?await zu(_e):Lt?.status==="FAILED"&&await Gu(_e),await qe.finish(),f?.(Lt),Lt.status};var TM={event:"execute",createHandler:H$};import{cloneDeep as G$}from"lodash-es";var j$=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=G$(e),s=eR(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},vM={event:"lintStep",createHandler:j$};var V$=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;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 t(i),f=pi.parse(u.advanced??{}),y={},S;if(c){if("useSelector"in l&&l.useSelector)try{let T=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);S=T.resolution.locator,y={target:T.target,thoughts:T.thoughts}}catch(T){e.warn({err:T},"Failed resolving target with selector"),s({err:`Failed locating element: ${T.message}`,decisions:T instanceof xr?T.decisions:void 0});return}else try{let T=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:si(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&Ec(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});y={target:T.target,thoughts:T.thoughts},S=T.resolution.locator}catch(T){(async()=>{try{let b=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:T,html:b.slice(0,1e5)},"Failed locating element with AI")}catch(b){e.warn({err:b},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${T.message}`});return}if(l.type==="SELECT_OPTION"&&S)try{y.options=await m.browser.getSelectOptions(S)}catch(T){e.warn({err:T},"Failed getting select options"),s({err:`Failed getting select options: ${T.message}`});return}e.info({result:y},"Locate handler result")}if(d)try{let{buffer:T,width:b,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:S}),C=await g.uploadScreenshot(T);y.screenshot={data:C,width:b,height:v},e.info({width:b,height:v},"Captured screenshot during locate")}catch(T){e.error({err:T},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${T.message}`});return}if(s({result:y}),S)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(S),m.browser.highlight(S)])}catch(T){e.warn({err:T},"Error highlighting element, continuing...")}}},AM={event:"locate",createHandler:V$};var $$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let s=t.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")}}},RM={event:"mouseClickEvent",createHandler:$$};var W$=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;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,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let h=new AbortController;h.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(y){t.warn({err:y},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(y,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:y,stepId:c,parentStepIdChain:l,command:S.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:t,testId:s,orgId:a,callbacks:{onActionReceived:y=>f("clickReceived",y),onStepRecorded:y=>f("descriptionGenerated",y)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},wM={event:"recordTargetClick",createHandler:W$};var q$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.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}}},CM={event:"keyDownEvent",createHandler:q$};var K$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.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}}},xM={event:"keyUpEvent",createHandler:K$};var Y$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,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=t.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")}}},_M={event:"mouseMoveEvent",createHandler:Y$};var X$=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;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)=>{t.emit("stepRecorded",{stepId:c,step:g,offset:f})},onStepRecorded:(g,f)=>{t.emit("stepRecorded",{stepId:c,step:g,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:h}}},IM={event:"recordingStart",createHandler:X$};var J$=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{let o=t.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}},MM={event:"recordingStop",createHandler:J$};var Q$=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;t.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:h}=await ji({testId:l,orgId:d,logger:t,storage:m,authorization:o,settings:p}),g=a.getSession(u);if(!g){r.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let y=f.browser.getViewport();t.info({baseUrl:h,viewport:y},`Session refreshed for test ${l} at ${h}`),c()},PM={event:"refresh",createHandler:Q$};var Z$=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;t.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,t),d=await n(l),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await ji({testId:s,orgId:l,logger:t,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){r.emit("error",{message:"No session to reset"});return}let{controller:y,context:S}=f;await y.browser.reset({newUrl:p});let T=y.browser.baseUrl;S.reset({baseUrl:T,currentUrl:y.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let b=y.browser.getViewport(),v=Vr.USER_AGENT;t.info({baseUrl:p,viewport:b},`Session reset for test ${s} at ${T}`),r.emit("session",{url:T,userAgent:v,viewport:b,sessionId:c})},OM={event:"reset",createHandler:Z$};var eW=({metadata:r,globalE2eStateManager:e})=>{let{sessionId:t}=r;return async({url:n})=>{let o=e.getSession(t);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},LM={event:"switchTab",createHandler:eW};async function NM(r){return bM(r)}var DM=[VR,TM,AM,OM,PM,zR,LM,vM,wM,IM,MM,_M,RM,CM,xM,jR,GR];var kM=r=>{let{logger:e}=r,t=new tW(r.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await NM({...r,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}DM.forEach(i=>rW(i,{...r,socket:n,metadata:o,logger:e}))}),t},rW=(r,e)=>{let t=r.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(r.event)||e.logger.debug({...e.metadata,event:r.event},`Websocket event (${r.event})`);let i=a=>{e.logger.error({event:r.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=t.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(r.event,n)};import{Router as sW}from"express";import{Router as oW}from"express";import tc from"fs";import ec from"path";import{v4 as iW}from"uuid";import aW from"yaml";import{hostname as nW}from"os";var Zl="2.27.0",Ze=va({app:"desktop-server",hostname:nW(),disableConsoleLogs:!0}).child({cliVersion:Zl});(async()=>{try{let r=await Xn(Ze);r.gitBranchName&&Ze.addBinding("branch",r.gitBranchName)}catch{}})();var ss=oW();async function LS(r){return(await Zu(r,Ze)).map(n=>{let o=r.modules[n.moduleId];if(!o){E.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)}ss.get("/",xe(async(r,e)=>{let t=ae(),n=await Z(t),o=await LS(n);e.status(200).json(o)}));ss.post("/",xe(async(r,e)=>{let t;try{t=IT.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{mo(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=ae(),o=(await Z(n)).modules;if(Object.values(o).find(s=>s.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=ec.join(n.rootDir,t.folderPath??"");if(!tc.existsSync(i)||!tc.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Qu({...t,folder:i,project:n});e.status(201).json(a)}));ss.get("/:moduleId",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Z(ae()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await rn(n,t,E);e.json(o)}catch(o){e.status(400).json({err:o})}}));ss.post("/:moduleId/duplicate",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=_T.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{mo(t.name)}catch(g){e.status(400).json({error:g.message});return}let n=ae(),o=await Z(n),i=o.modules[r.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(g=>g.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let a=await rn(i,o,E),s=ec.join(n.rootDir,ec.dirname(i.relativePath));if(!tc.existsSync(s)||!tc.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=De(t.name),l=ec.join(s,`${c}.module.yaml`),u=iW(),{stepsToSave:d}=await tt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:At()}}),p={fileType:me.MODULE,schemaVersion:Re,moduleId:u,name:t.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=aW.stringify(p);tc.writeFileSync(l,m,"utf-8");let h={relativeFilePath:ec.relative(n.rootDir,l)};e.status(201).json(h)}));ss.patch("/:moduleId/metadata",xe(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=MT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ae(),o=await Z(n);bR({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:E,project:n}),e.status(201).json({message:"ok"})}));var UM=ss;var FM=sW();FM.get("/",xe(async(r,e)=>{let t=ae(),n=await Z(t),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 LS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var BM=FM;import{Router as lW}from"express";var NS=lW();NS.get("/",xe((r,e)=>{let t=ed(ae(),Ze);e.status(200).json(t)}));NS.get("/names",xe((r,e)=>{let n=ae().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var HM=NS;import{Router as cW}from"express";var zM=cW();zM.get("/",xe((r,e)=>{let t={userId:Io(),orgId:At(),cliVersion:Zl??"0.0.0"};e.status(200).json(t)}));var GM=zM;import{StreamableHTTPServerTransport as Eq}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as bq}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as Tq}from"crypto";import{Router as vq}from"express";import{McpServer as Sq}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as yq}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as hW}from"ai";import _p from"dedent";import{z as Vo}from"zod";import{tool as uW}from"ai";import{z as dW}from"zod";var wp=(r,e)=>({builder:n=>uW({description:r.schema.description,inputSchema:dW.object(r.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:r.schema.name,input:o,err:a.content.map(s=>s.text).join(`
4227
4258
  `)},"Tool execution resulted in error"):n.logger.info({toolName:r.schema.name,input:o},"Tool execution completed"),a}}),tool:r});var rc=class{results=[];isError;addResult(e){this.results.push(e)}addError(e){this.results.push(`Error: ${e}`),this.isError=!0}getResult(){return this.results.join(`
4228
4259
  `)}async serialize(){let e=[];return this.results.length&&(e.push("### Result"),e.push(this.results.join(`
4229
4260
  `)),e.push("")),{content:[{type:"text",text:e.join(`
@@ -4582,7 +4613,7 @@ ${n}`}import wW from"path";var Lp=class{_result=[];_includeSnapshot=!1;_includeT
4582
4613
  ${o}`}async test(){if(!this._includeTest)return"";let e=await Z(this._project),t=await lt(wW.join(this._project.rootDir,this._testPath),this._logger,e);try{let o=new Je({baseUrl:yr(),apiKey:Er(),logger:this._logger}),i=await kr(this._logger,o,this._project),a=_o({orgId:At(),client:o,gitMetadata:i,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}),{steps:s,beforeSteps:c,afterSteps:l}=await Du({cacheStorage:a,logger:this._logger,schemaVersion:t.schemaVersion,stepLists:{steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps},testId:t.id});t.beforeSteps=c,t.steps=s,t.afterSteps=l}catch(o){this._logger.error({err:o},"Failed to resolve step cache entries for copilot test view")}let n=[];return n.push("### Test"),n.push(`Name: ${t.name}`),t.description&&n.push(`Description: ${t.description}`),n.push(""),t.beforeSteps&&t.beforeSteps.length>0&&(n.push(this.formatStepList(t.beforeSteps,"Setup Steps")),n.push("")),n.push(this.formatStepList(t.steps,"Main Steps")),t.afterSteps&&t.afterSteps.length>0&&(n.push(""),n.push(this.formatStepList(t.afterSteps,"Teardown Steps"))),n.join(`
4583
4614
  `)}addError(e){this._result.push(e),this._isError=!0}async serialize(){let e=[];this._result.length&&(e.push("### Result"),e.push(this._result.join(`
4584
4615
  `)),e.push(""));let t=await this.snapshot();t&&e.push(t,"");let n=this.testContext();n&&e.push(n,"");let o=await this.test();return o&&e.push(o,""),{content:[{type:"text",text:e.join(`
4585
- `)}],isError:this._isError}}};var Ot=r=>({builder:wp(r,t=>new Lp(t.controller.browser,t.testContext,t.project,t.logger,t.testPath)).builder,name:r.schema.name});var CW=Ot({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),qM=[CW];import Dp from"path";import{z as We}from"zod";function cs(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import xW from"fs";import us from"path";function KM(r){let e=r.subDir?us.join(r.project.rootDir,r.subDir):r.project.rootDir,t=`${De(r.name)}.module.yaml`,n=us.join(e,t),o=us.relative(r.project.rootDir,n),i=xW.statSync(n);return{type:he.MODULE,name:r.name,id:r.moduleId,description:r.description??void 0,relativePath:o,fullFilePath:n,platformSep:us.sep,fullPathSegments:n.split(us.sep),relativePathSegments:o.split(us.sep),fileName:t,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as FS}from"crypto";import{z as YM}from"zod";function Np(r){let e=r.config.ai?.aiAction??!1,t=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?YM.discriminatedUnion("type",[Vm,$m,YE]).describe(t):YM.discriminatedUnion("type",[Vm,$m]).describe(t)}async function ds(r,e,t){switch(r.type){case"PRESET_ACTION":{let n=Fc(r.action),o=r.envKey&&jm.includes(n.type)?r.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:FS(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await Ln(e,n,"module"),s=await rn(i,a,t);XE(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:FS(),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:r.text,id:FS()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function XM({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await tt({stepLists:{steps:e}});br({content:{...r,steps:o.steps},schemaVersion:Re,momenticFiles:t,project:n})}var _W=Ot({schema:{name:"momentic_module_create",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:{name:We.string(),description:We.string(),enabled:We.boolean().default(!0),parameters:We.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:We.record(We.string(),We.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:We.record(We.string(),We.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:We.record(We.string(),We.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:We.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:We.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:We.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}},handle:async(r,e,t,n)=>{let{project:o,logger:i,testPath:a,socket:s}=r,c=e.startIndex??0,l=e.endIndex??c+1,u=await Z(o);if(Object.values(u.modules).find(g=>g.name===e.name))throw new Ue(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let g=e.defaultParameters?Object.keys(e.defaultParameters):[],f=e.parameterEnums?Object.keys(e.parameterEnums):[],y=new Set([...g,...f]);for(let S of y)if(!e.parameters.includes(S))throw new Ue(`Default parameter "${S}" is not defined in parameters array. Available parameters: ${e.parameters.join(", ")}`)}let p=[];if(e.startIndex!==void 0){if(!a)throw new Ue("testPath is required when extracting steps from the current test.");let g=await lt(Dp.join(o.rootDir,a),i,u);if(c<0||c>=g.steps.length)throw new Ue(`startIndex ${c} is out of bounds. Test has ${g.steps.length} steps.`);if(l<=c||l>g.steps.length)throw new Ue(`endIndex ${l} is out of bounds. Must be between ${c+1} and ${g.steps.length}.`);p=g.steps.slice(c,l);for(let f of p)if(f.type==="RESOLVED_MODULE")throw new Ue("Modules cannot be nested. Please select steps that do not include module references.")}let m=await Qu({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Dp.join(o.rootDir,e.subDir):o.rootDir,project:o}),h=KM({project:o,name:e.name,moduleId:m.moduleId,subDir:e.subDir,description:m.description??void 0});if(u.modules[m.moduleId]=h,e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let g={moduleId:m.moduleId,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums};await XM({moduleMetadata:g,steps:p,momenticFiles:u,project:o}),m={...m,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums}}if(e.startIndex!==void 0){let g=await lt(Dp.join(o.rootDir,a),i,u),f={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},y=await ds(f,o,i);g.steps.splice(c,l-c,y);let{stepsToSave:S,moduleUpdates:T}=await tt({stepLists:{steps:g.steps,beforeSteps:g.beforeSteps,afterSteps:g.afterSteps}});T.forEach(b=>{br({content:b,schemaVersion:Re,momenticFiles:u,project:o})}),pr({relativeTestPath:a,steps:S,schemaVersion:Re,project:o}),cs("copilotStepsUpdated",i,s,{steps:g.steps??[],beforeSteps:g.beforeSteps??[],afterSteps:g.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function IW(r,e,t,n){if(r===void 0&&e!==void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Ue("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Ue(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Ue("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Ue(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let o=r??n;if((e??o)===o&&t===0)throw new Ue("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function MW(r){return Ot({schema:{name:"momentic_module_change",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:{selector:ho,steps:r.array(),startIndex:We.number().optional(),endIndex:We.number().optional(),description:We.string().optional().describe("New description for the module."),enabled:We.boolean().optional().describe("New enabled state for the module."),parameters:We.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:We.record(We.string(),We.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:We.record(We.string(),We.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,socket:s,testPath:c}=e,l=await Promise.all(t.steps.map(S=>ds(S,i,a))),{entity:u,momenticFiles:d}=await Ln(i,t.selector,"module"),p=await rn(u,d,a),m=l.find(S=>!Fm(S));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{IW(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(S){n.addError(String(S));return}let h=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){h=[...p.steps];let S=t.startIndex!==void 0?t.startIndex:h.length,T=t.endIndex!==void 0?t.endIndex:S;h.splice(S,T-S,...l)}let g={moduleId:p.moduleId,name:p.name,description:t.description??p.description,enabled:t.enabled??p.enabled,parameters:t.parameters??p.parameters,defaultParameters:t.defaultParameters??p.defaultParameters,parameterEnums:t.parameterEnums??p.parameterEnums};t.parameters!==void 0&&(g.defaultParameters=t.defaultParameters??{},g.parameterEnums=t.parameterEnums??{}),await XM({moduleMetadata:g,steps:h,momenticFiles:d,project:i});let f=await Z(i);if(c){let S=await lt(Dp.join(i.rootDir,c),a,f);cs("copilotStepsUpdated",a,s,{steps:S.steps??[],beforeSteps:S.beforeSteps??[],afterSteps:S.afterSteps??[]})}let y={...g,stepCount:h.length};n.addResult(JSON.stringify(y,null,2))}})}function PW(r){let e=Np(r);return[_W,MW(e)]}var JM=PW;import{randomUUID as kp}from"crypto";import{z as Up}from"zod";var QM=Ot({schema:{name:"preview_preflight",description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:{description:Up.string().describe("Description of the element to preview.")}},handle:async({controller:r,logger:e,testContext:t},n,o,i)=>{o.setIncludeSnapshot();try{let a=await r.locateElement({description:n.description,disableCache:!0,skipWait:!0,logger:e,testContext:t});a.resolution.locator&&await Promise.all([r.browser.scrollIntoViewIfNeeded(a.resolution.locator),r.browser.highlight(a.resolution.locator)]),o.addResult(`Found element matching description: ${a.target.id}`),a.target.nodeOnlySerializedHtml&&o.addResult(`HTML: ${a.target.nodeOnlySerializedHtml}`);return}catch(a){o.addError(`Failed to find any element matching description: ${a}`)}}}),ZM=Ot({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:Up.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:kp()},id:kp()},p=await xp({step:d,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!p){t.addError("Assertion executed with unknown result.");return}if(p.status==="SUCCESS"){t.addResult(`Assertion is true: ${p.message}`);return}t.addError(`Assertion is false: ${p.message}`)}}),eP=Ot({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:sa}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r;t.setIncludeSnapshot();let d=Fc(e.command),p={type:"PRESET_ACTION",command:d,id:kp()},m=await xp({step:p,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!m){t.addError("Assertion executed with unknown result.");return}if(m.status==="SUCCESS"){t.addResult(`Assertion is true: ${m.message}`);return}t.addError(`Assertion is false: ${m.message}`)}}),OW=Ot({schema:{name:"preview_ai_action",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:{text:Up.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:Up.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:s,codeEvalTools:c,socket:l,orgId:u,testContext:d}=r;if(!(o.config.ai?.aiAction??!1)){t.addError("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return}let m={type:"AI_ACTION_DYNAMIC",text:e.text,id:kp(),retries:e.retries},h=await xp({step:m,controller:s,storage:a,codeEvalTools:c,logger:i,socket:l,orgId:u,testContext:d});if(!h){t.addError("AI action executed with unknown result.");return}if(h.status==="SUCCESS"){t.addResult(`AI action completed successfully: ${h.message??"Goal achieved"}`);return}t.addError(`AI action failed: ${h.message??"Unknown error while previewing AI action"}`)}});function tP(r){return r.config.ai?.aiAction??!1?[QM,ZM,eP,OW]:[QM,ZM,eP]}import aP from"path";import{z as iP}from"zod";import rP from"path";import{z as nc}from"zod";var nP=r=>{throw new Error(`Unknown test section: ${r}`)},Fp=nc.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)"),LW=Ot({schema:{name:"test_get",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:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function NW(r){return Ot({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:nc.number(),step:r,targetSection:Fp.default("main")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,testPath:s,socket:c}=e,l=await Z(i),u=await lt(rP.join(i.rootDir,s),a,l),d=await ds(t.step,i,a);switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.index<0||t.index>u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.index,0,d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.index<0||t.index>u.afterSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.index,0,d);break;case"main":if(t.index<0||t.index>u.steps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.index,0,d);break;default:return nP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await tt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{br({content:h,schemaVersion:Re,momenticFiles:l,project:i})}),pr({relativeTestPath:s,steps:p,schemaVersion:Re,project:i}),cs("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]}),n.addResult(`Successfully inserted step at index ${t.index} in the ${t.targetSection} section.`)}})}function DW(r){return Ot({schema:{name:"test_splice_steps",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:{startIndex:nc.number(),deleteCount:nc.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:r.array(),targetSection:Fp.default("main"),returnTest:nc.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(e,t,n,o)=>{t.returnTest&&n.setIncludeTest();let{project:i,logger:a,testPath:s,socket:c}=e,l=await Z(i),u=await lt(rP.join(i.rootDir,s),a,l),d=await Promise.all(t.steps.map(f=>ds(f,i,a)));switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.startIndex<0||t.startIndex>u.beforeSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.startIndex,t.deleteCount,...d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.startIndex<0||t.startIndex>u.afterSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.startIndex,t.deleteCount,...d);break;case"main":if(t.startIndex<0||t.startIndex>u.steps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.startIndex,t.deleteCount,...d);break;default:return nP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await tt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(f=>{br({content:f,schemaVersion:Re,momenticFiles:l,project:i})}),pr({relativeTestPath:s,steps:p,schemaVersion:Re,project:i}),cs("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]});let h=t.steps.length,g=t.deleteCount;n.addResult(`Successfully spliced ${h} step(s) at index ${t.startIndex} in the ${t.targetSection} section, removing ${g} step(s).`)}})}function oP(r){let e=Np(r);return[LW,NW(e),DW(e)]}var kW=Ot({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),UW=Ot({schema:{name:"reset_session",description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,orgId:s,codeEvalTools:c}=r,l=await Z(o),u=await lt(aP.join(o.rootDir,a),i,l),d=u.baseUrl,p,m={};if(!d&&u.envs){let h=u.envs.find(g=>g.default);if(h)try{let g=xi(h.name,o,i);p=g.name,m=g.variables;let f=g.variables[yt];typeof f=="string"&&(d=f)}catch(g){i.warn({err:g,envName:h.name},"Failed to resolve environment for reset")}}d||(d="about:blank"),m=await ip({orgId:s,testName:u.name,envName:p,baseEnvVariables:m,parameters:u.parameters,logger:i,localTools:c}),await r.controller.browser.reset({newUrl:d}),r.testContext.reset({baseUrl:d,testName:u.name,currentUrl:r.controller.browser.url(),variablesFromEnvironment:m,envName:p})}}),FW=Ot({schema:{name:"run_step",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:{fromIndex:iP.number(),toIndex:iP.number().optional(),targetSection:Fp.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,h=e.toIndex??m,g=await Z(o),f=await lt(aP.join(o.rootDir,a),i,g),y;switch(e.targetSection){case"setup":y=f.beforeSteps??[];break;case"teardown":y=f.afterSteps??[];break;case"main":y=f.steps;break;default:return(_=>{throw new Error(`Unknown test section: ${_}`)})(e.targetSection)}if(m<0||m>=y.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}if(h<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(h>=y.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}let S=y.slice(m,h+1);if(S.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:T}=await DS({steps:S,controller:c,storage:s,codeEvalTools:l,logger:i,socket:u,orgId:d,testContext:p});if(!T||T.length===0){t.addError("No steps were executed.");return}let b=T.at(-1);if(!b){t.addError("No steps were executed.");return}if(b.status!=="SUCCESS"){let x=m+T.length-1;t.addError(`Step at index ${x} failed: ${b.message}`);return}let v=e.targetSection==="main"?"":` in ${e.targetSection}`,C=m===h?`Step at index ${h}${v}`:`Steps ${m}-${h}${v}`;if(b.status==="SUCCESS"){t.addResult(`${C} executed successfully. Last step result: ${b.message}`),b.data&&t.addResult(`Data: ${JSON.stringify(b.data,null,2)}`);return}t.addError(`${C} failed: ${b.message}`)}}),sP=[kW,UW,FW];function lP(r){return[...JM(r),...qM,...sP,...tP(r),...oP(r),...Ip]}var zW=1e5,GW=8e4,BS=2,cP="[trimmed: omitted due to context budget]",HS=50,jW=1600;function VW(r,e){return typeof r=="object"&&r!==null&&r.type===e}function $W(r,e,t){let n=0,o=[];for(let i of r){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(!VW(c,t)){s.push(c);continue}if(t==="image"){n>=e?s.push(c):n+=jW;continue}let l=t==="tool-result"?"output":"input",u=t==="tool-result"?c.output:c.input;if(u===void 0||u===cP){s.push(c);continue}let d=Ge(u);n+=d,s.push({...c,[l]:cP})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function WW(r){return BW({messages:r,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 qW=["tool-result","image","tool-call"],KW=.3;function oc(r,e,t){let n=[...r];for(let o of qW){let i=Ge(n);if(i<=e)break;let a=i-e,s=$W(n,a,o);n=s.messages,s.trimmedTokens>0&&t.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:Ge(n)},"Trimmed content")}return n}function YW(r,e,t){let n=Ge(r);if(n<=e||r.length<=1)return r;let o=r[0],i=[],a=[];if(r.length>BS+1?(i=r.slice(1,r.length-BS),a=r.slice(r.length-BS)):a=r.slice(1),i.length>0){i=oc(i,e,t);let u=[o,...i,...a];if(n=Ge(u),n<=e)return u}let s=Ge(i),c=s/e;if(c<KW){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=oc(d,e,t),m=[o,...p,u];if(n=Ge(m),n<=e)return m;let h=oc([...p,u],e,t),g=[o,...h];if(n=Ge(g),n<=e)return g}else if(a.length===1){let u=[...i,...a],d=oc(u,e,t),p=[o,...d];if(n=Ge(p),n<=e)return p}}else for(t.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=Ge(u),n<=e)return u}a=oc(a,e,t);let l=[o,...i,...a];if(n=Ge(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=Ge(l),n<=e)return l;return n>e&&t.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function XW(r,e,t,n){let o=WW(r),i=Ge(o);return i>e&&(n.debug({projected:i,threshold:e,target:t},"Context exceeds threshold, pruning messages"),o=YW(o,t,n)),o}function Bp(r,e,t,n,o,i={}){let{onStepFinish:a,onPrepareStep:s,onChunk:c,onError:l,onFinish:u}=i,d=Er(),p=At(),m=yr(),h=ae(),g=new Je({apiKey:d,baseUrl:m,logger:t}),f=new $o(g,p),y=new Tn({httpClient:new Ft({baseUrl:g.baseUrl,apiKey:g.apiKey,logger:t,mode:"interactive"}),fakerSeed:h.config.advanced?.fakerConstantSeed?Ea:void 0}),S={project:h,apiKey:d,orgId:p,baseUrl:m,sessionId:o,logger:t,storage:f,codeEvalTools:y,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},b=lP(h).reduce((_,{name:P,builder:G})=>(_[P]=G(S),_),{}),v=Cp(o),C=async _=>{let{messages:P}=_;s&&await s(P);let G=XW(P,zW,GW,t),W=Ge(P);return W>FT&&t.debug({originalCount:P.length,prunedCount:G.length,originalTokens:W,prunedTokens:Ge(G)},"Prepared messages for copilot step"),{..._,messages:G}};return{model:v("claude-sonnet-4-5-20250929"),stopWhen:HW(HS),maxRetries:4,system:WM(h),messages:e,tools:b,prepareStep:C,onStepFinish:a,onChunk:c,onError:l,onFinish:async({finishReason:_,usage:P,text:G,response:W})=>{t.info({finishReason:_,usage:P,sessionId:o},"Full copilot turn finished"),u&&await u({finishReason:_,usage:P,text:G,response:W})}}}var yWe=new Error("timeout while waiting for mutex to become available"),EWe=new Error("mutex already locked"),JW=new Error("request for lock canceled"),QW=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},zS=class{constructor(e,t=JW){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=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:t},a=uP(this._queue,s=>t<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return QW(this,arguments,void 0,function*(t,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield t(i)}finally{a()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),ZW(this._weightedWaiters[e-1],{resolve:n,priority:t})})}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 t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let t=this._weightedWaiters[e-1];t&&(t.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let t=this._value;t>0;t--){let n=this._weightedWaiters[t-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,t){return(this._queue.length===0||this._queue[0].priority<t)&&e<=this._value}};function ZW(r,e){let t=uP(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function uP(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var eq=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},Hp=class{constructor(e){this._semaphore=new zS(1,e)}acquire(){return eq(this,arguments,void 0,function*(e=0){let[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}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 GS=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new Hp);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([t,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},dP=new GS;import ps from"dedent";function tq(){let r=Object.entries(Pm).map(([e,t])=>`- **${e}**: ${t}`).join(`
4616
+ `)}],isError:this._isError}}};var Ot=r=>({builder:wp(r,t=>new Lp(t.controller.browser,t.testContext,t.project,t.logger,t.testPath)).builder,name:r.schema.name});var CW=Ot({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),qM=[CW];import Dp from"path";import{z as We}from"zod";function cs(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import xW from"fs";import us from"path";function KM(r){let e=r.subDir?us.join(r.project.rootDir,r.subDir):r.project.rootDir,t=`${De(r.name)}.module.yaml`,n=us.join(e,t),o=us.relative(r.project.rootDir,n),i=xW.statSync(n);return{type:me.MODULE,name:r.name,id:r.moduleId,description:r.description??void 0,relativePath:o,fullFilePath:n,platformSep:us.sep,fullPathSegments:n.split(us.sep),relativePathSegments:o.split(us.sep),fileName:t,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as FS}from"crypto";import{z as YM}from"zod";function Np(r){let e=r.config.ai?.aiAction??!1,t=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?YM.discriminatedUnion("type",[Vm,$m,YE]).describe(t):YM.discriminatedUnion("type",[Vm,$m]).describe(t)}async function ds(r,e,t){switch(r.type){case"PRESET_ACTION":{let n=Fc(r.action),o=r.envKey&&jm.includes(n.type)?r.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:FS(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await Ln(e,n,"module"),s=await rn(i,a,t);XE(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:FS(),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:r.text,id:FS()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function XM({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await tt({stepLists:{steps:e}});br({content:{...r,steps:o.steps},schemaVersion:Re,momenticFiles:t,project:n})}var _W=Ot({schema:{name:"momentic_module_create",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:{name:We.string(),description:We.string(),enabled:We.boolean().default(!0),parameters:We.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:We.record(We.string(),We.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:We.record(We.string(),We.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:We.record(We.string(),We.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:We.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:We.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:We.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}},handle:async(r,e,t,n)=>{let{project:o,logger:i,testPath:a,socket:s}=r,c=e.startIndex??0,l=e.endIndex??c+1,u=await Z(o);if(Object.values(u.modules).find(g=>g.name===e.name))throw new Ue(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let g=e.defaultParameters?Object.keys(e.defaultParameters):[],f=e.parameterEnums?Object.keys(e.parameterEnums):[],y=new Set([...g,...f]);for(let S of y)if(!e.parameters.includes(S))throw new Ue(`Default parameter "${S}" is not defined in parameters array. Available parameters: ${e.parameters.join(", ")}`)}let p=[];if(e.startIndex!==void 0){if(!a)throw new Ue("testPath is required when extracting steps from the current test.");let g=await lt(Dp.join(o.rootDir,a),i,u);if(c<0||c>=g.steps.length)throw new Ue(`startIndex ${c} is out of bounds. Test has ${g.steps.length} steps.`);if(l<=c||l>g.steps.length)throw new Ue(`endIndex ${l} is out of bounds. Must be between ${c+1} and ${g.steps.length}.`);p=g.steps.slice(c,l);for(let f of p)if(f.type==="RESOLVED_MODULE")throw new Ue("Modules cannot be nested. Please select steps that do not include module references.")}let m=await Qu({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Dp.join(o.rootDir,e.subDir):o.rootDir,project:o}),h=KM({project:o,name:e.name,moduleId:m.moduleId,subDir:e.subDir,description:m.description??void 0});if(u.modules[m.moduleId]=h,e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let g={moduleId:m.moduleId,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums};await XM({moduleMetadata:g,steps:p,momenticFiles:u,project:o}),m={...m,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums}}if(e.startIndex!==void 0){let g=await lt(Dp.join(o.rootDir,a),i,u),f={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},y=await ds(f,o,i);g.steps.splice(c,l-c,y);let{stepsToSave:S,moduleUpdates:T}=await tt({stepLists:{steps:g.steps,beforeSteps:g.beforeSteps,afterSteps:g.afterSteps}});T.forEach(b=>{br({content:b,schemaVersion:Re,momenticFiles:u,project:o})}),pr({relativeTestPath:a,steps:S,schemaVersion:Re,project:o}),cs("copilotStepsUpdated",i,s,{steps:g.steps??[],beforeSteps:g.beforeSteps??[],afterSteps:g.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function IW(r,e,t,n){if(r===void 0&&e!==void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Ue("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Ue(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Ue("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Ue(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let o=r??n;if((e??o)===o&&t===0)throw new Ue("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function MW(r){return Ot({schema:{name:"momentic_module_change",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:{selector:ho,steps:r.array(),startIndex:We.number().optional(),endIndex:We.number().optional(),description:We.string().optional().describe("New description for the module."),enabled:We.boolean().optional().describe("New enabled state for the module."),parameters:We.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:We.record(We.string(),We.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:We.record(We.string(),We.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,socket:s,testPath:c}=e,l=await Promise.all(t.steps.map(S=>ds(S,i,a))),{entity:u,momenticFiles:d}=await Ln(i,t.selector,"module"),p=await rn(u,d,a),m=l.find(S=>!Fm(S));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{IW(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(S){n.addError(String(S));return}let h=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){h=[...p.steps];let S=t.startIndex!==void 0?t.startIndex:h.length,T=t.endIndex!==void 0?t.endIndex:S;h.splice(S,T-S,...l)}let g={moduleId:p.moduleId,name:p.name,description:t.description??p.description,enabled:t.enabled??p.enabled,parameters:t.parameters??p.parameters,defaultParameters:t.defaultParameters??p.defaultParameters,parameterEnums:t.parameterEnums??p.parameterEnums};t.parameters!==void 0&&(g.defaultParameters=t.defaultParameters??{},g.parameterEnums=t.parameterEnums??{}),await XM({moduleMetadata:g,steps:h,momenticFiles:d,project:i});let f=await Z(i);if(c){let S=await lt(Dp.join(i.rootDir,c),a,f);cs("copilotStepsUpdated",a,s,{steps:S.steps??[],beforeSteps:S.beforeSteps??[],afterSteps:S.afterSteps??[]})}let y={...g,stepCount:h.length};n.addResult(JSON.stringify(y,null,2))}})}function PW(r){let e=Np(r);return[_W,MW(e)]}var JM=PW;import{randomUUID as kp}from"crypto";import{z as Up}from"zod";var QM=Ot({schema:{name:"preview_preflight",description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:{description:Up.string().describe("Description of the element to preview.")}},handle:async({controller:r,logger:e,testContext:t},n,o,i)=>{o.setIncludeSnapshot();try{let a=await r.locateElement({description:n.description,disableCache:!0,skipWait:!0,logger:e,testContext:t});a.resolution.locator&&await Promise.all([r.browser.scrollIntoViewIfNeeded(a.resolution.locator),r.browser.highlight(a.resolution.locator)]),o.addResult(`Found element matching description: ${a.target.id}`),a.target.nodeOnlySerializedHtml&&o.addResult(`HTML: ${a.target.nodeOnlySerializedHtml}`);return}catch(a){o.addError(`Failed to find any element matching description: ${a}`)}}}),ZM=Ot({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:Up.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:kp()},id:kp()},p=await xp({step:d,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!p){t.addError("Assertion executed with unknown result.");return}if(p.status==="SUCCESS"){t.addResult(`Assertion is true: ${p.message}`);return}t.addError(`Assertion is false: ${p.message}`)}}),eP=Ot({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:sa}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r;t.setIncludeSnapshot();let d=Fc(e.command),p={type:"PRESET_ACTION",command:d,id:kp()},m=await xp({step:p,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!m){t.addError("Assertion executed with unknown result.");return}if(m.status==="SUCCESS"){t.addResult(`Assertion is true: ${m.message}`);return}t.addError(`Assertion is false: ${m.message}`)}}),OW=Ot({schema:{name:"preview_ai_action",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:{text:Up.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:Up.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:s,codeEvalTools:c,socket:l,orgId:u,testContext:d}=r;if(!(o.config.ai?.aiAction??!1)){t.addError("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return}let m={type:"AI_ACTION_DYNAMIC",text:e.text,id:kp(),retries:e.retries},h=await xp({step:m,controller:s,storage:a,codeEvalTools:c,logger:i,socket:l,orgId:u,testContext:d});if(!h){t.addError("AI action executed with unknown result.");return}if(h.status==="SUCCESS"){t.addResult(`AI action completed successfully: ${h.message??"Goal achieved"}`);return}t.addError(`AI action failed: ${h.message??"Unknown error while previewing AI action"}`)}});function tP(r){return r.config.ai?.aiAction??!1?[QM,ZM,eP,OW]:[QM,ZM,eP]}import aP from"path";import{z as iP}from"zod";import rP from"path";import{z as nc}from"zod";var nP=r=>{throw new Error(`Unknown test section: ${r}`)},Fp=nc.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)"),LW=Ot({schema:{name:"test_get",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:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function NW(r){return Ot({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:nc.number(),step:r,targetSection:Fp.default("main")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,testPath:s,socket:c}=e,l=await Z(i),u=await lt(rP.join(i.rootDir,s),a,l),d=await ds(t.step,i,a);switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.index<0||t.index>u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.index,0,d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.index<0||t.index>u.afterSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.index,0,d);break;case"main":if(t.index<0||t.index>u.steps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.index,0,d);break;default:return nP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await tt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{br({content:h,schemaVersion:Re,momenticFiles:l,project:i})}),pr({relativeTestPath:s,steps:p,schemaVersion:Re,project:i}),cs("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]}),n.addResult(`Successfully inserted step at index ${t.index} in the ${t.targetSection} section.`)}})}function DW(r){return Ot({schema:{name:"test_splice_steps",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:{startIndex:nc.number(),deleteCount:nc.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:r.array(),targetSection:Fp.default("main"),returnTest:nc.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(e,t,n,o)=>{t.returnTest&&n.setIncludeTest();let{project:i,logger:a,testPath:s,socket:c}=e,l=await Z(i),u=await lt(rP.join(i.rootDir,s),a,l),d=await Promise.all(t.steps.map(f=>ds(f,i,a)));switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.startIndex<0||t.startIndex>u.beforeSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.startIndex,t.deleteCount,...d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.startIndex<0||t.startIndex>u.afterSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.startIndex,t.deleteCount,...d);break;case"main":if(t.startIndex<0||t.startIndex>u.steps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.startIndex,t.deleteCount,...d);break;default:return nP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await tt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(f=>{br({content:f,schemaVersion:Re,momenticFiles:l,project:i})}),pr({relativeTestPath:s,steps:p,schemaVersion:Re,project:i}),cs("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]});let h=t.steps.length,g=t.deleteCount;n.addResult(`Successfully spliced ${h} step(s) at index ${t.startIndex} in the ${t.targetSection} section, removing ${g} step(s).`)}})}function oP(r){let e=Np(r);return[LW,NW(e),DW(e)]}var kW=Ot({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),UW=Ot({schema:{name:"reset_session",description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,orgId:s,codeEvalTools:c}=r,l=await Z(o),u=await lt(aP.join(o.rootDir,a),i,l),d=u.baseUrl,p,m={};if(!d&&u.envs){let h=u.envs.find(g=>g.default);if(h)try{let g=xi(h.name,o,i);p=g.name,m=g.variables;let f=g.variables[yt];typeof f=="string"&&(d=f)}catch(g){i.warn({err:g,envName:h.name},"Failed to resolve environment for reset")}}d||(d="about:blank"),m=await ip({orgId:s,testName:u.name,envName:p,baseEnvVariables:m,parameters:u.parameters,logger:i,localTools:c}),await r.controller.browser.reset({newUrl:d}),r.testContext.reset({baseUrl:d,testName:u.name,currentUrl:r.controller.browser.url(),variablesFromEnvironment:m,envName:p})}}),FW=Ot({schema:{name:"run_step",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:{fromIndex:iP.number(),toIndex:iP.number().optional(),targetSection:Fp.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,h=e.toIndex??m,g=await Z(o),f=await lt(aP.join(o.rootDir,a),i,g),y;switch(e.targetSection){case"setup":y=f.beforeSteps??[];break;case"teardown":y=f.afterSteps??[];break;case"main":y=f.steps;break;default:return(_=>{throw new Error(`Unknown test section: ${_}`)})(e.targetSection)}if(m<0||m>=y.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}if(h<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(h>=y.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}let S=y.slice(m,h+1);if(S.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:T}=await DS({steps:S,controller:c,storage:s,codeEvalTools:l,logger:i,socket:u,orgId:d,testContext:p});if(!T||T.length===0){t.addError("No steps were executed.");return}let b=T.at(-1);if(!b){t.addError("No steps were executed.");return}if(b.status!=="SUCCESS"){let x=m+T.length-1;t.addError(`Step at index ${x} failed: ${b.message}`);return}let v=e.targetSection==="main"?"":` in ${e.targetSection}`,C=m===h?`Step at index ${h}${v}`:`Steps ${m}-${h}${v}`;if(b.status==="SUCCESS"){t.addResult(`${C} executed successfully. Last step result: ${b.message}`),b.data&&t.addResult(`Data: ${JSON.stringify(b.data,null,2)}`);return}t.addError(`${C} failed: ${b.message}`)}}),sP=[kW,UW,FW];function lP(r){return[...JM(r),...qM,...sP,...tP(r),...oP(r),...Ip]}var zW=1e5,GW=8e4,BS=2,cP="[trimmed: omitted due to context budget]",HS=50,jW=1600;function VW(r,e){return typeof r=="object"&&r!==null&&r.type===e}function $W(r,e,t){let n=0,o=[];for(let i of r){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(!VW(c,t)){s.push(c);continue}if(t==="image"){n>=e?s.push(c):n+=jW;continue}let l=t==="tool-result"?"output":"input",u=t==="tool-result"?c.output:c.input;if(u===void 0||u===cP){s.push(c);continue}let d=Ge(u);n+=d,s.push({...c,[l]:cP})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function WW(r){return BW({messages:r,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 qW=["tool-result","image","tool-call"],KW=.3;function oc(r,e,t){let n=[...r];for(let o of qW){let i=Ge(n);if(i<=e)break;let a=i-e,s=$W(n,a,o);n=s.messages,s.trimmedTokens>0&&t.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:Ge(n)},"Trimmed content")}return n}function YW(r,e,t){let n=Ge(r);if(n<=e||r.length<=1)return r;let o=r[0],i=[],a=[];if(r.length>BS+1?(i=r.slice(1,r.length-BS),a=r.slice(r.length-BS)):a=r.slice(1),i.length>0){i=oc(i,e,t);let u=[o,...i,...a];if(n=Ge(u),n<=e)return u}let s=Ge(i),c=s/e;if(c<KW){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=oc(d,e,t),m=[o,...p,u];if(n=Ge(m),n<=e)return m;let h=oc([...p,u],e,t),g=[o,...h];if(n=Ge(g),n<=e)return g}else if(a.length===1){let u=[...i,...a],d=oc(u,e,t),p=[o,...d];if(n=Ge(p),n<=e)return p}}else for(t.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=Ge(u),n<=e)return u}a=oc(a,e,t);let l=[o,...i,...a];if(n=Ge(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=Ge(l),n<=e)return l;return n>e&&t.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function XW(r,e,t,n){let o=WW(r),i=Ge(o);return i>e&&(n.debug({projected:i,threshold:e,target:t},"Context exceeds threshold, pruning messages"),o=YW(o,t,n)),o}function Bp(r,e,t,n,o,i={}){let{onStepFinish:a,onPrepareStep:s,onChunk:c,onError:l,onFinish:u}=i,d=Er(),p=At(),m=yr(),h=ae(),g=new Je({apiKey:d,baseUrl:m,logger:t}),f=new $o(g,p),y=new Tn({httpClient:new Ft({baseUrl:g.baseUrl,apiKey:g.apiKey,logger:t,mode:"interactive"}),fakerSeed:h.config.advanced?.fakerConstantSeed?Ea:void 0}),S={project:h,apiKey:d,orgId:p,baseUrl:m,sessionId:o,logger:t,storage:f,codeEvalTools:y,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},b=lP(h).reduce((_,{name:P,builder:G})=>(_[P]=G(S),_),{}),v=Cp(o),C=async _=>{let{messages:P}=_;s&&await s(P);let G=XW(P,zW,GW,t),W=Ge(P);return W>FT&&t.debug({originalCount:P.length,prunedCount:G.length,originalTokens:W,prunedTokens:Ge(G)},"Prepared messages for copilot step"),{..._,messages:G}};return{model:v("claude-sonnet-4-5-20250929"),stopWhen:HW(HS),maxRetries:4,system:WM(h),messages:e,tools:b,prepareStep:C,onStepFinish:a,onChunk:c,onError:l,onFinish:async({finishReason:_,usage:P,text:G,response:W})=>{t.info({finishReason:_,usage:P,sessionId:o},"Full copilot turn finished"),u&&await u({finishReason:_,usage:P,text:G,response:W})}}}var yWe=new Error("timeout while waiting for mutex to become available"),EWe=new Error("mutex already locked"),JW=new Error("request for lock canceled"),QW=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},zS=class{constructor(e,t=JW){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=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:t},a=uP(this._queue,s=>t<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return QW(this,arguments,void 0,function*(t,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield t(i)}finally{a()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),ZW(this._weightedWaiters[e-1],{resolve:n,priority:t})})}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 t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let t=this._weightedWaiters[e-1];t&&(t.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let t=this._value;t>0;t--){let n=this._weightedWaiters[t-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,t){return(this._queue.length===0||this._queue[0].priority<t)&&e<=this._value}};function ZW(r,e){let t=uP(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function uP(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var eq=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=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(r,e||[])).next())})},Hp=class{constructor(e){this._semaphore=new zS(1,e)}acquire(){return eq(this,arguments,void 0,function*(e=0){let[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}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 GS=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new Hp);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([t,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},dP=new GS;import ps from"dedent";function tq(){let r=Object.entries(Pm).map(([e,t])=>`- **${e}**: ${t}`).join(`
4586
4617
  `);return ps`
4587
4618
  ### Available Step Types
4588
4619
 
@@ -4638,7 +4669,7 @@ ${o}`}async test(){if(!this._includeTest)return"";let e=await Z(this._project),t
4638
4669
  `}function cq(r){return r?._meta?.progressToken!==void 0}function uq(r,e,t,n){let o=new AbortController,i={completed:0,total:t},a=[],s=cq(r),c=s?r:void 0,l=d=>{c&&dq(c,i,d,e,o,n)};return{hooks:{onStepFinish:s?()=>{i.completed+=1,l()}:void 0,onPrepareStep:s?d=>{let p=d[d.length-1];if(p?.role==="tool"){let m=p.content.map(h=>h.toolName).join(", ");l(`Tool ${m} finished, thinking...`)}}:void 0,onChunk:({chunk:d})=>{d.type==="text-delta"?(a.push(d.text),l(a.join(""))):d.type==="tool-call"&&l(`Running tool ${d.toolName}...`)},onError:({error:d})=>{e.error({error:d},"Error during copilot stream"),n.addError(`Stream error: ${String(d)}`)}},notificationAbortController:o,getAccumulatedText:()=>a.join("")}}async function dq(r,e,t,n,o,i){try{await r.sendNotification({method:"notifications/progress",params:{progressToken:r._meta.progressToken,progress:e.completed,total:e.total,...t?{message:t}:{}}})}catch(a){n.error({err:a},"Failed to send progress notification"),o.abort(a),i.addError(`Failed to send progress notification: ${String(a)}`)}}var pq=un({schema:{name:"momentic_test_create",description:"Create a test. You must provide a name and either a baseUrl or environment or the tool will fail.",inputSchema:Ih},handle:async(r,e,t,n)=>{let{project:o}=r;try{let i=await Pp({project:o,input:e});t.addResult(JSON.stringify(i,null,2))}catch(i){t.addError(String(i));return}}}),mq=un({schema:{name:"momentic_test_list",description:"List tests.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o}=r,i=await Z(o),s=Object.values(i.tests).map(c=>({id:c.id,name:c.name,description:c.description,relativePath:c.relativePath,fullFilePath:c.fullFilePath,platformSep:c.platformSep,fullPathSegments:c.fullPathSegments,relativePathSegments:c.relativePathSegments,fileName:c.fileName,lastModified:c.lastModified,createdAt:c.createdAt,type:c.type,labels:c.labels||[]}));t.addResult(JSON.stringify({tests:s},null,2))}}),hq=un({schema:{name:"momentic_test_get",description:"Get a single fully loaded test by id, exact name, or file path. Exactly one selector must be provided.",inputSchema:{selector:ho}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r;try{let a=await Ln(o,e.selector,"test"),s=await lt(a.entity.fullFilePath,i,a.momenticFiles);t.addResult(JSON.stringify({test:s},null,2))}catch(a){t.addError(String(a));return}}});async function gq(r,e,t){let n=Er(),o=At(),i=yr(),a=new Vi,s=new Je({apiKey:n,baseUrl:i,logger:r}),c=new $o(s,o),l=(await lt(t.fullFilePath,r,await Z(e))).advanced?.viewport??qt,u=new $n(e.config.ai?.agentConfig,{baseUrl:i,apiKey:n,logger:r,mode:"interactive"}),d=new wo({baseUrl:i,apiKey:n,logger:r,mode:"interactive"},u),p=await Vr.init({baseUrl:"about:blank",userBrowserSettings:{},enricher:d,storage:c,logger:r,contextArgs:{viewport:l,locale:go,timezoneId:fo,geolocation:So},iconKnowledgeBase:null,callbacks:{}}),m=new jo({browser:p,generator:u,logger:r,orgId:o,options:{scratchPadId:void 0,slowMoMs:void 0,autoFollowNewTabs:!0,useMemory:e.config.ai?.useMemory,aiPageFiltering:!0},storage:c,localCodeEvalTools:new Tn({httpClient:new Ft({baseUrl:i,apiKey:n,logger:r,mode:"interactive"}),fakerSeed:e.config.advanced?.fakerConstantSeed?Ea:void 0}),visualDiffScreenshotStorage:a}),h=new nr({baseUrl:"about:blank",testName:sq.basename(t.relativePath),currentUrl:p.url(),variablesFromEnvironment:{},envName:void 0});return{controller:m,context:h,socket:void 0}}var fq=un({schema:{name:"momentic_test_edit",description:pP(),inputSchema:{selector:ho,message:lq.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(r,e,t,n)=>{let{project:o,logger:i}=r,a=n?.signal;if(!a){t.addError("No response handler available: client abort signal is required for momentic_test_edit");return}let s=Er(),c=yr(),u=await new $n(o.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:"interactive"}).getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(u.category!=="NONE"){t.addError(`${u.thoughts}
4639
4670
 
4640
4671
  Category: ${u.category}`);return}let d,p;try{({entity:d,momenticFiles:p}=await Ln(o,e.selector,"test"))}catch(P){t.addError(String(P));return}let m=await lt(d.fullFilePath,i,p),h=i.child({applicationName:"momentic-mcp-copilot",testId:d.id}),{hooks:g,notificationAbortController:f,getAccumulatedText:y}=uq(n,i,HS,t),S=Bp(d.relativePath,[{role:"user",content:e.message}],h,await gq(h,o,d),n?.sessionId,g),{signal:T,release:b}=await dP.startOrReplace(d.id,a),v=aq(S);try{await v.text}catch(P){if(T.aborted)i.debug("AI stream was cancelled, returning partial output"),t.addResult(JSON.stringify({aborted:String(P),partialOutput:y()},null,2));else throw P}finally{b()}let C=await lt(d.fullFilePath,i,p),x=await oR(m,C),_=y().split(`
4641
- `).map(P=>P.trim()).filter(P=>P.length>0);t.addResult(JSON.stringify({additions:x.additions,deletions:x.deletions,messages:_},null,2))}}),mP=[mq,pq,hq,fq];var hP=[...jM,...mP,...Ip];function jS(r,e){let t=new Sq({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of hP)n.addToolToMcpServer(r,t);return t}async function gP(r,e,t,n){let o=new yq(t,e,n);return await r.connect(o),{close:async()=>{try{await r.close()}catch{}},transport:o}}var VS="mcp-session-id",Aq="sessionId",ms=vq(),ic=new Map;function fP(){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Zl??"0.0.0"},e=ae(),t=Ze.child({orgId:At(),userId:Io(),...r});return{context:{project:e,logger:t},info:r}}ms.get("/sse",async(r,e)=>{let{context:t,info:n}=fP(),o=jS(t,n),{transport:i}=await gP(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{ic.delete(a);try{await o.close()}catch(c){t.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};ic.set(a,s),i.onclose=()=>{let c=ic.get(a);c&&c.close()}});ms.post("/sse",async(r,e)=>{let t=String(r.query[Aq]??"");if(!t||!ic.has(t)){e.status(400).send("Invalid or missing sessionId");return}await ic.get(t).transport.handlePostMessage(r,e,r.body)});var SP=ms,to={};ms.post("/",async(r,e)=>{let t=String(r.headers[VS]??"");try{if(t&&to[t]){await to[t].handleRequest(r,e,r.body);return}if(!t&&bq(r.body)){let{context:n,info:o}=fP(),i=jS(n,o),a=new Eq({sessionIdGenerator:()=>Tq(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{to[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&to[s]&&delete to[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(r,e,r.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})}});ms.get("/",async(r,e)=>{let t=String(r.headers[VS]??"");if(!t||!to[t]){e.status(400).send("Invalid or missing session ID");return}await to[t].handleRequest(r,e)});ms.delete("/",async(r,e)=>{let t=String(r.headers[VS]??"");if(!t||!to[t]){e.status(400).send("Invalid or missing session ID");return}let n=to[t];try{await n.handleRequest(r,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as Rq}from"express";var zp=Rq();zp.get("/",xe(async(r,e)=>{let t=(await Pg()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(t)}));zp.get("/current",xe((r,e)=>{let t=ae();if(!t){e.status(404).json({error:"No project found."});return}let n={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(n)}));zp.post("/set",xe(async(r,e)=>{let t;try{t=OT.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}Ze.info("Setting local project");try{let n=await Rt({configFilePath:t.configFilePath});Ju(n,o=>Rt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var yP=zp;import{Router as wq}from"express";var EP=wq();EP.get("/",xe((r,e)=>{let n={ai:ae().config.ai};e.status(200).json(n)}));var bP=EP;import{convertToModelMessages as Cq,streamText as xq}from"ai";import{Router as _q}from"express";import Gp from"fs";import hs from"path";import{v4 as Iq}from"uuid";import Mq from"yaml";var ac=new cd({platform:"local_app"},{flushAt:1,flushInterval:0});var ro=_q();ro.post("/",xe(async(r,e)=>{let t;try{t=CT.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=ae(),o=await Pp({project:n,input:t});ac.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof Ue){e.status(400).json({error:n.message});return}throw n}}));ro.get("/:testPath",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=ae(),o=await Z(n),i;try{i=await lt(hs.join(n.rootDir,t),Ze,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await tt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{br({content:c,schemaVersion:Re,momenticFiles:o,project:n})}),pr({relativeTestPath:t,steps:a,schemaVersion:Re,project:n})}catch(a){Ze.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));ro.get("/:testPath/metadata",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=ae(),o=hs.join(n.rootDir,t);if(!Gp.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=Gp.statSync(o),a=await Xn(Ze),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));ro.patch("/:testPath/metadata",xe(async(r,e)=>{if(!r.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=wT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:Ag(r.params.testPath,t,ae()).newRelativeTestPath};e.status(200).json(o)}));ro.patch("/:testPath",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=RT.parse(r.body)}catch(m){Ze.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}Ze.info({testPath:t},"Save received");let o=ae(),i=await Z(o),a;try{a=Tl(t,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 tt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:At()}}),u=new Je({apiKey:Er(),baseUrl:yr(),logger:Ze}),d=await kr(Ze,u,o);await _o({orgId:At(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:Ze,testId:a.id,entries:l}),c.forEach(m=>{br({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),pr({relativeTestPath:t,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));ro.patch("/:testPath/environments",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=PT.parse(r.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}Ag(t,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},ae()),e.status(201).json({message:"ok"})}));ro.post("/:testPath/duplicate",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=xT.parse(r.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{mo(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=ae(),i=hs.join(o.rootDir,t);if(!Gp.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await Z(o),s;try{s=await lt(i,Ze,a)}catch(f){e.status(400).send({error:f.message});return}let c=Iq(),l=Nr.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await tt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:At()}}),d=vn({fileType:he.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=hs.dirname(i),m=hs.join(p,`${n.name}.test.yaml`),h=Mq.stringify(d);Gp.writeFileSync(m,h,"utf-8");let g={relativeFilePath:hs.relative(o.rootDir,m)};ac.track({type:"test_editor:test_create"}),e.status(201).json(g)}));ro.post("/:testPath/chat",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=r.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=r.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Cq(n),a=Mp.getSession(o);if(!a){e.status(400).json({error:"No active browser session. Start a session first."});return}let s=ae(),c=Tl(t,s),l=Ze.child({orgId:At(),userId:Io(),applicationName:"momentic-desktop-server-copilot",testId:c.id,sessionId:o});l.debug({sessionId:o},"Initializing copilot with sessionId");let u=Bp(t,i,l,a,o);xq(u).pipeUIMessageStreamToResponse(e,{onError:p=>{let m=p instanceof Error?p.message:String(p);return l.error({err:p,sessionId:o},"streamText session failed"),m}})}));var TP=ro;async function wP(r){let{momenticServerUrl:e,apiKey:t,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=r;e&&fR(e),await yR(t);let u=At(),d=Io();ac.identify({user_id:d,org_id:u});let p=r.logger??Ze;p=p.child({orgId:u,userId:d}),p.debug({params:r},"Desktop server init and api key check done");let m=Uq(o,n,p),h=`http://localhost:${n}`;E.info(`Desktop server is running at ${h}`),Ju(l,v=>Rt({configFilePath:v})),await new Promise(v=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${h}`),v()})}catch(C){C.message.includes("EADDRINUSE")?CP(n):E.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let f={type:"API_KEY",baseUrl:yr(),apiKey:t,logger:p,mode:"interactive"},y=async()=>{let v=ae();return new $n(v.config.ai?.agentConfig,f)},S=async()=>new wo(f,await y()),T=new Je(f),b=new Vi;kM({baseServer:m,getOrgId:async()=>At(),generatorFactory:y,enricherFactory:S,cacheStorageFactory:async v=>{let C=ae(),x=await kr(p,T,C);return _o({orgId:v,client:T,gitMetadata:x,regenerateCache:a??!1,alwaysSaveCache:s??!1,noCache:c??!1,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await Xn(p))?.gitBranchName}catch(v){p.error({err:v},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let v=ae();return{ai:{},browser:{},...v.config}},storageFactory:async v=>new $o(T,v),logger:p,devicePixelRatio:i,authorization:f,visualDiffScreenshotStorage:b,globalE2eStateManager:Mp})}var RP="25mb";function Uq(r,e,t){let n=AP();n.use(Pq()),n.use(vP.json({limit:RP})),n.use(vP.urlencoded({extended:!1,limit:RP}));let o=Nq();if(o.use("/tests",TP),o.use("/modules",UM),o.use("/environments",HM),o.use("/projects",yP),o.use("/folders",vg),o.use("/settings",bP),o.use("/identify",GM),o.use("/entities",BM),o.use("/mcp",SP),o.use("/git",Ug),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&t.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}t.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),E.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
4672
+ `).map(P=>P.trim()).filter(P=>P.length>0);t.addResult(JSON.stringify({additions:x.additions,deletions:x.deletions,messages:_},null,2))}}),mP=[mq,pq,hq,fq];var hP=[...jM,...mP,...Ip];function jS(r,e){let t=new Sq({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of hP)n.addToolToMcpServer(r,t);return t}async function gP(r,e,t,n){let o=new yq(t,e,n);return await r.connect(o),{close:async()=>{try{await r.close()}catch{}},transport:o}}var VS="mcp-session-id",Aq="sessionId",ms=vq(),ic=new Map;function fP(){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Zl??"0.0.0"},e=ae(),t=Ze.child({orgId:At(),userId:Io(),...r});return{context:{project:e,logger:t},info:r}}ms.get("/sse",async(r,e)=>{let{context:t,info:n}=fP(),o=jS(t,n),{transport:i}=await gP(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{ic.delete(a);try{await o.close()}catch(c){t.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};ic.set(a,s),i.onclose=()=>{let c=ic.get(a);c&&c.close()}});ms.post("/sse",async(r,e)=>{let t=String(r.query[Aq]??"");if(!t||!ic.has(t)){e.status(400).send("Invalid or missing sessionId");return}await ic.get(t).transport.handlePostMessage(r,e,r.body)});var SP=ms,to={};ms.post("/",async(r,e)=>{let t=String(r.headers[VS]??"");try{if(t&&to[t]){await to[t].handleRequest(r,e,r.body);return}if(!t&&bq(r.body)){let{context:n,info:o}=fP(),i=jS(n,o),a=new Eq({sessionIdGenerator:()=>Tq(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{to[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&to[s]&&delete to[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(r,e,r.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})}});ms.get("/",async(r,e)=>{let t=String(r.headers[VS]??"");if(!t||!to[t]){e.status(400).send("Invalid or missing session ID");return}await to[t].handleRequest(r,e)});ms.delete("/",async(r,e)=>{let t=String(r.headers[VS]??"");if(!t||!to[t]){e.status(400).send("Invalid or missing session ID");return}let n=to[t];try{await n.handleRequest(r,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as Rq}from"express";var zp=Rq();zp.get("/",xe(async(r,e)=>{let t=(await Pg()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(t)}));zp.get("/current",xe((r,e)=>{let t=ae();if(!t){e.status(404).json({error:"No project found."});return}let n={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(n)}));zp.post("/set",xe(async(r,e)=>{let t;try{t=OT.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}Ze.info("Setting local project");try{let n=await Rt({configFilePath:t.configFilePath});Ju(n,o=>Rt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var yP=zp;import{Router as wq}from"express";var EP=wq();EP.get("/",xe((r,e)=>{let n={ai:ae().config.ai};e.status(200).json(n)}));var bP=EP;import{convertToModelMessages as Cq,streamText as xq}from"ai";import{Router as _q}from"express";import Gp from"fs";import hs from"path";import{v4 as Iq}from"uuid";import Mq from"yaml";var ac=new cd({platform:"local_app"},{flushAt:1,flushInterval:0});var ro=_q();ro.post("/",xe(async(r,e)=>{let t;try{t=CT.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=ae(),o=await Pp({project:n,input:t});ac.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof Ue){e.status(400).json({error:n.message});return}throw n}}));ro.get("/:testPath",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=ae(),o=await Z(n),i;try{i=await lt(hs.join(n.rootDir,t),Ze,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await tt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{br({content:c,schemaVersion:Re,momenticFiles:o,project:n})}),pr({relativeTestPath:t,steps:a,schemaVersion:Re,project:n})}catch(a){Ze.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));ro.get("/:testPath/metadata",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=ae(),o=hs.join(n.rootDir,t);if(!Gp.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=Gp.statSync(o),a=await Xn(Ze),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));ro.patch("/:testPath/metadata",xe(async(r,e)=>{if(!r.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=wT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:Ag(r.params.testPath,t,ae()).newRelativeTestPath};e.status(200).json(o)}));ro.patch("/:testPath",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=RT.parse(r.body)}catch(m){Ze.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}Ze.info({testPath:t},"Save received");let o=ae(),i=await Z(o),a;try{a=Tl(t,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 tt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:At()}}),u=new Je({apiKey:Er(),baseUrl:yr(),logger:Ze}),d=await kr(Ze,u,o);await _o({orgId:At(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:Ze,testId:a.id,entries:l}),c.forEach(m=>{br({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),pr({relativeTestPath:t,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));ro.patch("/:testPath/environments",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=PT.parse(r.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}Ag(t,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},ae()),e.status(201).json({message:"ok"})}));ro.post("/:testPath/duplicate",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=xT.parse(r.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{mo(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=ae(),i=hs.join(o.rootDir,t);if(!Gp.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await Z(o),s;try{s=await lt(i,Ze,a)}catch(f){e.status(400).send({error:f.message});return}let c=Iq(),l=Nr.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await tt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:At()}}),d=vn({fileType:me.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=hs.dirname(i),m=hs.join(p,`${n.name}.test.yaml`),h=Mq.stringify(d);Gp.writeFileSync(m,h,"utf-8");let g={relativeFilePath:hs.relative(o.rootDir,m)};ac.track({type:"test_editor:test_create"}),e.status(201).json(g)}));ro.post("/:testPath/chat",xe(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=r.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=r.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Cq(n),a=Mp.getSession(o);if(!a){e.status(400).json({error:"No active browser session. Start a session first."});return}let s=ae(),c=Tl(t,s),l=Ze.child({orgId:At(),userId:Io(),applicationName:"momentic-desktop-server-copilot",testId:c.id,sessionId:o});l.debug({sessionId:o},"Initializing copilot with sessionId");let u=Bp(t,i,l,a,o);xq(u).pipeUIMessageStreamToResponse(e,{onError:p=>{let m=p instanceof Error?p.message:String(p);return l.error({err:p,sessionId:o},"streamText session failed"),m}})}));var TP=ro;async function wP(r){let{momenticServerUrl:e,apiKey:t,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=r;e&&fR(e),await yR(t);let u=At(),d=Io();ac.identify({user_id:d,org_id:u});let p=r.logger??Ze;p=p.child({orgId:u,userId:d}),p.debug({params:r},"Desktop server init and api key check done");let m=Uq(o,n,p),h=`http://localhost:${n}`;E.info(`Desktop server is running at ${h}`),Ju(l,v=>Rt({configFilePath:v})),await new Promise(v=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${h}`),v()})}catch(C){C.message.includes("EADDRINUSE")?CP(n):E.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let f={type:"API_KEY",baseUrl:yr(),apiKey:t,logger:p,mode:"interactive"},y=async()=>{let v=ae();return new $n(v.config.ai?.agentConfig,f)},S=async()=>new wo(f,await y()),T=new Je(f),b=new Vi;kM({baseServer:m,getOrgId:async()=>At(),generatorFactory:y,enricherFactory:S,cacheStorageFactory:async v=>{let C=ae(),x=await kr(p,T,C);return _o({orgId:v,client:T,gitMetadata:x,regenerateCache:a??!1,alwaysSaveCache:s??!1,noCache:c??!1,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await Xn(p))?.gitBranchName}catch(v){p.error({err:v},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let v=ae();return{ai:{},browser:{},...v.config}},storageFactory:async v=>new $o(T,v),logger:p,devicePixelRatio:i,authorization:f,visualDiffScreenshotStorage:b,globalE2eStateManager:Mp})}var RP="25mb";function Uq(r,e,t){let n=AP();n.use(Pq()),n.use(vP.json({limit:RP})),n.use(vP.urlencoded({extended:!1,limit:RP}));let o=Nq();if(o.use("/tests",TP),o.use("/modules",UM),o.use("/environments",HM),o.use("/projects",yP),o.use("/folders",vg),o.use("/settings",bP),o.use("/identify",GM),o.use("/entities",BM),o.use("/mcp",SP),o.use("/git",Ug),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&t.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}t.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),E.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
4642
4673
  ${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),r){let a=AP.static(r,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,c)=>{c.sendFile(kq.join(r,"index.html"))})}let i=Dq.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(CP(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}Lq.setMaxListeners(25);process.on("warning",r=>{Ze.warn({err:r},`Node warning received on desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{Ze.error({err:r},"Uncaught exception on desktop-server"),E.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",(r,e)=>{Ze.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on desktop-server (promise rejection)"),E.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function CP(r){E.error(Oq`Port ${r} is already in use by another process. Please close the other process and try again.
4643
4674
  Using Bash on MacOS or Linux:
4644
4675
  lsof -t -i :58888 | xargs kill -9
@@ -4649,7 +4680,7 @@ ${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),r){let
4649
4680
  ${[...n].map(i=>`${St}- ${i}`).join(`
4650
4681
  `)}`),o.size>0&&E.warn(`Modified the following module files:
4651
4682
  ${[...o].map(i=>`${St}- ${i}`).join(`
4652
- `)}`)):E.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(E.success("No duplicates detected. All test, module, step and command IDs are unique."),process.exit(0))}async function MP({project:r}){let e=await Z(r),t=Object.values(e.tests),n=await Zu(e,X),o={},i={},a=new Set,s=new Set;for(let l of t)o[l.name]?i[l.name]?i[l.name].push(l.fullFilePath):i[l.name]=[o[l.name],l.fullFilePath]:o[l.name]=l.fullFilePath;for(let l of n)s.has(l.name)&&a.add(l.name),s.add(l.name);if(Object.entries(i).length>0||a.size>0){for(let[l,u]of Object.entries(i))for(let d of u)E.error(`Test Name ${l} is duplicated in ${d}`);for(let l of a)E.error(`Module name ${l} is duplicated in your project`);process.exit(1)}E.success("No duplicates detected. All test and module names are unique."),process.exit(0)}import{cloneDeep as Hq}from"lodash-es";async function PP({client:r,skipPrompts:e,project:t}){let n=await r.getAllEnvironments(),o=Hq(t.config);o.environments||(o.environments=[]);for(let i of n){let a=o.environments?.find(s=>s.name===i.name);if(a)!e&&!await Ut(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),a.baseUrl=i.variables[yt],delete i.variables[yt],a.envVariables=i.variables;else{let s=i.variables[yt];delete i.variables[yt],o.environments.push({name:i.name,baseUrl:s,envVariables:i.variables})}}Mo(o,t.configFilePath),E.success(`Pulled ${n.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as OP}from"crypto";import LP from"fs";async function $S({testsToFetch:r,client:e,all:t,yes:n}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:r,all:t}),a=0;for(let[c,l]of Object.entries(o)){let u=NP(c,he.TEST);!n&&!await qh(u)||(a+=1,LP.writeFileSync(u,l,"utf-8"),X.info({checksum:OP("md5").update(l).digest("hex")},`Wrote '${u}'`))}let s=0;for(let[c,l]of Object.entries(i)){let u=NP(c,he.MODULE);!n&&!await qh(u)||(s+=1,LP.writeFileSync(u,l,"utf-8"),X.info({checksum:OP("md5").update(l).digest("hex")},`Wrote '${u}'`))}a===0?E.success("Pulled 0 tests."):E.success(`Pulled ${a} test${a>1?"s":""}${s?` and ${s} module${s>1?"s":""}`:""}!`)}function NP(r,e){switch(e){case he.TEST:return`${De(r)}.test.yaml`;case he.MODULE:return`${De(r)}.module.yaml`;default:throw new Error(`Unknown entity type ${e}`)}}async function DP(r){let{project:e,client:t,skipPrompts:n}=r;E.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),E.info("Importing environments from Momentic Cloud."),E.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await Ut("Are you sure you want to proceed?")||(E.info("Aborting..."),process.exit(1)),await PP({client:t,project:e,skipPrompts:n}),E.success(`Successfully imported environments from Momentic Cloud. We recommend pulling secrets out of ${e.configFilePath} into .env files or dynamically set environment variables for security.`),E.info("Importing tests and modules from Momentic Cloud."),await $S({testsToFetch:[],client:t,all:!0,yes:n}),E.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}async function kP(r){let{client:e,skipPrompts:t,paths:n}=r;await $S({testsToFetch:n,client:e,all:void 0,yes:t}),E.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}import{Argument as $i,InvalidArgumentError as lc,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as zq}from"http";import{z as UP}from"zod";var Vp=58888;function Nn(r){let e=parseInt(r,10);if(isNaN(e))throw new lc("Not a number.");return e}function $p(r){if(r===void 0)return;let e={};for(let t of r){let n=t.indexOf("=");if(n===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,n),i=t.slice(n+1);zq(o,i),e[o]=i}return e}var $r=new Ne("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new lc("API key is required.");return r}).makeOptionMandatory(),Wr=new Ne("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return UP.string().url().parse(r),r}catch{throw new lc("Not a valid URL.")}}),Wo=new Ne("-y, --yes","Skip all confirmation prompts.").env("CI"),WS=new Ne("-w, --wait","Wait for tests to finish running before exiting."),qS=new Ne("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Defaults to ${18e5/1e3} seconds.`).default(18e5/1e3).implies({wait:!0}).argParser(Nn),Wp=new Ne("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),FP=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Zc)),BP=new Ne("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports"),KS=new Ne("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),HP=new Ne("--upload-results","Upload test results to Momentic Cloud.").default(!1),YS=new Ne("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),XS=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),JS=new Ne("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio.").argParser(Nn),QS=new Ne("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),qp=new Ne("--env <env>","Name of the environment to use when running tests."),Kp=new Ne("--url-override <urlOverride>","Fully qualified URL (e.g. https://www.google.com) to start all tests from. Overrides any default starting URL set from the test or environment.").argParser(r=>{try{return UP.string().url().parse(r),r}catch{throw new lc("Not a valid URL.")}}),zP=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=Nn(r);if(e<1)throw new lc("Shard index must be greater than 0.");return e}),GP=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Nn),sr=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),qo=new Ne("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),jP=new Ne("--fix","Attempt to fix any issues found."),ZS=new Ne("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.").implies({disableCache:!1,saveCache:!0}),ey=new Ne("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI").implies({disableCache:!1}),ty=new Ne("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1,regenerateCache:!1}),VP=new Ne("--bust-oldest-cache-percentage <n>","Bust the oldest n% of step caches when running tests. This option can be used to incrementally regenerate caches after a config change. When enabled, there will always be at least one cache busted, even if n% is less than 1. This option is only used when running on not protected branches.").implies({disableCache:!1,regenerateCache:!1}).argParser(Nn),$P=new Ne("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:!1,ignoreQuarantine:!1}),WP=new Ne("--only-quarantined","Run only tests that are currently quarantined. When running with this option, any test failures will cause the pipeline to fail, even though the tests are quarantined.").implies({skipQuarantined:!1,ignoreQuarantine:!1}),qP=new Ne("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),KP=new Ne("--record-video","Record video of test runs. By default, video is never recorded. It is recommended to only enable this when debugging test failures, as it causes larger test outputs. FFMpeg must be installed to use this flag."),YP=new $i("<tests...>","One or more test paths to queue on Momentic Cloud."),XP=new $i("<tests...>","One or more test paths to import from Momentic Cloud.").argOptional(),ry=new $i("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional(),JP=new $i("<suites...>","One or more suite paths that exist on Momentic Cloud."),QP=new $i("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),ZP=new $i("<results>","Path to the results archive.").argRequired(),ny=new Ne("--reason <reason>","The reason for quarantining the test. This will be used to generate a report on the test run."),oy=new $i("<test>","Name of the test to quarantine.").argOptional(),eO=new Ne("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(Nn);async function tO(r){let e=await Z(r),t=Object.values(e.tests);for(let n of t)try{let o=Ci(n.fullFilePath,E,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){E.debug(`Test ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=Kt.parse(o),s=await vi(a,i,E);E.dimmed(`Updating ${n.relativePath}`),pr({relativeTestPath:n.relativePath,steps:{beforeSteps:o.beforeSteps,steps:s.steps,afterSteps:o.afterSteps},schemaVersion:Re,project:r,forceSaveOnNoDiffs:!0})}catch(o){E.error({err:o},`Failed to read or migrate test ${n.name} (${n.relativePath}), continuing...`)}for(let n of Object.values(e.modules)){E.dimmed(`Updating ${n.relativePath}`);try{let o=Yn(n.fullFilePath,E),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){E.debug(`Module ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=await vi({id:o.moduleId,schemaVersion:o.schemaVersion},i,E);br({content:{...o,steps:a.steps},schemaVersion:Re,momenticFiles:e,project:r,forceSaveOnNoDiffs:!0})}catch(o){E.error({err:o},`Failed to read or migrate module ${n.name} (${n.relativePath}), continuing...`)}}}import{spawnSync as jq}from"child_process";function Vq(){try{let e=jq("git remote show origin",{encoding:"utf8",maxBuffer:5242880}).stdout.match(/HEAD branch: (.*)$/m);if(e&&e[1])return e[1].trim();E.warn("Could not determine your Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field.");return}catch(r){let e=r instanceof Error?r.message:String(r);E.warn(`Could not determine Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field. Error:
4683
+ `)}`)):E.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(E.success("No duplicates detected. All test, module, step and command IDs are unique."),process.exit(0))}async function MP({project:r}){let e=await Z(r),t=Object.values(e.tests),n=await Zu(e,X),o={},i={},a=new Set,s=new Set;for(let l of t)o[l.name]?i[l.name]?i[l.name].push(l.fullFilePath):i[l.name]=[o[l.name],l.fullFilePath]:o[l.name]=l.fullFilePath;for(let l of n)s.has(l.name)&&a.add(l.name),s.add(l.name);if(Object.entries(i).length>0||a.size>0){for(let[l,u]of Object.entries(i))for(let d of u)E.error(`Test Name ${l} is duplicated in ${d}`);for(let l of a)E.error(`Module name ${l} is duplicated in your project`);process.exit(1)}E.success("No duplicates detected. All test and module names are unique."),process.exit(0)}import{cloneDeep as Hq}from"lodash-es";async function PP({client:r,skipPrompts:e,project:t}){let n=await r.getAllEnvironments(),o=Hq(t.config);o.environments||(o.environments=[]);for(let i of n){let a=o.environments?.find(s=>s.name===i.name);if(a)!e&&!await Ut(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),a.baseUrl=i.variables[yt],delete i.variables[yt],a.envVariables=i.variables;else{let s=i.variables[yt];delete i.variables[yt],o.environments.push({name:i.name,baseUrl:s,envVariables:i.variables})}}Mo(o,t.configFilePath),E.success(`Pulled ${n.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as OP}from"crypto";import LP from"fs";async function $S({testsToFetch:r,client:e,all:t,yes:n}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:r,all:t}),a=0;for(let[c,l]of Object.entries(o)){let u=NP(c,me.TEST);!n&&!await qh(u)||(a+=1,LP.writeFileSync(u,l,"utf-8"),X.info({checksum:OP("md5").update(l).digest("hex")},`Wrote '${u}'`))}let s=0;for(let[c,l]of Object.entries(i)){let u=NP(c,me.MODULE);!n&&!await qh(u)||(s+=1,LP.writeFileSync(u,l,"utf-8"),X.info({checksum:OP("md5").update(l).digest("hex")},`Wrote '${u}'`))}a===0?E.success("Pulled 0 tests."):E.success(`Pulled ${a} test${a>1?"s":""}${s?` and ${s} module${s>1?"s":""}`:""}!`)}function NP(r,e){switch(e){case me.TEST:return`${De(r)}.test.yaml`;case me.MODULE:return`${De(r)}.module.yaml`;default:throw new Error(`Unknown entity type ${e}`)}}async function DP(r){let{project:e,client:t,skipPrompts:n}=r;E.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),E.info("Importing environments from Momentic Cloud."),E.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await Ut("Are you sure you want to proceed?")||(E.info("Aborting..."),process.exit(1)),await PP({client:t,project:e,skipPrompts:n}),E.success(`Successfully imported environments from Momentic Cloud. We recommend pulling secrets out of ${e.configFilePath} into .env files or dynamically set environment variables for security.`),E.info("Importing tests and modules from Momentic Cloud."),await $S({testsToFetch:[],client:t,all:!0,yes:n}),E.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}async function kP(r){let{client:e,skipPrompts:t,paths:n}=r;await $S({testsToFetch:n,client:e,all:void 0,yes:t}),E.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}import{Argument as $i,InvalidArgumentError as lc,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as zq}from"http";import{z as UP}from"zod";var Vp=58888;function Nn(r){let e=parseInt(r,10);if(isNaN(e))throw new lc("Not a number.");return e}function $p(r){if(r===void 0)return;let e={};for(let t of r){let n=t.indexOf("=");if(n===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,n),i=t.slice(n+1);zq(o,i),e[o]=i}return e}var $r=new Ne("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new lc("API key is required.");return r}).makeOptionMandatory(),Wr=new Ne("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return UP.string().url().parse(r),r}catch{throw new lc("Not a valid URL.")}}),Wo=new Ne("-y, --yes","Skip all confirmation prompts.").env("CI"),WS=new Ne("-w, --wait","Wait for tests to finish running before exiting."),qS=new Ne("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Defaults to ${18e5/1e3} seconds.`).default(18e5/1e3).implies({wait:!0}).argParser(Nn),Wp=new Ne("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),FP=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Zc)),BP=new Ne("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports"),KS=new Ne("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),HP=new Ne("--upload-results","Upload test results to Momentic Cloud.").default(!1),YS=new Ne("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),XS=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),JS=new Ne("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio.").argParser(Nn),QS=new Ne("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),qp=new Ne("--env <env>","Name of the environment to use when running tests."),Kp=new Ne("--url-override <urlOverride>","Fully qualified URL (e.g. https://www.google.com) to start all tests from. Overrides any default starting URL set from the test or environment.").argParser(r=>{try{return UP.string().url().parse(r),r}catch{throw new lc("Not a valid URL.")}}),zP=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=Nn(r);if(e<1)throw new lc("Shard index must be greater than 0.");return e}),GP=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Nn),sr=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),qo=new Ne("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),jP=new Ne("--fix","Attempt to fix any issues found."),ZS=new Ne("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.").implies({disableCache:!1,saveCache:!0}),ey=new Ne("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI").implies({disableCache:!1}),ty=new Ne("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1,regenerateCache:!1}),VP=new Ne("--bust-oldest-cache-percentage <n>","Bust the oldest n% of step caches when running tests. This option can be used to incrementally regenerate caches after a config change. When enabled, there will always be at least one cache busted, even if n% is less than 1. This option is only used when running on not protected branches.").implies({disableCache:!1,regenerateCache:!1}).argParser(Nn),$P=new Ne("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:!1,ignoreQuarantine:!1}),WP=new Ne("--only-quarantined","Run only tests that are currently quarantined. When running with this option, any test failures will cause the pipeline to fail, even though the tests are quarantined.").implies({skipQuarantined:!1,ignoreQuarantine:!1}),qP=new Ne("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),KP=new Ne("--record-video","Record video of test runs. By default, video is never recorded. It is recommended to only enable this when debugging test failures, as it causes larger test outputs. FFMpeg must be installed to use this flag."),YP=new $i("<tests...>","One or more test paths to queue on Momentic Cloud."),XP=new $i("<tests...>","One or more test paths to import from Momentic Cloud.").argOptional(),ry=new $i("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional(),JP=new $i("<suites...>","One or more suite paths that exist on Momentic Cloud."),QP=new $i("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),ZP=new $i("<results>","Path to the results archive.").argRequired(),ny=new Ne("--reason <reason>","The reason for quarantining the test. This will be used to generate a report on the test run."),oy=new $i("<test>","Name of the test to quarantine.").argOptional(),eO=new Ne("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(Nn);async function tO(r){let e=await Z(r),t=Object.values(e.tests);for(let n of t)try{let o=Ci(n.fullFilePath,E,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){E.debug(`Test ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=Kt.parse(o),s=await vi(a,i,E);E.dimmed(`Updating ${n.relativePath}`),pr({relativeTestPath:n.relativePath,steps:{beforeSteps:o.beforeSteps,steps:s.steps,afterSteps:o.afterSteps},schemaVersion:Re,project:r,forceSaveOnNoDiffs:!0})}catch(o){E.error({err:o},`Failed to read or migrate test ${n.name} (${n.relativePath}), continuing...`)}for(let n of Object.values(e.modules)){E.dimmed(`Updating ${n.relativePath}`);try{let o=Yn(n.fullFilePath,E),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){E.debug(`Module ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=await vi({id:o.moduleId,schemaVersion:o.schemaVersion},i,E);br({content:{...o,steps:a.steps},schemaVersion:Re,momenticFiles:e,project:r,forceSaveOnNoDiffs:!0})}catch(o){E.error({err:o},`Failed to read or migrate module ${n.name} (${n.relativePath}), continuing...`)}}}import{spawnSync as jq}from"child_process";function Vq(){try{let e=jq("git remote show origin",{encoding:"utf8",maxBuffer:5242880}).stdout.match(/HEAD branch: (.*)$/m);if(e&&e[1])return e[1].trim();E.warn("Could not determine your Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field.");return}catch(r){let e=r instanceof Error?r.message:String(r);E.warn(`Could not determine Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field. Error:
4653
4684
  ${e}`)}}async function rO({project:r,orgId:e,apiClient:t}){E.info("Pulling browser and AI configuration options from Cloud");let n=await ld.init(e);r.config.browser={autoExpandIframes:n.isBooleanFlagEnabled("auto_expand_iframes"),disableSecondaryCacheResolution:n.isBooleanFlagEnabled("disable_secondary_cache_resolution"),globalLocatorRedirect:n.isBooleanFlagEnabled("global_locator_redirect"),visualActions:n.isBooleanFlagEnabled("visual_actions"),showZeroOpacityElements:n.isBooleanFlagEnabled("show_zero_opacity_elements"),...r.config.browser},r.config.advanced={fakerConstantSeed:n.isBooleanFlagEnabled("faker_constant_seed"),...r.config.advanced},r.config.ai={aiPageFiltering:n.isBooleanFlagEnabled("rag_v2"),agentConfig:await t.getAgentConfig(),...r.config.ai},E.info(`Updated ${r.configFilePath} to include V2 browser and AI configuration options`),E.info("Determining main Git branch"),r.config.gitMainBranch=Vq(),Mo(r.config,r.configFilePath),E.success("Migration complete!")}import{input as $q,search as Wq}from"@inquirer/prompts";import qq from"fuse.js";async function Yp({prompt:r,inputtedTest:e,testOptions:t}){if(e){let s=t.find(c=>c.name===e||c.relativePath===e);if(!s)E.error(`${e} is not a valid test option.`);else return{name:s.name,id:s.id}}let n=t.map(s=>({value:s.id,name:s.name})),o=new qq(n,{keys:[{name:"name",weight:1}],threshold:.4,includeScore:!0,findAllMatches:!0,ignoreLocation:!0,useExtendedSearch:!0,shouldSort:!0,includeMatches:!0,distance:100,ignoreFieldNorm:!1}),i=await Wq({message:r,source:async s=>!s||s.length===0?n:o.search({name:s}).map(l=>l.item)}),a=n.find(s=>s.value===i);return{name:a.name,id:a.value}}async function Xp({prompt:r,inputtedReason:e}){return e||$q({message:r})}async function nO({test:r,reason:e,apiClient:t,project:n,logger:o,identity:i}){let a=(await Z(n)).tests,s=await Yp({prompt:"Select a test to quarantine.",inputtedTest:r,testOptions:Object.values(a)}),c=await Xp({prompt:"Enter a reason for quarantining the test.",inputtedReason:e});await t.quarantineTest(s,c,i),E.success(`Test ${s.name} has been successfully quarantined. Navigate to ${t.getAppUrl()}/quarantine to view all quarantined tests. Remove this test from quarantine by running 'npx momentic quarantine remove ${s.name}'.`)}import iy from"fs";import{compact as Kq,partition as Jp}from"lodash-es";import ay from"path";import{cwd as Yq}from"process";import Xq from"semver";async function gs({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,labels:a,logger:s}){let c=new Set;if(r&&r.length>0){let u=r.some(p=>iy.existsSync(p)),d=Yq();u?(d!==t.rootDir&&s.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),s.info(`Reading tests from the following local file paths:
4654
4685
  ${r.map(p=>`${St}- ${p}`).join(`
4655
4686
  `)}
@@ -4658,7 +4689,7 @@ ${r.map(p=>`${St}- ${p}`).join(`
4658
4689
  `)}`),Object.values(e.tests).forEach(p=>{r.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await Ut("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=ay.relative(t.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 lt(u,X,e);if(Xq.gt(d.schemaVersion,Re)&&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:ay.relative(t.rootDir,u)}}catch(d){s.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(l).then(Kq)}function oO({testDefinitions:r,quarantinedTestReasons:e,onlyQuarantined:t=!1,skipQuarantined:n=!1}){if(t){let[u,d]=Jp(r,h=>h.id in e),[p,m]=Jp(u,h=>h.disabled||n);return{testsToSkip:p,quarantinedTestsToSkip:[],testsToRun:m,quarantinedTestsToRun:[]}}let[o,i]=Jp(r,u=>u.disabled),[a,s]=Jp(i,u=>u.id in e);return{testsToSkip:o,testsToRun:s,quarantinedTestsToRun:n?[]:a,quarantinedTestsToSkip:n?a:[]}}function iO({testsToRun:r,quarantinedTestsToRun:e,quarantinedTestReasons:t,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 r.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,t[a.id])),o}async function aO({project:r,apiClient:e}){let t=await Z(r),n=await gs({tests:[],momenticFiles:t,yes:!0,project:r,logger:new Si(40,{})}),o=(await e.getQuarantinedTests()).quarantined,i=new Set(o.map(s=>s.testId)),a=n.filter(s=>i.has(s.id));E.info(a.map(s=>s.relativeFilePath).join(`
4659
4690
  `))}async function sO({test:r,reason:e,apiClient:t,project:n,identity:o}){let i=(await Z(n)).tests,a=Object.values(i),s=(await t.getQuarantinedTests()).quarantined,c=new Set(s.map(p=>p.testId)),l=a.filter(p=>c.has(p.id)),u=await Yp({prompt:"Select a test to unquarantine.",inputtedTest:r,testOptions:l}),d=await Xp({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await t.unquarantineTest(u,d,o),E.success(`Test ${u.name} has been successfully removed from quarantine.`)}function lO(r){return r?De(r):"Unknown suite"}async function cO({client:r,orgId:e,suitePaths:t,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await r.queueSuiteRuns({paths:t,...i});X.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:t},"Queued suites remotely"),E.dimmed(`Queued ${t.length} suites.`),n||process.exit(0);let c=Date.now();E.dimmed(`Waiting for ${t.length} suites to finish. You can view results upon completion at:`);for(let f of s)E.dimmed(`${St}- ${r.getAppUrl()}/run-groups/${f}`);let l=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(S=>S.status==="FAILED"&&(S.failureReason||S.finishedAt&&Date.now()-S.finishedAt.getTime()>30*1e3)||S.status==="PASSED"||S.status==="CANCELLED"),p=await Au({name:"suites",getResults:async()=>{let f=s.filter(T=>!u.some(b=>b.id===T)),y=await r.bulkGetRunGroupStatus(f),S=[];for(let T of y)d(T)?u.push(T):S.push(T);return[...u,...S]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(y=>{y.status==="RUNNING"&&(l.has(y.id)||(l.add(y.id),E.log(`${l.size}/${s.length} ${lO(y.suite?.name)}`)))}),f.every(d))}),m=r.getAppUrl(),g=Aa({results:p,startTime:c,onFailed:f=>{let y=lO(f.suite?.name),S=f.runs.filter(b=>b.status==="FAILED").length,T=f.runs.length;E.error(`${y} (${S}/${T} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let v=b.testName||b.test?.name;E.error(` ${v?De(v):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?De(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function uO({tests:r,client:e,orgId:t,...n}){!n.yes&&!await Ut(`This command will queue ${r.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:r,...n});if(X.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),E.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;E.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 Au({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(y=>y.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&&E.log(`${a.size}/${o.length} ${De(g)}`)}}),m.every(c))}),p=Aa({results:d,startTime:u,onFailed:m=>{let h=m.testName||m.test?.name;Ru(m,h?De(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?De(h):"Unknown test"}`;return m.id&&(g+=` (${l}/runs/${m.id})`),g},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as DK}from"crypto";import kK from"fs";import{existsSync as uK,mkdirSync as dK,statSync as pK}from"fs";import{randomUUID as dO}from"crypto";import sy from"fs";import{hostname as Jq}from"os";import ly from"path";async function Qp(r,e,t,n){if(n){let o=await e.getScreenshot(r,n);if(o){let i=`${n}-screenshot.jpeg`,a=ly.join(t,i);return sy.writeFileSync(a,o),i}}}async function Qq(r,e,t,n){let o=n.runId??dO(),i={uuid:o,historyId:o,testCaseId:n.test.id,fullName:n.test.name,name:De(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:Jq()},{name:"platform",value:"momentic"},{name:"attempts",value:n.attempts.toString()}],steps:[]};n.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${n.runId}`});for(let[s,c]of Object.entries(n.parameters))c!=null&&i.parameters.push({name:s,value:JSON.stringify(c)});n.results&&await Zq(r,e,t.folder,i.steps,n.results);let a=`${o}-result.json`;sy.writeFileSync(ly.join(t.folder,a),JSON.stringify(i,void 0,2))}async function fs(r,e,t,n){let o={name:tn(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 Qp(r,e,t,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Qp(r,e,t,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data){let s=`${dO()}-attachment.json`,c=ly.join(t,s);sy.writeFileSync(c,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function Zq(r,e,t,n,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{n.push(await fs(r,e,t,i));break}case"CONDITIONAL":{let a=await fs(r,e,t,i);a.steps=[],i.assertionResult&&a.steps.push(await fs(r,e,t,i.assertionResult)),a.steps.push(...await Promise.all(i.results.map(s=>fs(r,e,t,s)))),n.push(a);break}case"AI_ACTION":case"SECTION":case"MODULE":{let a=await fs(r,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>fs(r,e,t,s))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,c]of Object.entries(i.inputs))a.parameters.push({name:s,value:c})}n.push(a)}}}async function pO(r,e,t,n){for(let o of n.runs)await Qq(r,e,{folder:t,suiteName:n.suiteName},o)}import eK from"junit-report-builder";import Zp from"path";function tK(r,e){if(e.name(r.test.name).className(r.test.name).file(Zp.relative(".",r.filePath)).property("id",r.test.id).property("dd_tags[id]",r.test.id),r.test.labels&&(e.property("labels",r.test.labels.join(",")),r.test.labels.forEach(t=>{e.property("dd_tags[label]",t)})),r.baseUrl&&(e.property("base_url",r.baseUrl),e.property("dd_tags[base_url]",r.baseUrl)),r.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${r.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${r.runId}`)),r.quarantined&&(e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),r.quarantinedReason&&(e.property("quarantined_reason",r.quarantinedReason),e.property("dd_tags[quarantined_reason]",r.quarantinedReason))),r.beforeResults?.some(t=>t.status==="FAILED")&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r.results?.some(t=>t.status==="FAILED")&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r.afterResults?.some(t=>t.status==="FAILED")&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),r.status==="FAILED"){if(r.failureReason){let t=Lc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ia[r.failureReason];r.runId&&(n+=` Visit https://app.momentic.ai/runs/${r.runId} for more details.`),e.failure(n,t)}r.failureDetails?.errorStack&&e.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&e.skipped();return e.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("started_at",r.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",r.lastAttemptStartedAt.toISOString()).property("finished_at",r.finishedAt.toISOString()).property("dd_tags[finished_at]",r.finishedAt.toISOString()),e.property("attempts",r.attempts.toString()).property("dd_tags[attempts]",r.attempts.toString()),r.parameters.envName&&(e.property("environment",r.parameters.envName),e.property("dd_tags[environment]",r.parameters.envName)),r.parameters.urlOverride&&e.property("url_override",r.parameters.urlOverride),e}function rK(r,{suiteId:e,suiteName:t,startedAt:n,finishedAt:o,runs:i,testsToSkip:a,quarantinedTestsToSkip:s,quarantinedTestReasons:c}){let l=r.testSuite().name(t);e&&l.property("id",e),l.timestamp(n).property("startedAt",n.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-n.getTime())/1e3);for(let u of i){let d=l.testCase();tK(u,d)}for(let u of a){let d=l.testCase();d.name(u.name).className(u.name).file(Zp.relative(".",u.relativeFilePath)).property("id",u.id),u.baseUrl&&d.property("baseUrl",u.baseUrl),u.labels&&(d.property("labels",u.labels.join(",")),u.labels.forEach(p=>{d.property("dd_tags[label]",p)})),d.skipped()}for(let u of s){let d=l.testCase();d.name(u.name).className(u.name).file(Zp.relative(".",u.relativeFilePath)).property("id",u.id).property("quarantined","true");let p=c[u.id];p&&d.property("quarantinedReason",p),u.baseUrl&&d.property("baseUrl",u.baseUrl),u.labels&&(d.property("labels",u.labels.join(",")),u.labels.forEach(m=>{d.property("dd_tags[label]",m)})),d.skipped()}return l}function mO(r,e){let t=eK.newBuilder();rK(t,e),t.writeTo(Zp.join(r,`${e.suiteName}.xml`))}import nK from"fs";import oK from"path";function hO(r){return{title:tn(r),duration:r.finishedAt.getTime()-r.startedAt.getTime(),error:r.status==="FAILED"?{value:r.failureReason}:void 0,steps:r.results&&r.type!=="PRESET_ACTION"?r.results.map(hO):[]}}async function iK(r,e,t,n){if(n.results?.length){let o=await Qp(r,e,t,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function aK(r,e,t,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||ia[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(hO)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await iK(r,e,t,n)}}async function sK(r,e,t,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await aK(r,e,t,n)]}}async function lK(r,e,t,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await sK(r,e,t,n)],id:n.runId,file:n.filePath}}function cy(r,e){return r.reduce((t,n)=>e(n)?t+1:t,0)}async function cK(r,e,t,n){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(n.runs.map(o=>lK(r,e,t,o)))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:cy(n.runs,o=>o.status==="PASSED"),unexpected:cy(n.runs,o=>o.status!=="PASSED"),flaky:cy(n.runs,o=>!!o.isFlake),skipped:0}}}async function gO(r,e,t,n){let o=await cK(r,e,t,n);nK.writeFileSync(oK.join(t,`${n.suiteName}.json`),JSON.stringify(o,null,2))}async function fO(r,e,t,n,o){switch(uK(o)?pK(o).isDirectory()||(E.error(`The specified reporter output directory '${o}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(E.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),dK(o,{recursive:!0})),t){case"junit":mO(o,n);return;case"allure":case"allure-json":await pO(r,e,o,n);return;case"playwright-json":await gO(r,e,o,n);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import UK from"wait-on";import{execSync as mK}from"child_process";import{platform as hK}from"os";function uy(){return SO()?(E.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),E.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.
4660
4691
  `),2):(E.dimmed("Setting device pixel ratio to 1."),E.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.
4661
- `),1)}function SO(){return hK()==="darwin"&&mK("system_profiler SPDisplaysDataType").toString().includes("Retina")}function dy(r){SO()&&r===1&&(E.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),E.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import gK from"@actions/exec";import fK from"@actions/io";import SK from"quote";import yK from"string-argv";async function yO(r,e=!0){let t=yK(r),n=await fK.which(t[0],!0),o=t.slice(1),i=gK.exec(SK(n),o,{delay:100});if(e)return i}import EK from"csv-parser";import{createReadStream as bK}from"fs";function py(r){return new Promise((e,t)=>{let n=[];bK(r).pipe(EK()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import Ss from"semver";import{z as em}from"zod";var Rr="2.26.0",TK="https://registry.npmjs.org/momentic",vK=em.object({versions:em.record(em.string(),em.unknown()).optional()});async function Qt(r){try{await AK(r)}catch(e){E.warn({err:e},"Failed to check CLI version against NPM servers")}}async function my(){let r=await H(fetch(TK),{milliseconds:5e3});if(!r.ok)throw new Error(`Got error status code ${r.statusText}`);let e=await r.json(),t=vK.parse(e).versions;if(!t)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Rr;for(let o of Object.keys(t))Ss.valid(o)&&Ss.major(o)===Ss.major(Rr)&&Ss.gt(o,n)&&Ss.prerelease(o)===null&&(n=o);return n}async function AK(r){let e;for(let t=0;t<2;t++)try{e=await my()}catch(n){r.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}Ss.eq(Rr,e)||(E.warn(`Update available: v${Rr} -> v${e}`),E.warn("This version may be missing critical fixes, features, and security updates."),E.warn('Run "npx momentic@latest upgrade" to update'))}async function no(){try{await H(Promise.all([Zv(),Pt.flush()]),{milliseconds:5e3})}catch{}}import{partition as RK}from"lodash-es";function tm(r){return r.length===1?"test":"tests"}function EO(r){return r===1?"1 worker":`${r} workers`}function bO(r){r.length!==0&&(E.info(`Skipping ${r.length} disabled ${tm(r)}:`),r.forEach(e=>{E.info(`${St}- ${[e.relativeFilePath]}`)}),E.log(""))}function TO(r,e){r.length!==0&&(E.info(`Skipping ${r.length} quarantined ${tm(r)}:`),r.forEach(t=>{E.info(`${St}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),E.log(""))}function wK(r,e){r.length!==0&&(E.info(`Running ${r.length} quarantined ${tm(r)} with ${EO(e)}:`),r.forEach(t=>{E.info(`${St}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),E.log(""))}function CK(r,e,t){e.length===0&&r.length>0||(E.info(`Running ${e.length} ${tm(e)} with ${EO(t)}:`),e.forEach(n=>{E.info(`${St}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),E.log(""))}function vO({logger:r,localTestsToRunWithInputs:e,parallel:t,shardCount:n,shardIndex:o}){r.info({tests:e.length,shardCount:n,shardIndex:o,parallel:t},"Running local tests");let[i,a]=RK(e,s=>s.quarantined);wK(i,t),CK(i,a,t)}import{cloneDeep as ys}from"lodash-es";async function AO({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await ar({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function RO({baseUrl:r,envName:e,testName:t,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:y}){let S=await op({settings:h,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:s,orgId:l}),T={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:X,mode:"runner"},b=S.browserType??"Chromium";if(!nA(b)){let _=`Browser ${b} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;E.warn(_),X.warn(_)}let v=await Vr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new wo(T,c),contextArgs:{viewport:i.advanced.viewport??qt,locale:i.advanced.locale??go,geolocation:i.advanced.geolocation??So,timezoneId:i.advanced.timezone??fo,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>y.onNetworkPage(_),onNetworkLogs:_=>y.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:y.videoOutputPath?{videoOutputPath:y.videoOutputPath,onVideoPageChange:({videoName:_})=>{y.setActiveVideo(_)}}:void 0}),C=new jo({browser:v,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),x=new nr({baseUrl:r,currentUrl:C.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:P,defaultValue:G,required:W}=_,U=m?.[P];W&&U===void 0&&(E.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let j=await ar({orgId:l,s:U??G,localTools:s,logger:d,context:nr.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(P,j)})),{controller:C,context:x}}async function wO({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!yi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return t.warn(n),E.warn(n),!1}return!0}async function CO({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;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 wO({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await np({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function xO(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await xK(r)}catch(o){let i="Fatal error running test";return E.error(`${i}: ${o.message}`),t.error({err:o},i),{results:[],parameters:r,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function xK(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:c,gitMetadata:l,cacheOptions:u,runId:d,testInputs:p,quarantined:m,quarantinedReason:h,usageTracker:g}=r,f=new Ra(n,o),y=_o({orgId:o,client:n,gitMetadata:l,regenerateCache:u.regenerateCache??!1,alwaysSaveCache:u.alwaysSaveCache??!1,noCache:u.noCache??!1,bustOldestCachePercentage:u.bustOldestCachePercentage}),S=await Du({cacheStorage:y,logger:c,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),T=S.steps,b=S.beforeSteps??void 0,v=S.afterSteps??void 0,C=r.envName??IK(e),x,_={};if(C){try{x=xi(C,t,c)}catch(U){let j=`Failed to resolve environment ${C} for test ${e.name}: ${U}`;throw new Error(j)}_=x.variables}let P=e.baseUrl;if(i)P=i;else if(!P){let U=_[yt];typeof U=="string"&&(P=U)}if(!P){let U=`Cannot run test with no base URL and no ${yt} variable defined in its environment`;throw new Error(U)}let G=await s.startRun({logger:c,runId:d,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:P,environmentName:C,schemaVersion:e.schemaVersion,resolvedInputs:p,quarantined:m,quarantinedReason:h}),W=c.child(G.loggerBindings||{});Object.entries(G.envVarBindings||{}).forEach(([U,j])=>{_[U]=j});try{let U=await _K({...r,variables:_,envName:C,resolvedEnv:x,baseUrl:P,storageClient:f,tracer:G,logger:W,cacheStorage:y,stepsWithCaches:T,beforeStepsWithCaches:b,afterStepsWithCaches:v,usageTracker:g});return await G.finish({logger:c,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:G.runId,...U}}finally{a?.pop()}}async function _K(r){let{testDefinition:e,stepsWithCaches:t,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:y,retriesOverride:S,devicePixelRatio:T,logUpdate:b,tracer:v,logger:C,cacheStorage:x,gitMetadata:_,quarantined:P,quarantinedReason:G,usageTracker:W}=r,U=i.config.ai?.aiFailureAnalysis??!1,j=new Date,Q=new Fa(i,a),Y={...i.config},Ee={envName:p,urlOverride:m,customHeaders:h,testInputs:g},q,nt=Math.abs(S??i.config.retries??e.retries??0),Be=[];C.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let qe=0;qe<=nt;qe++){let Lt=await v.startAttempt(),_e=C.child(Lt.loggerBindings||{}),ne={...e,steps:ys(t),beforeSteps:ys(n),afterSteps:ys(o)};qe!==0&&b("RETRY",`attempt ${qe+1}/${nt+1}`);let Gt=new Date,Dn=Y.advanced?.fakerConstantSeed,kn=new Tn({httpClient:new Ft({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:_e,mode:"runner"}),fakerSeed:Dn?Ea:void 0}),om=Lt;try{let{controller:Un,context:Ko}=await RO({tracer:Lt,baseUrl:l,envName:p,testName:ne.name,apiClient:s,devicePixelRatio:T,logger:_e,storageClient:u,codeEvalTools:kn,test:ne,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...y?.browser||{},...ne.advanced},aiSettings:{...i.config.ai||{},...ne.advanced||{}},visualDiffScreenshotStorage:Q});q=await CO({attemptMetadata:{attemptNumber:qe+1,orgId:d,runId:v.runId},attemptFixtures:{logger:_e,storageClient:u,usageTracker:W,codeEvalTools:kn,apiClient:s,context:Ko,controller:Un,tracer:Lt},attemptInputs:{test:ne,orgSettings:Y}});let wr=new Date,dn={logger:C,cacheStorage:x,orgId:d,testId:e.id,originalStepsWithCaches:{steps:ys(t),beforeSteps:ys(n),afterSteps:ys(o)},updatedStepsWithCaches:{steps:ne.steps,beforeSteps:ne.beforeSteps,afterSteps:ne.afterSteps}};q?.status==="PASSED"?await zu(dn):q?.status==="FAILED"&&qe===nt&&await Gu(dn),await Lt.finish({logger:_e,result:q}),Be.unshift(q.status);let Yo=await AO({orgId:d,codeEvalTools:kn,logger:_e,outputDefinitions:e.outputs??[],testContext:Ko}),K=Ab(Be),pc=qe+1;if(q.status!=="FAILED")return{...q,parameters:Ee,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:wr,attempts:pc,baseUrl:l,outputs:Yo,isFlake:K,quarantined:P,quarantinedReason:G};let oo=q.failedStepResult,qr=oo?.message||"Unknown failure",io=oo?.failureReason??PE(qr)??"UnknownError",Es=_e.child({errResult:oo,failureReason:io,errorMessage:qr,numAttempts:nt+1,name:ne.name});if(qe<nt){Es.warn(`Retrying failed execution attempt for run: ${qr}`);continue}Es.error(`Test failed after all exhausting attempts: ${qr}`);let bs=new Error(qr),Ts={errorMessage:qr,errorStack:bs.stack},qi;if(U){let Fn;try{if(q.results&&q.results.length>0){let{classification:mc,aiFailureReason:im}=await pR({logger:_e,browserStateStorage:om,generator:c,fullResults:q,failureReason:io,error:bs,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Fn=mc,qi=im}}catch(mc){_e.warn({err:mc},"Failed to classify test results")}Fn&&(Ts.classification=Fn,io=qi??io)}return{...q,parameters:Ee,failureDetails:Ts,failureReason:io,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:wr,attempts:qe+1,baseUrl:l,outputs:Yo,quarantined:P,quarantinedReason:G}}catch(Un){As(Un);let Ko=`Encountered fatal platform error while running test '${ne.name}': ${Un}`,wr=new Date,dn=qe+1;_e.error({err:Un},Ko),E.error(Ko);let Yo={errorMessage:Un.message,errStack:Un.stack},K={status:"FAILED",failureDetails:Yo,failureReason:"InternalPlatformError",finishedAt:wr};return await Lt.finish({logger:_e,result:{status:"FAILED",results:[]}}),{...K,results:[],parameters:Ee,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:new Date,attempts:dn,baseUrl:l,outputs:{},quarantined:P,quarantinedReason:G}}}throw new Error("This code should not be reachable")}function IK(r){for(let e of r.envs??[])if(e.default)return e.name}import OK from"adm-zip";import LK from"path";var hr="assets";function MK(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Wi=class{constructor(e,t,n,o){this.orgId=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.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,t]of Object.entries(this.stepFrequenciesByType))Pt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:t}=e;this.recordStepStat(t);let n={step:t,status:"RUNNING",startedAt:new Date},o=new hy(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(t=>t.finishInternal({status:MK(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function PK(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var hy=class{constructor(e,t,n,o,i){this.orgId=e;this.testId=t;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";Pt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:t,healedAt:new Date}}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Pt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finish({status:PK(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new Wi(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var cc=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(hr),this.harPagesStream=this.diskStorage.createFileStream(`${hr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${hr}/har-entries.log`)}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return LK.resolve(this.diskStorage.cwd(),"assets")}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)}
4692
+ `),1)}function SO(){return hK()==="darwin"&&mK("system_profiler SPDisplaysDataType").toString().includes("Retina")}function dy(r){SO()&&r===1&&(E.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),E.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import gK from"@actions/exec";import fK from"@actions/io";import SK from"quote";import yK from"string-argv";async function yO(r,e=!0){let t=yK(r),n=await fK.which(t[0],!0),o=t.slice(1),i=gK.exec(SK(n),o,{delay:100});if(e)return i}import EK from"csv-parser";import{createReadStream as bK}from"fs";function py(r){return new Promise((e,t)=>{let n=[];bK(r).pipe(EK()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import Ss from"semver";import{z as em}from"zod";var Rr="2.27.0",TK="https://registry.npmjs.org/momentic",vK=em.object({versions:em.record(em.string(),em.unknown()).optional()});async function Qt(r){try{await AK(r)}catch(e){E.warn({err:e},"Failed to check CLI version against NPM servers")}}async function my(){let r=await H(fetch(TK),{milliseconds:5e3});if(!r.ok)throw new Error(`Got error status code ${r.statusText}`);let e=await r.json(),t=vK.parse(e).versions;if(!t)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Rr;for(let o of Object.keys(t))Ss.valid(o)&&Ss.major(o)===Ss.major(Rr)&&Ss.gt(o,n)&&Ss.prerelease(o)===null&&(n=o);return n}async function AK(r){let e;for(let t=0;t<2;t++)try{e=await my()}catch(n){r.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}Ss.eq(Rr,e)||(E.warn(`Update available: v${Rr} -> v${e}`),E.warn("This version may be missing critical fixes, features, and security updates."),E.warn('Run "npx momentic@latest upgrade" to update'))}async function no(){try{await H(Promise.all([Zv(),Pt.flush()]),{milliseconds:5e3})}catch{}}import{partition as RK}from"lodash-es";function tm(r){return r.length===1?"test":"tests"}function EO(r){return r===1?"1 worker":`${r} workers`}function bO(r){r.length!==0&&(E.info(`Skipping ${r.length} disabled ${tm(r)}:`),r.forEach(e=>{E.info(`${St}- ${[e.relativeFilePath]}`)}),E.log(""))}function TO(r,e){r.length!==0&&(E.info(`Skipping ${r.length} quarantined ${tm(r)}:`),r.forEach(t=>{E.info(`${St}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),E.log(""))}function wK(r,e){r.length!==0&&(E.info(`Running ${r.length} quarantined ${tm(r)} with ${EO(e)}:`),r.forEach(t=>{E.info(`${St}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),E.log(""))}function CK(r,e,t){e.length===0&&r.length>0||(E.info(`Running ${e.length} ${tm(e)} with ${EO(t)}:`),e.forEach(n=>{E.info(`${St}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),E.log(""))}function vO({logger:r,localTestsToRunWithInputs:e,parallel:t,shardCount:n,shardIndex:o}){r.info({tests:e.length,shardCount:n,shardIndex:o,parallel:t},"Running local tests");let[i,a]=RK(e,s=>s.quarantined);wK(i,t),CK(i,a,t)}import{cloneDeep as ys}from"lodash-es";async function AO({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await ar({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function RO({baseUrl:r,envName:e,testName:t,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:y}){let S=await op({settings:h,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:s,orgId:l}),T={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:X,mode:"runner"},b=S.browserType??"Chromium";if(!nA(b)){let _=`Browser ${b} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;E.warn(_),X.warn(_)}let v=await Vr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new wo(T,c),contextArgs:{viewport:i.advanced.viewport??qt,locale:i.advanced.locale??go,geolocation:i.advanced.geolocation??So,timezoneId:i.advanced.timezone??fo,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>y.onNetworkPage(_),onNetworkLogs:_=>y.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:y.videoOutputPath?{videoOutputPath:y.videoOutputPath,onVideoPageChange:({videoName:_})=>{y.setActiveVideo(_)}}:void 0}),C=new jo({browser:v,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),x=new nr({baseUrl:r,currentUrl:C.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:P,defaultValue:G,required:W}=_,U=m?.[P];W&&U===void 0&&(E.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let j=await ar({orgId:l,s:U??G,localTools:s,logger:d,context:nr.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(P,j)})),{controller:C,context:x}}async function wO({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!yi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return t.warn(n),E.warn(n),!1}return!0}async function CO({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;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 wO({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await np({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function xO(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await xK(r)}catch(o){let i="Fatal error running test";return E.error(`${i}: ${o.message}`),t.error({err:o},i),{results:[],parameters:r,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function xK(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:c,gitMetadata:l,cacheOptions:u,runId:d,testInputs:p,quarantined:m,quarantinedReason:h,usageTracker:g}=r,f=new Ra(n,o),y=_o({orgId:o,client:n,gitMetadata:l,regenerateCache:u.regenerateCache??!1,alwaysSaveCache:u.alwaysSaveCache??!1,noCache:u.noCache??!1,bustOldestCachePercentage:u.bustOldestCachePercentage}),S=await Du({cacheStorage:y,logger:c,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),T=S.steps,b=S.beforeSteps??void 0,v=S.afterSteps??void 0,C=r.envName??IK(e),x,_={};if(C){try{x=xi(C,t,c)}catch(U){let j=`Failed to resolve environment ${C} for test ${e.name}: ${U}`;throw new Error(j)}_=x.variables}let P=e.baseUrl;if(i)P=i;else if(!P){let U=_[yt];typeof U=="string"&&(P=U)}if(!P){let U=`Cannot run test with no base URL and no ${yt} variable defined in its environment`;throw new Error(U)}let G=await s.startRun({logger:c,runId:d,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:P,environmentName:C,schemaVersion:e.schemaVersion,resolvedInputs:p,quarantined:m,quarantinedReason:h}),W=c.child(G.loggerBindings||{});Object.entries(G.envVarBindings||{}).forEach(([U,j])=>{_[U]=j});try{let U=await _K({...r,variables:_,envName:C,resolvedEnv:x,baseUrl:P,storageClient:f,tracer:G,logger:W,cacheStorage:y,stepsWithCaches:T,beforeStepsWithCaches:b,afterStepsWithCaches:v,usageTracker:g});return await G.finish({logger:c,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:G.runId,...U}}finally{a?.pop()}}async function _K(r){let{testDefinition:e,stepsWithCaches:t,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:y,retriesOverride:S,devicePixelRatio:T,logUpdate:b,tracer:v,logger:C,cacheStorage:x,gitMetadata:_,quarantined:P,quarantinedReason:G,usageTracker:W}=r,U=i.config.ai?.aiFailureAnalysis??!1,j=new Date,Q=new Fa(i,a),Y={...i.config},Ee={envName:p,urlOverride:m,customHeaders:h,testInputs:g},q,nt=Math.abs(S??i.config.retries??e.retries??0),Be=[];C.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let qe=0;qe<=nt;qe++){let Lt=await v.startAttempt(),_e=C.child(Lt.loggerBindings||{}),ne={...e,steps:ys(t),beforeSteps:ys(n),afterSteps:ys(o)};qe!==0&&b("RETRY",`attempt ${qe+1}/${nt+1}`);let Gt=new Date,Dn=Y.advanced?.fakerConstantSeed,kn=new Tn({httpClient:new Ft({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:_e,mode:"runner"}),fakerSeed:Dn?Ea:void 0}),om=Lt;try{let{controller:Un,context:Ko}=await RO({tracer:Lt,baseUrl:l,envName:p,testName:ne.name,apiClient:s,devicePixelRatio:T,logger:_e,storageClient:u,codeEvalTools:kn,test:ne,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...y?.browser||{},...ne.advanced},aiSettings:{...i.config.ai||{},...ne.advanced||{}},visualDiffScreenshotStorage:Q});q=await CO({attemptMetadata:{attemptNumber:qe+1,orgId:d,runId:v.runId},attemptFixtures:{logger:_e,storageClient:u,usageTracker:W,codeEvalTools:kn,apiClient:s,context:Ko,controller:Un,tracer:Lt},attemptInputs:{test:ne,orgSettings:Y}});let wr=new Date,dn={logger:C,cacheStorage:x,orgId:d,testId:e.id,originalStepsWithCaches:{steps:ys(t),beforeSteps:ys(n),afterSteps:ys(o)},updatedStepsWithCaches:{steps:ne.steps,beforeSteps:ne.beforeSteps,afterSteps:ne.afterSteps}};q?.status==="PASSED"?await zu(dn):q?.status==="FAILED"&&qe===nt&&await Gu(dn),await Lt.finish({logger:_e,result:q}),Be.unshift(q.status);let Yo=await AO({orgId:d,codeEvalTools:kn,logger:_e,outputDefinitions:e.outputs??[],testContext:Ko}),K=Ab(Be),pc=qe+1;if(q.status!=="FAILED")return{...q,parameters:Ee,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:wr,attempts:pc,baseUrl:l,outputs:Yo,isFlake:K,quarantined:P,quarantinedReason:G};let oo=q.failedStepResult,qr=oo?.message||"Unknown failure",io=oo?.failureReason??PE(qr)??"UnknownError",Es=_e.child({errResult:oo,failureReason:io,errorMessage:qr,numAttempts:nt+1,name:ne.name});if(qe<nt){Es.warn(`Retrying failed execution attempt for run: ${qr}`);continue}Es.error(`Test failed after all exhausting attempts: ${qr}`);let bs=new Error(qr),Ts={errorMessage:qr,errorStack:bs.stack},qi;if(U){let Fn;try{if(q.results&&q.results.length>0){let{classification:mc,aiFailureReason:im}=await pR({logger:_e,browserStateStorage:om,generator:c,fullResults:q,failureReason:io,error:bs,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Fn=mc,qi=im}}catch(mc){_e.warn({err:mc},"Failed to classify test results")}Fn&&(Ts.classification=Fn,io=qi??io)}return{...q,parameters:Ee,failureDetails:Ts,failureReason:io,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:wr,attempts:qe+1,baseUrl:l,outputs:Yo,quarantined:P,quarantinedReason:G}}catch(Un){As(Un);let Ko=`Encountered fatal platform error while running test '${ne.name}': ${Un}`,wr=new Date,dn=qe+1;_e.error({err:Un},Ko),E.error(Ko);let Yo={errorMessage:Un.message,errStack:Un.stack},K={status:"FAILED",failureDetails:Yo,failureReason:"InternalPlatformError",finishedAt:wr};return await Lt.finish({logger:_e,result:{status:"FAILED",results:[]}}),{...K,results:[],parameters:Ee,test:ne,filePath:ne.relativeFilePath,startedAt:j,lastAttemptStartedAt:Gt,finishedAt:new Date,attempts:dn,baseUrl:l,outputs:{},quarantined:P,quarantinedReason:G}}}throw new Error("This code should not be reachable")}function IK(r){for(let e of r.envs??[])if(e.default)return e.name}import OK from"adm-zip";import LK from"path";var hr="assets";function MK(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Wi=class{constructor(e,t,n,o){this.orgId=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.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,t]of Object.entries(this.stepFrequenciesByType))Pt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:t}=e;this.recordStepStat(t);let n={step:t,status:"RUNNING",startedAt:new Date},o=new hy(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(t=>t.finishInternal({status:MK(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function PK(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var hy=class{constructor(e,t,n,o,i){this.orgId=e;this.testId=t;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${hr}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";Pt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:t,healedAt:new Date}}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Pt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finish({status:PK(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new Wi(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var cc=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(hr),this.harPagesStream=this.diskStorage.createFileStream(`${hr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${hr}/har-entries.log`)}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return LK.resolve(this.diskStorage.cwd(),"assets")}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)}
4662
4693
  `)}onNetworkLogs(e){if(!this.finished)for(let[t,n]of Object.entries(e))n.response?(delete this.inProgressHarEntries[t],this.harEntriesStream.write(`${JSON.stringify(n)}
4663
4694
  `)):this.inProgressHarEntries[t]=n}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:t,logger:n}=e,o=t();if(!o)return;let i=new OK;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${hr}/${Vh}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Vh},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:Hu(n.results,t),beforeResults:n.beforeResults?Hu(n.beforeResults,t):void 0,afterResults:n.afterResults?Hu(n.afterResults,t):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)}
4664
4695
  `);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 Wi(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new Wi(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new Wi(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${hr}/${t}.html`)?.toString()}};import{randomUUID as NK}from"crypto";var uc=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;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{[M_]:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,result:{status:t.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let e=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),t=NK(),n={id:t,schemaVersion:Re,runAttemptSchemaVersion:Hv,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new cc(this.orgId,this.testId,this.testName,t,n,e,this.recordVideo);return this.children.push(o),o}};var dc=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;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:t,outputDir:n,gitMetadata:o,labels:i,recordVideo:a}){let s={...o,id:t,trigger:Pr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Rr,labels:i??[]},c=new Al(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new r(e,t,s,c,a??!1)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,n={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let t=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:Rr,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new uc(this.orgId,e.testId,e.testName,e.runId,n,t,this.recordVideo);return this.children.push(o),o}};async function _O(r,e,t){if(t)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]=i.quarantinedReason,o),{})}catch(n){return r.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function IO(r){let{logger:e,tests:t,yes:n,start:o,waitOn:i,waitOnProxy:a,client:s,debugDataStorage:c,project:l,retriesOverride:u,urlOverride:d,envName:p,orgId:m,devicePixelRatio:h,customHeaders:g,testInputMatrix:f,reporter:y,include:S,exclude:T,labels:b,reporterDir:v=PR,outputDir:C=OR,uploadResults:x=!1,waitOnTimeout:_=60,parallel:P,shardIndex:G=1,shardCount:W=1,regenerateGoldenFiles:U,gitMetadata:j,cacheOptions:Q,ignoreQuarantine:Y,skipQuarantined:Ee,onlyQuarantined:q,runGroupId:nt,recordVideo:Be,timeoutMinutes:qe}=r;if(o&&(e.info({orgId:m},`Executing start command: ${o}`),await yO(o,!1)),i){e.info({orgId:m},`Waiting for url: ${i} with timeout: ${_} seconds.`);let et=a?new URL(a):void 0,Bn;et&&(Bn={host:et.hostname,port:et.port?parseInt(et.port):et.protocol.startsWith("https")?443:80,auth:et.username||et.password?{username:et.username,password:et.password}:void 0}),await UK({resources:[i],interval:2500,timeout:_*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:Bn})}let Lt=new $n(l.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e,mode:"runner"}),_e=await Z(l),ne=await gs({tests:t,momenticFiles:_e,yes:n,project:l,include:S,exclude:T,labels:b,logger:E}),Gt=await _O(e,s,Y),{testsToSkip:Dn,quarantinedTestsToSkip:kn,testsToRun:om,quarantinedTestsToRun:Un}=oO({testDefinitions:ne,quarantinedTestReasons:Gt,onlyQuarantined:q,skipQuarantined:Ee});bO(Dn),TO(kn,Gt);let Ko=iO({testsToRun:om,quarantinedTestsToRun:Un,quarantinedTestReasons:Gt,testInputMatrix:f}),wr=BK({globalTestsToRunWithInputs:Ko,shardIndex:G,shardCount:W});vO({logger:e,localTestsToRunWithInputs:wr,parallel:P,shardCount:W,shardIndex:G});let dn=[],Yo=new Date,K=new Set,pc=async()=>{let et=s.getAppUrl(),Bn=Aa({results:dn,startTime:Yo.getTime(),onFailed:gr=>{Ru(gr,gr.filePath)},getDisplayLine:gr=>{let Xo=`${St}- ${gr.filePath}${gr.failureRecoveryDetails?" [recovered] ":""}`;return gr.runId&&(Xo+=` ( link when uploaded: ${et}/runs/${gr.runId} )`),Xo},entity:"test"}),hc=dn.filter(gr=>!!gr.failureRecoveryDetails?.attempts);return hc.length>0&&E.warn(`Our AI agent automatically prevented ${hc.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.
@@ -4666,4 +4697,4 @@ ${r.map(p=>`${St}- ${p}`).join(`
4666
4697
  `),E.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."),nm.existsSync(ka)&&(E.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=r.name??await Wv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await NR()||await Ut("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),Mo({name:e,include:wg},ka),E.success(`Initialized Momentic project file at ${rm.resolve(ka)}`)});zt.command("app").addOption($r).addOption(Wr).addOption(Wo).addOption(JS).addOption(sr).addOption(ZS).addOption(ey).addOption(ty).action(async r=>{await Qt(X);let{apiKey:e,yes:t,server:n,pixelRatio:o,disableCache:i,saveCache:a,regenerateCache:s}=r,c=await Rt({configFilePath:r.config,nameFilter:void 0}),{errors:l}=await jp({project:c,fix:!1});l>0&&(E.error(`Found ${l} errors`),E.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1)),Ew(X);let u=new Je({baseUrl:n,apiKey:e,logger:X});await rg({client:u,skipPrompts:t});let d=KK(import.meta.url),p=rm.dirname(d),m=rm.resolve(p,"..","static"),h=rm.resolve(p,"..","assets"),g=o??uy();dy(g),await wP({momenticServerUrl:n,apiKey:e,serverPort:Vp,appPort:Vp,staticDir:m,assetsDir:h,devicePixelRatio:g,regenerateCache:s,noCache:i,alwaysSaveCache:a,initialProject:c});let f=`http://localhost:${Vp}`;await qK(f)});var kO=zt.command("queue").description("Queue tests or suites to run on Momentic Cloud");kO.command("suites").description("Run one or more suites on Momentic Cloud").addOption($r).addOption(Wr).addOption(WS).addOption(qS).addOption(Wo).addArgument(JP).addOption(Kp).addOption(qp).addOption(Wp).action(async(r,e)=>{await Qt(X);let{apiKey:t,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=$p(e.customHeaders),l=new Je({baseUrl:n,apiKey:t,logger:X});(!r||!Array.isArray(r)||!r.length)&&(E.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await l.getAuthInfo();await cO({client:l,orgId:u,wait:o,suitePaths:r,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await no()});kO.command("tests").description("Run one or more tests on Momentic Cloud").addOption($r).addOption(Wr).addOption(Wo).addOption(Wp).addOption(QS).addOption(Kp).addOption(qp).addOption(new lr("--all","Run all tests.").default(!1)).addOption(WS).addOption(qS).addArgument(YP).action(async(r,e)=>{await Qt(X);let{all:t,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=$p(e.customHeaders);for(let g of r)(g.endsWith(".yaml")||nm.existsSync(g))&&E.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 Je({baseUrl:i,apiKey:n,logger:X}),{orgId:m}=await p.getAuthInfo(),h;a&&(h=await py(a)),await uO({client:p,orgId:m,tests:r,all:t,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:h,yes:u}),await no(),process.exit(0)});var YK=zt.command("list").description("List test paths");YK.addOption(sr).addOption(qo).addOption(YS).addOption(XS).addOption(new lr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(ry).action(async(r,e)=>{let t=await Rt({configFilePath:e.config,nameFilter:e.filter}),n=await Z(t),o=await gs({tests:r,momenticFiles:n,yes:!0,project:t,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Si(40,{})});E.info(o.map(i=>i.relativeFilePath).join(`
4667
4698
  `)),process.exit(0)});var XK=zt.command("run").alias("test").description("Run tests on the local machine");XK.addOption($r).addOption(Wr).addOption(sr).addOption(qo).addOption(Wo).addOption(Wp).addOption(QS).addOption(ZS).addOption(ey).addOption(ty).addOption(VP).addOption(KP).addOption($P).addOption(WP).addOption(qP).addOption(qp).addOption(Kp).addOption(JS).addOption(new lr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new lr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new lr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new lr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Nn)).addOption(new lr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Nn)).addOption(new lr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Nn)).addOption(new lr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new lr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(FP).addOption(BP).addOption(KS).addOption(HP).addOption(GP).addOption(zP).addOption(YS).addOption(XS).addOption(eO).addArgument(ry).action(async(r,e)=>{if(await Qt(X),e.shardIndex>e.shardCount)throw new Error("Shard index cannot be greater than shard count");let t=$p(e.customHeaders),n=await Rt({configFilePath:e.config,nameFilter:e.filter}),o=e.parallel??n.config.parallel??1;OO().length<o*2&&E.warn(`You requested to run tests in parallel ${o} at a time on a machine with ${OO().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),E.debug({projectName:n.config.name},"Identified project config");let{errors:i}=await jp({project:n,fix:!1});i>0&&(E.error(`Found ${i} errors`),E.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let a=new Je({baseUrl:e.server,apiKey:e.apiKey,logger:X});E.debug("Checking API key and dependencies");let{orgId:s,userId:c}=await rg({client:a,skipPrompts:e.yes});E.debug("API key check and browser installation complete");let l=new rl,u=e.outputDir??n.config.outputDir,d=e.reporterDir??n.config.reporterDir,p=$K(),m=X.child({cliVersion:Rr,orgId:s,userId:c,runGroupId:p}),h=await kr(X,a,n);m.info({gitMetadata:h,config:n.config,nodeVersion:process.versions.node},"Got local metadata");let g;e.inputCsv&&(g=await py(e.inputCsv));let f=e.pixelRatio??uy();dy(f);try{let y=await IO({...e,parallel:o,retriesOverride:e.retries,devicePixelRatio:f,tests:r,project:n,client:a,debugDataStorage:l,outputDir:u,uploadResults:e.uploadResults,reporterDir:d,customHeaders:t,envName:e.env,orgId:s,testInputMatrix:g,logger:m,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:h,cacheOptions:{regenerateCache:e.regenerateCache,alwaysSaveCache:e.saveCache,noCache:e.disableCache,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??n.config.recordVideo,runGroupId:p,timeoutMinutes:e.timeoutMinutes});await no(),y.failed>0?process.exit(1):process.exit(0)}catch(y){E.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),E.error(y),await no(),process.exit(1)}});var JK=zt.command("apply").description("Apply an operation to local resources");JK.command("patch").addOption($r).addOption(Wr).addOption(sr).addOption(qo).addOption(Wo).addOption(new lr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new lr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async r=>{await Qt(X);let{apiKey:e,server:t,config:n,yes:o}=r,i=await Rt({configFilePath:n}),a=X,s=new Je({baseUrl:t,apiKey:e,logger:a}),c=await Z(i),l=c.tests[r.to]??Object.values(c.tests).find(d=>De(d.name)===r.to.trim());l||(E.error(`No test matching '${r.to}' could be found in the current project.`),process.exit(1));let u=await s.fetchTestFragment(r.from);await xP({client:s,test:l,fragment:u,yes:o,entities:c,logger:X}),process.exit(0)});var UO=zt.command("results").description("Merge and upload test results.");UO.command("merge").description("Merge test results files.").addOption(KS).addArgument(QP).action(async(r,e)=>{await Qt(X);let{outputDir:t}=e;t||(E.error("Output directory is required."),process.exit(1)),nm.existsSync(r)||(E.warn("Results path does not exist, skipping merge."),process.exit(0)),nm.existsSync(t)&&E.warn(`Output directory ${t} already exists, removing before merging...`),FR(X,t,r)});UO.command("upload").description("Upload test results to Momentic cloud.").addOption($r).addOption(Wr).addArgument(ZP).action(async(r,e)=>{await Qt(X);let{apiKey:t,server:n}=e,o=X,i=new Je({baseUrl:n,apiKey:t,logger:o});await nd({consoleLogger:E,resultsPath:r,client:i}),process.exit(0)});var fy=zt.command("quarantine").description("Manage test quarantines");fy.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption($r).addOption(Wr).addOption(sr).addOption(qo).addOption(ny).addArgument(oy).action(async(r,e)=>{await Qt(X);let{apiKey:t,server:n,config:o,reason:i}=e,a=X,s=await Rt({configFilePath:o}),c=new Je({baseUrl:n,apiKey:t,logger:a}),l=await kr(X,c,s);await nO({test:r,reason:i,apiClient:c,project:s,logger:a,identity:l})});fy.command("list").description("List quarantined tests.").addOption($r).addOption(Wr).addOption(sr).addOption(qo).action(async r=>{let{apiKey:e,server:t,config:n}=r,o=X,i=await Rt({configFilePath:n}),a=new Je({baseUrl:t,apiKey:e,logger:o});await aO({apiClient:a,project:i})});fy.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption($r).addOption(Wr).addOption(sr).addOption(qo).addOption(ny).addArgument(oy).action(async(r,e)=>{await Qt(X);let{apiKey:t,server:n,config:o,reason:i}=e,a=X,s=await Rt({configFilePath:o}),c=new Je({baseUrl:n,apiKey:t,logger:a}),l=await kr(X,c,s);await sO({test:r,reason:i,apiClient:c,project:s,identity:l})});zt.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(sr).addOption(qo).action(async r=>{let e=await Rt({configFilePath:r.config,nameFilter:r.filter});E.info("Updating Momentic version in package.json..."),await MO(),E.info("Updating project configuration..."),PO(e),E.success("Your project configuration was successfully updated to the latest recommended settings."),E.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 QK(){NO("Main program started");try{await zt.parseAsync(process.argv),await no()}catch(r){let e={};try{e.playwrightVersion=VK("npx playwright --version").toString()}catch(t){X.error({err:t},"Error fetching debug information")}X.error({err:r,debugInfo:e},"Uncaught error in CLI"),As(r,e),E.error(r),await no(),process.exit(1)}}WK.setMaxListeners(25);process.on("warning",r=>{X.warn({err:r},`Node warning received on CLI: ${r.message}`)});NO("CLI parsing setup complete");QK();
4668
4699
  //# sourceMappingURL=cli.js.map
4669
- //# debugId=6d4b8763-9e65-5faa-9980-eb8bfa44ae80
4700
+ //# debugId=750765bf-2aed-5bef-89bd-cd904ac1e4d1