momentic 2.17.19 → 2.18.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 +47 -47
- package/npm-shrinkwrap.json +24 -24
- package/package.json +1 -1
- package/static/assets/{index-UJQznt2S.js → index-vZ2UVcww.js} +150 -150
- package/static/index.html +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
4
|
-
var II=Object.defineProperty;var Ye=(r,e)=>()=>(r&&(e=r(r=0)),e);var MI=(r,e)=>{for(var t in e)II(r,t,{get:e[t],enumerable:!0})};var Av,Cv=Ye(()=>{"use strict";Av=typeof globalThis=="object"?globalThis:global});var xv=Ye(()=>{"use strict";Cv()});var _v=Ye(()=>{"use strict";xv()});var Cn,vh=Ye(()=>{"use strict";Cn="1.9.0"});function f0(r){var e=new Set([r]),t=new Set,n=r.match(Iv);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(l){return t.add(l),!1}function a(l){return e.add(l),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var s=c.match(Iv);if(!s)return i(c);var u={major:+s[1],minor:+s[2],patch:+s[3],prerelease:s[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 Iv,Mv,Pv=Ye(()=>{"use strict";vh();Iv=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;Mv=f0(Cn)});function ha(r,e,t,n){var o;n===void 0&&(n=!1);var i=js[Gs]=(o=js[Gs])!==null&&o!==void 0?o:{version:Cn};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!==Cn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+Cn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+Cn+"."),!0}function xn(r){var e,t,n=(e=js[Gs])===null||e===void 0?void 0:e.version;if(!(!n||!Mv(n)))return(t=js[Gs])===null||t===void 0?void 0:t[r]}function ga(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+Cn+".");var t=js[Gs];t&&delete t[r]}var S0,Gs,js,Vs=Ye(()=>{"use strict";_v();vh();Pv();S0=Cn.split(".")[0],Gs=Symbol.for("opentelemetry.js.api."+S0),js=Av});function $s(r,e,t){var n=xn("diag");if(n)return t.unshift(e),n[r].apply(n,E0([],y0(t),!1))}var y0,E0,Ov,Lv=Ye(()=>{"use strict";Vs();y0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},E0=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))},Ov=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 $s("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("verbose",this._namespace,e)},r}()});var Ge,pu=Ye(()=>{"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"})(Ge||(Ge={}))});function Nv(r,e){r<Ge.NONE?r=Ge.NONE:r>Ge.ALL&&(r=Ge.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",Ge.ERROR),warn:t("warn",Ge.WARN),info:t("info",Ge.INFO),debug:t("debug",Ge.DEBUG),verbose:t("verbose",Ge.VERBOSE)}}var Dv=Ye(()=>{"use strict";pu()});var T0,b0,v0,an,Ws=Ye(()=>{"use strict";Lv();Dv();pu();Vs();T0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b0=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))},v0="diag",an=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var l=xn("diag");if(l)return l[o].apply(l,b0([],T0(i),!1))}}var t=this,n=function(o,i){var a,l,c;if(i===void 0&&(i={logLevel:Ge.INFO}),o===t){var s=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=s.stack)!==null&&a!==void 0?a:s.message),!1}typeof i=="number"&&(i={logLevel:i});var u=xn("diag"),d=Nv((l=i.logLevel)!==null&&l!==void 0?l:Ge.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 ha("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ga(v0,t)},t.createComponentLogger=function(o){return new Ov(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 kv,Fv=Ye(()=>{"use strict";kv=Symbol("BaggageEntryMetadata")});function Rh(r){return typeof r!="string"&&(R0.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:kv,toString:function(){return r}}}var R0,Uv=Ye(()=>{"use strict";Ws();Fv();R0=an.instance()});function wh(r){return Symbol.for(r)}var w0,Ah,Ch=Ye(()=>{"use strict";w0=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}(),Ah=new w0});function Ih(){return _h}var si,A0,mu,C0,x0,_0,I0,xh,M0,P0,O0,_h,L0,N0,D0,k0,F0,U0,B0,Mh=Ye(()=>{"use strict";si=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)}}(),A0=function(){function r(){}return r.prototype.createGauge=function(e,t){return N0},r.prototype.createHistogram=function(e,t){return D0},r.prototype.createCounter=function(e,t){return L0},r.prototype.createUpDownCounter=function(e,t){return k0},r.prototype.createObservableGauge=function(e,t){return U0},r.prototype.createObservableCounter=function(e,t){return F0},r.prototype.createObservableUpDownCounter=function(e,t){return B0},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),mu=function(){function r(){}return r}(),C0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(mu),x0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(mu),_0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(mu),I0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(mu),xh=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),M0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),P0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),O0=function(r){si(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),_h=new A0,L0=new C0,N0=new _0,D0=new I0,k0=new x0,F0=new M0,U0=new P0,B0=new O0});var ar,Bv=Ye(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(ar||(ar={}))});var z0,H0,zv,Hv=Ye(()=>{"use strict";Ch();z0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},H0=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))},zv=function(){function r(){}return r.prototype.active=function(){return Ah},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,H0([n],z0(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var G0,j0,Ph,V0,Gv,jv=Ye(()=>{"use strict";Hv();Vs();Ws();G0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},j0=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))},Ph="context",V0=new zv,Gv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return ha(Ph,e,an.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,j0([e,t,n],G0(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return xn(Ph)||V0},r.prototype.disable=function(){this._getContextManager().disable(),ga(Ph,an.instance())},r}()});var fa,Vv=Ye(()=>{"use strict";jv();fa=Gv.getInstance()});var G,$v=Ye(()=>{"use strict";Ws();G=an.instance()});var $0,Wv,qv=Ye(()=>{"use strict";Mh();$0=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return _h},r}(),Wv=new $0});var Oh,Kv,Yv=Ye(()=>{"use strict";qv();Vs();Ws();Oh="metrics",Kv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return ha(Oh,e,an.instance())},r.prototype.getMeterProvider=function(){return xn(Oh)||Wv},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ga(Oh,an.instance())},r}()});var hu,Xv=Ye(()=>{"use strict";Yv();hu=Kv.getInstance()});var Oe=Ye(()=>{"use strict";Uv();Ch();pu();Mh();Bv();Vv();$v();Xv()});var Ga=(r,e)=>{},up=!1;try{let r=await import("@sentry/node");Ga=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),up=!0}catch{}import{Command as oV,Option as tr}from"@commander-js/extra-typings";import{execSync as iV}from"child_process";var ja=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;import{existsSync as cN,statSync as uN}from"fs";import{z as rS}from"zod";var EV=rS.object({input:rS.string()});import{z as ht}from"zod";var vV=ht.object({srcs:ht.array(ht.string()),urls:ht.array(ht.string()),desiredSrc:ht.string().optional(),desiredUrl:ht.string().optional()}),nS=ht.object({srcRegex:ht.string().optional(),urlRegex:ht.string().optional()}),oS=ht.object({x:ht.number(),y:ht.number(),correlation:ht.number()}),RV=ht.object({searchImageBase64String:ht.string(),pageImageBase64String:ht.string(),id:ht.string().uuid(),timeoutMs:ht.number().max(1e4).min(0).optional()});import{z as O}from"zod";import*as k from"zod";import{extendZodWithOpenApi as PI}from"zod-openapi";PI(k);var Bn=(l=>(l.AI="AI",l.AI_HEALED="AI_HEALED",l.CLICK_TO_FIND="CLICK_TO_FIND",l.XY_PERCENT="XY_PERCENT",l.RECORDING="RECORDING",l.USER_CSS_SELECTOR="USER_CSS_SELECTOR",l.HEURISTIC_HEALED="HEURISTIC_HEALED",l))(Bn||{}),OI=k.object({mPathSelectorTokens:k.string().array(),frameSrcRegex:k.string().optional(),frameUrlRegex:k.string().optional(),indices:k.number().array()}),dp=k.object({result:k.number(),traceId:k.string()}).array(),xl=k.object({type:k.literal("GCS_TRACES"),traces:dp}),iS=k.object({text:k.string().optional(),attributes:k.record(k.string(),k.string()).optional(),boundingBox:k.object({x:k.number(),y:k.number(),width:k.number(),height:k.number()}).optional()}),LI=k.object({selectors:k.string().array(),requirements:iS.optional()}),zn=k.object({id:k.number().int(),dataMomenticId:k.number().int().optional(),selector:k.string().optional(),hybridSelector:k.object({textContent:k.string().nullish(),attributes:k.record(k.string(),k.string()),tagName:k.string(),expandShadowRoot:k.boolean().optional(),classNames:k.string().array(),nthChild:k.number()}).array().optional(),generatedSelectors:k.string().array().optional(),requirements:iS.optional(),additionalElements:LI.array().optional(),role:k.string().optional(),name:k.string().optional(),numChildren:k.number().optional(),content:k.string().optional(),pathFromRoot:k.string().optional(),serializedHtml:k.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:k.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:k.string().url().optional(),boundingBox:k.object({x:k.number().optional(),y:k.number().optional(),width:k.number(),height:k.number()}).describe("css pixel bounding box").optional(),frameCache:OI.optional(),inputDescription:k.string().optional().describe("the description that generated this cache"),targetSource:k.nativeEnum(Bn).optional(),targetUpdateTime:k.string().optional(),targetUpdateLoggerTags:k.record(k.string(),k.string()).optional(),cacheResolutionUpdateSource:k.string().optional(),cacheResolutionUpdateTime:k.string().optional(),cacheResolutionUpdateLoggerTags:k.record(k.string(),k.string()).optional(),memory:xl.optional()}).openapi({ref:"ElementTargetCache"});function _l(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var NI=k.object({type:k.literal("description"),elementDescriptor:k.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),DI=k.object({x:k.number(),y:k.number()}),kI=k.object({type:k.literal("coordinates"),pixels:DI}).openapi({ref:"CoordinatesTarget"});function Hn(r){return r.type==="description"}function $r(r){return r.type==="coordinates"}var Mt=k.discriminatedUnion("type",[NI,kI]).openapi({ref:"ElementTarget"});function pp(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Pt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.pixels.y}`}}function Il(r){return xl.safeParse(r).success}import{v4 as Re}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as VI}from"zod-openapi";import{z as ie}from"zod";import{extendZodWithOpenApi as FI}from"zod-openapi";import{z as $a}from"zod";import aS from"zod";var Va=aS.object({updatedAt:aS.coerce.date().optional()});var mp=$a.object({result:$a.boolean(),traceId:$a.string()}).array(),hp=$a.object({type:$a.literal("GCS_TRACES"),traces:mp}),gp=Va.extend({memory:hp.optional()});FI(ie);var sS=ie.object({plan:ie.string().optional(),evidence:ie.string().optional(),thoughts:ie.string(),result:ie.boolean(),relevantElements:ie.array(ie.number()).optional(),updatedMemory:mp.optional()}),Gn=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Gn||{});var UI=ie.object({type:ie.literal("ELEMENT_NAME"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),value:ie.string()}).openapi({ref:"ElementNameAssertion"}),BI=ie.object({type:ie.literal("ELEMENT_STYLE"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),property:ie.string(),value:ie.string()}).openapi({ref:"ElementStyleAssertion"}),zI=ie.object({type:ie.literal("ELEMENT_CONTENT"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),value:ie.string()}).openapi({ref:"ElementContentAssertion"}),HI=ie.object({type:ie.literal("ELEMENT_ATTRIBUTE"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),attr:ie.string(),value:ie.string()}).openapi({ref:"ElementAttributeValueAssertion"}),xi=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(xi||{}),GI=ie.object({type:ie.literal("ELEMENT_EXISTENCE"),negated:ie.boolean().optional(),condition:ie.nativeEnum(xi).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),lS=ie.discriminatedUnion("type",[zI,HI,GI,UI,BI]).openapi({ref:"ManualElementAssertion"});var jI=ie.object({type:ie.literal("CONTENT"),negated:ie.boolean().optional(),value:ie.string()}).openapi({ref:"PageContentAssertion"}),cS=ie.discriminatedUnion("type",[jI]).openapi({ref:"ManualPageAssertion"});import Ht from"zod";var fp=Ht.discriminatedUnion("type",[Ht.object({type:Ht.literal("SUBSTRING"),url:Ht.string()}),Ht.object({type:Ht.literal("GLOB"),glob:Ht.string()}),Ht.object({type:Ht.literal("REGEX"),regex:Ht.string()}),Ht.object({type:Ht.literal("DOMAIN"),domain:Ht.string()})]),Wa=Ht.object({urlMatcher:fp,method:Ht.string().optional()});import{z as ve}from"zod";var _i=ve.object({url:ve.string(),method:ve.union([ve.literal("GET"),ve.literal("POST"),ve.literal("PUT"),ve.literal("DELETE"),ve.literal("PATCH")]),headers:ve.record(ve.string(),ve.string()).optional(),params:ve.record(ve.string(),ve.string()).optional(),body:ve.string().optional(),timeout:ve.number().int().optional().describe("Max seconds to wait for the request to complete")}),uS=ve.object({url:ve.string(),headers:ve.record(ve.string(),ve.string()).optional(),query:ve.string(),variables:ve.string().optional(),timeout:ve.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ml=ve.object({code:ve.string(),fragment:ve.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ve.union([ve.literal("NODE"),ve.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ve.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Xe=($=>($.AI_EXTRACT="AI_EXTRACT",$.AI_ASSERTION="AI_ASSERTION",$.AUTH_LOAD="AUTH_LOAD",$.AUTH_SAVE="AUTH_SAVE",$.BLUR="BLUR",$.CAPTCHA="CAPTCHA",$.CLICK="CLICK",$.COOKIE="COOKIE",$.COPY="COPY",$.DIALOG="DIALOG",$.DRAG="DRAG",$.ELEMENT_CHECK="ELEMENT_CHECK",$.FILE_UPLOAD="FILE_UPLOAD",$.FOCUS="FOCUS",$.GO_BACK="GO_BACK",$.GO_FORWARD="GO_FORWARD",$.HOVER="HOVER",$.JAVASCRIPT="JAVASCRIPT",$.LOCAL_STORAGE="LOCAL_STORAGE",$.MOUSE_DRAG="MOUSE_DRAG",$.NAVIGATE="NAVIGATE",$.NEW_TAB="NEW_TAB",$.PAGE_CHECK="PAGE_CHECK",$.PASTE="PASTE",$.PRESS="PRESS",$.KEY_DOWN="KEY_DOWN",$.KEY_UP="KEY_UP",$.REFRESH="REFRESH",$.REQUEST="REQUEST",$.GRAPHQL_REQUEST="GRAPHQL_REQUEST",$.SCROLL_DOWN="SCROLL_DOWN",$.SCROLL_UP="SCROLL_UP",$.SCROLL_LEFT="SCROLL_LEFT",$.SCROLL_RIGHT="SCROLL_RIGHT",$.SELECT_OPTION="SELECT_OPTION",$.SWITCH_TAB="TAB",$.TYPE="TYPE",$.VISUAL_DIFF="VISUAL_DIFF",$.WAIT="WAIT",$.WAIT_FOR_URL="WAIT_FOR_URL",$.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="SUCCESS",$))(Xe||{});VI(R);var J=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),dr=R.object({useSelector:R.boolean().optional(),force:R.boolean().optional(),disableCache:R.boolean().optional().describe("disable element caching for this step"),iframeUrl:R.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),rr=Va.extend({target:zn}).optional().openapi({ref:"SingleTargetCache"});function dS(r){return rr.safeParse(r).success}var Ol=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),yp=J.merge(Ol).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Ll=dr.merge(R.object({cache:rr})),jn=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Vn=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ii=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Mi=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),ZV=R.discriminatedUnion("type",[jn,Vn,Ii,Mi]).openapi({ref:"AllScrollCommands"}),$I=J.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),WI=J.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),qI=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")}),Ep=J.extend({type:R.literal("WAIT_FOR_URL"),matcher:fp}).merge(qI).openapi({ref:"WaitUrlCommand"}),KI=J.merge(Ol).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),YI=J.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),XI=J.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),JI=J.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),QI=J.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"}),Tp=J.merge(dr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),ZI=J.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),eM=J.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),bp=J.merge(Ml).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Mo=J.merge(dr).extend({type:R.literal("CLICK"),target:Mt,doubleClick:R.boolean().optional(),rightClick:R.boolean().optional(),waitForDownload:R.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:R.number().optional(),downloadTimeoutMs:R.number().optional(),cache:rr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),vp=Va.extend({fromTarget:zn.optional(),toTarget:zn.optional()}),qa=J.merge(dr).merge(R.object({type:R.literal("DRAG"),fromTarget:Mt,toTarget:Mt,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:vp.optional()})).openapi({ref:"DragCommand"}),Ka=J.merge(dr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:Mt.optional(),deltaX:R.string().describe("pixels to move horizontally, can be template"),deltaY:R.string().describe("pixels to move vertically, can be template"),steps:R.number().optional(),cache:rr})).openapi({ref:"MouseDragCommand"}),Po=J.merge(dr).merge(R.object({type:R.literal("HOVER"),target:Mt,cache:rr})).openapi({ref:"HoverCommand"}),Ya=J.merge(dr).merge(R.object({type:R.literal("FOCUS"),target:Mt,cache:rr})).openapi({ref:"FocusCommand"}),Xa=J.merge(dr).extend({type:R.literal("BLUR"),target:Mt.optional(),cache:rr}).openapi({ref:"BlurCommand"}),tM=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),rM=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),nM=J.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[tM,rM]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),oM=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()})]),Oo=J.merge(dr).extend({type:R.literal("SELECT_OPTION"),target:Mt,cache:rr,choice:oM.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Rp=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),Pi=J.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Rp.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:gp.optional()})).openapi({ref:"AIAssertionCommand"}),Wr=5,wp=600,Lo=J.merge(dr).extend({type:R.literal("ELEMENT_CHECK"),target:Mt,assertion:lS,cache:rr.or(gp).optional(),timeout:R.number().int().min(0).max(wp).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Ap=J.extend({type:R.literal("PAGE_CHECK"),assertion:cS,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(wp).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),iM=J.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"}),aM=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()}),pS=25,No=J.merge(dr).merge(aM).extend({type:R.literal("TYPE"),target:Mt.optional(),value:R.string(),cache:rr}).openapi({ref:"TypeCommand"}),Cp=J.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"}),sM=J.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),lM=J.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),cM=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),uM=R.object({type:R.literal("REGEX"),pattern:R.string()}),dM=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),pM=R.discriminatedUnion("type",[cM,uM,dM]),mM=J.merge(Ol).merge(R.object({type:R.literal("TAB"),action:pM})).openapi({ref:"TabCommand"}),xp=J.merge(Ol).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),hM=J.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),gM=J.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),fM=J.extend({type:R.literal("REQUEST")}).merge(_i).openapi({ref:"RequestCommand"}),SM=J.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(uS).openapi({ref:"GraphQLRequestCommand"}),yM=J.merge(R.object({type:R.literal("SUCCESS"),condition:Pi.optional()})).openapi({ref:"SuccessCommand"}),EM=J.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),TM=R.object({data:R.string().describe("location at which to find a jpg"),width:R.number(),height:R.number()}),Ja=J.merge(dr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:Mt.optional(),screenshot:TM.optional(),cache:rr})).openapi({ref:"VisualDiffCommand"}),bM=J.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Wa,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),vM=J.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),RM=J.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:Wa,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wM=J.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),AM=J.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:Wa.optional()})).openapi({ref:"SetHeaderCommand"}),CM=J.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:Wa,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"})),xM=J.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"})),_M=J.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),mS=R.discriminatedUnion("type",[Mo,No,Cp,sM,lM,Oo,yp,Vn,jn,Pi,Po,WI,yM]),IM=R.discriminatedUnion("type",[iM,QI,JI,Tp,hM,ZI,$I,qa,Lo,nM,YI,XI,bp,gM,Ka,xp,Ap,eM,KI,fM,SM,Ii,Mi,mM,Ja,Ya,Xa,Ep,bM,vM,RM,wM,AM,CM,xM,_M]),Oi=R.discriminatedUnion("type",[...mS.options,...IM.options]).openapi({ref:"Command"}),Nl=R.discriminatedUnion("type",[...mS.options,EM]);function yn(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:Re(),type:r};break;case"AUTH_LOAD":{e={id:Re(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Re(),type:r,goal:""};break;case"DIALOG":e={id:Re(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Re(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Re(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Re(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Re(),type:r,delay:1};break;case"BLUR":e={id:Re(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Re(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Re(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Re(),type:r,value:""};break;case"SELECT_OPTION":e={id:Re(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Re(),type:r,url:""};case"TAB":e={id:Re(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Re(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Re(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Re(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Re(),type:r,code:""};break;case"AI_ASSERTION":e={id:Re(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Re(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Re(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Re(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Re(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Re(),type:r,key:""};break}case"SET_HEADER":{e={id:Re(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Re(),type:r};break}case"OFFLINE_MODE":{e={id:Re(),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 hS(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 MM}from"zod";var o$=MM.discriminatedUnion("type",[Xa,Tp,Mo,qa,Ya,Po,Ka,jn,Vn,Ii,Mi,Oo,No,Ja,Lo]);function gS(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as PM}from"zod";import{z as $n}from"zod";function Qa(r){return $n.object({key:$n.string(),testId:$n.string().optional(),moduleId:$n.string().optional(),organizationId:$n.string(),value:r})}function Za(r){return Qa(r).extend({uniqueKey:$n.string()})}function Dl(r){return $n.record($n.string(),Za(r))}var Gt={type:!0,cache:!0},En=PM.discriminatedUnion("type",[Pi.pick(Gt),Xa.pick(Gt),Mo.pick(Gt),qa.pick(Gt),Lo.pick(Gt),Ya.pick(Gt),Po.pick(Gt),Ka.pick(Gt),jn.pick(Gt),Vn.pick(Gt),Ii.pick(Gt),Mi.pick(Gt),Oo.pick(Gt),No.pick(Gt),Ja.pick(Gt)]),kl=Object.values(Xe).filter(r=>En.options.some(e=>e.shape.type.safeParse(r).success));Oi.options.forEach(r=>{if("target"in r.shape&&!kl.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function fS(r){return kl.includes(r.type)}var SS=Qa(En),yS=Za(En),p$=Dl(En);import{z as _p}from"zod";import{extendZodWithOpenApi as NM}from"zod-openapi";import{z as ES}from"zod";import{extendZodWithOpenApi as OM}from"zod-openapi";import{z as Do}from"zod";var pr=Do.object({index:Do.number().optional().describe("global index within a test (in-order traversal)"),id:Do.string(),skipped:Do.boolean().optional(),envKey:Do.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:Do.boolean().optional(),retries:Do.number().optional()});OM(ES);var LM=pr.extend({type:ES.literal("PRESET_ACTION")}),nr=LM.extend({command:Oi}).openapi({ref:"PresetAction"});NM(_p);var ko=pr.extend({type:_p.literal("AI_ACTION"),text:_p.string(),steps:nr.array().optional()}).openapi({ref:"AIAction"});import{z as jt}from"zod";import{z as Fl}from"zod";import{extendZodWithOpenApi as DM}from"zod-openapi";DM(Fl);var Li=pr.extend({type:Fl.literal("AI_ACTION_DYNAMIC"),text:Fl.string(),retries:Fl.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as TS}from"zod";var Ip=pr.extend({type:TS.literal("CONDITIONAL"),skipped:TS.boolean().optional()});import{z as he}from"zod";var kM=he.object({cacheKey:he.string(),cacheExpiryMs:he.number()}),Mp=pr.extend({id:he.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:he.record(he.string()).optional(),cacheConfig:kM.optional()}),Mr=Mp.extend({type:he.literal("MODULE"),moduleId:he.string().uuid()}),FM=he.union([Mr.pick({type:!0,moduleId:!0}),he.record(he.unknown())]),UM=he.object({type:he.literal("URL_REGEX"),regex:he.string()}),BM=he.object({type:he.literal("PAGE_CHECK"),substring:he.string()}),Pp=he.object({cacheInvalidation:he.discriminatedUnion("type",[BM,UM]).optional()}),Kt=he.object({moduleId:he.string().uuid(),name:he.string(),description:he.string().nullish(),enabled:he.boolean().nullish(),parameters:he.string().array().nullish(),defaultParameters:he.record(he.string(),he.string()).nullish(),parameterEnums:he.record(he.string(),he.string().array()).nullish(),defaultCacheKey:he.string().nullish(),defaultCacheTtl:he.number().nullish(),defaultCacheAllInvocations:he.boolean().nullish(),autoAuth:he.boolean().nullish(),advanced:Pp.nullish()});var Op=r=>r.type==="AI_ACTION"||r.type==="AI_ACTION_DYNAMIC"||r.type==="PRESET_ACTION";import{z as mr}from"zod";var Lp=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Lp||{});var zM=mr.discriminatedUnion("type",[mr.object({type:mr.literal("NAVIGATE_URL"),url:mr.string().url()}),mr.object({type:mr.literal("GO_TO_SECTION_START")})]),HM=mr.object({trigger:mr.nativeEnum(Lp).optional(),attempts:mr.number().int().optional(),restartBehavior:zM}),es=pr.extend({type:mr.literal("SECTION"),description:mr.string().describe("user provided goal of what the section should accomplish"),plan:mr.string().array().optional(),autohealingConfig:HM.optional()});var bS=Kt.merge(Mp).extend({type:jt.literal("RESOLVED_MODULE"),steps:jt.lazy(()=>tt.array())}),ts=Kt.extend({steps:jt.lazy(()=>tt.array())}),Np=es.extend({steps:jt.lazy(()=>De.array())}),GM=es.extend({steps:jt.lazy(()=>tt.array())}),Fo=Ip.extend({blocks:jt.object({assertion:jt.lazy(()=>nr),steps:jt.lazy(()=>De.array())}).array(),elseSteps:jt.lazy(()=>De.array().optional())}),jM=Ip.extend({blocks:jt.object({assertion:jt.lazy(()=>nr),steps:jt.lazy(()=>tt.array())}).array(),elseSteps:jt.lazy(()=>tt.array().optional())}),De=jt.discriminatedUnion("type",[nr,ko,Li,Mr,Fo,Np]),tt=jt.discriminatedUnion("type",[nr,ko,Li,bS,jM,GM]);import{z as hr}from"zod";var VM=hr.object({steps:De.array(),beforeSteps:De.array().nullish(),afterSteps:De.array().nullish()}),Ni=hr.object({steps:tt.array(),beforeSteps:tt.array().nullish(),afterSteps:tt.array().nullish()}),Uo=hr.object({steps:hr.record(hr.string(),hr.unknown()).array(),beforeSteps:hr.record(hr.string(),hr.unknown()).array().nullish(),afterSteps:hr.record(hr.string(),hr.unknown()).array().nullish()});var le="1.0.21";var vS=O.object({phrase:O.string()}),Dp=O.object({thoughts:O.string().optional(),result:O.union([O.literal("NOT_FOUND"),O.string(),O.number(),O.array(O.unknown()),O.record(O.unknown(),O.unknown()),O.unknown()])}),XW=O.object({text:O.string()}),RS=O.object({attributes:O.array(O.string()).optional(),text:O.boolean().optional(),boundingBox:O.boolean().optional()}),$M=O.object({id:O.number().int(),requirements:RS}),WM=$M.array(),wS=O.object({thoughts:O.string(),review:O.string().optional(),id:O.number().int(),updatedMemory:dp.optional(),requirements:RS.optional(),additionalElements:WM.optional()});var Ul=(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))(Ul||{}),kp=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(kp||{});var AS=O.object({thoughts:O.string(),category:O.nativeEnum(Ul)}),CS=O.object({thoughts:O.string(),category:O.nativeEnum(kp)}),qM=O.discriminatedUnion("op",[O.object({op:O.literal("replace"),path:O.string(),value:O.string()}),O.object({op:O.literal("add"),path:O.string(),value:O.string()}),O.object({op:O.literal("remove"),path:O.string()})]),JW=O.object({thoughts:O.string(),patches:qM.array()}),KM=[O.literal("add"),O.literal("replace"),O.literal("remove")],YM=O.object({op:O.union(KM),path:O.string(),value:tt.optional()}),xS=O.object({patches:YM.array(),thoughts:O.string()}),Fp=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Fp||{}),_S=O.object({thoughts:O.string(),scenario:O.nativeEnum(Fp),instructions:O.string().nullish()}),IS=O.object({reasoning:O.string(),scenario:O.string(),patch:O.null().optional()}),QW=O.object({thoughts:O.string(),evaluation:O.number().min(0).max(10)}),ZW=O.object({observations:O.string(),reasoning:O.string(),command:Nl});var Up=O.object({summary:O.string(),reasoning:O.string(),evaluation:O.discriminatedUnion("type",[O.object({type:O.literal("DONE")}),O.object({type:O.literal("RIGHT_TRACK")}),O.object({type:O.literal("WRONG_TRACK"),feedback:O.string()}),O.object({type:O.literal("IMPOSSIBLE")})])}),XM=O.object({startId:O.number().int(),endId:O.number().int()}),Bp=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(Bp||{}),MS=O.object({categoryThoughts:O.string(),category:O.nativeEnum(Bp),relevantSections:XM.array()});import{z as P}from"zod";import*as ae from"zod";var iq=ae.object({thoughts:ae.string().optional().describe("only provided if a description was provided"),target:zn.optional().describe("only provided if a description was provided"),pageState:ae.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ae.object({label:ae.string(),value:ae.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ae.object({data:ae.string(),height:ae.number().int(),width:ae.number().int()}).optional().describe("only provided if returnScreenshot is true")}),PS=ae.union([ae.literal("ELEMENT_CHECK"),ae.literal("NEGATED_CHECK"),ae.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ae.literal("SELECT_OPTION"),ae.literal("TYPE")]);function Bo(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 rs=(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))(rs||{}),Di=ae.object({matched:ae.boolean(),reason:ae.string().optional().describe("Human understandable description"),logs:ae.string().array().optional().describe("Logs for debugging")}),JM=Di.extend({type:ae.literal("USER_SELECTOR")}),QM=Di.extend({type:ae.literal("CSS_SELECTOR"),selectors:ae.string().array()}),ZM=Di.extend({type:ae.literal("HYBRID_SELECTOR")}),eP=Di.extend({type:ae.literal("HTML_DISTANCE"),distance:ae.number().optional(),closestElement:ae.string().optional(),savedElement:ae.string().optional()}),tP=Di.extend({type:ae.literal("TEMPLATE_MATCHING"),elementImageUrl:ae.string().url()}),rP=Di.extend({type:ae.literal("AUTO_FRAME"),logs:ae.string().array().optional()}),OS=ae.discriminatedUnion("type",[JM,QM,ZM,eP,tP,rP]);import{z as as}from"zod";import{z as gP}from"zod";import*as q from"zod";import{extendZodWithOpenApi as sP}from"zod-openapi";import{cloneDeep as ns}from"lodash-es";import US from"truncate-json";import*as Go from"zod";import{extendZodWithOpenApi as nP}from"zod-openapi";import{z as Ot}from"zod";import{z as ke}from"zod";var zp=ke.object({autoFollowNewTabs:ke.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:ke.union([ke.boolean(),ke.literal("inputs-only")]).optional(),ignoreHrefForCaching:ke.boolean().optional(),disableSecondaryCacheResolution:ke.boolean().optional(),hybridSelectorMode:ke.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:ke.boolean().optional(),visualActions:ke.boolean().optional(),autoExpandIframes:ke.boolean().optional(),disableHtmlSnapshots:ke.boolean().optional(),importantAttributes:ke.string().array().optional(),importantClasses:ke.string().array().optional(),importantStyles:ke.string().array().optional()});var LS=1e4,NS=6e4,zo=zp.extend({pageLoadTimeoutMs:ke.number().optional().refine(r=>r===void 0||r<=NS&&r>=-1,{message:`Page load timeout must be between 0 and ${NS/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:ke.number().optional().refine(r=>r===void 0||r<=LS&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${LS/1e3} seconds`}),localChromeExtensionPaths:ke.string().array().optional(),extraHeaders:ke.record(ke.string(),ke.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:ke.string().optional(),disableGpu:ke.boolean().optional(),bustCacheOnBoundingBoxChange:ke.boolean().optional().describe("Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:ke.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:ke.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.")});var St="BASE_URL",Bl="CURRENT_URL",Ho="ENV_NAME",ki="TEST_NAME",dq={[St]:"https://www.google.com"},DS=Ot.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),kS=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.string().describe("variable value"))}),FS=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.unknown().describe("variable value")),browser:zo.optional()});var pq=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.unknown().describe("variable value"))});nP(Go);var Hp=Go.object({env:Go.record(Go.unknown())}).openapi({ref:"TestContextSnapshot"}),oP="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",iP=[St,Ho,ki],BS=[Bl,St,Ho,ki],Yt=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[St]??"about:blank",o=e.env[Bl]??"about:blank",i=e.env[Ho],a=e.env[ki],l={};for(let[s,u]of Object.entries(e.env))BS.includes(s)||(t??{})[s]===void 0&&(l[s]=u);return new r({baseUrl:n,currentUrl:o,dynamicVariables:l,envName:i,testName:a,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=ns(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){iP.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Ho]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return ns(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>BS.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,oP]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=US(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=US(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Bl]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=ns(e.variablesFromEnvironment),this.setMomenticSystemVariable(St,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Ho,e.envName),e.testName&&this.setMomenticSystemVariable(ki,e.testName)}getDynamicVariablesCopy(){return ns(this.env)}getVariablesFromEnvironmentCopy(){return ns(this.varsFromMomenticEnvironment)}};var we=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(we||{}),zl=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(zl||{});import{z as qr}from"zod";import{extendZodWithOpenApi as aP}from"zod-openapi";aP(qr);var ge=(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))(ge||{});var zS=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Hl={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"},Fi={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."},Gp=qr.object({reason:qr.nativeEnum(ge),previousStepsDescription:qr.array(qr.string()).optional(),summary:qr.string(),rootCause:qr.string().optional()}).openapi({ref:"TestResultClassification"}),Gl=qr.object({errorMessage:qr.string(),errorStack:qr.string().optional(),classification:Gp.optional()}).openapi({ref:"TestFailureDetails"});sP(q);var jp=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),lP=jp.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(zl),message:q.string().optional(),elementInteracted:q.string().optional()}),jo=jp.extend({status:q.nativeEnum(we),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:Hp.optional(),afterTestContext:Hp.optional(),failureReason:q.nativeEnum(ge).optional(),details:q.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"}),Vp=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(Vp||{}),jl=jo.merge(nr).extend({results:lP.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>gt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(Vp),message:q.string()}).optional()}),cP=jo.merge(ko).extend({results:q.lazy(()=>jl.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),uP=jo.merge(Li).extend({results:q.lazy(()=>jl.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),dP=jo.merge(Mr).extend({moduleName:q.string().optional(),results:q.lazy(()=>gt.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),pP=jo.merge(Fo).extend({assertion:jl.optional(),results:q.lazy(()=>gt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>gt.array()).optional()}),mP=jo.merge(es).extend({results:q.lazy(()=>gt.array()),healingAttempts:q.lazy(()=>gt.array().array()).optional(),previousAttempts:q.lazy(()=>gt.array()).optional()}),gt=q.discriminatedUnion("type",[cP,uP,jl,dP,pP,mP]),Vl=jo.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),hP=jp.extend({index:q.number().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),$l=hP.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var $p=gP.object({results:gt.array().describe("main results"),beforeResults:gt.array().optional(),afterResults:gt.array().optional()}),os=$p.partial();import{z as F}from"zod";import{extendZodWithOpenApi as bP}from"zod-openapi";var Ui=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(Ui||{});import{isValidCron as fP}from"cron-validator";import{z as ce}from"zod";import{z as Wp}from"zod";var Tn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(Tn||{});var Wl=Wp.object({width:Wp.number().min(200).max(1e4),height:Wp.number().min(200).max(1e4)}),HS={"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}},zq=Object.keys(HS);var Lt=HS["Desktop Large"],Wn="en-us",qn="America/Los_Angeles";var Kn={latitude:37.7749,longitude:-122.4194};var GS=["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 jS=2e3,ql=zo.extend({browserType:ce.nativeEnum(Tn).optional(),slowMoMs:ce.number().optional().refine(r=>r===void 0||r<=jS&&r>=-1,{message:`Slow motion must be between 0 and ${jS} milliseconds`}),basicAuthorization:ce.object({username:ce.string().optional(),password:ce.string().optional()}).optional(),geolocation:ce.object({latitude:ce.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ce.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ce.boolean().optional(),locale:ce.string().optional(),timezone:ce.enum(GS).optional(),colorScheme:ce.enum(["light","dark"]).optional()}),VS=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],qp=ce.object({useMemory:ce.boolean().optional(),failureRecovery:ce.boolean().optional().describe("undefined means inherit org settings")}),SP=qp.extend({disableAICaching:ce.boolean().optional(),failureRecoveryInstructions:ce.string().optional()}),yP=ce.object({viewport:Wl.optional()}),Vo=yP.merge(SP).merge(ql),Bi=ce.object({cron:ce.string().refine(r=>fP(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ce.boolean().default(!1),env:ce.string().optional(),timeZone:ce.string().default("America/Los_Angeles"),jobKey:ce.string().optional()}),zi=ce.object({onSuccess:ce.boolean().default(!1),failureMessage:ce.string().optional(),onFailure:ce.boolean().default(!0),successMessage:ce.string().optional()}),EP=ce.object({name:ce.string(),required:ce.boolean().optional(),defaultValue:ce.string().describe("this is not optional because we need a value when the editor is first loaded")}),Kl=EP.array(),TP=ce.object({name:ce.string(),value:ce.string()}),$S=TP.array(),Yl=ce.object({name:ce.string(),default:ce.boolean().optional(),fixtures:DS.array().optional()});bP(F);var gr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},Se=(l=>(l.PENDING="PENDING",l.RUNNING="RUNNING",l.PASSED="PASSED",l.FAILED="FAILED",l.CANCELLED="CANCELLED",l.RETRYING="RETRYING",l.WAITING_FOR_USER="WAITING_FOR_USER",l))(Se||{}),Xl=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Xl||{});var lt=F.string().pipe(F.coerce.date()).or(F.date()),is=F.object({id:F.string(),runKey:F.string(),organizationId:F.string(),executionType:F.nativeEnum(Ui).optional().default("WEB"),createdAt:lt,createdBy:F.string(),flake:F.boolean().nullish(),scheduledAt:lt.or(F.null()),startedAt:lt.or(F.null()),updatedAt:lt.nullish(),finishedAt:lt.or(F.null()),resolvedBaseUrl:F.string().nullish(),environmentName:F.string().nullish(),gitBranchName:F.string().nullish(),githubRepository:F.string().nullish(),gitlabProjectPath:F.string().nullish(),labels:F.array(F.string()).optional(),gitOriginUrl:F.string().nullish(),gitCommitSha:F.string().nullish(),gitCommitShaShort:F.string().nullish(),gitCommitAuthorName:F.string().nullish(),cliVersion:F.string().nullish(),section:F.nativeEnum(Xl).nullish(),status:F.nativeEnum(Se),trigger:F.nativeEnum(gr),attempts:F.number(),runAttempts:F.array(F.object({id:F.string(),status:F.nativeEnum(Se),startedAt:lt.or(F.null()),finishedAt:lt.or(F.null())})).optional(),videos:F.array(F.string()).optional(),failureReason:F.nativeEnum(ge).nullish(),failureDetails:Gl.nullish(),failureRecoveryDetails:F.record(F.string(),F.unknown()).nullish(),pipelineId:F.string().nullish(),resolvedInputs:F.record(F.string(),F.string()).nullish(),quarantined:F.boolean().nullish().default(!1),quarantinedReason:F.string().nullish(),localTestId:F.string().nullish(),testId:F.string().nullish(),testName:F.string().nullish(),description:F.string().nullish(),test:F.object({name:F.string(),id:F.string()}).nullish().default(null),suiteId:F.string().nullish()}).openapi({ref:"RunMetadata"}),vP={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Jl=is.pick({...vP,test:!0}),WS=is.omit({failureReason:!0,failureDetails:!0,test:!0}),Kp=is.extend({stepsSnapshot:F.array(F.record(F.unknown())).nullish(),resolvedInputs:F.record(F.string(),F.string()).nullish(),test:F.object({name:F.string(),id:F.string(),description:F.string().nullish(),baseUrl:F.string().nullish(),advanced:Vo.nullish()}).nullish()}).merge($p),qS=r=>r.includes("PASSED")&&r.includes("FAILED");var RP=as.object({id:as.string().uuid(),startedAt:lt.or(as.null()),finishedAt:lt.or(as.null()),status:as.nativeEnum(Se)}).merge(os),lK=RP.array();var Ql=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Ql||{});import{z as ct}from"zod";var wP=ct.object({id:ct.string(),status:ct.nativeEnum(Se),trigger:ct.nativeEnum(gr),createdAt:lt,startedAt:lt.nullish(),finishedAt:lt.nullish(),gitCommitSha:ct.string().nullish(),gitCommitShaShort:ct.string().nullish(),gitCommitTimestamp:lt.nullish(),gitBranchName:ct.string().nullish(),gitOriginUrl:ct.string().nullish(),gitCommitMessage:ct.string().nullish(),gitCommitAuthorName:ct.string().nullish(),githubRepository:ct.string().nullish(),gitlabProjectPath:ct.string().nullish(),pipelineId:ct.string().nullish(),cliVersion:ct.string().nullish(),labels:ct.string().array().optional(),suite:ct.object({id:ct.string(),name:ct.string()}).nullish(),runs:ct.object({status:ct.nativeEnum(Se)}).array()}).openapi({ref:"RunGroup"}),KS=wP.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Jl.array()});import{z as yt}from"zod";var AP=yt.object({type:yt.literal("TARGETING"),name:yt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:OS.array(),pageState:yt.string().optional(),targetSource:yt.nativeEnum(Bn).optional(),targetUpdateTime:yt.string().optional()}),CP=yt.object({type:yt.literal("AI_LOCATION"),matched:yt.boolean(),pageState:yt.string().optional(),ragUsed:yt.boolean().optional(),thoughts:yt.string().optional()}),xP=yt.object({type:yt.literal("ASSERTION"),relevantElementsSerialized:yt.string().array().optional(),pageState:yt.string().optional(),ragUsed:yt.boolean().optional()}),YS=yt.discriminatedUnion("type",[AP,CP,xP]);function Zl(){return{details:[]}}import{z as ot}from"zod";var _P=ot.object({id:ot.string(),name:ot.string()}),vK=_P.merge(ot.object({createdAt:lt,createdBy:ot.string(),schedule:Bi,notification:zi,environment:ot.object({name:ot.string()}).nullish(),beforeTests:ot.object({id:ot.string()}).array().nullish(),afterTests:ot.object({id:ot.string()}).array().nullish()})),XS=ot.object({id:ot.string().uuid(),orgId:ot.string(),createdAt:lt,startedAt:lt.or(ot.null()),finishedAt:lt.or(ot.null()),status:ot.nativeEnum(Se),trigger:ot.nativeEnum(gr),suite:ot.object({id:ot.string(),name:ot.string()}).nullish(),runs:is.array()}),RK=XS.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),JS=XS.extend({runs:Jl.array()});import{z as fr}from"zod";import{cloneDeep as CK}from"lodash-es";import{z as Ae}from"zod";var OK=Ae.object({thoughts:Ae.string(),subGoals:Ae.object({instruction:Ae.string()}).array()}),LK=Ae.object({thoughts:Ae.string(),newPlanMarkdown:Ae.string()}),NK=Ae.object({thoughts:Ae.string(),correct:Ae.boolean(),failedActionIndex:Ae.number().optional()}),IP=Ae.object({type:Ae.literal("PLANNING"),beforePlan:Ae.string(),goalDecision:Ae.string(),thoughts:Ae.string()}),MP=Ae.object({type:Ae.literal("RUNNING"),stepDisplayName:Ae.string(),status:Ae.nativeEnum(we),results:gt.array()}),PP=Ae.object({type:Ae.literal("REVISING"),beforePlan:Ae.string(),afterPlan:Ae.string(),errString:Ae.string(),diffs:Ae.string(),thoughts:Ae.string()}),OP=Ae.object({type:Ae.literal("SYSTEM"),message:Ae.string()}),LP=Ae.discriminatedUnion("type",[IP,MP,PP,OP]),QS=LP.array();var BK=fr.object({id:fr.string(),scheduledAt:fr.coerce.date().nullable(),startedAt:fr.coerce.date().nullable(),finishedAt:fr.coerce.date().nullable(),status:fr.nativeEnum(Se),history:QS.nullable(),testPlan:fr.object({id:fr.string(),name:fr.string()}).nullable(),test:fr.object({id:fr.string(),name:fr.string()}).nullable()});import{z as Vt}from"zod";var Yp=Vt.object({content:Vt.string(),ids:Vt.string().array(),tokenLength:Vt.number()}),NP=Vt.object({chunks:Yp.array()}),r2=Vt.object({ids:Vt.string().array(),score:Vt.number(),tokenLength:Vt.number()}),n2=NP.extend({description:Vt.string().describe("Input to pass to RAG engine"),tokenLimit:Vt.number()}),ZS=Vt.object({ids:Vt.number().array()}),ey=Vt.object({indices:Vt.number().array()});var Nt=P.object({disableCache:P.boolean().optional(),useMemory:P.boolean().optional(),loggerTags:P.record(P.string(),P.string()).optional(),langfuseSessionId:P.string().optional(),agentConfigVersion:P.string().optional()}),d2=Nt.extend({chunks:Yp.array(),description:P.string().describe("Input to pass to AI"),type:P.union([P.literal("locator"),P.literal("assertion"),P.literal("ai-action")]),softTokenLimit:P.number(),hardTokenLimit:P.number()}),DP=P.object({screenshotBase64AfterCommand:P.string(),urlAfterCommand:P.string(),serializedCommand:P.string(),elementInteracted:P.string().optional(),thoughts:P.string().optional()}),ty=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string(),source:PS.optional().catch(void 0),memory:P.discriminatedUnion("type",[xl,P.object({type:P.literal("RESOLVED_TRACES"),traces:P.unknown().array()})]).optional()}),ry=P.object({target:P.string().or(P.number()),browserState:P.string().optional(),screenshot:P.string().optional(),boundingBox:P.object({x:P.number(),y:P.number(),height:P.number(),width:P.number()}).optional()}),ny=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string().optional(),returnSchema:P.string().optional()}),kP=P.literal("NEGATED_CHECK"),oy=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string(),url:P.string(),contextChoice:Rp.optional(),memory:P.discriminatedUnion("type",[hp,P.object({type:P.literal("RESOLVED_TRACES"),traces:P.unknown().array()})]).optional(),source:kP.optional()}),iy=P.object({command:Oi}),ay=P.object({message:P.string()}),Xp=P.object({goal:P.string(),browserState:P.string(),startingScreenshot:P.string().optional(),screenshot:P.string(),url:P.string(),history:DP.array(),actionHint:P.string().optional(),lastError:P.string().optional()}),sy=P.object({results:$l.array(),errorMessage:P.string(),errorStack:P.string().optional()}),ly=P.object({results:$l.array(),goal:P.string(),errorMessage:P.string()}),cy=P.object({failedResults:$l.array(),nextStepsSerialized:P.string().array(),currentUrl:P.string(),currentPageState:P.string(),currentScreenshot:P.string(),customInstructions:P.string().optional(),testDescription:P.string().optional()}),p2=P.object({description:P.string(),type:P.union([P.literal("locator"),P.literal("assertion"),P.literal("ai-action")]),excerpt:P.string()}),uy=P.object({type:P.string(),browserContext:P.string(),currentStep:P.string(),screenshot:P.string()});import{z as ss}from"zod";var g2=ss.object({goal:ss.string()}),dy=ss.object({keywords:ss.array(ss.string())});import{z as Jp}from"zod";var ec=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(ec||{}),y2=Jp.nativeEnum(ec),FP=Jp.enum(["v1","v2"]),E2=FP.or(Jp.string().describe("for people with special configurations"));import{z as je}from"zod";var py=je.object({attributesRequired:je.array(je.string()).optional(),textRequired:je.boolean().optional(),boundsRequired:je.boolean().optional()}),UP=je.object({id:je.number(),thoughts:je.string(),inWebview:je.boolean().optional(),requirements:py.optional(),additionalElements:je.object({id:je.number(),requirements:py}).array().optional()}),my=je.object({description:je.string(),screenXml:je.string(),screenshot:je.string()}),hy=je.object({assertion:je.string(),screenXml:je.string(),screenshot:je.string()}),BP=je.object({thoughts:je.string(),result:je.boolean(),relevantElements:je.array(je.number()).optional()});var gy=r=>!(!r.org_id||!r.user_id||!r.platform);import{z as $o}from"zod";var fy=$o.object({id:$o.string().uuid(),skipped:$o.boolean().optional(),envKey:$o.string().optional().describe("key in the environment to save the result of this step to")}),Qp=fy.merge(_i).extend({type:$o.literal("REQUEST")}),Zp=fy.merge(Ml).extend({type:$o.literal("JAVASCRIPT")}),em=$o.discriminatedUnion("type",[Zp,Qp]);import{z as Sr}from"zod";import{z as Wo}from"zod";var zP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Ie=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 Hi=Wo.string().min(1).max(255).superRefine((r,e)=>{try{Yn(r)}catch(t){return e.addIssue({code:Wo.ZodIssueCode.custom,message:t.message,fatal:!0}),Wo.NEVER}});function Yn(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(zP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var tc=Wo.preprocess(r=>r===null?"":r,Wo.union([Wo.string().url(),Wo.literal("")])).optional();var Sy=Sr.object({id:Sr.string(),name:Hi,description:Sr.string().optional().nullish(),baseUrl:tc.nullish(),schemaVersion:Sr.string(),advanced:Sr.unknown().optional(),retries:Sr.number(),envs:Sr.array(Yl).nullish(),parameters:Kl.nullish()}),HP=Sr.object({createdAt:Sr.coerce.date(),updatedAt:Sr.coerce.date(),schedule:Bi.nullish(),notification:zi.nullish(),createdBy:Sr.string(),organizationId:Sr.string()}),GP=Sy.merge(HP),$2=GP.extend({steps:em.array()}),W2=Sy.extend({steps:em.array()});import{z as Xt}from"zod";var yy=Xt.object({startedAt:Xt.coerce.date(),finishedAt:Xt.coerce.date(),status:Xt.nativeEnum(we),message:Xt.string().optional(),data:Xt.unknown().optional()}),jP=yy.merge(Zp).extend({type:Xt.literal("JAVASCRIPT")}),VP=yy.merge(Qp).extend({type:Xt.literal("REQUEST")}),$P=Xt.discriminatedUnion("type",[jP,VP]),Ey=Xt.object({startedAt:Xt.coerce.date(),finishedAt:Xt.coerce.date().nullish(),status:Xt.nativeEnum(Se),results:$P.array(),failureReason:Xt.string().nullish(),failureDetails:Gl.nullish()});import{z as Jt}from"zod";var WP=Jt.object({id:Jt.string(),organizationId:Jt.string(),createdAt:Jt.coerce.date(),updatedAt:Jt.coerce.date(),createdBy:Jt.string(),scheduledAt:Jt.coerce.date().nullish(),startedAt:Jt.coerce.date().nullish(),finishedAt:Jt.coerce.date().nullish(),status:Jt.nativeEnum(Se),trigger:Jt.nativeEnum(gr),results:Ey.array().nullish(),apiTestName:Jt.string().nullish(),apiTestPath:Jt.string().nullish(),apiTestId:Jt.string().nullish()}),rY=WP.pick({status:!0,startedAt:!0,finishedAt:!0});var ls=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(ls||{}),Ty=3;function qP(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function tm(r){if(!qP(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 rm(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return Ty;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 Gi=class{trackStepExecution(){}async flush(){}};import{parseString as KP,splitCookiesString as YP}from"set-cookie-parser";import{z as xe}from"zod";var nm=xe.object({name:xe.string(),value:xe.string(),url:xe.string().optional(),domain:xe.string().optional(),path:xe.string().optional(),expires:xe.number().default(Date.now()/1e3+60*60*24*365),httpOnly:xe.boolean().optional(),secure:xe.boolean().default(!0),sameSite:xe.union([xe.literal("Strict"),xe.literal("Lax"),xe.literal("None")]).default("None")});function rc(r,e){let t=[],n=YP(r);for(let o of n){let i=KP(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 l=nm.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(l);let c=[l.name,...Object.keys(l)].map(u=>u.toLowerCase()),s=o.match(/\b(\S+)=([^;]*)/g);if(s)for(let u of s){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...l,name:d,value:p})}}return t}var XP=xe.object({origin:xe.string(),localStorage:xe.array(xe.object({name:xe.string(),value:xe.string()}))}),JP=xe.object({entries:xe.record(xe.string(),xe.array(xe.tuple([xe.unknown(),xe.unknown()]))),version:xe.number().optional()}),nc=xe.object({cookies:nm.array().optional(),origins:XP.array().optional(),idb:xe.record(xe.string(),JP).optional().describe("key is db name")});function by(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=nm.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 fO from"zod";import{v4 as AY}from"uuid";import{z}from"zod";import*as Fe from"zod";var vy=Fe.object({requiredText:Fe.string().optional(),requiredAttributes:Fe.record(Fe.string(),Fe.string()).optional(),requiredBounds:Fe.boolean().optional()}),QP=Fe.object({xPath:Fe.string(),requirements:vy.optional()}),ZP=Fe.object({type:Fe.literal("NATIVE"),bounds:Fe.number().array(),resolvedDescription:Fe.string(),xPath:Fe.string(),elementOnlySerializedXml:Fe.string(),requirements:vy.optional(),requiredRelatedElements:QP.array().optional()}),eO=Fe.object({type:Fe.literal("WEBVIEW"),resolvedDescription:Fe.string(),xPath:Fe.string(),browserCache:zn.optional()}),Ry=Fe.discriminatedUnion("type",[ZP,eO]);var ji=(h=>(h.AI_CHECK="AI_CHECK",h.TAP="TAP",h.TYPE="TYPE",h.PRESS="PRESS",h.PRESS_KEYBOARD="PRESS_KEYBOARD",h.OPEN_APP="OPEN_APP",h.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",h.SWIPE="SWIPE",h.JAVASCRIPT="JAVASCRIPT",h.REQUEST="REQUEST",h.WAIT="WAIT",h.ADD_FILE="ADD_FILE",h.ADB="ADB",h.STATE="STATE",h))(ji||{}),wy=(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))(wy||{}),Ay=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(Ay||{}),Cy=z.object({type:z.literal("description"),description:z.string()}),tO=z.object({type:z.literal("coordinates"),xPercent:z.number(),yPercent:z.number()}),xy=z.discriminatedUnion("type",[Cy,tO]),rO=z.object({updatedAt:z.coerce.date().optional()}),Qt=z.object({id:z.string().uuid(),disableCache:z.boolean().optional()}),nO=Qt.extend({type:z.literal("STATE")}),_y=rO.extend({target:Ry}),oO=Qt.extend({type:z.literal("AI_CHECK"),assertion:z.string(),timeoutSecs:z.number().optional()}),om=Qt.extend({type:z.literal("TAP"),target:xy,cache:_y.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()}),im=Qt.extend({type:z.literal("TYPE"),target:xy.optional(),cache:_y.optional(),keyPressDelayMs:z.number().optional(),text:z.string(),clearContent:z.boolean().optional()}),iO=Qt.extend({type:z.literal("PRESS"),key:z.nativeEnum(wy),longPress:z.boolean().optional()}),aO=Qt.extend({type:z.literal("PRESS_KEYBOARD"),key:z.nativeEnum(Ay)}),sO=Qt.extend({type:z.literal("OPEN_APP"),packageName:z.string(),activityName:z.string().optional()}),lO=Qt.extend({type:z.literal("OPEN_NOTIFICATION_DRAWER")}),cO=z.discriminatedUnion("type",[z.object({type:z.literal("SCREEN")}),z.object({type:z.literal("OPEN_APP")}),z.object({type:z.literal("CUSTOM"),target:Cy})]),uO=Qt.extend({type:z.literal("SWIPE"),direction:z.enum(["up","down","left","right"]),scrollableElement:cO,viewportPercent:z.number().optional(),durationMs:z.number().optional()}),dO=Qt.extend({type:z.literal("JAVASCRIPT"),code:z.string(),timeout:z.number().int().max(60).optional().describe("Max seconds for the code to complete")}),pO=Qt.extend({type:z.literal("REQUEST")}).merge(_i),mO=Qt.extend({type:z.literal("WAIT"),timeoutSecs:z.number()}),hO=Qt.extend({type:z.literal("ADB"),command:z.string(),jsonArgs:z.string().optional()}),gO=Qt.extend({type:z.literal("ADD_FILE"),file:z.string(),storageLocation:z.string()}),Iy=z.discriminatedUnion("type",[oO,om,im,iO,sO,lO,aO,uO,dO,pO,mO,gO,hO,nO]);var My={type:!0,cache:!0},Vi=fO.discriminatedUnion("type",[om.pick(My),im.pick(My)]),NY=Object.values(ji).filter(r=>Vi.options.some(e=>e.shape.type.safeParse(r).success));var Py=Qa(Vi),Oy=Za(Vi),DY=Dl(Vi);import{cloneDeep as UY}from"lodash-es";import zY from"truncate-json";var cs=(t=>(t.USWest1="us-west1",t.EUNorth1="eu-north1",t))(cs||{});import ut from"zod";import{z as Pr}from"zod";import{z as Ve}from"zod";var Dt=Ve.object({id:Ve.string(),name:Hi,baseUrl:tc,description:Ve.string().optional().nullish(),schemaVersion:Ve.string(),advanced:Vo,retries:Ve.number(),envs:Ve.array(Yl).nullish(),parameters:Kl.nullish(),disabled:Ve.boolean().optional(),labels:Ve.array(Ve.string()).optional().catch([])}),KY=Ve.enum(["INHERIT","ENABLED","DISABLED"]);var SO=Vo.extend({failureRecovery:Ve.boolean().or(Ve.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:Ve.boolean().or(Ve.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var YY=Dt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:SO}),XY=Dt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),yO=Ve.object({labels:Ve.array(Ve.string()).optional(),outputs:$S.nullish()}),yr=Dt.merge(yO),EO=Ve.object({createdAt:Ve.coerce.date(),updatedAt:Ve.coerce.date(),updatedBy:Ve.string().nullable(),schedule:Bi,notification:zi,createdBy:Ve.string(),organizationId:Ve.string(),folderId:Ve.string().nullable().optional()}),TO=Dt.merge(EO),JY=TO.merge(Ni),oc=Dt.merge(Ni),QY=Dt.merge(Uo);var bO="test",vO="module",RO="mobile-test",wO="mobile-module";var pe=(o=>(o.TEST=`momentic/${bO}`,o.MODULE=`momentic/${vO}`,o.MOBILE_TEST=`momentic/${RO}`,o.MOBILE_MODULE=`momentic/${wO}`,o))(pe||{}),i5=Dt.merge(Uo),am=Kt.extend({steps:Pr.array(Pr.record(Pr.string(),Pr.unknown())),schemaVersion:Pr.string()}),a5=am.extend({fileType:Pr.literal(pe.MODULE)}),s5=Pr.object({test:Pr.string().describe("YAML for the test, including metadata and steps"),modules:Pr.record(Pr.string(),Pr.string()).describe("Map of module name to YAML for the module")});var sm=ut.object({parameterNames:ut.string().array(),defaultParameters:ut.record(ut.string(),ut.string()).optional(),parameterEnums:ut.record(ut.string(),ut.string().array()).optional()}),AO=ut.object({moduleId:ut.string().uuid(),name:ut.string(),description:ut.string().nullish(),parameters:sm.optional(),enabled:ut.boolean().nullish(),schemaVersion:ut.string()}),ic=AO.omit({name:!0}),Ly=ic.extend({steps:ut.array(ut.record(ut.string(),ut.unknown()))}),CO=ut.object({fileType:ut.literal(pe.MOBILE_MODULE)}).merge(Ly);import Zt from"zod";var Xn=(t=>(t.PRESET="MOBILE_PRESET_STEP",t.MODULE="MOBILE_MODULE_STEP",t))(Xn||{}),ac=Zt.object({id:Zt.string().uuid(),envKey:Zt.string().optional(),skipped:Zt.boolean().optional()}),us=ac.extend({type:Zt.literal("MOBILE_PRESET_STEP"),command:Iy,keyPressDelayMs:Zt.number().optional()}),ds=Zt.object({moduleId:Zt.string(),inputs:Zt.record(Zt.string(),Zt.string()).optional(),parameters:sm.optional()}),sc=ac.merge(ds.extend({type:Zt.literal("MOBILE_MODULE_STEP")})),g5=ds.extend({steps:Zt.lazy(()=>qo.array())}),qo=Zt.discriminatedUnion("type",[us,sc]);import dt from"zod";import lc from"zod";var Jn=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Jn||{}),xO=ds.extend({steps:lc.lazy(()=>ps.array()),name:lc.string().describe("name of the module")}),_O=ac.merge(xO).extend({type:lc.literal("RESOLVED_MOBILE_MODULE")}),ps=lc.discriminatedUnion("type",[_O,us]);function Ny(r){return Object.values(Jn).includes(r)||Object.values(Xn).includes(r)}var IO=dt.object({disableMomenticAccessibilityTree:dt.boolean().optional(),autoGrantPermissions:dt.boolean().optional()}),lm=IO.extend({region:dt.nativeEnum(cs).optional()}),ms=dt.object({retries:dt.number().optional().describe("number of retries to run"),defaultChannel:dt.string().optional().describe("default channel to use"),defaultTag:dt.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:dt.string().optional(),emulator:lm.optional()}),hs=dt.object({id:dt.string().uuid(),description:dt.string(),schemaVersion:dt.string(),settings:ms.optional()}),MO=hs.merge(dt.object({steps:dt.array(qo)})),PO=dt.object({fileType:dt.literal(pe.MOBILE_TEST)}).merge(MO),I5=dt.object({name:dt.string(),steps:dt.array(qo).optional(),settings:ms.optional()}),OO=hs.extend({steps:ps.array()});import ye from"zod";var Qn=ye.object({startTime:ye.number(),endTime:ye.number().optional(),durationMs:ye.number().optional(),error:ye.string().optional(),result:ye.unknown().optional(),attributes:ye.record(ye.string(),ye.unknown())});var LO=Qn.extend({type:ye.literal("SECTION"),name:ye.string(),subSpans:ye.lazy(()=>HO.array())}),NO=Qn.extend({type:ye.literal("AI_LOCATOR_CALL"),result:ye.object({id:ye.number(),thoughts:ye.string()}).optional()}),DO=Qn.extend({type:ye.literal("AI_ASSERTION_CALL"),result:ye.object({thoughts:ye.string(),result:ye.boolean()}).optional()}),kO=Qn.extend({type:ye.literal("TARGET_RESOLUTION"),result:ye.object({serializedElement:ye.string()}).optional()}),FO=Qn.extend({type:ye.literal("WAIT_FOR_STABILITY"),reason:ye.string()}),UO=Qn.extend({type:ye.literal("EMULATOR_INTERACTION"),name:ye.string(),withinWebview:ye.boolean().optional()}),BO=Qn.extend({type:ye.literal("EMULATOR_READ_STATE"),name:ye.string()}),zO=Qn.extend({type:ye.literal("GENERIC"),name:ye.string()}),HO=ye.discriminatedUnion("type",[LO,NO,DO,kO,FO,UO,BO,zO]);import Or from"zod";var Dy=Or.object({message:Or.string().optional(),startTime:Or.number(),endTime:Or.number(),status:Or.nativeEnum(we),trace:Or.unknown(),beforeSnapshot:Or.string().optional(),afterSnapshot:Or.string().optional(),data:Or.unknown().optional().describe("output data from the step")}),GO=Dy.merge(us),jO=Dy.merge(sc).extend({steps:Or.lazy(()=>Ko.array())}),Ko=Or.discriminatedUnion("type",[GO,jO]);var o3=new Set(Object.values(Xe));var VO={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},i3={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},a3={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",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."},s3={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",OPEN_APP:"Open app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",ADB:"ADB command",STATE:"Debug state"},l3={AI_CHECK:"Ask AI to verify whether something is true on the screen.",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.",OPEN_APP:"Open an app on the device.",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.",ADB:"Execute an ADB command on the device.",STATE:"Get the debug state of the device."};import $O from"semver";import{z as WO}from"zod";var p3=WO.string().refine(r=>$O.valid(r),{message:"must be a valid semver string"});import{Faker as g3,en as f3}from"@faker-js/faker";import{z as N}from"zod";var $i=55555,y3=N.object({body:N.string(),to:N.string(),from:N.string()}),E3=N.object({from:N.string().optional(),to:N.string(),timeout:N.number().optional(),beforeDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional()}),T3=N.object({to:N.string().email(),from:N.string(),subject:N.string(),body:N.string(),html:N.string().optional()}),b3=N.object({inbox:N.string().transform(r=>r.toLowerCase()),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),timeout:N.number().optional(),trimWhitespace:N.boolean().optional()}),v3=N.object({inbox:N.string(),limit:N.number().optional(),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),trimWhitespace:N.boolean().optional()});var cc=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(cc||{}),ky=N.object({body:N.string().nullish(),status:N.number().optional(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}),qO=N.object({url:N.string(),options:N.object({method:N.string(),body:N.string().nullish(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}).optional()}).optional(),KO=N.object({body:N.string().nullish(),options:N.object({status:N.number(),statusText:N.string().optional(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}).optional()}).optional(),Fy=N.object({result:N.unknown(),variableUpdates:N.record(N.string(),N.unknown()).optional(),persistentVariableUpdates:N.record(N.string(),N.unknown()).optional(),error:N.string().optional(),success:N.boolean()}),R3=N.object({id:N.string().optional(),orgId:N.string(),momenticLambdaAuthHash:N.string(),code:N.string(),fragment:N.boolean(),state:N.object({env:N.record(N.string(),N.unknown()),request:qO,response:KO,additionalBindings:N.record(N.string(),N.unknown()).optional()}),timeoutMs:N.number().optional(),disallowVariableUpdates:N.boolean().optional(),responseSerialization:N.nativeEnum(cc).optional()}),Zn=15e3;import*as kt from"zod";import{extendZodWithOpenApi as YO}from"zod-openapi";YO(kt);var XO=kt.object({url:kt.string(),lineNumber:kt.number(),columnNumber:kt.number()}).openapi({ref:"CodeLocation"}),uc=kt.object({timestamp:kt.number(),text:kt.string(),type:kt.string(),tabIndex:kt.number(),args:kt.unknown().array().optional(),url:kt.string().optional(),location:XO.optional()}).openapi({ref:"ConsoleLog"}),Uy=uc.array(),JO=Uy.array();import*as um from"zod";import{extendZodWithOpenApi as SL}from"zod-openapi";import{z as I}from"zod";var QO=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),ZO=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),eL=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),zy=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:eL,comment:I.string().optional()}),tL=I.array(zy),rL=I.object({name:I.string(),value:I.string(),path:I.string().optional(),domain:I.string().optional(),expires:I.string().optional(),httpOnly:I.boolean().optional(),secure:I.boolean().optional(),comment:I.string().optional()}),Hy=I.array(rL),nL=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Gy=I.array(nL),oL=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),iL=I.array(oL),aL=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),sL=I.array(aL),lL=I.object({mimeType:I.string(),params:sL,text:I.string(),comment:I.string().optional()}),cL=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:Hy,headers:Gy,queryString:iL,postData:lL.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),uL=I.object({size:I.number().optional(),compression:I.number().optional(),mimeType:I.string().optional(),text:I.string().optional(),encoding:I.string().optional(),comment:I.string().optional()}),dL=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:Hy,headers:Gy,content:uL,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional(),_mocked:I.boolean().optional()}),By=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),pL=I.object({beforeRequest:By.optional(),afterRequest:By.optional(),comment:I.string().optional()}),mL=I.object({blocked:I.number().optional(),dns:I.number().optional(),connect:I.number().optional(),send:I.number(),wait:I.number(),receive:I.number(),ssl:I.number().optional(),comment:I.string().optional()}),jy=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:cL,response:dL.optional(),cache:pL.optional(),timings:mL,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),hL=I.array(jy),gL=I.object({version:I.string().default("1.1"),creator:QO.optional(),browser:ZO.optional(),pages:tL.optional(),entries:hL,comment:I.string().optional()}),fL=I.object({log:gL}),Vy=I.record(I.string(),zy),$y=I.record(I.string(),jy);function cm(r,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(r).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}SL(um);var yL=um.object({logsPerPage:uc.array().array(),harPages:Vy.optional(),harEntries:$y.optional()}).openapi({ref:"DebugData"});var gs=class{async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,n,o){}async storeNetworkLogsForRunAttempt(e,t,n,o){}async storeScreenshot(e,t,n){}async storeHtmlSnapshot(e,t,n){}};var Me=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var dc=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function Wy(r){for(let e of Object.values(ge))if(r.includes(e))return e}var C=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(ge))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}}},Wi=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},Kr=class extends Error{decisions;constructor(e,t,n={}){super(e,n),this.decisions=t,this.name="NoElementsFoundUsingCacheError"}toString(){return`${this.message}
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d5908d08-f40c-5cad-a0ac-6a84aa86535a")}catch(e){}}();
|
|
4
|
+
var II=Object.defineProperty;var Ye=(r,e)=>()=>(r&&(e=r(r=0)),e);var MI=(r,e)=>{for(var t in e)II(r,t,{get:e[t],enumerable:!0})};var Av,Cv=Ye(()=>{"use strict";Av=typeof globalThis=="object"?globalThis:global});var xv=Ye(()=>{"use strict";Cv()});var _v=Ye(()=>{"use strict";xv()});var Cn,vh=Ye(()=>{"use strict";Cn="1.9.0"});function f0(r){var e=new Set([r]),t=new Set,n=r.match(Iv);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(l){return t.add(l),!1}function a(l){return e.add(l),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var s=c.match(Iv);if(!s)return i(c);var u={major:+s[1],minor:+s[2],patch:+s[3],prerelease:s[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 Iv,Mv,Pv=Ye(()=>{"use strict";vh();Iv=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;Mv=f0(Cn)});function ha(r,e,t,n){var o;n===void 0&&(n=!1);var i=js[Gs]=(o=js[Gs])!==null&&o!==void 0?o:{version:Cn};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!==Cn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+Cn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+Cn+"."),!0}function xn(r){var e,t,n=(e=js[Gs])===null||e===void 0?void 0:e.version;if(!(!n||!Mv(n)))return(t=js[Gs])===null||t===void 0?void 0:t[r]}function ga(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+Cn+".");var t=js[Gs];t&&delete t[r]}var S0,Gs,js,Vs=Ye(()=>{"use strict";_v();vh();Pv();S0=Cn.split(".")[0],Gs=Symbol.for("opentelemetry.js.api."+S0),js=Av});function $s(r,e,t){var n=xn("diag");if(n)return t.unshift(e),n[r].apply(n,E0([],y0(t),!1))}var y0,E0,Ov,Lv=Ye(()=>{"use strict";Vs();y0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},E0=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))},Ov=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 $s("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $s("verbose",this._namespace,e)},r}()});var Ge,pu=Ye(()=>{"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"})(Ge||(Ge={}))});function Nv(r,e){r<Ge.NONE?r=Ge.NONE:r>Ge.ALL&&(r=Ge.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",Ge.ERROR),warn:t("warn",Ge.WARN),info:t("info",Ge.INFO),debug:t("debug",Ge.DEBUG),verbose:t("verbose",Ge.VERBOSE)}}var Dv=Ye(()=>{"use strict";pu()});var T0,b0,v0,an,Ws=Ye(()=>{"use strict";Lv();Dv();pu();Vs();T0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b0=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))},v0="diag",an=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var l=xn("diag");if(l)return l[o].apply(l,b0([],T0(i),!1))}}var t=this,n=function(o,i){var a,l,c;if(i===void 0&&(i={logLevel:Ge.INFO}),o===t){var s=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=s.stack)!==null&&a!==void 0?a:s.message),!1}typeof i=="number"&&(i={logLevel:i});var u=xn("diag"),d=Nv((l=i.logLevel)!==null&&l!==void 0?l:Ge.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 ha("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ga(v0,t)},t.createComponentLogger=function(o){return new Ov(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 kv,Fv=Ye(()=>{"use strict";kv=Symbol("BaggageEntryMetadata")});function Rh(r){return typeof r!="string"&&(R0.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:kv,toString:function(){return r}}}var R0,Uv=Ye(()=>{"use strict";Ws();Fv();R0=an.instance()});function wh(r){return Symbol.for(r)}var w0,Ah,Ch=Ye(()=>{"use strict";w0=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}(),Ah=new w0});function Ih(){return _h}var li,A0,mu,C0,x0,_0,I0,xh,M0,P0,O0,_h,L0,N0,D0,k0,F0,U0,B0,Mh=Ye(()=>{"use strict";li=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)}}(),A0=function(){function r(){}return r.prototype.createGauge=function(e,t){return N0},r.prototype.createHistogram=function(e,t){return D0},r.prototype.createCounter=function(e,t){return L0},r.prototype.createUpDownCounter=function(e,t){return k0},r.prototype.createObservableGauge=function(e,t){return U0},r.prototype.createObservableCounter=function(e,t){return F0},r.prototype.createObservableUpDownCounter=function(e,t){return B0},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),mu=function(){function r(){}return r}(),C0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(mu),x0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(mu),_0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(mu),I0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(mu),xh=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),M0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),P0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),O0=function(r){li(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(xh),_h=new A0,L0=new C0,N0=new _0,D0=new I0,k0=new x0,F0=new M0,U0=new P0,B0=new O0});var ar,Bv=Ye(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(ar||(ar={}))});var z0,H0,zv,Hv=Ye(()=>{"use strict";Ch();z0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},H0=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))},zv=function(){function r(){}return r.prototype.active=function(){return Ah},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,H0([n],z0(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var G0,j0,Ph,V0,Gv,jv=Ye(()=>{"use strict";Hv();Vs();Ws();G0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},j0=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))},Ph="context",V0=new zv,Gv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return ha(Ph,e,an.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,j0([e,t,n],G0(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return xn(Ph)||V0},r.prototype.disable=function(){this._getContextManager().disable(),ga(Ph,an.instance())},r}()});var fa,Vv=Ye(()=>{"use strict";jv();fa=Gv.getInstance()});var G,$v=Ye(()=>{"use strict";Ws();G=an.instance()});var $0,Wv,qv=Ye(()=>{"use strict";Mh();$0=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return _h},r}(),Wv=new $0});var Oh,Kv,Yv=Ye(()=>{"use strict";qv();Vs();Ws();Oh="metrics",Kv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return ha(Oh,e,an.instance())},r.prototype.getMeterProvider=function(){return xn(Oh)||Wv},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ga(Oh,an.instance())},r}()});var hu,Xv=Ye(()=>{"use strict";Yv();hu=Kv.getInstance()});var Le=Ye(()=>{"use strict";Uv();Ch();pu();Mh();Bv();Vv();$v();Xv()});var Ga=(r,e)=>{},up=!1;try{let r=await import("@sentry/node");Ga=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),up=!0}catch{}import{Command as oV,Option as tr}from"@commander-js/extra-typings";import{execSync as iV}from"child_process";var ja=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;import{existsSync as cN,statSync as uN}from"fs";import{z as rS}from"zod";var EV=rS.object({input:rS.string()});import{z as ht}from"zod";var vV=ht.object({srcs:ht.array(ht.string()),urls:ht.array(ht.string()),desiredSrc:ht.string().optional(),desiredUrl:ht.string().optional()}),nS=ht.object({srcRegex:ht.string().optional(),urlRegex:ht.string().optional()}),oS=ht.object({x:ht.number(),y:ht.number(),correlation:ht.number()}),RV=ht.object({searchImageBase64String:ht.string(),pageImageBase64String:ht.string(),id:ht.string().uuid(),timeoutMs:ht.number().max(1e4).min(0).optional()});import{z as O}from"zod";import*as k from"zod";import{extendZodWithOpenApi as PI}from"zod-openapi";PI(k);var Bn=(l=>(l.AI="AI",l.AI_HEALED="AI_HEALED",l.CLICK_TO_FIND="CLICK_TO_FIND",l.XY_PERCENT="XY_PERCENT",l.RECORDING="RECORDING",l.USER_CSS_SELECTOR="USER_CSS_SELECTOR",l.HEURISTIC_HEALED="HEURISTIC_HEALED",l))(Bn||{}),OI=k.object({mPathSelectorTokens:k.string().array(),frameSrcRegex:k.string().optional(),frameUrlRegex:k.string().optional(),indices:k.number().array()}),dp=k.object({result:k.number(),traceId:k.string()}).array(),xl=k.object({type:k.literal("GCS_TRACES"),traces:dp}),iS=k.object({text:k.string().optional(),attributes:k.record(k.string(),k.string()).optional(),boundingBox:k.object({x:k.number(),y:k.number(),width:k.number(),height:k.number()}).optional()}),LI=k.object({selectors:k.string().array(),requirements:iS.optional()}),zn=k.object({id:k.number().int(),dataMomenticId:k.number().int().optional(),selector:k.string().optional(),hybridSelector:k.object({textContent:k.string().nullish(),attributes:k.record(k.string(),k.string()),tagName:k.string(),expandShadowRoot:k.boolean().optional(),classNames:k.string().array(),nthChild:k.number()}).array().optional(),generatedSelectors:k.string().array().optional(),requirements:iS.optional(),additionalElements:LI.array().optional(),role:k.string().optional(),name:k.string().optional(),numChildren:k.number().optional(),content:k.string().optional(),pathFromRoot:k.string().optional(),serializedHtml:k.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:k.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:k.string().url().optional(),boundingBox:k.object({x:k.number().optional(),y:k.number().optional(),width:k.number(),height:k.number()}).describe("css pixel bounding box").optional(),frameCache:OI.optional(),inputDescription:k.string().optional().describe("the description that generated this cache"),targetSource:k.nativeEnum(Bn).optional(),targetUpdateTime:k.string().optional(),targetUpdateLoggerTags:k.record(k.string(),k.string()).optional(),cacheResolutionUpdateSource:k.string().optional(),cacheResolutionUpdateTime:k.string().optional(),cacheResolutionUpdateLoggerTags:k.record(k.string(),k.string()).optional(),memory:xl.optional()}).openapi({ref:"ElementTargetCache"});function _l(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var NI=k.object({type:k.literal("description"),elementDescriptor:k.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),DI=k.object({x:k.number(),y:k.number()}),kI=k.object({type:k.literal("coordinates"),pixels:DI}).openapi({ref:"CoordinatesTarget"});function Hn(r){return r.type==="description"}function $r(r){return r.type==="coordinates"}var Mt=k.discriminatedUnion("type",[NI,kI]).openapi({ref:"ElementTarget"});function pp(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Pt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.pixels.y}`}}function Il(r){return xl.safeParse(r).success}import{v4 as Re}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as VI}from"zod-openapi";import{z as ie}from"zod";import{extendZodWithOpenApi as FI}from"zod-openapi";import{z as $a}from"zod";import aS from"zod";var Va=aS.object({updatedAt:aS.coerce.date().optional()});var mp=$a.object({result:$a.boolean(),traceId:$a.string()}).array(),hp=$a.object({type:$a.literal("GCS_TRACES"),traces:mp}),gp=Va.extend({memory:hp.optional()});FI(ie);var sS=ie.object({plan:ie.string().optional(),evidence:ie.string().optional(),thoughts:ie.string(),result:ie.boolean(),relevantElements:ie.array(ie.number()).optional(),updatedMemory:mp.optional()}),Gn=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Gn||{});var UI=ie.object({type:ie.literal("ELEMENT_NAME"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),value:ie.string()}).openapi({ref:"ElementNameAssertion"}),BI=ie.object({type:ie.literal("ELEMENT_STYLE"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),property:ie.string(),value:ie.string()}).openapi({ref:"ElementStyleAssertion"}),zI=ie.object({type:ie.literal("ELEMENT_CONTENT"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),value:ie.string()}).openapi({ref:"ElementContentAssertion"}),HI=ie.object({type:ie.literal("ELEMENT_ATTRIBUTE"),negated:ie.boolean().optional(),operation:ie.nativeEnum(Gn),attr:ie.string(),value:ie.string()}).openapi({ref:"ElementAttributeValueAssertion"}),_i=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(_i||{}),GI=ie.object({type:ie.literal("ELEMENT_EXISTENCE"),negated:ie.boolean().optional(),condition:ie.nativeEnum(_i).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),lS=ie.discriminatedUnion("type",[zI,HI,GI,UI,BI]).openapi({ref:"ManualElementAssertion"});var jI=ie.object({type:ie.literal("CONTENT"),negated:ie.boolean().optional(),value:ie.string()}).openapi({ref:"PageContentAssertion"}),cS=ie.discriminatedUnion("type",[jI]).openapi({ref:"ManualPageAssertion"});import Ht from"zod";var fp=Ht.discriminatedUnion("type",[Ht.object({type:Ht.literal("SUBSTRING"),url:Ht.string()}),Ht.object({type:Ht.literal("GLOB"),glob:Ht.string()}),Ht.object({type:Ht.literal("REGEX"),regex:Ht.string()}),Ht.object({type:Ht.literal("DOMAIN"),domain:Ht.string()})]),Wa=Ht.object({urlMatcher:fp,method:Ht.string().optional()});import{z as ve}from"zod";var Ii=ve.object({url:ve.string(),method:ve.union([ve.literal("GET"),ve.literal("POST"),ve.literal("PUT"),ve.literal("DELETE"),ve.literal("PATCH")]),headers:ve.record(ve.string(),ve.string()).optional(),params:ve.record(ve.string(),ve.string()).optional(),body:ve.string().optional(),timeout:ve.number().int().optional().describe("Max seconds to wait for the request to complete")}),uS=ve.object({url:ve.string(),headers:ve.record(ve.string(),ve.string()).optional(),query:ve.string(),variables:ve.string().optional(),timeout:ve.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ml=ve.object({code:ve.string(),fragment:ve.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ve.union([ve.literal("NODE"),ve.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ve.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Xe=($=>($.AI_EXTRACT="AI_EXTRACT",$.AI_ASSERTION="AI_ASSERTION",$.AUTH_LOAD="AUTH_LOAD",$.AUTH_SAVE="AUTH_SAVE",$.BLUR="BLUR",$.CAPTCHA="CAPTCHA",$.CLICK="CLICK",$.COOKIE="COOKIE",$.COPY="COPY",$.DIALOG="DIALOG",$.DRAG="DRAG",$.ELEMENT_CHECK="ELEMENT_CHECK",$.FILE_UPLOAD="FILE_UPLOAD",$.FOCUS="FOCUS",$.GO_BACK="GO_BACK",$.GO_FORWARD="GO_FORWARD",$.HOVER="HOVER",$.JAVASCRIPT="JAVASCRIPT",$.LOCAL_STORAGE="LOCAL_STORAGE",$.MOUSE_DRAG="MOUSE_DRAG",$.NAVIGATE="NAVIGATE",$.NEW_TAB="NEW_TAB",$.PAGE_CHECK="PAGE_CHECK",$.PASTE="PASTE",$.PRESS="PRESS",$.KEY_DOWN="KEY_DOWN",$.KEY_UP="KEY_UP",$.REFRESH="REFRESH",$.REQUEST="REQUEST",$.GRAPHQL_REQUEST="GRAPHQL_REQUEST",$.SCROLL_DOWN="SCROLL_DOWN",$.SCROLL_UP="SCROLL_UP",$.SCROLL_LEFT="SCROLL_LEFT",$.SCROLL_RIGHT="SCROLL_RIGHT",$.SELECT_OPTION="SELECT_OPTION",$.SWITCH_TAB="TAB",$.TYPE="TYPE",$.VISUAL_DIFF="VISUAL_DIFF",$.WAIT="WAIT",$.WAIT_FOR_URL="WAIT_FOR_URL",$.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="SUCCESS",$))(Xe||{});VI(R);var J=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),dr=R.object({useSelector:R.boolean().optional(),force:R.boolean().optional(),disableCache:R.boolean().optional().describe("disable element caching for this step"),iframeUrl:R.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),rr=Va.extend({target:zn}).optional().openapi({ref:"SingleTargetCache"});function dS(r){return rr.safeParse(r).success}var Ol=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),yp=J.merge(Ol).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Ll=dr.merge(R.object({cache:rr})),jn=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Vn=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Mi=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Pi=J.merge(Ll.merge(R.object({target:Mt.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),ZV=R.discriminatedUnion("type",[jn,Vn,Mi,Pi]).openapi({ref:"AllScrollCommands"}),$I=J.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),WI=J.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),qI=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")}),Ep=J.extend({type:R.literal("WAIT_FOR_URL"),matcher:fp}).merge(qI).openapi({ref:"WaitUrlCommand"}),KI=J.merge(Ol).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),YI=J.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),XI=J.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),JI=J.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),QI=J.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"}),Tp=J.merge(dr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),ZI=J.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),eM=J.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),bp=J.merge(Ml).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Po=J.merge(dr).extend({type:R.literal("CLICK"),target:Mt,doubleClick:R.boolean().optional(),rightClick:R.boolean().optional(),waitForDownload:R.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:R.number().optional(),downloadTimeoutMs:R.number().optional(),cache:rr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),vp=Va.extend({fromTarget:zn.optional(),toTarget:zn.optional()}),qa=J.merge(dr).merge(R.object({type:R.literal("DRAG"),fromTarget:Mt,toTarget:Mt,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:vp.optional()})).openapi({ref:"DragCommand"}),Ka=J.merge(dr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:Mt.optional(),deltaX:R.string().describe("pixels to move horizontally, can be template"),deltaY:R.string().describe("pixels to move vertically, can be template"),steps:R.number().optional(),cache:rr})).openapi({ref:"MouseDragCommand"}),Oo=J.merge(dr).merge(R.object({type:R.literal("HOVER"),target:Mt,cache:rr})).openapi({ref:"HoverCommand"}),Ya=J.merge(dr).merge(R.object({type:R.literal("FOCUS"),target:Mt,cache:rr})).openapi({ref:"FocusCommand"}),Xa=J.merge(dr).extend({type:R.literal("BLUR"),target:Mt.optional(),cache:rr}).openapi({ref:"BlurCommand"}),tM=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),rM=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),nM=J.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[tM,rM]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),oM=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()})]),Lo=J.merge(dr).extend({type:R.literal("SELECT_OPTION"),target:Mt,cache:rr,choice:oM.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Rp=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),Oi=J.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Rp.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:gp.optional()})).openapi({ref:"AIAssertionCommand"}),Wr=5,wp=600,No=J.merge(dr).extend({type:R.literal("ELEMENT_CHECK"),target:Mt,assertion:lS,cache:rr.or(gp).optional(),timeout:R.number().int().min(0).max(wp).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Ap=J.extend({type:R.literal("PAGE_CHECK"),assertion:cS,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(wp).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),iM=J.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"}),aM=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()}),pS=25,Do=J.merge(dr).merge(aM).extend({type:R.literal("TYPE"),target:Mt.optional(),value:R.string(),cache:rr}).openapi({ref:"TypeCommand"}),Cp=J.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"}),sM=J.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),lM=J.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),cM=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),uM=R.object({type:R.literal("REGEX"),pattern:R.string()}),dM=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),pM=R.discriminatedUnion("type",[cM,uM,dM]),mM=J.merge(Ol).merge(R.object({type:R.literal("TAB"),action:pM})).openapi({ref:"TabCommand"}),xp=J.merge(Ol).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),hM=J.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),gM=J.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),fM=J.extend({type:R.literal("REQUEST")}).merge(Ii).openapi({ref:"RequestCommand"}),SM=J.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(uS).openapi({ref:"GraphQLRequestCommand"}),yM=J.merge(R.object({type:R.literal("SUCCESS"),condition:Oi.optional()})).openapi({ref:"SuccessCommand"}),EM=J.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),TM=R.object({data:R.string().describe("location at which to find a jpg"),width:R.number(),height:R.number()}),Ja=J.merge(dr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:Mt.optional(),screenshot:TM.optional(),cache:rr})).openapi({ref:"VisualDiffCommand"}),bM=J.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Wa,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),vM=J.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),RM=J.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:Wa,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wM=J.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),AM=J.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:Wa.optional()})).openapi({ref:"SetHeaderCommand"}),CM=J.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:Wa,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"})),xM=J.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"})),_M=J.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),mS=R.discriminatedUnion("type",[Po,Do,Cp,sM,lM,Lo,yp,Vn,jn,Oi,Oo,WI,yM]),IM=R.discriminatedUnion("type",[iM,QI,JI,Tp,hM,ZI,$I,qa,No,nM,YI,XI,bp,gM,Ka,xp,Ap,eM,KI,fM,SM,Mi,Pi,mM,Ja,Ya,Xa,Ep,bM,vM,RM,wM,AM,CM,xM,_M]),Li=R.discriminatedUnion("type",[...mS.options,...IM.options]).openapi({ref:"Command"}),Nl=R.discriminatedUnion("type",[...mS.options,EM]);function yn(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:Re(),type:r};break;case"AUTH_LOAD":{e={id:Re(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Re(),type:r,goal:""};break;case"DIALOG":e={id:Re(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Re(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Re(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Re(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Re(),type:r,delay:1};break;case"BLUR":e={id:Re(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Re(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Re(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Re(),type:r,value:""};break;case"SELECT_OPTION":e={id:Re(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Re(),type:r,url:""};case"TAB":e={id:Re(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Re(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Re(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Re(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Re(),type:r,code:""};break;case"AI_ASSERTION":e={id:Re(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Re(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Re(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Re(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Re(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Re(),type:r,key:""};break}case"SET_HEADER":{e={id:Re(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Re(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Re(),type:r};break}case"OFFLINE_MODE":{e={id:Re(),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 hS(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 MM}from"zod";var o$=MM.discriminatedUnion("type",[Xa,Tp,Po,qa,Ya,Oo,Ka,jn,Vn,Mi,Pi,Lo,Do,Ja,No]);function gS(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as PM}from"zod";import{z as $n}from"zod";function Qa(r){return $n.object({key:$n.string(),testId:$n.string().optional(),moduleId:$n.string().optional(),organizationId:$n.string(),value:r})}function Za(r){return Qa(r).extend({uniqueKey:$n.string()})}function Dl(r){return $n.record($n.string(),Za(r))}var Gt={type:!0,cache:!0},En=PM.discriminatedUnion("type",[Oi.pick(Gt),Xa.pick(Gt),Po.pick(Gt),qa.pick(Gt),No.pick(Gt),Ya.pick(Gt),Oo.pick(Gt),Ka.pick(Gt),jn.pick(Gt),Vn.pick(Gt),Mi.pick(Gt),Pi.pick(Gt),Lo.pick(Gt),Do.pick(Gt),Ja.pick(Gt)]),kl=Object.values(Xe).filter(r=>En.options.some(e=>e.shape.type.safeParse(r).success));Li.options.forEach(r=>{if("target"in r.shape&&!kl.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function fS(r){return kl.includes(r.type)}var SS=Qa(En),yS=Za(En),p$=Dl(En);import{z as _p}from"zod";import{extendZodWithOpenApi as NM}from"zod-openapi";import{z as ES}from"zod";import{extendZodWithOpenApi as OM}from"zod-openapi";import{z as ko}from"zod";var pr=ko.object({index:ko.number().optional().describe("global index within a test (in-order traversal)"),id:ko.string(),skipped:ko.boolean().optional(),envKey:ko.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:ko.boolean().optional(),retries:ko.number().optional()});OM(ES);var LM=pr.extend({type:ES.literal("PRESET_ACTION")}),nr=LM.extend({command:Li}).openapi({ref:"PresetAction"});NM(_p);var Fo=pr.extend({type:_p.literal("AI_ACTION"),text:_p.string(),steps:nr.array().optional()}).openapi({ref:"AIAction"});import{z as jt}from"zod";import{z as Fl}from"zod";import{extendZodWithOpenApi as DM}from"zod-openapi";DM(Fl);var Ni=pr.extend({type:Fl.literal("AI_ACTION_DYNAMIC"),text:Fl.string(),retries:Fl.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as TS}from"zod";var Ip=pr.extend({type:TS.literal("CONDITIONAL"),skipped:TS.boolean().optional()});import{z as he}from"zod";var kM=he.object({cacheKey:he.string(),cacheExpiryMs:he.number()}),Mp=pr.extend({id:he.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:he.record(he.string()).optional(),cacheConfig:kM.optional()}),Mr=Mp.extend({type:he.literal("MODULE"),moduleId:he.string().uuid()}),FM=he.union([Mr.pick({type:!0,moduleId:!0}),he.record(he.unknown())]),UM=he.object({type:he.literal("URL_REGEX"),regex:he.string()}),BM=he.object({type:he.literal("PAGE_CHECK"),substring:he.string()}),Pp=he.object({cacheInvalidation:he.discriminatedUnion("type",[BM,UM]).optional()}),Kt=he.object({moduleId:he.string().uuid(),name:he.string(),description:he.string().nullish(),enabled:he.boolean().nullish(),parameters:he.string().array().nullish(),defaultParameters:he.record(he.string(),he.string()).nullish(),parameterEnums:he.record(he.string(),he.string().array()).nullish(),defaultCacheKey:he.string().nullish(),defaultCacheTtl:he.number().nullish(),defaultCacheAllInvocations:he.boolean().nullish(),autoAuth:he.boolean().nullish(),advanced:Pp.nullish()});var Op=r=>r.type==="AI_ACTION"||r.type==="AI_ACTION_DYNAMIC"||r.type==="PRESET_ACTION";import{z as mr}from"zod";var Lp=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Lp||{});var zM=mr.discriminatedUnion("type",[mr.object({type:mr.literal("NAVIGATE_URL"),url:mr.string().url()}),mr.object({type:mr.literal("GO_TO_SECTION_START")})]),HM=mr.object({trigger:mr.nativeEnum(Lp).optional(),attempts:mr.number().int().optional(),restartBehavior:zM}),es=pr.extend({type:mr.literal("SECTION"),description:mr.string().describe("user provided goal of what the section should accomplish"),plan:mr.string().array().optional(),autohealingConfig:HM.optional()});var bS=Kt.merge(Mp).extend({type:jt.literal("RESOLVED_MODULE"),steps:jt.lazy(()=>tt.array())}),ts=Kt.extend({steps:jt.lazy(()=>tt.array())}),Np=es.extend({steps:jt.lazy(()=>ke.array())}),GM=es.extend({steps:jt.lazy(()=>tt.array())}),Uo=Ip.extend({blocks:jt.object({assertion:jt.lazy(()=>nr),steps:jt.lazy(()=>ke.array())}).array(),elseSteps:jt.lazy(()=>ke.array().optional())}),jM=Ip.extend({blocks:jt.object({assertion:jt.lazy(()=>nr),steps:jt.lazy(()=>tt.array())}).array(),elseSteps:jt.lazy(()=>tt.array().optional())}),ke=jt.discriminatedUnion("type",[nr,Fo,Ni,Mr,Uo,Np]),tt=jt.discriminatedUnion("type",[nr,Fo,Ni,bS,jM,GM]);import{z as hr}from"zod";var VM=hr.object({steps:ke.array(),beforeSteps:ke.array().nullish(),afterSteps:ke.array().nullish()}),Wn=hr.object({steps:tt.array(),beforeSteps:tt.array().nullish(),afterSteps:tt.array().nullish()}),Bo=hr.object({steps:hr.record(hr.string(),hr.unknown()).array(),beforeSteps:hr.record(hr.string(),hr.unknown()).array().nullish(),afterSteps:hr.record(hr.string(),hr.unknown()).array().nullish()});var le="1.0.21";var vS=O.object({phrase:O.string()}),Dp=O.object({thoughts:O.string().optional(),result:O.union([O.literal("NOT_FOUND"),O.string(),O.number(),O.array(O.unknown()),O.record(O.unknown(),O.unknown()),O.unknown()])}),XW=O.object({text:O.string()}),RS=O.object({attributes:O.array(O.string()).optional(),text:O.boolean().optional(),boundingBox:O.boolean().optional()}),$M=O.object({id:O.number().int(),requirements:RS}),WM=$M.array(),wS=O.object({thoughts:O.string(),review:O.string().optional(),id:O.number().int(),updatedMemory:dp.optional(),requirements:RS.optional(),additionalElements:WM.optional()});var Ul=(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))(Ul||{}),kp=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(kp||{});var AS=O.object({thoughts:O.string(),category:O.nativeEnum(Ul)}),CS=O.object({thoughts:O.string(),category:O.nativeEnum(kp)}),qM=O.discriminatedUnion("op",[O.object({op:O.literal("replace"),path:O.string(),value:O.string()}),O.object({op:O.literal("add"),path:O.string(),value:O.string()}),O.object({op:O.literal("remove"),path:O.string()})]),JW=O.object({thoughts:O.string(),patches:qM.array()}),KM=[O.literal("add"),O.literal("replace"),O.literal("remove")],YM=O.object({op:O.union(KM),path:O.string(),value:tt.optional()}),xS=O.object({patches:YM.array(),thoughts:O.string()}),Fp=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Fp||{}),_S=O.object({thoughts:O.string(),scenario:O.nativeEnum(Fp),instructions:O.string().nullish()}),IS=O.object({reasoning:O.string(),scenario:O.string(),patch:O.null().optional()}),QW=O.object({thoughts:O.string(),evaluation:O.number().min(0).max(10)}),ZW=O.object({observations:O.string(),reasoning:O.string(),command:Nl});var Up=O.object({summary:O.string(),reasoning:O.string(),evaluation:O.discriminatedUnion("type",[O.object({type:O.literal("DONE")}),O.object({type:O.literal("RIGHT_TRACK")}),O.object({type:O.literal("WRONG_TRACK"),feedback:O.string()}),O.object({type:O.literal("IMPOSSIBLE")})])}),XM=O.object({startId:O.number().int(),endId:O.number().int()}),Bp=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(Bp||{}),MS=O.object({categoryThoughts:O.string(),category:O.nativeEnum(Bp),relevantSections:XM.array()});import{z as P}from"zod";import*as ae from"zod";var iq=ae.object({thoughts:ae.string().optional().describe("only provided if a description was provided"),target:zn.optional().describe("only provided if a description was provided"),pageState:ae.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ae.object({label:ae.string(),value:ae.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ae.object({data:ae.string(),height:ae.number().int(),width:ae.number().int()}).optional().describe("only provided if returnScreenshot is true")}),PS=ae.union([ae.literal("ELEMENT_CHECK"),ae.literal("NEGATED_CHECK"),ae.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ae.literal("SELECT_OPTION"),ae.literal("TYPE")]);function zo(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 rs=(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))(rs||{}),Di=ae.object({matched:ae.boolean(),reason:ae.string().optional().describe("Human understandable description"),logs:ae.string().array().optional().describe("Logs for debugging")}),JM=Di.extend({type:ae.literal("USER_SELECTOR")}),QM=Di.extend({type:ae.literal("CSS_SELECTOR"),selectors:ae.string().array()}),ZM=Di.extend({type:ae.literal("HYBRID_SELECTOR")}),eP=Di.extend({type:ae.literal("HTML_DISTANCE"),distance:ae.number().optional(),closestElement:ae.string().optional(),savedElement:ae.string().optional()}),tP=Di.extend({type:ae.literal("TEMPLATE_MATCHING"),elementImageUrl:ae.string().url()}),rP=Di.extend({type:ae.literal("AUTO_FRAME"),logs:ae.string().array().optional()}),OS=ae.discriminatedUnion("type",[JM,QM,ZM,eP,tP,rP]);import{z as as}from"zod";import{z as gP}from"zod";import*as q from"zod";import{extendZodWithOpenApi as sP}from"zod-openapi";import{cloneDeep as ns}from"lodash-es";import US from"truncate-json";import*as jo from"zod";import{extendZodWithOpenApi as nP}from"zod-openapi";import{z as Ot}from"zod";import{z as we}from"zod";var zp=we.object({autoFollowNewTabs:we.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:we.union([we.boolean(),we.literal("inputs-only")]).optional(),ignoreHrefForCaching:we.boolean().optional(),disableSecondaryCacheResolution:we.boolean().optional(),hybridSelectorMode:we.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:we.boolean().optional(),visualActions:we.boolean().optional(),autoExpandIframes:we.boolean().optional(),disableHtmlSnapshots:we.boolean().optional(),importantAttributes:we.string().array().optional(),importantClasses:we.string().array().optional(),importantStyles:we.string().array().optional()});var LS=1e4,NS=6e4,Ho=zp.extend({pageLoadTimeoutMs:we.number().optional().refine(r=>r===void 0||r<=NS&&r>=-1,{message:`Page load timeout must be between 0 and ${NS/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:we.number().optional().refine(r=>r===void 0||r<=LS&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${LS/1e3} seconds`}),localChromeExtensionPaths:we.string().array().optional(),extraHeaders:we.record(we.string(),we.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:we.record(we.string(),we.record(we.string(),we.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:we.string().optional(),disableGpu:we.boolean().optional(),bustCacheOnBoundingBoxChange:we.boolean().optional().describe("Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:we.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:we.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.")});var St="BASE_URL",Bl="CURRENT_URL",Go="ENV_NAME",ki="TEST_NAME",dq={[St]:"https://www.google.com"},DS=Ot.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),kS=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.string().describe("variable value"))}),FS=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.unknown().describe("variable value")),browser:Ho.optional()});var pq=Ot.object({name:Ot.string(),variables:Ot.record(Ot.string().describe("variable name"),Ot.unknown().describe("variable value"))});nP(jo);var Hp=jo.object({env:jo.record(jo.unknown())}).openapi({ref:"TestContextSnapshot"}),oP="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",iP=[St,Go,ki],BS=[Bl,St,Go,ki],Yt=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[St]??"about:blank",o=e.env[Bl]??"about:blank",i=e.env[Go],a=e.env[ki],l={};for(let[s,u]of Object.entries(e.env))BS.includes(s)||(t??{})[s]===void 0&&(l[s]=u);return new r({baseUrl:n,currentUrl:o,dynamicVariables:l,envName:i,testName:a,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=ns(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){iP.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Go]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return ns(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>BS.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,oP]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=US(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=US(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Bl]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=ns(e.variablesFromEnvironment),this.setMomenticSystemVariable(St,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Go,e.envName),e.testName&&this.setMomenticSystemVariable(ki,e.testName)}getDynamicVariablesCopy(){return ns(this.env)}getVariablesFromEnvironmentCopy(){return ns(this.varsFromMomenticEnvironment)}};var Ae=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ae||{}),zl=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(zl||{});import{z as qr}from"zod";import{extendZodWithOpenApi as aP}from"zod-openapi";aP(qr);var ge=(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))(ge||{});var zS=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Hl={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"},Fi={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."},Gp=qr.object({reason:qr.nativeEnum(ge),previousStepsDescription:qr.array(qr.string()).optional(),summary:qr.string(),rootCause:qr.string().optional()}).openapi({ref:"TestResultClassification"}),Gl=qr.object({errorMessage:qr.string(),errorStack:qr.string().optional(),classification:Gp.optional()}).openapi({ref:"TestFailureDetails"});sP(q);var jp=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),lP=jp.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(zl),message:q.string().optional(),elementInteracted:q.string().optional()}),Vo=jp.extend({status:q.nativeEnum(Ae),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:Hp.optional(),afterTestContext:Hp.optional(),failureReason:q.nativeEnum(ge).optional(),details:q.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"}),Vp=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(Vp||{}),jl=Vo.merge(nr).extend({results:lP.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>gt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(Vp),message:q.string()}).optional()}),cP=Vo.merge(Fo).extend({results:q.lazy(()=>jl.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),uP=Vo.merge(Ni).extend({results:q.lazy(()=>jl.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),dP=Vo.merge(Mr).extend({moduleName:q.string().optional(),results:q.lazy(()=>gt.array()),previousAttempts:q.lazy(()=>gt.array()).optional()}),pP=Vo.merge(Uo).extend({assertion:jl.optional(),results:q.lazy(()=>gt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>gt.array()).optional()}),mP=Vo.merge(es).extend({results:q.lazy(()=>gt.array()),healingAttempts:q.lazy(()=>gt.array().array()).optional(),previousAttempts:q.lazy(()=>gt.array()).optional()}),gt=q.discriminatedUnion("type",[cP,uP,jl,dP,pP,mP]),Vl=Vo.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),hP=jp.extend({index:q.number().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),$l=hP.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var $p=gP.object({results:gt.array().describe("main results"),beforeResults:gt.array().optional(),afterResults:gt.array().optional()}),os=$p.partial();import{z as F}from"zod";import{extendZodWithOpenApi as bP}from"zod-openapi";var Ui=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(Ui||{});import{isValidCron as fP}from"cron-validator";import{z as ce}from"zod";import{z as Wp}from"zod";var Tn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(Tn||{});var Wl=Wp.object({width:Wp.number().min(200).max(1e4),height:Wp.number().min(200).max(1e4)}),HS={"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}},zq=Object.keys(HS);var Lt=HS["Desktop Large"],qn="en-us",Kn="America/Los_Angeles";var Yn={latitude:37.7749,longitude:-122.4194};var GS=["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 jS=2e3,ql=Ho.extend({browserType:ce.nativeEnum(Tn).optional(),slowMoMs:ce.number().optional().refine(r=>r===void 0||r<=jS&&r>=-1,{message:`Slow motion must be between 0 and ${jS} milliseconds`}),basicAuthorization:ce.object({username:ce.string().optional(),password:ce.string().optional()}).optional(),geolocation:ce.object({latitude:ce.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ce.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ce.boolean().optional(),locale:ce.string().optional(),timezone:ce.enum(GS).optional(),colorScheme:ce.enum(["light","dark"]).optional()}),VS=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],qp=ce.object({useMemory:ce.boolean().optional(),failureRecovery:ce.boolean().optional().describe("undefined means inherit org settings")}),SP=qp.extend({disableAICaching:ce.boolean().optional(),failureRecoveryInstructions:ce.string().optional()}),yP=ce.object({viewport:Wl.optional()}),$o=yP.merge(SP).merge(ql),Bi=ce.object({cron:ce.string().refine(r=>fP(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ce.boolean().default(!1),env:ce.string().optional(),timeZone:ce.string().default("America/Los_Angeles"),jobKey:ce.string().optional()}),zi=ce.object({onSuccess:ce.boolean().default(!1),failureMessage:ce.string().optional(),onFailure:ce.boolean().default(!0),successMessage:ce.string().optional()}),EP=ce.object({name:ce.string(),required:ce.boolean().optional(),defaultValue:ce.string().describe("this is not optional because we need a value when the editor is first loaded")}),Kl=EP.array(),TP=ce.object({name:ce.string(),value:ce.string()}),$S=TP.array(),Yl=ce.object({name:ce.string(),default:ce.boolean().optional(),fixtures:DS.array().optional()});bP(F);var gr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},Se=(l=>(l.PENDING="PENDING",l.RUNNING="RUNNING",l.PASSED="PASSED",l.FAILED="FAILED",l.CANCELLED="CANCELLED",l.RETRYING="RETRYING",l.WAITING_FOR_USER="WAITING_FOR_USER",l))(Se||{}),Xl=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Xl||{});var lt=F.string().pipe(F.coerce.date()).or(F.date()),is=F.object({id:F.string(),runKey:F.string(),organizationId:F.string(),executionType:F.nativeEnum(Ui).optional().default("WEB"),createdAt:lt,createdBy:F.string(),flake:F.boolean().nullish(),scheduledAt:lt.or(F.null()),startedAt:lt.or(F.null()),updatedAt:lt.nullish(),finishedAt:lt.or(F.null()),resolvedBaseUrl:F.string().nullish(),environmentName:F.string().nullish(),gitBranchName:F.string().nullish(),githubRepository:F.string().nullish(),gitlabProjectPath:F.string().nullish(),labels:F.array(F.string()).optional(),gitOriginUrl:F.string().nullish(),gitCommitSha:F.string().nullish(),gitCommitShaShort:F.string().nullish(),gitCommitAuthorName:F.string().nullish(),cliVersion:F.string().nullish(),section:F.nativeEnum(Xl).nullish(),status:F.nativeEnum(Se),trigger:F.nativeEnum(gr),attempts:F.number(),runAttempts:F.array(F.object({id:F.string(),status:F.nativeEnum(Se),startedAt:lt.or(F.null()),finishedAt:lt.or(F.null())})).optional(),videos:F.array(F.string()).optional(),failureReason:F.nativeEnum(ge).nullish(),failureDetails:Gl.nullish(),failureRecoveryDetails:F.record(F.string(),F.unknown()).nullish(),pipelineId:F.string().nullish(),resolvedInputs:F.record(F.string(),F.string()).nullish(),quarantined:F.boolean().nullish().default(!1),quarantinedReason:F.string().nullish(),localTestId:F.string().nullish(),testId:F.string().nullish(),testName:F.string().nullish(),description:F.string().nullish(),test:F.object({name:F.string(),id:F.string()}).nullish().default(null),suiteId:F.string().nullish()}).openapi({ref:"RunMetadata"}),vP={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Jl=is.pick({...vP,test:!0}),WS=is.omit({failureReason:!0,failureDetails:!0,test:!0}),Kp=is.extend({stepsSnapshot:F.array(F.record(F.unknown())).nullish(),resolvedInputs:F.record(F.string(),F.string()).nullish(),test:F.object({name:F.string(),id:F.string(),description:F.string().nullish(),baseUrl:F.string().nullish(),advanced:$o.nullish()}).nullish()}).merge($p),qS=r=>r.includes("PASSED")&&r.includes("FAILED");var RP=as.object({id:as.string().uuid(),startedAt:lt.or(as.null()),finishedAt:lt.or(as.null()),status:as.nativeEnum(Se)}).merge(os),lK=RP.array();var Ql=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Ql||{});import{z as ct}from"zod";var wP=ct.object({id:ct.string(),status:ct.nativeEnum(Se),trigger:ct.nativeEnum(gr),createdAt:lt,startedAt:lt.nullish(),finishedAt:lt.nullish(),gitCommitSha:ct.string().nullish(),gitCommitShaShort:ct.string().nullish(),gitCommitTimestamp:lt.nullish(),gitBranchName:ct.string().nullish(),gitOriginUrl:ct.string().nullish(),gitCommitMessage:ct.string().nullish(),gitCommitAuthorName:ct.string().nullish(),githubRepository:ct.string().nullish(),gitlabProjectPath:ct.string().nullish(),pipelineId:ct.string().nullish(),cliVersion:ct.string().nullish(),labels:ct.string().array().optional(),suite:ct.object({id:ct.string(),name:ct.string()}).nullish(),runs:ct.object({status:ct.nativeEnum(Se)}).array()}).openapi({ref:"RunGroup"}),KS=wP.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Jl.array()});import{z as yt}from"zod";var AP=yt.object({type:yt.literal("TARGETING"),name:yt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:OS.array(),pageState:yt.string().optional(),targetSource:yt.nativeEnum(Bn).optional(),targetUpdateTime:yt.string().optional()}),CP=yt.object({type:yt.literal("AI_LOCATION"),matched:yt.boolean(),pageState:yt.string().optional(),ragUsed:yt.boolean().optional(),thoughts:yt.string().optional()}),xP=yt.object({type:yt.literal("ASSERTION"),relevantElementsSerialized:yt.string().array().optional(),pageState:yt.string().optional(),ragUsed:yt.boolean().optional()}),YS=yt.discriminatedUnion("type",[AP,CP,xP]);function Zl(){return{details:[]}}import{z as ot}from"zod";var _P=ot.object({id:ot.string(),name:ot.string()}),vK=_P.merge(ot.object({createdAt:lt,createdBy:ot.string(),schedule:Bi,notification:zi,environment:ot.object({name:ot.string()}).nullish(),beforeTests:ot.object({id:ot.string()}).array().nullish(),afterTests:ot.object({id:ot.string()}).array().nullish()})),XS=ot.object({id:ot.string().uuid(),orgId:ot.string(),createdAt:lt,startedAt:lt.or(ot.null()),finishedAt:lt.or(ot.null()),status:ot.nativeEnum(Se),trigger:ot.nativeEnum(gr),suite:ot.object({id:ot.string(),name:ot.string()}).nullish(),runs:is.array()}),RK=XS.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),JS=XS.extend({runs:Jl.array()});import{z as fr}from"zod";import{cloneDeep as CK}from"lodash-es";import{z as Ce}from"zod";var OK=Ce.object({thoughts:Ce.string(),subGoals:Ce.object({instruction:Ce.string()}).array()}),LK=Ce.object({thoughts:Ce.string(),newPlanMarkdown:Ce.string()}),NK=Ce.object({thoughts:Ce.string(),correct:Ce.boolean(),failedActionIndex:Ce.number().optional()}),IP=Ce.object({type:Ce.literal("PLANNING"),beforePlan:Ce.string(),goalDecision:Ce.string(),thoughts:Ce.string()}),MP=Ce.object({type:Ce.literal("RUNNING"),stepDisplayName:Ce.string(),status:Ce.nativeEnum(Ae),results:gt.array()}),PP=Ce.object({type:Ce.literal("REVISING"),beforePlan:Ce.string(),afterPlan:Ce.string(),errString:Ce.string(),diffs:Ce.string(),thoughts:Ce.string()}),OP=Ce.object({type:Ce.literal("SYSTEM"),message:Ce.string()}),LP=Ce.discriminatedUnion("type",[IP,MP,PP,OP]),QS=LP.array();var BK=fr.object({id:fr.string(),scheduledAt:fr.coerce.date().nullable(),startedAt:fr.coerce.date().nullable(),finishedAt:fr.coerce.date().nullable(),status:fr.nativeEnum(Se),history:QS.nullable(),testPlan:fr.object({id:fr.string(),name:fr.string()}).nullable(),test:fr.object({id:fr.string(),name:fr.string()}).nullable()});import{z as Vt}from"zod";var Yp=Vt.object({content:Vt.string(),ids:Vt.string().array(),tokenLength:Vt.number()}),NP=Vt.object({chunks:Yp.array()}),r2=Vt.object({ids:Vt.string().array(),score:Vt.number(),tokenLength:Vt.number()}),n2=NP.extend({description:Vt.string().describe("Input to pass to RAG engine"),tokenLimit:Vt.number()}),ZS=Vt.object({ids:Vt.number().array()}),ey=Vt.object({indices:Vt.number().array()});var Nt=P.object({disableCache:P.boolean().optional(),useMemory:P.boolean().optional(),loggerTags:P.record(P.string(),P.string()).optional(),langfuseSessionId:P.string().optional(),agentConfigVersion:P.string().optional()}),d2=Nt.extend({chunks:Yp.array(),description:P.string().describe("Input to pass to AI"),type:P.union([P.literal("locator"),P.literal("assertion"),P.literal("ai-action")]),softTokenLimit:P.number(),hardTokenLimit:P.number()}),DP=P.object({screenshotBase64AfterCommand:P.string(),urlAfterCommand:P.string(),serializedCommand:P.string(),elementInteracted:P.string().optional(),thoughts:P.string().optional()}),ty=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string(),source:PS.optional().catch(void 0),memory:P.discriminatedUnion("type",[xl,P.object({type:P.literal("RESOLVED_TRACES"),traces:P.unknown().array()})]).optional()}),ry=P.object({target:P.string().or(P.number()),browserState:P.string().optional(),screenshot:P.string().optional(),boundingBox:P.object({x:P.number(),y:P.number(),height:P.number(),width:P.number()}).optional()}),ny=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string().optional(),returnSchema:P.string().optional()}),kP=P.literal("NEGATED_CHECK"),oy=P.object({goal:P.string(),browserState:P.string(),screenshot:P.string(),url:P.string(),contextChoice:Rp.optional(),memory:P.discriminatedUnion("type",[hp,P.object({type:P.literal("RESOLVED_TRACES"),traces:P.unknown().array()})]).optional(),source:kP.optional()}),iy=P.object({command:Li}),ay=P.object({message:P.string()}),Xp=P.object({goal:P.string(),browserState:P.string(),startingScreenshot:P.string().optional(),screenshot:P.string(),url:P.string(),history:DP.array(),actionHint:P.string().optional(),lastError:P.string().optional()}),sy=P.object({results:$l.array(),errorMessage:P.string(),errorStack:P.string().optional()}),ly=P.object({results:$l.array(),goal:P.string(),errorMessage:P.string()}),cy=P.object({failedResults:$l.array(),nextStepsSerialized:P.string().array(),currentUrl:P.string(),currentPageState:P.string(),currentScreenshot:P.string(),customInstructions:P.string().optional(),testDescription:P.string().optional()}),p2=P.object({description:P.string(),type:P.union([P.literal("locator"),P.literal("assertion"),P.literal("ai-action")]),excerpt:P.string()}),uy=P.object({type:P.string(),browserContext:P.string(),currentStep:P.string(),screenshot:P.string()});import{z as ss}from"zod";var g2=ss.object({goal:ss.string()}),dy=ss.object({keywords:ss.array(ss.string())});import{z as Jp}from"zod";var ec=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(ec||{}),y2=Jp.nativeEnum(ec),FP=Jp.enum(["v1","v2"]),E2=FP.or(Jp.string().describe("for people with special configurations"));import{z as je}from"zod";var py=je.object({attributesRequired:je.array(je.string()).optional(),textRequired:je.boolean().optional(),boundsRequired:je.boolean().optional()}),UP=je.object({id:je.number(),thoughts:je.string(),inWebview:je.boolean().optional(),requirements:py.optional(),additionalElements:je.object({id:je.number(),requirements:py}).array().optional()}),my=je.object({description:je.string(),screenXml:je.string(),screenshot:je.string()}),hy=je.object({assertion:je.string(),screenXml:je.string(),screenshot:je.string()}),BP=je.object({thoughts:je.string(),result:je.boolean(),relevantElements:je.array(je.number()).optional()});var gy=r=>!(!r.org_id||!r.user_id||!r.platform);import{z as Wo}from"zod";var fy=Wo.object({id:Wo.string().uuid(),skipped:Wo.boolean().optional(),envKey:Wo.string().optional().describe("key in the environment to save the result of this step to")}),Qp=fy.merge(Ii).extend({type:Wo.literal("REQUEST")}),Zp=fy.merge(Ml).extend({type:Wo.literal("JAVASCRIPT")}),em=Wo.discriminatedUnion("type",[Zp,Qp]);import{z as Sr}from"zod";import{z as qo}from"zod";var zP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Me=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 Hi=qo.string().min(1).max(255).superRefine((r,e)=>{try{Xn(r)}catch(t){return e.addIssue({code:qo.ZodIssueCode.custom,message:t.message,fatal:!0}),qo.NEVER}});function Xn(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(zP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var tc=qo.preprocess(r=>r===null?"":r,qo.union([qo.string().url(),qo.literal("")])).optional();var Sy=Sr.object({id:Sr.string(),name:Hi,description:Sr.string().optional().nullish(),baseUrl:tc.nullish(),schemaVersion:Sr.string(),advanced:Sr.unknown().optional(),retries:Sr.number(),envs:Sr.array(Yl).nullish(),parameters:Kl.nullish()}),HP=Sr.object({createdAt:Sr.coerce.date(),updatedAt:Sr.coerce.date(),schedule:Bi.nullish(),notification:zi.nullish(),createdBy:Sr.string(),organizationId:Sr.string()}),GP=Sy.merge(HP),$2=GP.extend({steps:em.array()}),W2=Sy.extend({steps:em.array()});import{z as Xt}from"zod";var yy=Xt.object({startedAt:Xt.coerce.date(),finishedAt:Xt.coerce.date(),status:Xt.nativeEnum(Ae),message:Xt.string().optional(),data:Xt.unknown().optional()}),jP=yy.merge(Zp).extend({type:Xt.literal("JAVASCRIPT")}),VP=yy.merge(Qp).extend({type:Xt.literal("REQUEST")}),$P=Xt.discriminatedUnion("type",[jP,VP]),Ey=Xt.object({startedAt:Xt.coerce.date(),finishedAt:Xt.coerce.date().nullish(),status:Xt.nativeEnum(Se),results:$P.array(),failureReason:Xt.string().nullish(),failureDetails:Gl.nullish()});import{z as Jt}from"zod";var WP=Jt.object({id:Jt.string(),organizationId:Jt.string(),createdAt:Jt.coerce.date(),updatedAt:Jt.coerce.date(),createdBy:Jt.string(),scheduledAt:Jt.coerce.date().nullish(),startedAt:Jt.coerce.date().nullish(),finishedAt:Jt.coerce.date().nullish(),status:Jt.nativeEnum(Se),trigger:Jt.nativeEnum(gr),results:Ey.array().nullish(),apiTestName:Jt.string().nullish(),apiTestPath:Jt.string().nullish(),apiTestId:Jt.string().nullish()}),rY=WP.pick({status:!0,startedAt:!0,finishedAt:!0});var ls=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(ls||{}),Ty=3;function qP(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function tm(r){if(!qP(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 rm(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return Ty;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 Gi=class{trackStepExecution(){}async flush(){}};import{parseString as KP,splitCookiesString as YP}from"set-cookie-parser";import{z as _e}from"zod";var nm=_e.object({name:_e.string(),value:_e.string(),url:_e.string().optional(),domain:_e.string().optional(),path:_e.string().optional(),expires:_e.number().default(Date.now()/1e3+60*60*24*365),httpOnly:_e.boolean().optional(),secure:_e.boolean().default(!0),sameSite:_e.union([_e.literal("Strict"),_e.literal("Lax"),_e.literal("None")]).default("None")});function rc(r,e){let t=[],n=YP(r);for(let o of n){let i=KP(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 l=nm.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(l);let c=[l.name,...Object.keys(l)].map(u=>u.toLowerCase()),s=o.match(/\b(\S+)=([^;]*)/g);if(s)for(let u of s){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...l,name:d,value:p})}}return t}var XP=_e.object({origin:_e.string(),localStorage:_e.array(_e.object({name:_e.string(),value:_e.string()}))}),JP=_e.object({entries:_e.record(_e.string(),_e.array(_e.tuple([_e.unknown(),_e.unknown()]))),version:_e.number().optional()}),nc=_e.object({cookies:nm.array().optional(),origins:XP.array().optional(),idb:_e.record(_e.string(),JP).optional().describe("key is db name")});function by(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=nm.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 fO from"zod";import{v4 as AY}from"uuid";import{z}from"zod";import*as Fe from"zod";var vy=Fe.object({requiredText:Fe.string().optional(),requiredAttributes:Fe.record(Fe.string(),Fe.string()).optional(),requiredBounds:Fe.boolean().optional()}),QP=Fe.object({xPath:Fe.string(),requirements:vy.optional()}),ZP=Fe.object({type:Fe.literal("NATIVE"),bounds:Fe.number().array(),resolvedDescription:Fe.string(),xPath:Fe.string(),elementOnlySerializedXml:Fe.string(),requirements:vy.optional(),requiredRelatedElements:QP.array().optional()}),eO=Fe.object({type:Fe.literal("WEBVIEW"),resolvedDescription:Fe.string(),xPath:Fe.string(),browserCache:zn.optional()}),Ry=Fe.discriminatedUnion("type",[ZP,eO]);var ji=(h=>(h.AI_CHECK="AI_CHECK",h.TAP="TAP",h.TYPE="TYPE",h.PRESS="PRESS",h.PRESS_KEYBOARD="PRESS_KEYBOARD",h.OPEN_APP="OPEN_APP",h.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",h.SWIPE="SWIPE",h.JAVASCRIPT="JAVASCRIPT",h.REQUEST="REQUEST",h.WAIT="WAIT",h.ADD_FILE="ADD_FILE",h.ADB="ADB",h.STATE="STATE",h))(ji||{}),wy=(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))(wy||{}),Ay=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(Ay||{}),Cy=z.object({type:z.literal("description"),description:z.string()}),tO=z.object({type:z.literal("coordinates"),xPercent:z.number(),yPercent:z.number()}),xy=z.discriminatedUnion("type",[Cy,tO]),rO=z.object({updatedAt:z.coerce.date().optional()}),Qt=z.object({id:z.string().uuid(),disableCache:z.boolean().optional()}),nO=Qt.extend({type:z.literal("STATE")}),_y=rO.extend({target:Ry}),oO=Qt.extend({type:z.literal("AI_CHECK"),assertion:z.string(),timeoutSecs:z.number().optional()}),om=Qt.extend({type:z.literal("TAP"),target:xy,cache:_y.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()}),im=Qt.extend({type:z.literal("TYPE"),target:xy.optional(),cache:_y.optional(),keyPressDelayMs:z.number().optional(),text:z.string(),clearContent:z.boolean().optional()}),iO=Qt.extend({type:z.literal("PRESS"),key:z.nativeEnum(wy),longPress:z.boolean().optional()}),aO=Qt.extend({type:z.literal("PRESS_KEYBOARD"),key:z.nativeEnum(Ay)}),sO=Qt.extend({type:z.literal("OPEN_APP"),packageName:z.string(),activityName:z.string().optional()}),lO=Qt.extend({type:z.literal("OPEN_NOTIFICATION_DRAWER")}),cO=z.discriminatedUnion("type",[z.object({type:z.literal("SCREEN")}),z.object({type:z.literal("OPEN_APP")}),z.object({type:z.literal("CUSTOM"),target:Cy})]),uO=Qt.extend({type:z.literal("SWIPE"),direction:z.enum(["up","down","left","right"]),scrollableElement:cO,viewportPercent:z.number().optional(),durationMs:z.number().optional()}),dO=Qt.extend({type:z.literal("JAVASCRIPT"),code:z.string(),timeout:z.number().int().max(60).optional().describe("Max seconds for the code to complete")}),pO=Qt.extend({type:z.literal("REQUEST")}).merge(Ii),mO=Qt.extend({type:z.literal("WAIT"),timeoutSecs:z.number()}),hO=Qt.extend({type:z.literal("ADB"),command:z.string(),jsonArgs:z.string().optional()}),gO=Qt.extend({type:z.literal("ADD_FILE"),file:z.string(),storageLocation:z.string()}),Iy=z.discriminatedUnion("type",[oO,om,im,iO,sO,lO,aO,uO,dO,pO,mO,gO,hO,nO]);var My={type:!0,cache:!0},Vi=fO.discriminatedUnion("type",[om.pick(My),im.pick(My)]),NY=Object.values(ji).filter(r=>Vi.options.some(e=>e.shape.type.safeParse(r).success));var Py=Qa(Vi),Oy=Za(Vi),DY=Dl(Vi);import{cloneDeep as UY}from"lodash-es";import zY from"truncate-json";var cs=(t=>(t.USWest1="us-west1",t.EUNorth1="eu-north1",t))(cs||{});import ut from"zod";import{z as Pr}from"zod";import{z as Ve}from"zod";var Dt=Ve.object({id:Ve.string(),name:Hi,baseUrl:tc,description:Ve.string().optional().nullish(),schemaVersion:Ve.string(),advanced:$o,retries:Ve.number(),envs:Ve.array(Yl).nullish(),parameters:Kl.nullish(),disabled:Ve.boolean().optional(),labels:Ve.array(Ve.string()).optional().catch([])}),KY=Ve.enum(["INHERIT","ENABLED","DISABLED"]);var SO=$o.extend({failureRecovery:Ve.boolean().or(Ve.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:Ve.boolean().or(Ve.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var YY=Dt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:SO}),XY=Dt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),yO=Ve.object({labels:Ve.array(Ve.string()).optional(),outputs:$S.nullish()}),yr=Dt.merge(yO),EO=Ve.object({createdAt:Ve.coerce.date(),updatedAt:Ve.coerce.date(),updatedBy:Ve.string().nullable(),schedule:Bi,notification:zi,createdBy:Ve.string(),organizationId:Ve.string(),folderId:Ve.string().nullable().optional()}),TO=Dt.merge(EO),JY=TO.merge(Wn),oc=Dt.merge(Wn),QY=Dt.merge(Bo);var bO="test",vO="module",RO="mobile-test",wO="mobile-module";var pe=(o=>(o.TEST=`momentic/${bO}`,o.MODULE=`momentic/${vO}`,o.MOBILE_TEST=`momentic/${RO}`,o.MOBILE_MODULE=`momentic/${wO}`,o))(pe||{}),i5=Dt.merge(Bo),am=Kt.extend({steps:Pr.array(Pr.record(Pr.string(),Pr.unknown())),schemaVersion:Pr.string()}),a5=am.extend({fileType:Pr.literal(pe.MODULE)}),s5=Pr.object({test:Pr.string().describe("YAML for the test, including metadata and steps"),modules:Pr.record(Pr.string(),Pr.string()).describe("Map of module name to YAML for the module")});var sm=ut.object({parameterNames:ut.string().array(),defaultParameters:ut.record(ut.string(),ut.string()).optional(),parameterEnums:ut.record(ut.string(),ut.string().array()).optional()}),AO=ut.object({moduleId:ut.string().uuid(),name:ut.string(),description:ut.string().nullish(),parameters:sm.optional(),enabled:ut.boolean().nullish(),schemaVersion:ut.string()}),ic=AO.omit({name:!0}),Ly=ic.extend({steps:ut.array(ut.record(ut.string(),ut.unknown()))}),CO=ut.object({fileType:ut.literal(pe.MOBILE_MODULE)}).merge(Ly);import Zt from"zod";var Jn=(t=>(t.PRESET="MOBILE_PRESET_STEP",t.MODULE="MOBILE_MODULE_STEP",t))(Jn||{}),ac=Zt.object({id:Zt.string().uuid(),envKey:Zt.string().optional(),skipped:Zt.boolean().optional()}),us=ac.extend({type:Zt.literal("MOBILE_PRESET_STEP"),command:Iy,keyPressDelayMs:Zt.number().optional()}),ds=Zt.object({moduleId:Zt.string(),inputs:Zt.record(Zt.string(),Zt.string()).optional(),parameters:sm.optional()}),sc=ac.merge(ds.extend({type:Zt.literal("MOBILE_MODULE_STEP")})),g5=ds.extend({steps:Zt.lazy(()=>Ko.array())}),Ko=Zt.discriminatedUnion("type",[us,sc]);import dt from"zod";import lc from"zod";var Qn=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Qn||{}),xO=ds.extend({steps:lc.lazy(()=>ps.array()),name:lc.string().describe("name of the module")}),_O=ac.merge(xO).extend({type:lc.literal("RESOLVED_MOBILE_MODULE")}),ps=lc.discriminatedUnion("type",[_O,us]);function Ny(r){return Object.values(Qn).includes(r)||Object.values(Jn).includes(r)}var IO=dt.object({disableMomenticAccessibilityTree:dt.boolean().optional(),autoGrantPermissions:dt.boolean().optional()}),lm=IO.extend({region:dt.nativeEnum(cs).optional()}),ms=dt.object({retries:dt.number().optional().describe("number of retries to run"),defaultChannel:dt.string().optional().describe("default channel to use"),defaultTag:dt.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:dt.string().optional(),emulator:lm.optional()}),hs=dt.object({id:dt.string().uuid(),description:dt.string(),schemaVersion:dt.string(),settings:ms.optional()}),MO=hs.merge(dt.object({steps:dt.array(Ko)})),PO=dt.object({fileType:dt.literal(pe.MOBILE_TEST)}).merge(MO),I5=dt.object({name:dt.string(),steps:dt.array(Ko).optional(),settings:ms.optional()}),OO=hs.extend({steps:ps.array()});import ye from"zod";var Zn=ye.object({startTime:ye.number(),endTime:ye.number().optional(),durationMs:ye.number().optional(),error:ye.string().optional(),result:ye.unknown().optional(),attributes:ye.record(ye.string(),ye.unknown())});var LO=Zn.extend({type:ye.literal("SECTION"),name:ye.string(),subSpans:ye.lazy(()=>HO.array())}),NO=Zn.extend({type:ye.literal("AI_LOCATOR_CALL"),result:ye.object({id:ye.number(),thoughts:ye.string()}).optional()}),DO=Zn.extend({type:ye.literal("AI_ASSERTION_CALL"),result:ye.object({thoughts:ye.string(),result:ye.boolean()}).optional()}),kO=Zn.extend({type:ye.literal("TARGET_RESOLUTION"),result:ye.object({serializedElement:ye.string()}).optional()}),FO=Zn.extend({type:ye.literal("WAIT_FOR_STABILITY"),reason:ye.string()}),UO=Zn.extend({type:ye.literal("EMULATOR_INTERACTION"),name:ye.string(),withinWebview:ye.boolean().optional()}),BO=Zn.extend({type:ye.literal("EMULATOR_READ_STATE"),name:ye.string()}),zO=Zn.extend({type:ye.literal("GENERIC"),name:ye.string()}),HO=ye.discriminatedUnion("type",[LO,NO,DO,kO,FO,UO,BO,zO]);import Or from"zod";var Dy=Or.object({message:Or.string().optional(),startTime:Or.number(),endTime:Or.number(),status:Or.nativeEnum(Ae),trace:Or.unknown(),beforeSnapshot:Or.string().optional(),afterSnapshot:Or.string().optional(),data:Or.unknown().optional().describe("output data from the step")}),GO=Dy.merge(us),jO=Dy.merge(sc).extend({steps:Or.lazy(()=>Yo.array())}),Yo=Or.discriminatedUnion("type",[GO,jO]);var o3=new Set(Object.values(Xe));var VO={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},i3={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},a3={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",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."},s3={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",OPEN_APP:"Open app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",ADB:"ADB command",STATE:"Debug state"},l3={AI_CHECK:"Ask AI to verify whether something is true on the screen.",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.",OPEN_APP:"Open an app on the device.",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.",ADB:"Execute an ADB command on the device.",STATE:"Get the debug state of the device."};import $O from"semver";import{z as WO}from"zod";var p3=WO.string().refine(r=>$O.valid(r),{message:"must be a valid semver string"});import{Faker as g3,en as f3}from"@faker-js/faker";import{z as N}from"zod";var $i=55555,y3=N.object({body:N.string(),to:N.string(),from:N.string()}),E3=N.object({from:N.string().optional(),to:N.string(),timeout:N.number().optional(),beforeDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional()}),T3=N.object({to:N.string().email(),from:N.string(),subject:N.string(),body:N.string(),html:N.string().optional()}),b3=N.object({inbox:N.string().transform(r=>r.toLowerCase()),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),timeout:N.number().optional(),trimWhitespace:N.boolean().optional()}),v3=N.object({inbox:N.string(),limit:N.number().optional(),afterDate:N.string().pipe(N.coerce.date()).or(N.date()).optional(),trimWhitespace:N.boolean().optional()});var cc=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(cc||{}),ky=N.object({body:N.string().nullish(),status:N.number().optional(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}),qO=N.object({url:N.string(),options:N.object({method:N.string(),body:N.string().nullish(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}).optional()}).optional(),KO=N.object({body:N.string().nullish(),options:N.object({status:N.number(),statusText:N.string().optional(),headers:N.array(N.tuple([N.string(),N.string()])).optional()}).optional()}).optional(),Fy=N.object({result:N.unknown(),variableUpdates:N.record(N.string(),N.unknown()).optional(),persistentVariableUpdates:N.record(N.string(),N.unknown()).optional(),error:N.string().optional(),success:N.boolean()}),R3=N.object({id:N.string().optional(),orgId:N.string(),momenticLambdaAuthHash:N.string(),code:N.string(),fragment:N.boolean(),state:N.object({env:N.record(N.string(),N.unknown()),request:qO,response:KO,additionalBindings:N.record(N.string(),N.unknown()).optional()}),timeoutMs:N.number().optional(),disallowVariableUpdates:N.boolean().optional(),responseSerialization:N.nativeEnum(cc).optional()}),eo=15e3;import*as kt from"zod";import{extendZodWithOpenApi as YO}from"zod-openapi";YO(kt);var XO=kt.object({url:kt.string(),lineNumber:kt.number(),columnNumber:kt.number()}).openapi({ref:"CodeLocation"}),uc=kt.object({timestamp:kt.number(),text:kt.string(),type:kt.string(),tabIndex:kt.number(),args:kt.unknown().array().optional(),url:kt.string().optional(),location:XO.optional()}).openapi({ref:"ConsoleLog"}),Uy=uc.array(),JO=Uy.array();import*as um from"zod";import{extendZodWithOpenApi as SL}from"zod-openapi";import{z as I}from"zod";var QO=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),ZO=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),eL=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),zy=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:eL,comment:I.string().optional()}),tL=I.array(zy),rL=I.object({name:I.string(),value:I.string(),path:I.string().optional(),domain:I.string().optional(),expires:I.string().optional(),httpOnly:I.boolean().optional(),secure:I.boolean().optional(),comment:I.string().optional()}),Hy=I.array(rL),nL=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Gy=I.array(nL),oL=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),iL=I.array(oL),aL=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),sL=I.array(aL),lL=I.object({mimeType:I.string(),params:sL,text:I.string(),comment:I.string().optional()}),cL=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:Hy,headers:Gy,queryString:iL,postData:lL.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),uL=I.object({size:I.number().optional(),compression:I.number().optional(),mimeType:I.string().optional(),text:I.string().optional(),encoding:I.string().optional(),comment:I.string().optional()}),dL=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:Hy,headers:Gy,content:uL,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional(),_mocked:I.boolean().optional()}),By=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),pL=I.object({beforeRequest:By.optional(),afterRequest:By.optional(),comment:I.string().optional()}),mL=I.object({blocked:I.number().optional(),dns:I.number().optional(),connect:I.number().optional(),send:I.number(),wait:I.number(),receive:I.number(),ssl:I.number().optional(),comment:I.string().optional()}),jy=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:cL,response:dL.optional(),cache:pL.optional(),timings:mL,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),hL=I.array(jy),gL=I.object({version:I.string().default("1.1"),creator:QO.optional(),browser:ZO.optional(),pages:tL.optional(),entries:hL,comment:I.string().optional()}),fL=I.object({log:gL}),Vy=I.record(I.string(),zy),$y=I.record(I.string(),jy);function cm(r,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(r).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}SL(um);var yL=um.object({logsPerPage:uc.array().array(),harPages:Vy.optional(),harEntries:$y.optional()}).openapi({ref:"DebugData"});var gs=class{async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,n,o){}async storeNetworkLogsForRunAttempt(e,t,n,o){}async storeScreenshot(e,t,n){}async storeHtmlSnapshot(e,t,n){}};var Pe=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var dc=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function Wy(r){for(let e of Object.values(ge))if(r.includes(e))return e}var C=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(ge))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}}},Wi=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},Kr=class extends Error{decisions;constructor(e,t,n={}){super(e,n),this.decisions=t,this.name="NoElementsFoundUsingCacheError"}toString(){return`${this.message}
|
|
5
5
|
Decisions:
|
|
6
6
|
${this.decisions.map(e=>e.toString()).join(`
|
|
7
|
-
`)}`}};function qy(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function dm(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 Yr=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},pc=class extends Yr{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},mc=class extends Yr{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function pm(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}function mm(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 hm(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 fs=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as EL}from"lodash-es";import{z as Xr}from"zod";var gm=(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))(gm||{});var Ky=Xr.union([Xr.string(),Xr.number(),Xr.boolean(),Xr.null(),Xr.record(Xr.string(),Xr.lazy(()=>Ky)),Xr.array(Xr.lazy(()=>Ky))]),Ss=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=EL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(gm).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")}},p4=new Ss({},{});var fm={".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"},Yy=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],h4=Object.keys(fm);import*as Xy from"zod";var f4=Xy.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as eo}from"zod";var E4=eo.object({id:eo.string(),name:eo.string(),createdAt:eo.coerce.date(),createdBy:eo.string(),updatedAt:eo.coerce.date(),updatedBy:eo.string().nullable(),organizationId:eo.string()});import{z as L}from"zod";import to from"zod";var qi=to.object({platformSep:to.string(),fullPathSegments:to.string().array(),relativePathSegments:to.string().array(),relativePath:to.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:to.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:to.coerce.date(),createdAt:to.coerce.date()});var TL=L.array(qi.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),bL=L.array(qi.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:ts})),O4=L.object({tests:TL,modules:bL,labels:L.string().array()}),L4=oc.merge(yr),Jy=L.object({schemaVersion:L.string(),stepLists:Ni}),Qy=yr.partial().merge(Dt.pick({id:!0})),Sm={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.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:L.nativeEnum(Tn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Wl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},Zy=L.object(Sm),N4=oc.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),eE=L.object({name:L.string()}),D4=L.object({relativeFilePath:L.string()}),tE=L.object({name:L.string()}),k4=L.object({relativeFilePath:L.string()}),rE=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>tt.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),nE=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var F4=L.array(FS),oE=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),iE=L.object({configFilePath:L.string().describe("full path on disk")}),U4=L.string().array(),B4=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),ym=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),aE=L.object({pathSegments:L.array(L.string())}),z4=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(ym)}),sE=L.object({pathSegments:L.array(L.string())}),lE=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),cE=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),H4=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()});var hc=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],gc=hc.map(r=>`**/${r}/**`),uE=!0,Jr=!1;import Qr from"chalk";import vL from"safe-stable-stringify";import RL from"truncate-json";import wL from"zod";var Ki=vL.configure({deterministic:!1});function dE(r){let e=Ki(r),{jsonString:t}=RL(e,1e4);return t}var AL=["app","version","env","namespace","host"];function Ue(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!AL.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Em=wL.enum(["debug","info","warn","error"]);var ys={debug:20,info:30,warn:40,error:50},Sc={20:"debug",30:"info",40:"warn",50:"error"},Es=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=ys[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}`)}}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[l,c]of a){let s=c;c instanceof Error?(s=c.message,console.log(t(` ${l}:`,s)),console.log(t(" stack:",c.stack))):typeof c=="object"?(s=Ki(c,void 0,2),s=s.split(`
|
|
7
|
+
`)}`}};function qy(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function dm(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 Yr=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},pc=class extends Yr{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},mc=class extends Yr{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function pm(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}function mm(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 hm(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 fs=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as EL}from"lodash-es";import{z as Xr}from"zod";var gm=(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))(gm||{});var Ky=Xr.union([Xr.string(),Xr.number(),Xr.boolean(),Xr.null(),Xr.record(Xr.string(),Xr.lazy(()=>Ky)),Xr.array(Xr.lazy(()=>Ky))]),Ss=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=EL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(gm).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")}},p4=new Ss({},{});var fm={".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"},Yy=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],h4=Object.keys(fm);import*as Xy from"zod";var f4=Xy.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 E4=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 L}from"zod";import ro from"zod";var qi=ro.object({platformSep:ro.string(),fullPathSegments:ro.string().array(),relativePathSegments:ro.string().array(),relativePath:ro.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:ro.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:ro.coerce.date(),createdAt:ro.coerce.date()});var TL=L.array(qi.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),bL=L.array(qi.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:ts})),O4=L.object({tests:TL,modules:bL,labels:L.string().array()}),L4=oc.merge(yr),Jy=L.object({schemaVersion:L.string(),stepLists:Wn}),Qy=yr.partial().merge(Dt.pick({id:!0})),Sm={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.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:L.nativeEnum(Tn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Wl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},Zy=L.object(Sm),N4=oc.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),eE=L.object({name:L.string()}),D4=L.object({relativeFilePath:L.string()}),tE=L.object({name:L.string()}),k4=L.object({relativeFilePath:L.string()}),rE=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>tt.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),nE=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var F4=L.array(FS),oE=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),iE=L.object({configFilePath:L.string().describe("full path on disk")}),U4=L.string().array(),B4=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),ym=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),aE=L.object({pathSegments:L.array(L.string())}),z4=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(ym)}),sE=L.object({pathSegments:L.array(L.string())}),lE=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),cE=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),H4=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()});var hc=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],gc=hc.map(r=>`**/${r}/**`),uE=!0,Jr=!1;import Qr from"chalk";import vL from"safe-stable-stringify";import RL from"truncate-json";import wL from"zod";var Ki=vL.configure({deterministic:!1});function dE(r){let e=Ki(r),{jsonString:t}=RL(e,1e4);return t}var AL=["app","version","env","namespace","host"];function Ue(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!AL.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Em=wL.enum(["debug","info","warn","error"]);var ys={debug:20,info:30,warn:40,error:50},Sc={20:"debug",30:"info",40:"warn",50:"error"},Es=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=ys[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}`)}}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[l,c]of a){let s=c;c instanceof Error?(s=c.message,console.log(t(` ${l}:`,s)),console.log(t(" stack:",c.stack))):typeof c=="object"?(s=Ki(c,void 0,2),s=s.split(`
|
|
8
8
|
`).map((u,d)=>d>0?` ${u}`:u).join(`
|
|
9
9
|
`),console.log(t(` ${l}:`,s))):console.log(t(` ${l}:`,s))}}else if(o)for(let a of o){let l=a;typeof a=="object"&&(l=Ki(a,void 0,2),l=l.split(`
|
|
10
10
|
`).map((c,s)=>s>0?` ${c}`:c).join(`
|
|
11
|
-
`)),console.log(" ",t(l))}}getLevel(){return Sc[this.minLogLevel]}setMinLevel(e){typeof e=="string"?this.minLogLevel=ys[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Qr.reset,...e)}info(...e){this.logWithLevel(30,Qr.white,...e)}debug(...e){this.logWithLevel(20,Qr.dim,...e)}warn(...e){this.logWithLevel(40,Qr.yellow,...e)}error(...e){this.logWithLevel(50,Qr.red,...e)}success(...e){this.logWithLevel(1/0,Qr.green,...e)}dimmed(...e){this.logWithLevel(30,Qr.dim,...e)}underline(...e){this.logWithLevel(40,Qr.underline,...e)}bold(...e){this.logWithLevel(40,Qr.bold,...e)}grey(...e){this.logWithLevel(20,Qr.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},Tm=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}getLevel(){return"error"}flush(){}bindings(){return{}}},Y4=new Tm,CL=typeof window>"u"&&typeof process<"u"&&Em.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Em.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,E=new Es(CL,{}),bn={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>bn,flush:()=>{},bindings:()=>({}),getLevel:()=>"error"},fc={},yc=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let l=fc[e];l?clearTimeout(l.timer):(l={count:0,totalCount:0},fc[e]=l),l.totalCount++,l.count<t&&(l.count++,r.debug(o,i,...a)),l.timer=setTimeout(()=>{let c=fc[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete fc[e]},n)};import{z as Ce}from"zod";var xL=Ce.array(qi.extend({id:Ce.string(),name:Ce.string(),description:Ce.string().optional(),labels:Ce.string().array().optional()})),_L=Ce.array(qi.extend({id:Ce.string(),name:Ce.string(),description:Ce.string().optional(),content:ts})),tX=Ce.object({name:Ce.string(),description:Ce.string().optional(),settings:ms.optional(),pathSegments:Ce.string().array()}),rX=Ce.object({id:Ce.string(),fileName:Ce.string(),fullPath:Ce.string(),relativeFilePath:Ce.string().describe("relative to project root")});var nX=Ce.object({steps:ps.array().optional(),settings:ms.optional()}),oX=Ce.object({message:Ce.literal("ok")}),iX=Ce.object({tag:Ce.string(),channel:Ce.string(),filePath:Ce.string()}),aX=Ce.object({tests:xL,modules:_L,labels:Ce.string().array()}),sX=Ce.object({name:Ce.string(),description:Ce.string(),enabled:Ce.boolean()}).partial();import{z as it}from"zod";var pE=it.object({id:it.string(),createdAt:it.coerce.date(),createdBy:it.string(),organizationId:it.string(),name:it.string(),description:it.string().nullish(),enabled:it.boolean(),schemaVersion:it.string().describe("Schema version for steps"),parameters:it.string().array().nullish().describe("Parameter list"),parameterEnums:it.record(it.string(),it.string().array()).nullish(),defaultParameters:it.record(it.string(),it.string()).nullish(),defaultCacheKey:it.string().nullish(),defaultCacheTtl:it.number().nullish(),defaultCacheAllInvocations:it.boolean().nullish(),autoAuth:it.boolean().nullish(),advanced:Pp.nullish()}),fX=pE.extend({steps:it.lazy(()=>De.array())}),mE=5*60*1e3,bm=Kt.merge(pE.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as EX}from"date-fns-tz";import{z as Be}from"zod";var vm=qp.extend({aiAction:Be.boolean().optional(),stepLintSuggestions:Be.boolean().optional(),agentConfig:Be.record(Be.string(),Be.string()).optional(),aiFailureAnalysis:Be.boolean().optional(),aiPageFiltering:Be.boolean().optional().describe("rag v2 feature flag")}),Rm=Be.object({fakerConstantSeed:Be.boolean().optional()}),hE=Be.object({ai:vm.optional(),githubAppInstallationId:Be.number().nullish(),githubAppSummaryMessageEnabled:Be.boolean().nullish(),githubReleaseAppInstallationId:Be.number().nullish(),gitlabAppAccessToken:Be.string().nullish(),gitlabAppBaseUrl:Be.string().nullish(),qaseAccessToken:Be.string().nullish(),testSuggestionsEnabled:Be.boolean().nullish(),browser:zp.optional(),advanced:Rm.optional()}),AX=Be.object({globalOverrides:Be.record(Be.string()).optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()}),CX=Be.record(Be.string(),Be.string()).nullish();import*as b from"zod";import{z as rt}from"zod";var wm=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(wm||{});var IL=rt.object({type:rt.literal("DESCRIPTION_UPDATE"),thoughts:rt.string()}),Ec=rt.discriminatedUnion("type",[IL]),ML=rt.object({testId:rt.string(),name:rt.string(),orgId:rt.string(),runId:rt.string(),steps:tt.array(),purpose:rt.nativeEnum(wm),details:Ec.or(Ec.array()).optional()});var MX=ML.pick({name:!0,orgId:!0}),PL=rt.object({id:rt.string(),name:rt.string().nullish(),createdAt:rt.string().pipe(rt.coerce.date()).or(rt.date()),organizationId:rt.string(),schemaVersion:rt.string(),runId:rt.string().nullish(),purpose:rt.nativeEnum(wm),details:Ec.or(Ec.array()).optional(),applied:rt.boolean().nullish(),appliedAt:rt.coerce.date().nullish()}),gE=PL.extend({steps:tt.array()});var Tc="x-momentic-cli-version",fE="x-momentic-cli-type",SE="x-momentic-logger-tags",OL="x-momentic-main-branch-name",LL="x-momentic-branch-name",NL="x-momentic-commit-timestamp",DL="x-momentic-last-commit-on-main",kL="x-momentic-last-commit-on-main-timestamp",FL="x-momentic-merged-branch-name",yE="x-momentic-session-id",qX=b.object({error:b.boolean(),reason:b.string(),message:b.string()}),KX=Nt.merge(Xp),EE=Nl,YX=Nt.merge(Xp);var XX=Nt.merge(oy).extend({useConsensus:b.boolean().optional(),attemptNumber:b.number().optional()}),Am=sS,JX=Nt.merge(ay),TE=CS,QX=Nt.merge(iy),bE=AS,ZX=Nt.merge(ty),vE=wS,eJ=Nt.merge(ry),RE=vS,tJ=Nt.merge(ny);var rJ=Nt.merge(uy),nJ=b.object({testPaths:b.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:b.string().optional(),all:b.boolean().optional(),urlOverride:b.string().optional(),customHeaders:b.record(b.string(),b.string()).optional(),testInputMatrix:b.record(b.string(),b.string()).array().optional()}),wE=b.object({queuedTests:b.unknown().array(),runIds:b.string().uuid().array(),runGroupId:b.string().optional()});var oJ=b.string().array(),iJ=b.union([b.object({paths:b.string().array().describe("run specific test paths (e.g. todo-test)"),all:b.boolean().describe("run all tests").optional()}),b.object({path:b.string().describe("deprecated; present for backcompat")})]),AE=b.object({tests:b.record(b.string().describe("Test name"),b.string().describe("Test YAML")),modules:b.record(b.string().describe("Module name"),b.string().describe("Module YAML"))}),UL=b.object({test:b.string().describe("test YAML"),modules:b.record(b.string().describe("moduleId"),b.string().describe("module YAML"))}),aJ=UL.array(),sJ=b.object({testId:b.string(),schemaVersion:b.string()}).merge(Uo);function Cm(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[OL]=encodeURIComponent(e)),t&&(a[LL]=encodeURIComponent(t)),n&&(a[NL]=n.toISOString()),o&&(a[DL]=encodeURIComponent(o)),i&&(a[kL]=i.toISOString()),r.mergedGitBranchName&&(a[FL]=encodeURIComponent(r.mergedGitBranchName)),a}var lJ=b.object({entries:b.array(SS),testId:b.string()}),cJ=b.object({entries:b.array(Py),testId:b.string()}),uJ=b.object({testId:b.string()});function CE(r){return b.record(b.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var xE=CE(yS),_E=CE(Oy),IE=b.object({trigger:b.nativeEnum(gr),status:b.nativeEnum(Se),startedAt:b.coerce.date().optional(),gitCommitSha:b.string().optional(),gitCommitShaShort:b.string().optional(),gitCommitTimestamp:b.coerce.date().optional(),gitBranchName:b.string().optional(),gitOriginUrl:b.string().optional(),gitCommitMessage:b.string().optional(),gitCommitAuthorName:b.string().optional(),githubRepository:b.string().optional(),gitlabProjectPath:b.string().optional(),pipelineId:b.string().optional(),cliVersion:b.string().optional()}),dJ=b.object({id:b.string()}),ME=b.object({status:b.nativeEnum(Se),updatedAt:b.coerce.date().optional(),finishedAt:b.coerce.date().optional()}),PE=b.object({stepsSnapshot:b.array(b.record(b.unknown())).optional(),runGroupId:b.string().optional(),testId:b.string(),testName:b.string(),resolvedBaseUrl:b.string().optional(),environmentName:b.string().optional(),labels:b.array(b.string()).optional(),cliVersion:b.string().optional(),trigger:b.nativeEnum(gr),schemaVersion:b.string().optional(),section:b.nativeEnum(Xl).optional(),resolvedInputs:b.record(b.string(),b.string()).optional(),quarantined:b.boolean().optional().default(!1),quarantinedReason:b.string().optional()}),pJ=b.object({id:b.string()}),BL=Kp.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),OE=BL.array(),LE=Kp.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),mJ=b.object({id:b.string()}),NE=b.object({status:b.nativeEnum(Se),finishedAt:b.coerce.date().optional(),schemaVersion:b.string().optional().default("1.0.19"),results:b.record(b.string(),b.unknown()).array().optional(),beforeResults:b.record(b.string(),b.unknown()).array().optional(),afterResults:b.record(b.string(),b.unknown()).array().optional()}),hJ=b.object({screenshot:b.string()}),DE=b.object({key:b.string()}),kE=b.object({orgId:b.string(),userId:b.string()}),FE=b.array(kS),gJ=b.record(b.string(),b.union([b.string(),b.boolean()])),fJ=b.object({paths:b.string().array(),env:b.string().optional(),urlOverride:b.string().optional(),customHeaders:b.record(b.string(),b.string()).optional()}),UE=b.object({suiteRunIds:b.string().array(),runGroupIds:b.string().array()}),SJ=b.object({suiteRunIds:b.string().array()}),yJ=JS.array(),EJ=b.object({runGroupIds:b.string().array()}),zL=b.object({uploadUrl:b.string()}),TJ=Nt.merge(sy),bJ=Nt.merge(cy),vJ=Nt.merge(ly),HL=b.object({testId:b.string().optional().default(""),testName:b.string().optional().default(""),suiteId:b.string().optional().default(""),suiteName:b.string().optional().default(""),creditsUsed:b.number().optional()}),GL=b.object({transactionId:b.string(),timestamp:b.string(),event:b.nativeEnum(ls),properties:HL}),RJ=GL.array(),BE=gE.omit({steps:!0}).extend({steps:b.array(b.record(b.string(),b.unknown())).describe("unparsed ResolvedStep[]")}),wJ=b.object({limit:b.number().max(10).optional(),afterTime:b.number().optional()}),zE=WS.array(),AJ=b.object({applied:b.boolean().optional(),appliedAt:b.coerce.date().optional()}),HE=zL.extend({id:b.string()}),CJ=b.object({runGroupId:b.string().uuid().optional()}),GE=b.object({runGroupId:b.string().uuid()}),jE=b.object({quarantined:b.object({testId:b.string().uuid(),quarantinedAt:b.coerce.date(),quarantinedBy:b.string().optional(),quarantinedReason:b.string()}).array()}),xJ=b.object({testId:b.string().uuid(),testName:b.string().optional(),reason:b.string(),gitLocalUsername:b.string().optional(),gitLocalEmail:b.string().optional(),gitLocalName:b.string().optional()}),_J=b.object({testName:b.string().optional(),reason:b.string().optional(),gitLocalUsername:b.string().optional(),gitLocalEmail:b.string().optional(),gitLocalName:b.string().optional()}),IJ=Nt.merge(my),MJ=Nt.merge(hy),PJ=b.object({apkToInstall:b.object({channel:b.string(),tag:b.string().optional()}).optional(),hostname:b.string().optional(),region:b.nativeEnum(cs).optional()}),VE=b.object({name:b.string(),webRtcUrl:b.string(),adbUrl:b.string(),token:b.string(),apkDownloadUrl:b.string().optional(),region:b.string().optional()}),OJ=b.object({channel:b.string(),tag:b.string(),md5:b.string()}),$E=b.object({id:b.string(),uploadUrl:b.string().optional(),downloadUrl:b.string(),md5:b.string().optional()}),WE=b.object({assets:b.array(b.object({channel:b.string(),tag:b.string(),md5:b.string(),createdAt:b.number().describe("Unix timestamp in milliseconds")}))});import{z as ee}from"zod";var jL=3,DJ=ee.object({localTestId:ee.string(),quarantinedAt:ee.date(),quarantinedBy:ee.string().optional(),quarantinedReason:ee.string(),quarantinedByGitEmail:ee.string().optional(),quarantinedByGitName:ee.string().optional(),quarantinedByGitUsername:ee.string().optional()}).or(ee.object({cloudTestId:ee.string(),quarantinedAt:ee.date(),quarantinedBy:ee.string().optional(),quarantinedReason:ee.string(),quarantinedByGitEmail:ee.string().optional(),quarantinedByGitName:ee.string().optional(),quarantinedByGitUsername:ee.string().optional()})),qE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(qE||{});var xm=ee.object({name:ee.string(),description:ee.string().nullish(),effect:ee.nativeEnum(qE),labels:ee.array(ee.string()),githubRepository:ee.string().nullish(),gitlabProjectPath:ee.string().nullish(),gitBranchName:ee.string().nullish()}),VL=ee.object({type:ee.literal("LAST_N_RUNS"),lastN:ee.number().min(jL).max(10)}),$L=ee.object({type:ee.literal("LAST_N_HOURS"),lastN:ee.number().min(1).max(24)}),WL=ee.object({type:ee.literal("LAST_N_DAYS"),lastN:ee.number().min(1).max(7)}),_m=ee.discriminatedUnion("type",[VL,$L,WL]),qL=ee.object({flakeRateThreshold:ee.number().min(1).max(100),evaluationWindow:_m}),KL=xm.extend({type:ee.literal("FLAKE_RATE"),config:qL}),YL=ee.object({passRateThreshold:ee.number().min(1).max(100),evaluationWindow:_m}),XL=xm.extend({type:ee.literal("PASS_RATE"),config:YL}),JL=ee.object({failureCountThreshold:ee.number().min(0),evaluationWindow:_m}),QL=xm.extend({type:ee.literal("FAILURE_COUNT"),config:JL}),kJ=ee.discriminatedUnion("type",[KL,XL,QL]);import{z as at}from"zod";var BJ=at.object({repositoriesIndexed:at.boolean(),indexingInProgress:at.boolean(),indexesOutdated:at.boolean()}),KE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(KE||{}),YE=(l=>(l.Success="success",l.Failure="failure",l.Neutral="neutral",l.Cancelled="cancelled",l.Skipped="skipped",l.TimedOut="timed_out",l.ActionRequired="action_required",l))(YE||{}),zJ=at.object({name:at.string(),status:at.nativeEnum(KE),conclusion:at.nativeEnum(YE).nullable()}),Ts=at.object({sha:at.string(),message:at.string(),author:at.object({name:at.string().optional(),email:at.string().optional(),date:at.coerce.date().optional()}),committer:at.object({name:at.string().optional(),email:at.string().optional(),date:at.coerce.date().optional()})}),Im=at.object({mergedBranch:at.string().optional()});import{z as $e}from"zod";var XE=$e.object({orgId:$e.string(),cacheKeys:$e.string().array()}),jJ=$e.object({keyParams:XE,clientMetadata:$e.string(),lockAcquisitionTimeoutMs:$e.number().optional()}),JE=$e.object({acquired:$e.boolean(),acquiredByMetadata:$e.string(),keyPrefix:$e.string()}),VJ=$e.object({keyPrefix:$e.string(),result:$e.string(),ttlMs:$e.number()}),$J=$e.union([$e.object({keyPrefix:$e.string()}),XE]),ZL=$e.object({remainingTtlMs:$e.number(),value:$e.string().nullish()}),WJ=$e.object({results:$e.record($e.string(),ZL),activeLocks:$e.string().array()}),QE=0,ZE=5*60*1e3;var XJ=90*24*60*60*1e3,JJ=7*24*60*60*1e3;import{z as eT}from"zod";var e8=eT.object({quarantineNotifications:eT.string().nullish()});import{z as Rt}from"zod";var eN=Rt.object({version:Rt.string(),json:Rt.record(Rt.unknown()),hash:Rt.string()}),tT=Rt.record(Rt.unknown()),o8=Rt.object({newSvgs:Rt.array(eN),metadata:tT.optional()}),tN=Rt.object({version:Rt.string(),json:Rt.record(Rt.unknown()).nullish(),hash:Rt.string(),description:Rt.string().nullish(),metadata:tT.nullish()}),rT=Rt.record(Rt.string().describe("icon hash"),tN);import{z as Je}from"zod";var Mm=Je.object({assertion:Je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),rN=Je.object({instruction:Je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Mm.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),nT=rN.extend({subSteps:Je.lazy(()=>nT.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),oT=Je.object({name:Je.string().describe("Short name describing the test plan"),description:Je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),iT=oT.extend({id:Je.string(),createdAt:Je.coerce.date(),updatedAt:Je.coerce.date(),updatedBy:Je.string(),createdBy:Je.string(),test:Je.object({id:Je.string(),name:Je.string()}).nullish().transform(r=>r??void 0)}),l8=iT.extend({testGenRuns:Je.tuple([]).or(Je.tuple([Je.object({id:Je.string(),startedAt:Je.coerce.date(),status:Je.nativeEnum(Se)})]))}),aT=Je.object({preConditions:Mm.array().nullish().transform(r=>r??[]),postConditions:Mm.array().nullish().transform(r=>r??[]),steps:nT.array().nullish().transform(r=>r??[])}),c8=iT.extend({plan:aT.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),nN=oT.extend({plan:aT.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),u8=nN.array().nullish().transform(r=>r??[]);import{validator as oN}from"@exodus/schemasafe";function sT(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{oN(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var lT=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as x8}from"zod";var bc=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};var Om="browser-crash-dump.zip",Pm=class{loggerBindings;getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}recordStepDuration(){}async finish(){}async startSubSteps(){return new bs}},bs=class{getParentStepIdChain(){return[]}async getScreenshot(){}async getHtmlSnapshot(){}async startStep(){return new Pm}};import{z as Lm}from"zod";var F8=Lm.object({parentStepIdChain:Lm.array(Lm.string()),result:Ko});import{z as Z}from"zod";var iN=Z.object({step:tt,status:Z.nativeEnum(we),startedAt:Z.coerce.date(),finishedAt:Z.coerce.date().optional(),healMetadata:Z.object({healType:Z.nativeEnum(rs).or(Z.literal("AI")),healedAt:Z.coerce.date()}).optional(),beforeSnapshotId:Z.string().uuid().optional(),afterSnapshotId:Z.string().uuid().optional(),message:Z.string().optional()}),aN=iN.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),W8=aN.extend({step:Z.unknown()}),cT="1.0.0",Nm=NE.extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),runAttemptSchemaVersion:Z.string().optional(),schemaVersion:Z.string().optional().default("1.0.19"),results:Z.record(Z.string(),Z.unknown()).array().optional(),beforeResults:Z.record(Z.string(),Z.unknown()).array().optional(),afterResults:Z.record(Z.string(),Z.unknown()).array().optional()}),uT=Nm.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),q8=Nm.merge(os),K8=uT.merge(os),dT=Z.object({results:Z.array(Ko),beforeResults:Z.array(Ko).optional(),afterResults:Z.array(Ko).optional()}),Y8=Nm.merge(dT),X8=uT.merge(dT),sN=LE.merge(PE).extend({executionType:Z.nativeEnum(Ui).optional().default("WEB"),testId:Z.string().uuid(),testDescription:Z.string().optional(),runGroupId:Z.string().uuid(),status:Z.nativeEnum(Se),startedAt:Z.coerce.date(),attempts:Z.number(),failureRecoveryDetails:Z.record(Z.unknown()).optional()}),J8=sN.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),lN=IE.merge(ME).extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),cliVersion:Z.string(),labels:Z.string().array().optional().default([])}),vs=lN.extend({updatedAt:Z.coerce.date().optional().transform(r=>r??new Date),finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)});function pT(r){try{return cN(r)&&uN(r).isDirectory()}catch(e){return E.error({err:e},`Error reading path ${r} during directory existence check`),!1}}import{confirm as wN,input as AN}from"@inquirer/prompts";import{existsSync as CN,mkdirSync as xN,statSync as _N}from"fs";import{dirname as IN}from"path";import Zr,{supportsColor as vN}from"chalk";import{Console as mT}from"console";import{format as Rs}from"util";var Dm=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},vc=class r extends mT{_buffer=[];_groupDepth=0;Console=mT;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new Dm(void 0,r.write).stack;if(!i)return e;let a=i.split(`
|
|
11
|
+
`)),console.log(" ",t(l))}}getLevel(){return Sc[this.minLogLevel]}setMinLevel(e){typeof e=="string"?this.minLogLevel=ys[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Qr.reset,...e)}info(...e){this.logWithLevel(30,Qr.white,...e)}debug(...e){this.logWithLevel(20,Qr.dim,...e)}warn(...e){this.logWithLevel(40,Qr.yellow,...e)}error(...e){this.logWithLevel(50,Qr.red,...e)}success(...e){this.logWithLevel(1/0,Qr.green,...e)}dimmed(...e){this.logWithLevel(30,Qr.dim,...e)}underline(...e){this.logWithLevel(40,Qr.underline,...e)}bold(...e){this.logWithLevel(40,Qr.bold,...e)}grey(...e){this.logWithLevel(20,Qr.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},Tm=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}getLevel(){return"error"}flush(){}bindings(){return{}}},Y4=new Tm,CL=typeof window>"u"&&typeof process<"u"&&Em.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Em.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,T=new Es(CL,{}),bn={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>bn,flush:()=>{},bindings:()=>({}),getLevel:()=>"error"},fc={},yc=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let l=fc[e];l?clearTimeout(l.timer):(l={count:0,totalCount:0},fc[e]=l),l.totalCount++,l.count<t&&(l.count++,r.debug(o,i,...a)),l.timer=setTimeout(()=>{let c=fc[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete fc[e]},n)};import{z as xe}from"zod";var xL=xe.array(qi.extend({id:xe.string(),name:xe.string(),description:xe.string().optional(),labels:xe.string().array().optional()})),_L=xe.array(qi.extend({id:xe.string(),name:xe.string(),description:xe.string().optional(),content:ts})),tX=xe.object({name:xe.string(),description:xe.string().optional(),settings:ms.optional(),pathSegments:xe.string().array()}),rX=xe.object({id:xe.string(),fileName:xe.string(),fullPath:xe.string(),relativeFilePath:xe.string().describe("relative to project root")});var nX=xe.object({steps:ps.array().optional(),settings:ms.optional()}),oX=xe.object({message:xe.literal("ok")}),iX=xe.object({tag:xe.string(),channel:xe.string(),filePath:xe.string()}),aX=xe.object({tests:xL,modules:_L,labels:xe.string().array()}),sX=xe.object({name:xe.string(),description:xe.string(),enabled:xe.boolean()}).partial();import{z as it}from"zod";var pE=it.object({id:it.string(),createdAt:it.coerce.date(),createdBy:it.string(),organizationId:it.string(),name:it.string(),description:it.string().nullish(),enabled:it.boolean(),schemaVersion:it.string().describe("Schema version for steps"),parameters:it.string().array().nullish().describe("Parameter list"),parameterEnums:it.record(it.string(),it.string().array()).nullish(),defaultParameters:it.record(it.string(),it.string()).nullish(),defaultCacheKey:it.string().nullish(),defaultCacheTtl:it.number().nullish(),defaultCacheAllInvocations:it.boolean().nullish(),autoAuth:it.boolean().nullish(),advanced:Pp.nullish()}),fX=pE.extend({steps:it.lazy(()=>ke.array())}),mE=5*60*1e3,bm=Kt.merge(pE.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as EX}from"date-fns-tz";import{z as Be}from"zod";var vm=qp.extend({aiAction:Be.boolean().optional(),stepLintSuggestions:Be.boolean().optional(),agentConfig:Be.record(Be.string(),Be.string()).optional(),aiFailureAnalysis:Be.boolean().optional(),aiPageFiltering:Be.boolean().optional().describe("rag v2 feature flag")}),Rm=Be.object({fakerConstantSeed:Be.boolean().optional()}),hE=Be.object({ai:vm.optional(),githubAppInstallationId:Be.number().nullish(),githubAppSummaryMessageEnabled:Be.boolean().nullish(),githubReleaseAppInstallationId:Be.number().nullish(),gitlabAppAccessToken:Be.string().nullish(),gitlabAppBaseUrl:Be.string().nullish(),qaseAccessToken:Be.string().nullish(),testSuggestionsEnabled:Be.boolean().nullish(),browser:zp.optional(),advanced:Rm.optional()}),AX=Be.object({globalOverrides:Be.record(Be.string()).optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()}),CX=Be.record(Be.string(),Be.string()).nullish();import*as b from"zod";import{z as rt}from"zod";var wm=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(wm||{});var IL=rt.object({type:rt.literal("DESCRIPTION_UPDATE"),thoughts:rt.string()}),Ec=rt.discriminatedUnion("type",[IL]),ML=rt.object({testId:rt.string(),name:rt.string(),orgId:rt.string(),runId:rt.string(),steps:tt.array(),purpose:rt.nativeEnum(wm),details:Ec.or(Ec.array()).optional()});var MX=ML.pick({name:!0,orgId:!0}),PL=rt.object({id:rt.string(),name:rt.string().nullish(),createdAt:rt.string().pipe(rt.coerce.date()).or(rt.date()),organizationId:rt.string(),schemaVersion:rt.string(),runId:rt.string().nullish(),purpose:rt.nativeEnum(wm),details:Ec.or(Ec.array()).optional(),applied:rt.boolean().nullish(),appliedAt:rt.coerce.date().nullish()}),gE=PL.extend({steps:tt.array()});var Tc="x-momentic-cli-version",fE="x-momentic-cli-type",SE="x-momentic-logger-tags",OL="x-momentic-main-branch-name",LL="x-momentic-branch-name",NL="x-momentic-commit-timestamp",DL="x-momentic-last-commit-on-main",kL="x-momentic-last-commit-on-main-timestamp",FL="x-momentic-merged-branch-name",yE="x-momentic-session-id",qX=b.object({error:b.boolean(),reason:b.string(),message:b.string()}),KX=Nt.merge(Xp),EE=Nl,YX=Nt.merge(Xp);var XX=Nt.merge(oy).extend({useConsensus:b.boolean().optional(),attemptNumber:b.number().optional()}),Am=sS,JX=Nt.merge(ay),TE=CS,QX=Nt.merge(iy),bE=AS,ZX=Nt.merge(ty),vE=wS,eJ=Nt.merge(ry),RE=vS,tJ=Nt.merge(ny);var rJ=Nt.merge(uy),nJ=b.object({testPaths:b.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:b.string().optional(),all:b.boolean().optional(),urlOverride:b.string().optional(),customHeaders:b.record(b.string(),b.string()).optional(),testInputMatrix:b.record(b.string(),b.string()).array().optional()}),wE=b.object({queuedTests:b.unknown().array(),runIds:b.string().uuid().array(),runGroupId:b.string().optional()});var oJ=b.string().array(),iJ=b.union([b.object({paths:b.string().array().describe("run specific test paths (e.g. todo-test)"),all:b.boolean().describe("run all tests").optional()}),b.object({path:b.string().describe("deprecated; present for backcompat")})]),AE=b.object({tests:b.record(b.string().describe("Test name"),b.string().describe("Test YAML")),modules:b.record(b.string().describe("Module name"),b.string().describe("Module YAML"))}),UL=b.object({test:b.string().describe("test YAML"),modules:b.record(b.string().describe("moduleId"),b.string().describe("module YAML"))}),aJ=UL.array(),sJ=b.object({testId:b.string(),schemaVersion:b.string()}).merge(Bo);function Cm(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[OL]=encodeURIComponent(e)),t&&(a[LL]=encodeURIComponent(t)),n&&(a[NL]=n.toISOString()),o&&(a[DL]=encodeURIComponent(o)),i&&(a[kL]=i.toISOString()),r.mergedGitBranchName&&(a[FL]=encodeURIComponent(r.mergedGitBranchName)),a}var lJ=b.object({entries:b.array(SS),testId:b.string()}),cJ=b.object({entries:b.array(Py),testId:b.string()}),uJ=b.object({testId:b.string()});function CE(r){return b.record(b.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var xE=CE(yS),_E=CE(Oy),IE=b.object({trigger:b.nativeEnum(gr),status:b.nativeEnum(Se),startedAt:b.coerce.date().optional(),gitCommitSha:b.string().optional(),gitCommitShaShort:b.string().optional(),gitCommitTimestamp:b.coerce.date().optional(),gitBranchName:b.string().optional(),gitOriginUrl:b.string().optional(),gitCommitMessage:b.string().optional(),gitCommitAuthorName:b.string().optional(),githubRepository:b.string().optional(),gitlabProjectPath:b.string().optional(),pipelineId:b.string().optional(),cliVersion:b.string().optional()}),dJ=b.object({id:b.string()}),ME=b.object({status:b.nativeEnum(Se),updatedAt:b.coerce.date().optional(),finishedAt:b.coerce.date().optional()}),PE=b.object({stepsSnapshot:b.array(b.record(b.unknown())).optional(),runGroupId:b.string().optional(),testId:b.string(),testName:b.string(),resolvedBaseUrl:b.string().optional(),environmentName:b.string().optional(),labels:b.array(b.string()).optional(),cliVersion:b.string().optional(),trigger:b.nativeEnum(gr),schemaVersion:b.string().optional(),section:b.nativeEnum(Xl).optional(),resolvedInputs:b.record(b.string(),b.string()).optional(),quarantined:b.boolean().optional().default(!1),quarantinedReason:b.string().optional()}),pJ=b.object({id:b.string()}),BL=Kp.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),OE=BL.array(),LE=Kp.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),mJ=b.object({id:b.string()}),NE=b.object({status:b.nativeEnum(Se),finishedAt:b.coerce.date().optional(),schemaVersion:b.string().optional().default("1.0.19"),results:b.record(b.string(),b.unknown()).array().optional(),beforeResults:b.record(b.string(),b.unknown()).array().optional(),afterResults:b.record(b.string(),b.unknown()).array().optional()}),hJ=b.object({screenshot:b.string()}),DE=b.object({key:b.string()}),kE=b.object({orgId:b.string(),userId:b.string()}),FE=b.array(kS),gJ=b.record(b.string(),b.union([b.string(),b.boolean()])),fJ=b.object({paths:b.string().array(),env:b.string().optional(),urlOverride:b.string().optional(),customHeaders:b.record(b.string(),b.string()).optional()}),UE=b.object({suiteRunIds:b.string().array(),runGroupIds:b.string().array()}),SJ=b.object({suiteRunIds:b.string().array()}),yJ=JS.array(),EJ=b.object({runGroupIds:b.string().array()}),zL=b.object({uploadUrl:b.string()}),TJ=Nt.merge(sy),bJ=Nt.merge(cy),vJ=Nt.merge(ly),HL=b.object({testId:b.string().optional().default(""),testName:b.string().optional().default(""),suiteId:b.string().optional().default(""),suiteName:b.string().optional().default(""),creditsUsed:b.number().optional()}),GL=b.object({transactionId:b.string(),timestamp:b.string(),event:b.nativeEnum(ls),properties:HL}),RJ=GL.array(),BE=gE.omit({steps:!0}).extend({steps:b.array(b.record(b.string(),b.unknown())).describe("unparsed ResolvedStep[]")}),wJ=b.object({limit:b.number().max(10).optional(),afterTime:b.number().optional()}),zE=WS.array(),AJ=b.object({applied:b.boolean().optional(),appliedAt:b.coerce.date().optional()}),HE=zL.extend({id:b.string()}),CJ=b.object({runGroupId:b.string().uuid().optional()}),GE=b.object({runGroupId:b.string().uuid()}),jE=b.object({quarantined:b.object({testId:b.string().uuid(),quarantinedAt:b.coerce.date(),quarantinedBy:b.string().optional(),quarantinedReason:b.string()}).array()}),xJ=b.object({testId:b.string().uuid(),testName:b.string().optional(),reason:b.string(),gitLocalUsername:b.string().optional(),gitLocalEmail:b.string().optional(),gitLocalName:b.string().optional()}),_J=b.object({testName:b.string().optional(),reason:b.string().optional(),gitLocalUsername:b.string().optional(),gitLocalEmail:b.string().optional(),gitLocalName:b.string().optional()}),IJ=Nt.merge(my),MJ=Nt.merge(hy),PJ=b.object({apkToInstall:b.object({channel:b.string(),tag:b.string().optional()}).optional(),hostname:b.string().optional(),region:b.nativeEnum(cs).optional()}),VE=b.object({name:b.string(),webRtcUrl:b.string(),adbUrl:b.string(),token:b.string(),apkDownloadUrl:b.string().optional(),region:b.string().optional()}),OJ=b.object({channel:b.string(),tag:b.string(),md5:b.string()}),$E=b.object({id:b.string(),uploadUrl:b.string().optional(),downloadUrl:b.string(),md5:b.string().optional()}),WE=b.object({assets:b.array(b.object({channel:b.string(),tag:b.string(),md5:b.string(),createdAt:b.number().describe("Unix timestamp in milliseconds")}))});import{z as ee}from"zod";var jL=3,DJ=ee.object({localTestId:ee.string(),quarantinedAt:ee.date(),quarantinedBy:ee.string().optional(),quarantinedReason:ee.string(),quarantinedByGitEmail:ee.string().optional(),quarantinedByGitName:ee.string().optional(),quarantinedByGitUsername:ee.string().optional()}).or(ee.object({cloudTestId:ee.string(),quarantinedAt:ee.date(),quarantinedBy:ee.string().optional(),quarantinedReason:ee.string(),quarantinedByGitEmail:ee.string().optional(),quarantinedByGitName:ee.string().optional(),quarantinedByGitUsername:ee.string().optional()})),qE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(qE||{});var xm=ee.object({name:ee.string(),description:ee.string().nullish(),effect:ee.nativeEnum(qE),labels:ee.array(ee.string()),githubRepository:ee.string().nullish(),gitlabProjectPath:ee.string().nullish(),gitBranchName:ee.string().nullish()}),VL=ee.object({type:ee.literal("LAST_N_RUNS"),lastN:ee.number().min(jL).max(10)}),$L=ee.object({type:ee.literal("LAST_N_HOURS"),lastN:ee.number().min(1).max(24)}),WL=ee.object({type:ee.literal("LAST_N_DAYS"),lastN:ee.number().min(1).max(7)}),_m=ee.discriminatedUnion("type",[VL,$L,WL]),qL=ee.object({flakeRateThreshold:ee.number().min(1).max(100),evaluationWindow:_m}),KL=xm.extend({type:ee.literal("FLAKE_RATE"),config:qL}),YL=ee.object({passRateThreshold:ee.number().min(1).max(100),evaluationWindow:_m}),XL=xm.extend({type:ee.literal("PASS_RATE"),config:YL}),JL=ee.object({failureCountThreshold:ee.number().min(0),evaluationWindow:_m}),QL=xm.extend({type:ee.literal("FAILURE_COUNT"),config:JL}),kJ=ee.discriminatedUnion("type",[KL,XL,QL]);import{z as at}from"zod";var BJ=at.object({repositoriesIndexed:at.boolean(),indexingInProgress:at.boolean(),indexesOutdated:at.boolean()}),KE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(KE||{}),YE=(l=>(l.Success="success",l.Failure="failure",l.Neutral="neutral",l.Cancelled="cancelled",l.Skipped="skipped",l.TimedOut="timed_out",l.ActionRequired="action_required",l))(YE||{}),zJ=at.object({name:at.string(),status:at.nativeEnum(KE),conclusion:at.nativeEnum(YE).nullable()}),Ts=at.object({sha:at.string(),message:at.string(),author:at.object({name:at.string().optional(),email:at.string().optional(),date:at.coerce.date().optional()}),committer:at.object({name:at.string().optional(),email:at.string().optional(),date:at.coerce.date().optional()})}),Im=at.object({mergedBranch:at.string().optional()});import{z as $e}from"zod";var XE=$e.object({orgId:$e.string(),cacheKeys:$e.string().array()}),jJ=$e.object({keyParams:XE,clientMetadata:$e.string(),lockAcquisitionTimeoutMs:$e.number().optional()}),JE=$e.object({acquired:$e.boolean(),acquiredByMetadata:$e.string(),keyPrefix:$e.string()}),VJ=$e.object({keyPrefix:$e.string(),result:$e.string(),ttlMs:$e.number()}),$J=$e.union([$e.object({keyPrefix:$e.string()}),XE]),ZL=$e.object({remainingTtlMs:$e.number(),value:$e.string().nullish()}),WJ=$e.object({results:$e.record($e.string(),ZL),activeLocks:$e.string().array()}),QE=0,ZE=5*60*1e3;var XJ=90*24*60*60*1e3,JJ=7*24*60*60*1e3;import{z as eT}from"zod";var e8=eT.object({quarantineNotifications:eT.string().nullish()});import{z as Rt}from"zod";var eN=Rt.object({version:Rt.string(),json:Rt.record(Rt.unknown()),hash:Rt.string()}),tT=Rt.record(Rt.unknown()),o8=Rt.object({newSvgs:Rt.array(eN),metadata:tT.optional()}),tN=Rt.object({version:Rt.string(),json:Rt.record(Rt.unknown()).nullish(),hash:Rt.string(),description:Rt.string().nullish(),metadata:tT.nullish()}),rT=Rt.record(Rt.string().describe("icon hash"),tN);import{z as Je}from"zod";var Mm=Je.object({assertion:Je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),rN=Je.object({instruction:Je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Mm.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),nT=rN.extend({subSteps:Je.lazy(()=>nT.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),oT=Je.object({name:Je.string().describe("Short name describing the test plan"),description:Je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),iT=oT.extend({id:Je.string(),createdAt:Je.coerce.date(),updatedAt:Je.coerce.date(),updatedBy:Je.string(),createdBy:Je.string(),test:Je.object({id:Je.string(),name:Je.string()}).nullish().transform(r=>r??void 0)}),l8=iT.extend({testGenRuns:Je.tuple([]).or(Je.tuple([Je.object({id:Je.string(),startedAt:Je.coerce.date(),status:Je.nativeEnum(Se)})]))}),aT=Je.object({preConditions:Mm.array().nullish().transform(r=>r??[]),postConditions:Mm.array().nullish().transform(r=>r??[]),steps:nT.array().nullish().transform(r=>r??[])}),c8=iT.extend({plan:aT.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),nN=oT.extend({plan:aT.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),u8=nN.array().nullish().transform(r=>r??[]);import{validator as oN}from"@exodus/schemasafe";function sT(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{oN(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var lT=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as x8}from"zod";var bc=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};var Om="browser-crash-dump.zip",Pm=class{loggerBindings;getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}recordStepDuration(){}async finish(){}async startSubSteps(){return new bs}},bs=class{getParentStepIdChain(){return[]}async getScreenshot(){}async getHtmlSnapshot(){}async startStep(){return new Pm}};import{z as Lm}from"zod";var F8=Lm.object({parentStepIdChain:Lm.array(Lm.string()),result:Yo});import{z as Z}from"zod";var iN=Z.object({step:tt,status:Z.nativeEnum(Ae),startedAt:Z.coerce.date(),finishedAt:Z.coerce.date().optional(),healMetadata:Z.object({healType:Z.nativeEnum(rs).or(Z.literal("AI")),healedAt:Z.coerce.date()}).optional(),beforeSnapshotId:Z.string().uuid().optional(),afterSnapshotId:Z.string().uuid().optional(),message:Z.string().optional()}),aN=iN.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),W8=aN.extend({step:Z.unknown()}),cT="1.0.0",Nm=NE.extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),runAttemptSchemaVersion:Z.string().optional(),schemaVersion:Z.string().optional().default("1.0.19"),results:Z.record(Z.string(),Z.unknown()).array().optional(),beforeResults:Z.record(Z.string(),Z.unknown()).array().optional(),afterResults:Z.record(Z.string(),Z.unknown()).array().optional()}),uT=Nm.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),q8=Nm.merge(os),K8=uT.merge(os),dT=Z.object({results:Z.array(Yo),beforeResults:Z.array(Yo).optional(),afterResults:Z.array(Yo).optional()}),Y8=Nm.merge(dT),X8=uT.merge(dT),sN=LE.merge(PE).extend({executionType:Z.nativeEnum(Ui).optional().default("WEB"),testId:Z.string().uuid(),testDescription:Z.string().optional(),runGroupId:Z.string().uuid(),status:Z.nativeEnum(Se),startedAt:Z.coerce.date(),attempts:Z.number(),failureRecoveryDetails:Z.record(Z.unknown()).optional()}),J8=sN.extend({finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)}),lN=IE.merge(ME).extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),cliVersion:Z.string(),labels:Z.string().array().optional().default([])}),vs=lN.extend({updatedAt:Z.coerce.date().optional().transform(r=>r??new Date),finishedAt:Z.coerce.date().optional().transform(r=>r??new Date)});function pT(r){try{return cN(r)&&uN(r).isDirectory()}catch(e){return T.error({err:e},`Error reading path ${r} during directory existence check`),!1}}import{confirm as wN,input as AN}from"@inquirer/prompts";import{existsSync as CN,mkdirSync as xN,statSync as _N}from"fs";import{dirname as IN}from"path";import Zr,{supportsColor as vN}from"chalk";import{Console as mT}from"console";import{format as Rs}from"util";var Dm=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},vc=class r extends mT{_buffer=[];_groupDepth=0;Console=mT;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new Dm(void 0,r.write).stack;if(!i)return e;let a=i.split(`
|
|
12
12
|
`).slice(o).filter(Boolean).join(`
|
|
13
13
|
`);return e.push({message:n,origin:a,type:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Rs(e,...t))}error(e,...t){this._log("error",Rs(e,...t))}info(e,...t){this._log("info",Rs(e,...t))}log(e,...t){this._log("log",Rs(e,...t))}warn(e,...t){this._log("warn",Rs(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function hT(r){let e=globalThis.console,t=new vc;globalThis.console=t;try{r()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
|
|
14
14
|
`);process.stderr.write(`${o}
|
|
15
15
|
`),globalThis.console=e}}var st=" ".repeat(6);function gT(r,e="",t=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=r.split(`
|
|
16
16
|
`),a=[];for(let l of i)if(t){let c=l;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=l.split(" "),s="";for(let u of c){if(!s.length){s=u;continue}let d=`${s} ${u}`;d.length<=o?s=d:(a.push(e+s),s=u)}a.push(e+s)}return a.join(`
|
|
17
|
-
`)}import pN from"fetch-retry";import mN from"os";import fT,{multistream as hN}from"pino";import gN from"pino-pretty";import fN from"pino-std-serializers";var Yi=new Map,SN=!0,ST="Log throttle exceeded",yN=100,EN=5e3,TN=pN(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}}),km=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??mN.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=SN?fT(a):fT(a,hN([{stream:gN({colorize:!0})}]))}getLevel(){return Sc[this.minLevelValue]}child(e){return new r({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}flush(e){this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush(e)}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 TN(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Ki(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch(t){this.consoleLogger.warn({err:t},"Failed to log to SigNoz")}}shouldAllowLog(e){if(e===ST)return!0;let t=Date.now();return t-this.lastWindowStart>EN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,ST),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<yN?(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(ys[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=fN.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 l={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:dE({message:n||"",...i})};this.buffer.push(l),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,Yi.set("app",this),Yi.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=Sc[e]):(this.minLevelValue=ys[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},Rc=({app:r,hostname:e,disableConsoleLogs:t})=>(Yi.has(r)||Yi.set(r,new km({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Yi.get(r));function yT(){for(let r of Yi.values())r.flush()}import{hostname as bN}from"os";var re=Rc({app:"cli",hostname:bN(),disableConsoleLogs:!0}).child({cliVersion:"2.17.19"});var RN=5;async function Ac({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>RN&&(E.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(s){i++,re.warn({err:s},"Failed to fetch run status, retrying..."),E.warn({err:s},"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(s=>setTimeout(s,c))}E.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Xi({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),l=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),s=r.filter(u=>u.status==="CANCELLED");return hT(()=>{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(s.length){E.log("");let u=s.length===1?"":"s";E.warn(`${s.length} ${t}${u} cancelled:`),s.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(l.length){E.log("");let u=l.length===1?"":"s";E.warn(`${l.length} quarantined ${t}${u} failed:`),l.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:l.length,failed:c.length,cancelled:s.length}}var Cc=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=Hl[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Fi[r.failureReason],o=r.failureDetails.classification?.rootCause;if(E.error(e),o){E.log(`${st}- Error type: ${Zr.dim(t)}`);let i="- Root cause analysis:",a=gT(`${i} ${o}`,`${st} `,!1),l=a.indexOf(":");E.log(`${st}${i} ${Zr.dim(a.slice(l+1))}`)}else E.log(`${st}Reason: ${Zr.red(t)}`),E.log(`${st}Description: ${Zr.red(n)}`)},ws=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Zr.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Zr.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Zr.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Zr.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Zr.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Zr.bgMagenta.white("RUNNING"),a=0):(E.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),vN||(i=`${i}`),E.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};var MN=!1,TT=(()=>{try{return _N("/.dockerenv"),!0}catch{return!1}})();async function wt(r){return ja||MN||TT?!0:(E.flush(),re.flush(),await new Promise(t=>setTimeout(t,500)),await wN({message:r}))}async function Fm(r){let e=IN(r);return pT(e)?CN(r)?wt(`File '${ET(r)}' already exists. Overwrite existing content?`):!0:await wt(`Directory '${ET(e)}' doesn't exist. Create it now?`)?(xN(e,{recursive:!0}),!0):!1}function ET(r){return r.replace(/(\s+)/g,"\\$1")}async function bT(r,e){return ja||TT?e:(await AN({message:r,default:e})).trim()||e}import PN from"fs";import{tmpdir as ON}from"os";import LN from"path";import{registry as As}from"playwright-core/lib/server";import vT from"proper-lockfile";var RT=LN.join(ON(),"momenticBrowserInstallation");var Um=["chrome","chromium","chrome-for-testing"],NN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},wT={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function AT(r){let e=wT[NN[r]??""]??"",t=As.findExecutable(e);return!t||t.installType==="none"?!1:Bm(t)}function Bm(r){let e=r.executablePath();return PN.existsSync(e)}function DN(r,e){let t=wT[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=As.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Bm(n)))return n}async function kN({browser:r,force:e}){let t=DN(r,e);if(!t){E.info(`Browser '${r}' is already installed, skipping...`);return}E.info(`Installing browser '${r}'...`);try{await As.installDeps([t],!1),await As.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=As.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Bm(o);)E.info("Waiting for browser to finish installing..."),await new Promise(l=>setTimeout(l,5e3))}else throw n}}async function CT({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Um:Array.from(new Set(r));try{await vT.lock(RT,{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 kN({browser:i,force:e})}catch(a){o=a,E.error(`Failed to install the ${i} browser: ${a}`)}}finally{await vT.unlock(RT,{realpath:!1})}if(o)throw o}import{randomUUID as aV}from"crypto";import g_ from"body-parser";import XG from"cors";import JG from"dedent";import{Router as CD}from"express";import $t from"fs";import{globSync as xD}from"glob";import Tt from"path";import th from"fs";import{z as jN}from"zod";var U="v1",zm="cli",Yo="2.17.19";var ro=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var xT=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 j(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((l,c)=>{let s;if(e.signal){let{signal:p}=e;if(p.aborted)return c(xT(p));s=()=>c(xT(p)),p.addEventListener("abort",s,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",s),n)try{l(n())}catch(p){c(p)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new ro(o??`Promise timed out after ${t}ms`);c(p)}};a=i.setTimeout(u,t);let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",s)};Promise.resolve(r).then(p=>{d(),l(p)}).catch(p=>{d(),c(p)})})}var xc=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(l=>n-l<=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 FN=9e4,UN=3,BN=1500,zN=15e3,Lr=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function HN(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Hm=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Yo&&(e[Tc]=Yo),zm&&(e[fE]=zm),e}async sendRequest(e,t){let{retries:n=UN,requestTimeoutMs:o=FN,initialRetryDelayMs:i=BN,maxRetryDelayMs:a=zN}=t,l=n,c=n,s,u={path:e,baseUrl:this.baseUrl,method:t.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,t,o)}catch(d){if(s=d,d instanceof Lr&&d.status>=400&&d.status<500)throw d;if(d instanceof Error&&d.name==="AbortError"&&(s=new ro),l===0)throw s;let p=c-l,m=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,m))}throw this.logger.warn({...u,err:s},"Got fatal error response from Momentic server"),s}async sendSingleRequestHelper(e,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),l=()=>i.abort();t.signal&&t.signal.addEventListener("abort",l,{once:!0});let c={...this.getHeaders(),...t.extraHeaders};try{let s=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:c,signal:i.signal});if(!s.ok){let d=await HN(s);throw new Lr(s.status,d,`Request to ${t.method} ${e} failed with status ${s.status}: ${d}`)}let u;if(s.status===204)u={};else{let d=await s.text();try{u=JSON.parse(d)}catch{u=d}}return this.logger&&t.logResponse===!0&&u&&this.logger.debug({result:u,status:s.status,...o},"Got response from Momentic server"),u}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",l)}}},At=class extends Hm{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};import{createAnthropic as GN}from"@ai-sdk/anthropic";var _c=({baseUrl:r,apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o})=>i=>{let a={Authorization:`Bearer ${e}`,[Tc]:Yo??"",...t&&{[yE]:t},...n||{}};return o&&(a[SE]=JSON.stringify(o)),GN({baseURL:`${r}/v1/llm/anthropic/${i}`,headers:a,apiKey:e})(i)};var vn=class extends At{agentConfig;constructor(e,t){super(t),this.agentConfig=e}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return ey.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${U}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Yo,...e},signal:t.abortSignal});return ZS.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return jN.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(`/${U}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return vE.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(`/${U}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Am.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return bE.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return TE.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(`/${U}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Am.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${U}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return EE.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${U}/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(`/${U}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Up.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${U}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return RE.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${U}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Dp.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return MS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${U}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Gp.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return dy.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return xS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return IS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return _S.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return nS.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return _c({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Gm}from"zod";var Qe=class extends At{constructor(e){super(e)}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3});return kE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return OE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return AE.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${U}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return xE.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${U}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,logResponse:!0,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return _E.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return wE.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return DE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return FE.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${U}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return JE.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${U}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${U}/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(`/${U}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return UE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${U}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return KS.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${U}/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(`/${U}/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(`/${U}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return BE.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${U}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return zE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return HE.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${U}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return GE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return rT.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${U}/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(`/${U}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${U}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${U}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Im.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(`/${U}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ts.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${U}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Im.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Gm.record(Gm.string(),Gm.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return jE.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${U}/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(`/${U}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${U}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return VE.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${U}/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(`/${U}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return $E.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${U}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${U}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return WE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function jm(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 Ic=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var no=class extends At{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${U}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return oS.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Ji=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 VN,en as $N}from"@faker-js/faker";var Qi="v1",en=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 VN({locale:$N}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Qi}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Lr?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Qi}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Qi}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function _T(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var Mc=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await _T(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}};import{diff as qN}from"deep-object-diff";import{cloneDeep as KN}from"lodash-es";function Cs(r){let e={parentChain:[]};return Pc(r,e),e}function Pc(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||Pc({...r,steps:c.steps},e)&&i)return!0;if(Pc({...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),Pc({...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 IT(r,e,t,n){let o=Array.from(e),i=Array.from(n);for(let l=0;l<o.length;l++){if(o[l]!==i[l])return!1;i.shift()}return!!WN([r],t,i).result}function WN(r,e,t=[]){let n,o=[],i=(a,l)=>{let c=JSON.stringify(l.parentChain.map(u=>u.id)),s=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&s?(n=a,o=l.parentChain,!0):!1};return Cs({steps:r,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function MT(r,e){e(r);for(let t in r){let n=r[t];n&&(Array.isArray(n)?Lc(n,e):typeof n=="object"&&MT(n,e))}}function Lc(r,e){for(let t of r)t&&(Array.isArray(t)?Lc(t,e):typeof t=="object"&&MT(t,e))}function Vm(r,e){if(r.length>e.length)return Vm(e,r);for(let t=0;t<r.length;t++)if(r[t]!==e[t])return!1;return!0}function Oc(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),Oc({...r,results:e.results});break;case"CONDITIONAL":r.onConditional?.(e),e.assertionResult&&r.onPresetAction(e.assertionResult),Oc({...r,results:e.results});break;default:throw new Error(`Unsupported result type: ${e.type}`)}}function xs(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(qN(r,e)).length>0}function Zi({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],l=[],c=[],s=0,u=(p,m)=>{try{let h=En.parse(m.value);if(h.type!==p.type){o.warn({parsedCacheEntry:h,command:p},"Not using step cache due to type mismatch"),l.push(m.key);return}p.cache=h.cache,a.push(m.key),c.push(m.uniqueKey)}catch(h){l.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},d=(p,m)=>{let h=YN(p.id,m),g=h.find(f=>!!n[f]);if(g)u(p,n[g]);else{if(p.type==="AI_ASSERTION")return;l.push(h[0])}};for(let p of r)switch(p.type){case"RESOLVED_MODULE":{s+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),l.push(...h),c.push(...g);break}case"SECTION":case"AI_ACTION":{if(s+=p.steps?.length??0,!p.steps?.length)break;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.steps,topLevel:!1});a.push(...m),l.push(...h),c.push(...g);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!kl.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;s++,d(p.command,i);break}case"CONDITIONAL":{for(let m of p.blocks){s++,d(m.assertion.command,i),s+=m.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Zi({...t,steps:m.steps,topLevel:!1});a.push(...h),l.push(...g),c.push(...f)}if(p.elseSteps){s+=p.elseSteps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.elseSteps,topLevel:!1});a.push(...m),l.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&&s&&l.length>0&&o.warn({totalSteps:s,cacheKeysMissed:l,cacheKeysHit:a,uniqueKeysHit:c,cacheEntries:n.length},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:l,uniqueKeysHit:c}}function PT(r,e){return e?`${e}:${r}`:r}function YN(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 $m(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
18
|
-
${JSON.stringify(t)}`);let n=[];return n.push({key:PT(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function OT(r){let e=new Set;return Lc(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 Nc({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"&&fS(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 Dc(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;return xs(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},{changed:!0}):{changed:!1}}function LT({steps:r}){let e={};return Cs({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=PT(t.id,i),l=En.parse(o);e[a]=l},onSimpleStepContainer:(t,n)=>{},onConditional:(t,n)=>{}}),e}function _s(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 XN(r,e){return xs(r.memory,e.memory)?{...r,memory:e.memory,updatedAt:e.updatedAt}:r}function Wm(r,e){return r?xs(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:_s(e.target),updatedAt:e.updatedAt}}function JN(r,e){let t=KN(r);return t.fromTarget?xs(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=_s(t.fromTarget),t.updatedAt=e.updatedAt)),t.toTarget?xs(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=_s(t.toTarget),t.updatedAt=e.updatedAt)),t}function NT({newEntries:r,originalCachesMap:e,logger:t}){let n=[];for(let o of r){let i=e[o.key];if(!i||!i.cache||o.value.type!==i.type)continue;let a=o.value.cache;if(o.value={...i},!a){n.push(o);continue}if("memory"in a&&a.memory)t.debug({cacheKey:o.key,newCacheMemory:a.memory,originalCache:i},"Overwriting assertion cache memory"),o.value.cache=XN(i.cache,a);else if("target"in a&&a.target.memory){t.debug({cacheKey:o.key,newCacheMemory:a.target.memory,originalCache:i},"Overwriting target cache memory");let l=rr.safeParse(o.value.cache);o.value.cache=Wm(l.data,a)}else if("fromTarget"in a||"toTarget"in a){let l=vp.optional().parse(o.value.cache);if(!l)continue;t.debug({cacheKey:o.key,fromTargetMemory:a.fromTarget?.memory,toTargetMemory:a.toTarget?.memory,originalCache:i},"Overwriting drag cache memory"),o.value.cache=JN(l,a)}n.push(o)}return n}function Ze(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Er={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},Tr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},qm={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},Km={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function QN(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?Tr[r.operation]:Er[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?Km[r.condition]:qm[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 ate={CONTENT:"The page"};function ZN(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 Fc(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 kc(r){let e="";return r.method&&(e=` with method ${r.method}`),`${Fc(r.urlMatcher)}${e}`}function eD(r){switch(r.type){case"CONTENT":return`${r.negated?Tr.CONTAINS:Er.CONTAINS} '${r.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function rn(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?Ze(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: ${Pt(r.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"WAIT":return`Wait for ${r.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(r.target?.type==="coordinates")return`Click at coordinates: ${Pt(r.target)}`;let 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 ${Pt(r.target)}`;case"BLUR":return`Focus ${Pt(r.target)}`;case"DRAG":return`Drag ${Pt(r.fromTarget)} onto ${Pt(r.toTarget)}`;case"MOUSE_DRAG":return r.target?.type==="description"&&r.target.elementDescriptor?`Click and drag ${Pt(r.target)} by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`:`Click and drag mouse by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`;case"TYPE":{let n="";return r.target?.type==="coordinates"?n=` in element at coordinates: ${Pt(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: ${Pt(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=ZN(r.choice);return r.target.type==="coordinates"?n=` from element at coordinates: ${Pt(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?Ze(r.code,30):r.code}`;case"AI_ASSERTION":return`Assertion: '${r.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${r.target?`for element: ${Pt(r.target)}`:"for entire page"}`;case"FILE_UPLOAD":return r.fileSource.type==="URL"?`Upload file: ${r.fileSource.url}`:`Upload file: ${r.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${Pt(r.target)} ${QN(r.assertion)}`;case"PAGE_CHECK":return`Check the page ${eD(r.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Fc(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 ${kc(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 ${kc(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 ${kc(r.requestMatcher)}`:`Set a ${r.name} header for all requests`:"Set a header";case"MOCK_ROUTE":return r.requestMatcher?`Mock requests that ${kc(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 tD(r){return typeof r=="object"&&r!==null}function tn(r){if(Array.isArray(r))return r.map(tn);if(tD(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=tn(n))}),e}return r}function DT(r){let e=[];for(let t of r){t.sort((a,l)=>a.timestamp-l.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 fte}from"lodash-es";import{cloneDeep as xte}from"lodash-es";import{v4 as Dte}from"uuid";import{cloneDeep as rD}from"lodash-es";import HT from"truncate-json";import{v4 as kT}from"uuid";import{cloneDeep as Yte,unset as Xte}from"lodash-es";function oo(r){switch(r.type){case"AI_ACTION":return`AI action: ${Ze(r.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Ze(r.text,100)}`;case"PRESET_ACTION":return rn(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: ${Ze(r.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}function Xo(r,e){return r.split(`
|
|
17
|
+
`)}import pN from"fetch-retry";import mN from"os";import fT,{multistream as hN}from"pino";import gN from"pino-pretty";import fN from"pino-std-serializers";var Yi=new Map,SN=!0,ST="Log throttle exceeded",yN=100,EN=5e3,TN=pN(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}}),km=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??mN.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=SN?fT(a):fT(a,hN([{stream:gN({colorize:!0})}]))}getLevel(){return Sc[this.minLevelValue]}child(e){return new r({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}flush(e){this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush(e)}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 TN(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Ki(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch(t){this.consoleLogger.warn({err:t},"Failed to log to SigNoz")}}shouldAllowLog(e){if(e===ST)return!0;let t=Date.now();return t-this.lastWindowStart>EN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,ST),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<yN?(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(ys[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=fN.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 l={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:dE({message:n||"",...i})};this.buffer.push(l),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,Yi.set("app",this),Yi.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=Sc[e]):(this.minLevelValue=ys[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},Rc=({app:r,hostname:e,disableConsoleLogs:t})=>(Yi.has(r)||Yi.set(r,new km({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Yi.get(r));function yT(){for(let r of Yi.values())r.flush()}import{hostname as bN}from"os";var re=Rc({app:"cli",hostname:bN(),disableConsoleLogs:!0}).child({cliVersion:"2.18.0"});var RN=5;async function Ac({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>RN&&(T.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(s){i++,re.warn({err:s},"Failed to fetch run status, retrying..."),T.warn({err:s},"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(s=>setTimeout(s,c))}T.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Xi({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),l=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),s=r.filter(u=>u.status==="CANCELLED");return hT(()=>{if(c.forEach(u=>{T.log(""),o(u)}),c.length){T.log("");let u=c.length===1?"":"s";T.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{T.dimmed(n(d))})}if(s.length){T.log("");let u=s.length===1?"":"s";T.warn(`${s.length} ${t}${u} cancelled:`),s.forEach(d=>{T.dimmed(n(d))})}if(a.length){T.log("");let u=a.length===1?"":"s";T.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{T.dimmed(n(d))})}if(l.length){T.log("");let u=l.length===1?"":"s";T.warn(`${l.length} quarantined ${t}${u} failed:`),l.forEach(d=>{T.dimmed(n(d))})}if(i.length){T.log("");let u=i.length===1?"":"s";T.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{T.dimmed(n(d))})}T.log(""),T.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:l.length,failed:c.length,cancelled:s.length}}var Cc=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=Hl[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Fi[r.failureReason],o=r.failureDetails.classification?.rootCause;if(T.error(e),o){T.log(`${st}- Error type: ${Zr.dim(t)}`);let i="- Root cause analysis:",a=gT(`${i} ${o}`,`${st} `,!1),l=a.indexOf(":");T.log(`${st}${i} ${Zr.dim(a.slice(l+1))}`)}else T.log(`${st}Reason: ${Zr.red(t)}`),T.log(`${st}Description: ${Zr.red(n)}`)},ws=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Zr.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Zr.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Zr.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Zr.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Zr.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Zr.bgMagenta.white("RUNNING"),a=0):(T.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),vN||(i=`${i}`),T.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};var MN=!1,TT=(()=>{try{return _N("/.dockerenv"),!0}catch{return!1}})();async function wt(r){return ja||MN||TT?!0:(T.flush(),re.flush(),await new Promise(t=>setTimeout(t,500)),await wN({message:r}))}async function Fm(r){let e=IN(r);return pT(e)?CN(r)?wt(`File '${ET(r)}' already exists. Overwrite existing content?`):!0:await wt(`Directory '${ET(e)}' doesn't exist. Create it now?`)?(xN(e,{recursive:!0}),!0):!1}function ET(r){return r.replace(/(\s+)/g,"\\$1")}async function bT(r,e){return ja||TT?e:(await AN({message:r,default:e})).trim()||e}import PN from"fs";import{tmpdir as ON}from"os";import LN from"path";import{registry as As}from"playwright-core/lib/server";import vT from"proper-lockfile";var RT=LN.join(ON(),"momenticBrowserInstallation");var Um=["chrome","chromium","chrome-for-testing"],NN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},wT={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function AT(r){let e=wT[NN[r]??""]??"",t=As.findExecutable(e);return!t||t.installType==="none"?!1:Bm(t)}function Bm(r){let e=r.executablePath();return PN.existsSync(e)}function DN(r,e){let t=wT[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=As.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Bm(n)))return n}async function kN({browser:r,force:e}){let t=DN(r,e);if(!t){T.info(`Browser '${r}' is already installed, skipping...`);return}T.info(`Installing browser '${r}'...`);try{await As.installDeps([t],!1),await As.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){T.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=As.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Bm(o);)T.info("Waiting for browser to finish installing..."),await new Promise(l=>setTimeout(l,5e3))}else throw n}}async function CT({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Um:Array.from(new Set(r));try{await vT.lock(RT,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){T.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 kN({browser:i,force:e})}catch(a){o=a,T.error(`Failed to install the ${i} browser: ${a}`)}}finally{await vT.unlock(RT,{realpath:!1})}if(o)throw o}import{randomUUID as aV}from"crypto";import g_ from"body-parser";import XG from"cors";import JG from"dedent";import{Router as CD}from"express";import $t from"fs";import{globSync as xD}from"glob";import Tt from"path";import th from"fs";import{z as jN}from"zod";var U="v1",zm="cli",Xo="2.18.0";var no=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var xT=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 j(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((l,c)=>{let s;if(e.signal){let{signal:p}=e;if(p.aborted)return c(xT(p));s=()=>c(xT(p)),p.addEventListener("abort",s,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",s),n)try{l(n())}catch(p){c(p)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new no(o??`Promise timed out after ${t}ms`);c(p)}};a=i.setTimeout(u,t);let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",s)};Promise.resolve(r).then(p=>{d(),l(p)}).catch(p=>{d(),c(p)})})}var xc=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(l=>n-l<=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 FN=9e4,UN=3,BN=1500,zN=15e3,Lr=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function HN(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Hm=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Xo&&(e[Tc]=Xo),zm&&(e[fE]=zm),e}async sendRequest(e,t){let{retries:n=UN,requestTimeoutMs:o=FN,initialRetryDelayMs:i=BN,maxRetryDelayMs:a=zN}=t,l=n,c=n,s,u={path:e,baseUrl:this.baseUrl,method:t.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,t,o)}catch(d){if(s=d,d instanceof Lr&&d.status>=400&&d.status<500)throw d;if(d instanceof Error&&d.name==="AbortError"&&(s=new no),l===0)throw s;let p=c-l,m=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,m))}throw this.logger.warn({...u,err:s},"Got fatal error response from Momentic server"),s}async sendSingleRequestHelper(e,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),l=()=>i.abort();t.signal&&t.signal.addEventListener("abort",l,{once:!0});let c={...this.getHeaders(),...t.extraHeaders};try{let s=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:c,signal:i.signal});if(!s.ok){let d=await HN(s);throw new Lr(s.status,d,`Request to ${t.method} ${e} failed with status ${s.status}: ${d}`)}let u;if(s.status===204)u={};else{let d=await s.text();try{u=JSON.parse(d)}catch{u=d}}return this.logger&&t.logResponse===!0&&u&&this.logger.debug({result:u,status:s.status,...o},"Got response from Momentic server"),u}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",l)}}},At=class extends Hm{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};import{createAnthropic as GN}from"@ai-sdk/anthropic";var _c=({baseUrl:r,apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o})=>i=>{let a={Authorization:`Bearer ${e}`,[Tc]:Xo??"",...t&&{[yE]:t},...n||{}};return o&&(a[SE]=JSON.stringify(o)),GN({baseURL:`${r}/v1/llm/anthropic/${i}`,headers:a,apiKey:e})(i)};var vn=class extends At{agentConfig;constructor(e,t){super(t),this.agentConfig=e}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return ey.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${U}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Xo,...e},signal:t.abortSignal});return ZS.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return jN.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(`/${U}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return vE.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(`/${U}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Am.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return bE.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return TE.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(`/${U}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Am.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${U}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return EE.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${U}/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(`/${U}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Up.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${U}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return RE.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${U}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Dp.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return MS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${U}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Gp.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return dy.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return xS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return IS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return _S.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return nS.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return _c({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Gm}from"zod";var Qe=class extends At{constructor(e){super(e)}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3});return kE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return OE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return AE.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${U}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return xE.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${U}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,logResponse:!0,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return _E.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return wE.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return DE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return FE.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${U}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return JE.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${U}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${U}/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(`/${U}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return UE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${U}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return KS.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${U}/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(`/${U}/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(`/${U}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return BE.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${U}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return zE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return HE.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${U}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return GE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return rT.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${U}/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(`/${U}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${U}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${U}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Im.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(`/${U}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ts.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${U}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ts.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Im.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Gm.record(Gm.string(),Gm.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return jE.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${U}/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(`/${U}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${U}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return VE.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${U}/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(`/${U}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return $E.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${U}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${U}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return WE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function jm(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(T.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),T.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return T.debug("Got auth info from API"),n}var Ic=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var oo=class extends At{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${U}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return oS.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Ji=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 VN,en as $N}from"@faker-js/faker";var Qi="v1",en=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 VN({locale:$N}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Qi}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Lr?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Qi}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Qi}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Qi}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function _T(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var Mc=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await _T(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}};import{diff as qN}from"deep-object-diff";import{cloneDeep as KN}from"lodash-es";function Cs(r){let e={parentChain:[]};return Pc(r,e),e}function Pc(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||Pc({...r,steps:c.steps},e)&&i)return!0;if(Pc({...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),Pc({...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 IT(r,e,t,n){let o=Array.from(e),i=Array.from(n);for(let l=0;l<o.length;l++){if(o[l]!==i[l])return!1;i.shift()}return!!WN([r],t,i).result}function WN(r,e,t=[]){let n,o=[],i=(a,l)=>{let c=JSON.stringify(l.parentChain.map(u=>u.id)),s=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&s?(n=a,o=l.parentChain,!0):!1};return Cs({steps:r,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function MT(r,e){e(r);for(let t in r){let n=r[t];n&&(Array.isArray(n)?Lc(n,e):typeof n=="object"&&MT(n,e))}}function Lc(r,e){for(let t of r)t&&(Array.isArray(t)?Lc(t,e):typeof t=="object"&&MT(t,e))}function Vm(r,e){if(r.length>e.length)return Vm(e,r);for(let t=0;t<r.length;t++)if(r[t]!==e[t])return!1;return!0}function Oc(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),Oc({...r,results:e.results});break;case"CONDITIONAL":r.onConditional?.(e),e.assertionResult&&r.onPresetAction(e.assertionResult),Oc({...r,results:e.results});break;default:throw new Error(`Unsupported result type: ${e.type}`)}}function xs(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(qN(r,e)).length>0}function Zi({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],l=[],c=[],s=0,u=(p,m)=>{try{let h=En.parse(m.value);if(h.type!==p.type){o.warn({parsedCacheEntry:h,command:p},"Not using step cache due to type mismatch"),l.push(m.key);return}p.cache=h.cache,a.push(m.key),c.push(m.uniqueKey)}catch(h){l.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},d=(p,m)=>{let h=YN(p.id,m),g=h.find(f=>!!n[f]);if(g)u(p,n[g]);else{if(p.type==="AI_ASSERTION")return;l.push(h[0])}};for(let p of r)switch(p.type){case"RESOLVED_MODULE":{s+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),l.push(...h),c.push(...g);break}case"SECTION":case"AI_ACTION":{if(s+=p.steps?.length??0,!p.steps?.length)break;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.steps,topLevel:!1});a.push(...m),l.push(...h),c.push(...g);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!kl.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;s++,d(p.command,i);break}case"CONDITIONAL":{for(let m of p.blocks){s++,d(m.assertion.command,i),s+=m.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Zi({...t,steps:m.steps,topLevel:!1});a.push(...h),l.push(...g),c.push(...f)}if(p.elseSteps){s+=p.elseSteps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=Zi({...t,steps:p.elseSteps,topLevel:!1});a.push(...m),l.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&&s&&l.length>0&&o.warn({totalSteps:s,cacheKeysMissed:l,cacheKeysHit:a,uniqueKeysHit:c,cacheEntries:n.length},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:l,uniqueKeysHit:c}}function PT(r,e){return e?`${e}:${r}`:r}function YN(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 $m(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
18
|
+
${JSON.stringify(t)}`);let n=[];return n.push({key:PT(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function OT(r){let e=new Set;return Lc(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 Nc({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"&&fS(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 Dc(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;return xs(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},{changed:!0}):{changed:!1}}function LT({steps:r}){let e={};return Cs({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=PT(t.id,i),l=En.parse(o);e[a]=l},onSimpleStepContainer:(t,n)=>{},onConditional:(t,n)=>{}}),e}function _s(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 XN(r,e){return xs(r.memory,e.memory)?{...r,memory:e.memory,updatedAt:e.updatedAt}:r}function Wm(r,e){return r?xs(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:_s(e.target),updatedAt:e.updatedAt}}function JN(r,e){let t=KN(r);return t.fromTarget?xs(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=_s(t.fromTarget),t.updatedAt=e.updatedAt)),t.toTarget?xs(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=_s(t.toTarget),t.updatedAt=e.updatedAt)),t}function NT({newEntries:r,originalCachesMap:e,logger:t}){let n=[];for(let o of r){let i=e[o.key];if(!i||!i.cache||o.value.type!==i.type)continue;let a=o.value.cache;if(o.value={...i},!a){n.push(o);continue}if("memory"in a&&a.memory)t.debug({cacheKey:o.key,newCacheMemory:a.memory,originalCache:i},"Overwriting assertion cache memory"),o.value.cache=XN(i.cache,a);else if("target"in a&&a.target.memory){t.debug({cacheKey:o.key,newCacheMemory:a.target.memory,originalCache:i},"Overwriting target cache memory");let l=rr.safeParse(o.value.cache);o.value.cache=Wm(l.data,a)}else if("fromTarget"in a||"toTarget"in a){let l=vp.optional().parse(o.value.cache);if(!l)continue;t.debug({cacheKey:o.key,fromTargetMemory:a.fromTarget?.memory,toTargetMemory:a.toTarget?.memory,originalCache:i},"Overwriting drag cache memory"),o.value.cache=JN(l,a)}n.push(o)}return n}function Ze(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Er={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},Tr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},qm={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},Km={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function QN(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?Tr[r.operation]:Er[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?Tr[r.operation]:Er[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?Km[r.condition]:qm[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 ate={CONTENT:"The page"};function ZN(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 Fc(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 kc(r){let e="";return r.method&&(e=` with method ${r.method}`),`${Fc(r.urlMatcher)}${e}`}function eD(r){switch(r.type){case"CONTENT":return`${r.negated?Tr.CONTAINS:Er.CONTAINS} '${r.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function rn(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?Ze(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: ${Pt(r.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${Pt(r.target)}`:""}`;case"WAIT":return`Wait for ${r.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(r.target?.type==="coordinates")return`Click at coordinates: ${Pt(r.target)}`;let 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 ${Pt(r.target)}`;case"BLUR":return`Focus ${Pt(r.target)}`;case"DRAG":return`Drag ${Pt(r.fromTarget)} onto ${Pt(r.toTarget)}`;case"MOUSE_DRAG":return r.target?.type==="description"&&r.target.elementDescriptor?`Click and drag ${Pt(r.target)} by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`:`Click and drag mouse by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`;case"TYPE":{let n="";return r.target?.type==="coordinates"?n=` in element at coordinates: ${Pt(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: ${Pt(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=ZN(r.choice);return r.target.type==="coordinates"?n=` from element at coordinates: ${Pt(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?Ze(r.code,30):r.code}`;case"AI_ASSERTION":return`Assertion: '${r.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${r.target?`for element: ${Pt(r.target)}`:"for entire page"}`;case"FILE_UPLOAD":return r.fileSource.type==="URL"?`Upload file: ${r.fileSource.url}`:`Upload file: ${r.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${Pt(r.target)} ${QN(r.assertion)}`;case"PAGE_CHECK":return`Check the page ${eD(r.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Fc(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 ${kc(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 ${kc(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 ${kc(r.requestMatcher)}`:`Set a ${r.name} header for all requests`:"Set a header";case"MOCK_ROUTE":return r.requestMatcher?`Mock requests that ${kc(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 tD(r){return typeof r=="object"&&r!==null}function tn(r){if(Array.isArray(r))return r.map(tn);if(tD(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=tn(n))}),e}return r}function DT(r){let e=[];for(let t of r){t.sort((a,l)=>a.timestamp-l.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 fte}from"lodash-es";import{cloneDeep as xte}from"lodash-es";import{v4 as Dte}from"uuid";import{cloneDeep as rD}from"lodash-es";import HT from"truncate-json";import{v4 as kT}from"uuid";import{cloneDeep as Yte,unset as Xte}from"lodash-es";function io(r){switch(r.type){case"AI_ACTION":return`AI action: ${Ze(r.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Ze(r.text,100)}`;case"PRESET_ACTION":return rn(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: ${Ze(r.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}function Jo(r,e){return r.split(`
|
|
19
19
|
`).map(t=>" ".repeat(e)+t).join(`
|
|
20
20
|
`)}function Ym(r){switch(r.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":{let e="results"in r&&Array.isArray(r.results)?r.results.length:0;return`AI action: ${r.text}
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
${
|
|
21
|
+
${Jo(`Sub-steps: ${e}`,2)}`}case"PRESET_ACTION":return rn(r.command,!1);case"MODULE":{let e="results"in r&&Array.isArray(r.results)?r.results.length:0;if("moduleName"in r){let t=r.moduleName;return`Module: ${r.id} ModuleName: ${t}
|
|
22
|
+
${Jo(`Sub-steps: ${e}`,2)}`}return`Module: ${r.id}
|
|
23
|
+
${Jo(`Sub-steps: ${e}`,2)}`}case"RESOLVED_MODULE":return`Module: ${r.name}`;case"CONDITIONAL":{let e=["Conditional step"];if("assertionResult"in r&&r.assertionResult&&(e.push(Jo("Conditional check:",2)),e.push(Jo(Ym(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(Jo(`${n}: ${t}`,2))}return e.join(`
|
|
24
24
|
`)}case"SECTION":{let e="results"in r&&Array.isArray(r.results)?r.results.length:0;return`Section${r.description?`with goal: ${r.description}`:""}
|
|
25
|
-
${
|
|
26
|
-
${o}`:o)(Ym(r))}function Bc(r,e={}){let t=e.followingStepStart??e.precedingStepEnd??new Date;return{type:"PRESET_ACTION",id:kT(),message:`Starting the ${r.replace("-"," ")} section`,startedAt:t,finishedAt:t,status:"SUCCESS",command:{id:kT(),type:"SUCCESS"},results:[]}}function Uc(r,e={}){let{index:t,includeDomState:n=!1,header:o}=e,i=oD(r,o),a;r.type==="PRESET_ACTION"&&(a=r.results?.[0]?.elementInteracted);let l=r.message!=="Successfully executed preset action."?r.message:void 0,c=i;r.status==="FAILED"&&(c=`${nD} ${c}`);let s={description:c,startedAt:r.startedAt.toISOString(),finishedAt:r.finishedAt.toISOString(),beforeUrl:r.beforeUrl,afterUrl:r.afterUrl,beforeSnapshot:r.beforeSnapshot,afterSnapshot:r.afterSnapshot,elementInteracted:a,message:l,index:t};if(r.status==="FAILED"&&n)try{let u=YS.array().parse(r.details);for(let d of u)"pageState"in d&&(s.pageState=d.pageState)}catch{}return s}async function GT(r,e,t,{addIndices:n=!0,includeDomState:o=!1,flatten:i=!0,maxItemsFromEnd:a=15,indexOffset:l=0}){let c,s=[];for(let u=0;u<t.length;u++){let d=t[u],p=n?u+l:void 0;switch(d.type){case"PRESET_ACTION":{s.push(Uc(d,{index:p,includeDomState:o,header:void 0})),d.status==="FAILED"&&(c=p);break}case"CONDITIONAL":case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":case"SECTION":{if(i){s.push(Uc(d,{index:n?p:void 0,includeDomState:o,header:"start"})),l+=1;let{failureIndex:m,results:h}=await GT(r,e,d.results,{addIndices:n,includeDomState:o,flatten:i,maxItemsFromEnd:a,indexOffset:l+u});s.push(...h),m!==void 0&&(c=m),l+=h.length,s.push(Uc(d,{index:n?l+u:void 0,includeDomState:o,header:"end"})),l+=1}else s.push(Uc(d,{index:n?l+u:void 0,includeDomState:o,header:void 0}));break}default:return(h=>{throw new Error("You missed a case in the switch above")})(d)}}return{results:s,failureIndex:c}}async function ea(r,e,t,{numStepsWithScreenshots:n=5,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,flatten:l=!0,maxItemsFromEnd:c=20}){let s=await GT(r,e,t,{addIndices:o,includeDomState:a,flatten:l,maxItemsFromEnd:c,indexOffset:0}),{results:u}=s,{failureIndex:d}=s;d!==void 0&&u.length>0&&(u=u.slice(0,d+1));let p=[],m=0;if(c!==void 0&&u.length>c&&(m=u.length-c),d!==void 0&&d<u.length-1&&r.warn("PROCESS_RESULTS_FOR_LLM: Failure index check - should not be possible",{failureIndex:d,flattenedResultsLength:u.length,lastIndex:u.length-1,isLastIndex:d===u.length-1,offset:m}),d!==void 0&&m>d)throw new Error("Failure index is out of bounds");for(let h=m;h<u.length;h++){let g=u[h],f={description:g.description,startedAt:g.startedAt,finishedAt:g.finishedAt,beforeUrl:g.beforeUrl,afterUrl:g.afterUrl,elementInteracted:g.elementInteracted,message:g.message,pageState:g.pageState,index:g.index},S,y;(n===void 0||n>0&&h>=u.length-n)&&(g.afterSnapshot&&(y=await BT(r,e,g.afterSnapshot)),i&&g.beforeSnapshot&&(S=await BT(r,e,g.beforeSnapshot))),f.beforeScreenshot=S,f.afterScreenshot=y,p.push(f)}return{results:p,failureIndex:d!==void 0?d-m:void 0}}function ta({json:r,keysToRedact:e,maxJsonStringSize:t}){try{if(!r)return r;if(typeof r=="string")return Ze(r,t??2e4);if(typeof r=="object"){let{jsonString:n}=HT(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 Xm(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=HT(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":zT(n);break;case"CONDITIONAL":n.assertionResult&&zT(n.assertionResult),Xm(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":{Xm(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 zT(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function zc(r,e){let t=rD(r);if(Xm(t,e),t.length>FT)return e.error("Results too long, truncating before insertion"),t.slice(t.length-FT,t.length);let n=JSON.stringify(t);if(n.length>UT)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>UT;)t.splice(0,1),n=JSON.stringify(t);try{return gt.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 Sre}from"lodash-es";var iD=/^(?!.*\S+\s+\S+).*$/,aD=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,sD=/style="([^"]*)/g,lD=/data-[\w-]+/g,cD=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 jT(r){let e=cD(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:iD.test(t)&&aD.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:sD.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"}:lD.test(t)?{thoughts:"Hardcoded data attributes are not recommended in the command description as they change frequently.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:`The element description you provided starts with the command type (${e.type}). This can confuse our AI agents since the element itself is unrelated to the desired action.`,category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}function VT(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 Sb}from"lodash-es";import hD from"diff-lines";import Gc,{gte as gD}from"semver";var $T={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 WT={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 uD=["target","fromTarget","toTarget"];function qT(r){for(let e of uD){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var KT={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 qT(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])qT(n);return e}default:return e}})};import{v4 as dD}from"uuid";var YT={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=dD()),e;default:return e}})};import{v4 as XT}from"uuid";var JT={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??XT(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??XT()}})),delete e.commands),e;default:return e}})};var QT={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 pD}from"uuid";var ZT={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=pD()),e))};import{v4 as eb}from"uuid";var tb={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=eb())}return e.id=eb(),e})};var rb={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 mD}from"uuid";var nb={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=mD()),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 ob={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 ib={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&&ab(t),e})};function ab(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){ab(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 sb={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 lb={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 cb={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 ub={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 db={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 pb={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 Hc=new Set(["CLICK","TYPE","SELECT_OPTION"]),mb={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||Hc.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let l=a?.elementDescriptor,c=a?.type;(l!==void 0||Hc.has(c))&&(a.target={elementDescriptor:l??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let l=a.command,c=l?.elementDescriptor,s=l?.type;(c!==void 0||Hc.has(s))&&(l.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Hc.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var hb={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 gb={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,l=a?.type;l?.startsWith("PRESET_")&&(a.type=l.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(s=>{let u=s.type;u?.startsWith("PRESET_")&&(s.type=u.slice(7))})}),e}),stopOnFailure:!0};var Jo=[pb,hb,gb,mb,$T,WT,KT,YT,JT,QT,ZT,tb,rb,nb,ob,ib,sb,lb,cb,ub,db];if(le!==Jo[Jo.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Jo.forEach((r,e)=>{if(!Gc.valid(r.toVersion)||!Gc.valid(r.fromVersion))throw new Error(`Migration '${r.name}' has invalid version`);if(!Gc.gt(r.toVersion,r.fromVersion))throw new Error(`Migration '${r.name}' has toVersion <= fromVersion`);if(e===0)return;if(Jo[e-1].toVersion!==r.fromVersion)throw new Error(`Migration '${r.name}' at index ${e} is not contiguous with previous migration`)});function fD(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var Is=async({metadata:r,steps:e,logger:t,toVersion:n})=>{let o=e,{schemaVersion:i,id:a}=r,l=Jo.findIndex(u=>Gc.gt(u.toVersion,i));if(l===-1)return{steps:o,newVersion:i};let c=i;for(let u=l;u<Jo.length;u++){if(n&&gD(c,n)){t.debug("Stopping migration early because toVersion was reached");break}let d=Jo[u],p={id:a,migration:d.name,toVersion:d.toVersion};try{o=await fb(o,d),c=d.toVersion}catch(m){throw t.error({err:m,...p},"Migration failed"),new Error(`Step migration ${d.name} failed: ${m}`)}}let s=hD(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return s.trim()&&t.debug({diffs:s,id:a},"Migration diffs"),{newVersion:c,steps:o}};async function fb(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)||fD(i)&&(n[o]=await fb(i,e))}return t}async function yb({rawSteps:r,metadata:e,logger:t,callbacks:n}){VT(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await jc({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),l={...e,steps:i,schemaVersion:a};for(let c of["beforeSteps","afterSteps"]){let s=r[c];if(!s)continue;let{resolvedSteps:u}=await jc({rawSteps:s,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});l[c]=u}return{resolvedTest:l,moduleIds:Array.from(Object.keys(o))}}async function Qo(r,e,t){let{newVersion:n,steps:o}=await Is({metadata:r,steps:e,logger:t});try{return{steps:De.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 dc(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function jc({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await Qo(e,r,t),l=[];for(let c of a)l.push(await Ms({step:c,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:l,newSchemaVersion:i}}async function Ms({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,s=n[c];if(s)return{...Sb(s),...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 Is({metadata:{id:c,schemaVersion:u.schemaVersion},steps:u.steps,logger:t}),m;try{m=De.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=>Ms({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]=Sb(g),{...g,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let c of r.blocks){let s=[];for(let u of c.steps)s.push(await Ms({step:u,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...c,steps:s})}let i;if(r.elseSteps){i=[];for(let c of r.elseSteps)i.push(await Ms({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 Ms({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{diff as Tb}from"deep-object-diff";import{cloneDeep as Eb}from"lodash-es";import{v4 as Jm}from"uuid";async function We(r){let e=new Map,t=new Set,n=Eb(r.stepLists.steps),o=await Zo({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let a of["beforeSteps","afterSteps"]){let l=Eb(r.stepLists[a]);if(!l)continue;let c=await Zo({...r,steps:l,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...c.cachesToSave),i.moduleUpdates.push(...c.moduleUpdates),i.stepsToSave[a]=c.stepsToSave}return i}async function Zo({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:l,createNewCacheIds:c}=e,s={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(delete u.index,delete u.aiSuggested,u.id=c?Jm():u.id,u.type){case"PRESET_ACTION":{let p=u.command;p.id=c?Jm():p.id,"cache"in p&&p.cache&&(n&&(s.cachesToSave=s.cachesToSave.concat($m({id:p.id,orgId:n.orgId,testId:n.testId,value:En.parse(p),moduleIdParents:o,moduleStepParents:i}))),delete p.cache),p.thoughts&&delete p.thoughts,s.stepsToSave.push({...u,command:p});break}case"RESOLVED_MODULE":{let p=c?Jm():u.id,m=u.moduleId;a.has(m)?m=a.get(m):l!==void 0&&(m=await l(u),a.set(u.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await Zo({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,p],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});s.moduleUpdates=s.moduleUpdates.concat(f),s.cachesToSave=s.cachesToSave.concat(h),t.has(m)||(t.add(m),s.moduleUpdates.push({...Kt.parse(u),steps:De.array().parse(g),moduleId:m}));let S=Mr.parse({...u,type:"MODULE",moduleId:m,inputs:u.inputs,id:p,skipped:u.skipped,cacheConfig:u.cacheConfig,envKey:u.envKey});s.stepsToSave.push(S);break}case"AI_ACTION":{if(!u.steps){s.stepsToSave.push(u);break}let{stepsToSave:p,cachesToSave:m}=await Zo({...e,steps:u.steps});try{u.steps=nr.array().parse(p)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}s.stepsToSave.push(u),s.cachesToSave=s.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{s.stepsToSave.push(u);break}case"CONDITIONAL":{let p=[];for(let h of u.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:S}=await Zo({...e,steps:h.steps});p.push({...h,steps:g}),s.cachesToSave=s.cachesToSave.concat(f),s.moduleUpdates=s.moduleUpdates.concat(S)}let m={...u,elseSteps:void 0,blocks:p};if(u.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Zo({...e,steps:u.elseSteps});m.elseSteps=h,s.cachesToSave=s.cachesToSave.concat(g),s.moduleUpdates=s.moduleUpdates.concat(f)}s.stepsToSave.push(m);break}case"SECTION":{let{stepsToSave:p,cachesToSave:m,moduleUpdates:h}=await Zo({...e,steps:u.steps}),g={...u,steps:p};s.moduleUpdates=s.moduleUpdates.concat(h),s.stepsToSave.push(g),s.cachesToSave=s.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 s}async function Vc({logger:r,cacheStorage:e,orgId:t,testId:n,originalSteps:o,updatedSteps:i}){let a=Tb(o,i);if(Object.keys(a).length!==0){r.debug("Updating step caches post-success");try{let{cachesToSave:l}=await We({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries({logger:r,testId:n,entries:l})}catch(l){r.error({err:l},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async function $c({logger:r,cacheStorage:e,orgId:t,testId:n,originalSteps:o,updatedSteps:i}){let a=Tb(o,i);if(Object.keys(a).length===0)return;r.debug({changes:a},"Updating memory post-run failure");let l={};for(let u of["steps","beforeSteps","afterSteps"]){let d=o[u];if(!d||!d.length)continue;let p=LT({steps:d});for(let[m,h]of Object.entries(p))l[m]=h}let{cachesToSave:c}=await We({stepLists:i,cacheCreationParams:{testId:n,orgId:t}}),s=NT({newEntries:c,originalCachesMap:l,logger:r});if(s.length){r.debug({prunedCaches:s},"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.")}}}import{cloneDeep as SD}from"lodash-es";import{stringify as bb}from"yaml";async function vb({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 yD({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:pe.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:bb(a),modules:o}}async function yD({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=SD(r);Object.values(o).forEach(l=>{ED(l??[])});let{stepsToSave:i,moduleUpdates:a}=await We({stepLists:o,createNewCacheIds:n});for(let l of a)t.has(l.name)||(e[l.name]=TD(l),t.add(l.name));return i}function ED(r){Cs({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 TD(r){let e=Kt.parse(r),t={fileType:pe.MODULE,...e,schemaVersion:le,steps:r.steps};return bb(t)}async function ne(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 Ps({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((l,c)=>{function s(){clearInterval(a),e?.removeEventListener("abort",s),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",s,{once:!0}),(async()=>{try{l(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",s)}})()})}async function ei({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,l=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",l),!i&&a.abort()},e);o?.addEventListener("abort",l,{once:!0});try{return await Ps({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",l),clearTimeout(c)}}function Rb(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 Wc(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(Mr.parse(n));break}case"SECTION":{let n={...t,steps:Wc(t.steps)};e.push(De.parse(n));break}case"CONDITIONAL":{let n={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Wc(o.steps)})),elseSteps:t.elseSteps?Wc(t.elseSteps):void 0};e.push(Fo.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 qc(r){return Wc([r])[0]}import bD from"picomatch";var Kc=(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||bD(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},Yc=(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}},ra=r=>{try{return new URL(r),!0}catch{return!1}},wb=r=>!r.toLowerCase().startsWith("http"),na=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function ti(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 vD(r){let{logger:e,browserStateStorage:t,generator:n,results:o,error:i,maxItemsFromEnd:a,numStepsWithScreenshots:l,disableCache:c}=r,s=[];if(o.length>0){let{results:d}=await ea(e,t,o,{numStepsWithScreenshots:l,maxItemsFromEnd:a,includeBeforeScreenshots:!0,includeContainerTagsInDescription:!0});s=d}return await n.getTestResultClassification({results:s,errorMessage:i.message,errorStack:i.stack},{disableCache:c??!1})}async function Ab(r){let{logger:e,browserStateStorage:t,generator:n,fullResults:o,failureReason:i,error:a,maxItemsFromEnd:l,numStepsWithScreenshots:c,disableCache:s}=r,u=o?.results??[];if(i==="SetupFailureError"){let d=(o?.beforeResults??[]).at(0);u=[Bc("setup",{followingStepStart:d?.startedAt}),...o?.beforeResults??[]]}else if(i==="TeardownFailureError"){let d=u.at(-1),p=(o?.afterResults??[])[0],m=Bc("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=Bc("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 vD({logger:e,browserStateStorage:t,generator:n,results:u,error:a,maxItemsFromEnd:l,numStepsWithScreenshots:c,disableCache:s});return{classification:d,aiFailureReason:d.reason}}catch(d){return e.error({err:d},"Failed to classify test result"),{}}}import{v4 as Cb}from"uuid";function Qm(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Xc=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:Qm({},this.metadata)}]).catch(l=>e.error({err:l},"Failed to report billable event"))]}trackStepExecution(e){if(Ny(e.type)){this.creditsUsedV2+=1;return}let t=tm(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=rm(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:Cb(),properties:Qm({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:Cb(),properties:Qm({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};function oa({orgId:r,client:e,gitMetadata:t,alwaysSaveCache:n,noCache:o}){return o?new bc:new Zm(r,e,t,n)}var Zm=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{gitBranchName:i,gitProtectedBranches:a}=n;this.cacheHeaders=Cm(n),o?this.writeCaches=!0:i?this.writeCaches=!a.includes(i):this.writeCaches=!0}cacheHeaders;writeCaches;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){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}for(let l of[t,n,o])l&&Zi({steps:l,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await We({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import RD from"path";var wD=new xc(30,60*1e3),nh="https://api.momentic.ai",_b,Ib=r=>{nh=r},Nr=()=>nh;var ia,rh,Jc,Mb=async r=>{if(_b&&ia&&Jc)return ia;let e=new Qe({baseUrl:nh,apiKey:r,logger:E});_b=e;try{let t=await e.getAuthInfo();return ia=t.orgId,rh=t.userId,Jc=r,ia}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Et=()=>{if(!ia)throw new Error("Your organization ID is invalid.");return ia},aa=()=>{if(!rh)throw new Error("Your user ID is invalid.");return rh},Dr=()=>{if(!Jc)throw new Error("Your API key is invalid.");return Jc},oh,eh,Qc=(r,e)=>{oh=r,eh?.abort(),eh=new AbortController;let t=eh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=RD.resolve(r.rootDir,o.envFile);try{if(th.lstatSync(i).isSymbolicLink())return;th.existsSync(i)&&n.push(i)}catch(a){E.warn({err:a},`Failed to check if env file ${i} exists`)}});try{AD({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){E.error({err:o},"Failed to start config file watchers")}},se=()=>oh;function AD({filesToWatch:r,revalidator:e,signal:t,project:n}){r.forEach(o=>{th.watch(o,{signal:t,persistent:!1,recursive:!1},async(i,a)=>{a&&(wD.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.`),oh=await Promise.resolve(e(n.configFilePath)))})})}function Ee(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var Ls=CD();function Os(r){let e=se(),t=Tt.dirname(e.configFilePath);return Tt.join(t,...r)}function _D(r){let e=se(),t=Tt.dirname(e.configFilePath),n=Tt.relative(t,r);return n?n.split(Tt.sep):[]}function ID(r,e){let t=$t.statSync(r),n=_D(r);return ym.parse({name:e,absolutePath:r,relativePath:n.join(Tt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Ls.post("/",Ee(async(r,e,t)=>{let n;try{n=aE.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Os(n);if(!$t.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Tt.sep)}`});return}if(!$t.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Tt.sep)}`});return}let a=se(),l=Array.from(a.config.exclude??[]).concat(gc),s=xD("*",{absolute:!1,cwd:o,ignore:l,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Tt.join(o,d);return ID(p,d)}),u={absolutePath:o,pathSegments:n,contents:s};e.status(200).json(u)}));Ls.put("/",Ee(async(r,e,t)=>{let n;try{n=sE.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Os(n);if($t.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Tt.sep)}`,pathSegments:n});return}$t.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Tt.sep)}`,pathSegments:n};e.status(201).json(i)}));Ls.patch("/",Ee(async(r,e,t)=>{let n,o;try{let s=lE.parse(r.body);n=s.pathSegments,o=s.newPathSegments}catch(s){e.status(400).json({error:`Failed to parse folder update body: ${s}`});return}let i=Os(n),a=Os(o);if(!$t.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Tt.sep)}`});return}if($t.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Tt.sep)}`});return}let l=Tt.dirname(a);$t.existsSync(l)||$t.mkdirSync(l,{recursive:!0}),$t.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Tt.sep)} to ${o.join(Tt.sep)}`,pathSegments:o};e.status(200).json(c)}));Ls.delete("/",Ee(async(r,e,t)=>{let n,o=!0;try{let c=cE.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=Os(n);if(!$t.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Tt.sep)}`,pathSegments:n});return}if(!$t.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Tt.sep)}`});return}if(o)$t.rmSync(i,{recursive:!0,force:!0});else{if($t.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}$t.rmdirSync(i)}let l={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(l)}));var ih=Ls;import QG from"events";import f_,{Router as ZG}from"express";import{diff as LD}from"deep-object-diff";import Fr from"fs";import ri from"path";import la from"yaml";import{z as Lb}from"zod";import{execSync as MD}from"child_process";function Rn(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{MD(n,{encoding:"utf-8"})}catch(o){E.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as Pb}from"deep-object-diff";import nn from"fs";import{cloneDeep as PD}from"lodash-es";import Ns from"path";import{v4 as OD}from"uuid";import Ds from"yaml";function Wt({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!nn.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=nn.readFileSync(i,"utf-8"),l=Ds.parse(a),c;if(r.name&&r.name!==l.name){let m=`${Ie(r.name)}.module.yaml`;if(c=Ns.join(Ns.dirname(i),m),nn.existsSync(c))throw new Error(`A conflicting file '${r.name}' already exists at path '${c}'`)}let s={...r,schemaVersion:e},u=tn({fileType:pe.MODULE,...bm.parse(s),steps:De.array().parse(r.steps)}),d=Pb(u,l);if(d&&Object.keys(d).length===0&&!o){E.debug(`Skipping save for module ${r.moduleId} since there are no changes`);return}let p=Ds.stringify(u);nn.writeFileSync(i,p,"utf-8"),c&&nn.renameSync(i,c),Rn(c||i,n.config)}function Ob({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=wn(i,o),l={...a,...e},c=tn({fileType:pe.MODULE,...bm.parse(l),steps:a.steps}),s=Pb(c,a);if(s&&Object.keys(s).length===0){E.debug(`Skipping save for module ${r} since there are no changes`);return}let u=Ds.stringify(c);nn.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${Ie(e.name)}.module.yaml`;if(d=Ns.join(Ns.dirname(i),p),nn.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);nn.renameSync(i,d)}Rn(d||i,n.config)}async function Zc({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Ie(r),l=Ns.join(o,`${a}.module.yaml`),c=OD(),{stepsToSave:s}=await We({stepLists:{steps:n}}),u={fileType:pe.MODULE,schemaVersion:le,moduleId:c,name:r,description:e,enabled:t,steps:s.steps},d=Ds.stringify(u);return nn.writeFileSync(l,d,"utf-8"),Rn(l,i.config),{moduleId:c,name:r,description:e,enabled:t,steps:n}}function wn(r,e){let t=nn.readFileSync(r,"utf-8"),n=Ds.parse(t);try{return am.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 kr(r,e,t,n){let o=wn(r.fullFilePath,t),{resolvedSteps:i}=await jc({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:l})=>{let c=e.modules[l]?.fullFilePath;if(c)return wn(c,t)}}}),a={...o,steps:i};return n&&(n[r.id]=PD(a)),a}async function eu(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await kr(n,r,e,t)})),Array.from(Object.values(t))}async function Nb({test:r,name:e,folder:t}){let n=await vb({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Ie(e)}.test.yaml`,a=ri.join(t,i);return Fr.writeFileSync(a,n.test,"utf-8"),a}function ah(r,e,t){let n=ri.join(t.rootDir,r);if(!Fr.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=Fr.readFileSync(n,"utf-8"),i=la.parse(o),a,l;if(e.name&&e.name!==i.name){let p=`${Ie(e.name)}.test.yaml`;if(a=ri.join(ri.dirname(r),p),l=ri.join(t.rootDir,a),Fr.existsSync(l))throw new Error(`Test with name '${e.name}' already exists at path '${l}'`)}let c={...i,...e},s=yr.parse(c),u={fileType:pe.TEST,...yr.parse(s),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=la.stringify(u);return Fr.writeFileSync(n,d,"utf-8"),l&&Fr.renameSync(n,l),Rn(n,t.config),{newRelativeTestPath:a}}function Ft({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=ri.join(n.rootDir,r);if(!Fr.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=Fr.readFileSync(i,"utf-8"),l=la.parse(a),c=yr.parse({...l,schemaVersion:t}),s=De.array().or(Lb.undefined()).parse(e.beforeSteps),u=De.array().parse(e.steps),d=De.array().or(Lb.undefined()).parse(e.afterSteps),p=tn({fileType:pe.TEST,...c,beforeSteps:s&&s.length>0?s:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=LD(p,l);if(m&&Object.keys(m).length===0&&!o){E.debug(`Skipping save for test ${c.name} since there are no changes`);return}let h=la.stringify(p);Fr.writeFileSync(i,h,"utf-8"),E.debug(`Saving test ${c.name} to ${i}`),Rn(i,n.config)}function ks(r,e){let t=ri.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=Fr.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
|
|
27
|
-
`)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=la.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return Dt.parse(o)}function
|
|
28
|
-
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return
|
|
29
|
-
`)){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 hk(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 $b("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),l=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(l?.[1])return l[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await $b("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function gk(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return hk(r,e,t);if(o)return}catch{}}function ru(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 He(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function fk(){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 Sk(r){let[e,t,n]=await Promise.all([He(r,Pe.show(["--no-patch","--format=%ci"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.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{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 yk(r){let[e,t,n]=await Promise.all([He(r,Pe.listRemote(["--get-url","origin"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function Ek(r){let[e,t,n,o]=await Promise.all([He(r,Pe.show(["--no-patch","--format=%ci"])),He(r,Pe.listRemote(["--get-url","origin"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),l=t?ru(t):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function Tk(r){let[e,t,n]=await Promise.all([He(r,Pe.show(["--no-patch","--format=%ci"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),l=o?ru(o):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function bk(r){let[e,t,n]=await Promise.all([He(r,Pe.show(["--no-patch","--format=%ci"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),l=o?ru(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function vk(r,e){let[t,n,o,i,a,l,c,s,u]=await Promise.all([He(r,Pe.revparse(["HEAD"])),He(r,Pe.revparse(["--short","HEAD"])),He(r,Pe.revparse(["--abbrev-ref","HEAD"])),He(r,Pe.listRemote(["--get-url","origin"])),He(r,Pe.show(["--no-patch","--format=%ci"])),He(r,Pe.show(["-s","--pretty=%B"])),He(r,Pe.show(["-s","--pretty=%an"])),e?He(r,Pe.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),mk(r)]),d=s?await He(r,Pe.show(["--no-patch","--format=%ci",s])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),h=i?ru(i):void 0,g=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,y=await gk(r,i,u)??S??void 0;return{gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:y,gitLocalEmail:g,gitLocalName:f,lastCommitOnMainSha:s,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?h:void 0,gitlabProjectPath:m?h:void 0,pipelineId:void 0}}async function Rk(){let r=process.env._HEAD_REPO_URL;return{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 wk(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Bs(r,e){let t=fk();if(!t)return vk(r,e);switch(t){case"GithubActions":return Sk(r);case"GitlabCI":return yk(r);case"CircleCI":return Ek(r);case"Buildkite":return Tk(r);case"AzureDevOps":return bk(r);case"GCPCloudBuild":return Rk()}}async function Ak(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 Ck(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 xk(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await Ck(r,e,n,o,t)}else if(t.gitlabProjectPath)return await Ak(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function io(r,e,t){let n=await wk(t),o=await Bs(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 xk(r,e,i);return{...n,...o,...a}}async function Wb(){try{return!!(await Pe.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as dle}from"deep-object-diff";import{cloneDeep as mle}from"lodash-es";import{v4 as Ale}from"uuid";import xle from"yaml";import jle from"yaml";import{randomUUID as _k}from"crypto";import An from"fs";import ii from"path";var qb={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 Ik(r,e,t){if(qb[t]){let i=qb[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 Kb=new Set([".DS_Store","__MACOSX"]);function Yb(r,e,t){let n=_k(),o=r.child({runGroupId:n});An.rmSync(e,{recursive:!0,force:!0});let i=An.readdirSync(t).filter(s=>!Kb.has(s)).map(s=>ii.join(t,s));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);An.mkdirSync(e,{recursive:!0});let a=ii.join(i[0],"metadata.json"),l={...vs.parse(JSON.parse(An.readFileSync(a,"utf-8"))),id:n};for(let s of i){let u=ii.join(s,"runs");if(!An.existsSync(u))continue;let d=An.readdirSync(u);for(let h of d){if(Kb.has(h))continue;let g=ii.join(u,h),f=ii.join(e,"runs",h);An.cpSync(g,f,{recursive:!0})}let p=ii.join(s,"metadata.json"),m=vs.parse(JSON.parse(An.readFileSync(p,"utf-8")));o.info({oldRunGroupId:m.id},"Merging metadata from run groups");for(let h in m){if(h==="id")continue;let g=h;l[g]=Ik(l,m,g)}}let c=ii.join(e,"metadata.json");An.writeFileSync(c,JSON.stringify(l,null,2))}import Xb from"adm-zip";import Sh from"fs";import nu from"path";function Mk(r){let e=new Xb,t=nu.join(r,"metadata.json"),n=vs.parse(JSON.parse(Sh.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Sh.readdirSync(nu.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new Xb(nu.join(r,"runs",o));for(let l of a.getEntries())l.isDirectory||e.addFile(nu.join("runs",i,l.entryName),l.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function ou(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Sh.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new Mc(e);try{let{runGroupId:i,buffer:a}=Mk(n),l=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${l}`;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 Pk from"adm-zip";import Ct from"fs";import or from"path";var zs=class r{constructor(e){this.filePath=e;Ct.rmSync(this.filePath,{recursive:!0,force:!0}),Ct.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(or.join(this.filePath,e))}mkdir(e){Ct.mkdirSync(or.join(this.filePath,e),{recursive:!0})}readFile(e){let t=or.join(this.filePath,e);if(Ct.existsSync(t))return Ct.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=or.join(this.filePath,t);try{Ct.writeFileSync(o,n)}catch{}}createFileStream(e){let t=or.join(this.filePath,e);return Ct.createWriteStream(t)}createRunArchive(e){return new yh(or.join(this.filePath,"runs"),e)}},yh=class{constructor(e,t){this.filePath=e;this.tempPath=or.join(e,`.${t}`),this.finalPath=or.join(e,`${t}.zip`),Ct.rmSync(this.tempPath,{recursive:!0,force:!0}),Ct.rmSync(this.finalPath,{recursive:!0,force:!0}),Ct.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=or.join(this.tempPath,e);if(Ct.existsSync(t))return Ct.readFileSync(t)}mkdir(e){Ct.mkdirSync(or.join(this.tempPath,e),{recursive:!0})}cd(e){return new zs(or.join(this.tempPath,e))}storeFile(e){let{name:t,contents:n}=e,o=or.join(this.tempPath,t);Ct.writeFileSync(o,n)}createFileStream(e){let t=or.join(this.tempPath,e);return Ct.createWriteStream(t)}close(){let e=new Pk;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Ct.writeFileSync(this.finalPath,t),Ct.rmSync(this.tempPath,{recursive:!0,force:!0})}};import ej from"http";import tj from"path";import{Server as O1}from"socket.io";var Ok=({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{}}},Jb={event:"cancel",createHandler:Ok};var Lk=({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 l=a.controller.browser;try{let s=(await l.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:s},"Fetched a11y tree from the browser"),i({a11yTree:s})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},Qb={event:"fetchA11yTree",createHandler:Lk};var Nk=({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 l=a.controller.browser;try{let c=await l.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})}}},Zb={event:"fetchDom",createHandler:Nk};var Dk=({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)}},ev={event:"disconnect",createHandler:Dk};function on(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=kk(t);Fk(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await Uk(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function kk(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertionResult){t=e;break}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 Fk(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 Uk(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as Yk}from"crypto";import{faker as Bk}from"@faker-js/faker";import zk from"assert";import Hk from"axios";import*as Gk from"child_process";import jk from"moment";import*as Vk from"otpauth";import $k from"pg";async function tv(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=rc(n,e);t.push(...o)}),t}function Wk(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 qk(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 Kk=Object.getPrototypeOf(async function(){}).constructor;async function rv(r,e,t){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:l}=e.bindings,c=e.tools,s={},u=(T,w)=>{o[T]=w,s[T]=w},d={},p=(T,w)=>{o[T]=w,d[T]=w},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 Kk("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Hk,jk,c.fakerInstance??Bk,zk,$k,m,h,Vk,Gk,tv,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,w=>c.sms.send(w),w=>c.sms.fetchLatest(w),c.email,c.sms,c.ai,Wk(a,l),...Object.values(i??{}))),f=!0,S,y;try{let T=await j(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await qk(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?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=T instanceof Error?T.message:`${T}`}return{result:S,variableUpdates:s,persistentVariableUpdates:d,success:f,error:y}}async function nv({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=Zn,disallowVariableUpdates:l,additionalBindings:c,responseSerialization:s,mock:u}){let d=Yk(),p=await rv(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:l,responseSerialization:s},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 Xk,randomUUID as Jk}from"crypto";import Qk from"fetch-retry";var Zk=Qk(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}}),ov=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,iv=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function av({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=Zn,retries:i=2,signal:a,logger:l,additionalBindings:c,disallowVariableUpdates:s,responseSerialization:u,mock:d}){if(!ov)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!iv)throw new Error("Missing lambda auth secret.");let g=Xk("sha256",iv).update(r).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let S={id:Jk(),orgId:r,momenticLambdaAuthHash:g,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:s,responseSerialization:u};try{if(p=await j(Zk(ov,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw l.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=Fy.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function ao(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await av(r);else if(r.localTools)e=await nv({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
25
|
+
${Jo(`Sub-steps: ${e}`,2)}`}default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}var FT=1e3,UT=5e7,nD="[FAILED]";async function BT(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 oD(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(o=>e?`${e==="start"?"Start":"End"} of ${t}
|
|
26
|
+
${o}`:o)(Ym(r))}function Bc(r,e={}){let t=e.followingStepStart??e.precedingStepEnd??new Date;return{type:"PRESET_ACTION",id:kT(),message:`Starting the ${r.replace("-"," ")} section`,startedAt:t,finishedAt:t,status:"SUCCESS",command:{id:kT(),type:"SUCCESS"},results:[]}}function Uc(r,e={}){let{index:t,includeDomState:n=!1,header:o}=e,i=oD(r,o),a;r.type==="PRESET_ACTION"&&(a=r.results?.[0]?.elementInteracted);let l=r.message!=="Successfully executed preset action."?r.message:void 0,c=i;r.status==="FAILED"&&(c=`${nD} ${c}`);let s={description:c,startedAt:r.startedAt.toISOString(),finishedAt:r.finishedAt.toISOString(),beforeUrl:r.beforeUrl,afterUrl:r.afterUrl,beforeSnapshot:r.beforeSnapshot,afterSnapshot:r.afterSnapshot,elementInteracted:a,message:l,index:t};if(r.status==="FAILED"&&n)try{let u=YS.array().parse(r.details);for(let d of u)"pageState"in d&&(s.pageState=d.pageState)}catch{}return s}async function GT(r,e,t,{addIndices:n=!0,includeDomState:o=!1,flatten:i=!0,maxItemsFromEnd:a=15,indexOffset:l=0}){let c,s=[];for(let u=0;u<t.length;u++){let d=t[u],p=n?u+l:void 0;switch(d.type){case"PRESET_ACTION":{s.push(Uc(d,{index:p,includeDomState:o,header:void 0})),d.status==="FAILED"&&(c=p);break}case"CONDITIONAL":case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":case"SECTION":{if(i){s.push(Uc(d,{index:n?p:void 0,includeDomState:o,header:"start"})),l+=1;let{failureIndex:m,results:h}=await GT(r,e,d.results,{addIndices:n,includeDomState:o,flatten:i,maxItemsFromEnd:a,indexOffset:l+u});s.push(...h),m!==void 0&&(c=m),l+=h.length,s.push(Uc(d,{index:n?l+u:void 0,includeDomState:o,header:"end"})),l+=1}else s.push(Uc(d,{index:n?l+u:void 0,includeDomState:o,header:void 0}));break}default:return(h=>{throw new Error("You missed a case in the switch above")})(d)}}return{results:s,failureIndex:c}}async function ea(r,e,t,{numStepsWithScreenshots:n=5,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,flatten:l=!0,maxItemsFromEnd:c=20}){let s=await GT(r,e,t,{addIndices:o,includeDomState:a,flatten:l,maxItemsFromEnd:c,indexOffset:0}),{results:u}=s,{failureIndex:d}=s;d!==void 0&&u.length>0&&(u=u.slice(0,d+1));let p=[],m=0;if(c!==void 0&&u.length>c&&(m=u.length-c),d!==void 0&&d<u.length-1&&r.warn("PROCESS_RESULTS_FOR_LLM: Failure index check - should not be possible",{failureIndex:d,flattenedResultsLength:u.length,lastIndex:u.length-1,isLastIndex:d===u.length-1,offset:m}),d!==void 0&&m>d)throw new Error("Failure index is out of bounds");for(let h=m;h<u.length;h++){let g=u[h],f={description:g.description,startedAt:g.startedAt,finishedAt:g.finishedAt,beforeUrl:g.beforeUrl,afterUrl:g.afterUrl,elementInteracted:g.elementInteracted,message:g.message,pageState:g.pageState,index:g.index},S,y;(n===void 0||n>0&&h>=u.length-n)&&(g.afterSnapshot&&(y=await BT(r,e,g.afterSnapshot)),i&&g.beforeSnapshot&&(S=await BT(r,e,g.beforeSnapshot))),f.beforeScreenshot=S,f.afterScreenshot=y,p.push(f)}return{results:p,failureIndex:d!==void 0?d-m:void 0}}function ta({json:r,keysToRedact:e,maxJsonStringSize:t}){try{if(!r)return r;if(typeof r=="string")return Ze(r,t??2e4);if(typeof r=="object"){let{jsonString:n}=HT(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 Xm(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=HT(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":zT(n);break;case"CONDITIONAL":n.assertionResult&&zT(n.assertionResult),Xm(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":{Xm(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 zT(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function zc(r,e){let t=rD(r);if(Xm(t,e),t.length>FT)return e.error("Results too long, truncating before insertion"),t.slice(t.length-FT,t.length);let n=JSON.stringify(t);if(n.length>UT)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>UT;)t.splice(0,1),n=JSON.stringify(t);try{return gt.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 Sre}from"lodash-es";var iD=/^(?!.*\S+\s+\S+).*$/,aD=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,sD=/style="([^"]*)/g,lD=/data-[\w-]+/g,cD=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 jT(r){let e=cD(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:iD.test(t)&&aD.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:sD.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"}:lD.test(t)?{thoughts:"Hardcoded data attributes are not recommended in the command description as they change frequently.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:`The element description you provided starts with the command type (${e.type}). This can confuse our AI agents since the element itself is unrelated to the desired action.`,category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}function VT(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 Sb}from"lodash-es";import hD from"diff-lines";import Gc,{gte as gD}from"semver";var $T={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 WT={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 uD=["target","fromTarget","toTarget"];function qT(r){for(let e of uD){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var KT={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 qT(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])qT(n);return e}default:return e}})};import{v4 as dD}from"uuid";var YT={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=dD()),e;default:return e}})};import{v4 as XT}from"uuid";var JT={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??XT(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??XT()}})),delete e.commands),e;default:return e}})};var QT={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 pD}from"uuid";var ZT={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=pD()),e))};import{v4 as eb}from"uuid";var tb={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=eb())}return e.id=eb(),e})};var rb={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 mD}from"uuid";var nb={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=mD()),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 ob={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 ib={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&&ab(t),e})};function ab(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){ab(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 sb={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 lb={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 cb={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 ub={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 db={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 pb={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 Hc=new Set(["CLICK","TYPE","SELECT_OPTION"]),mb={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||Hc.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let l=a?.elementDescriptor,c=a?.type;(l!==void 0||Hc.has(c))&&(a.target={elementDescriptor:l??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let l=a.command,c=l?.elementDescriptor,s=l?.type;(c!==void 0||Hc.has(s))&&(l.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Hc.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var hb={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 gb={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,l=a?.type;l?.startsWith("PRESET_")&&(a.type=l.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(s=>{let u=s.type;u?.startsWith("PRESET_")&&(s.type=u.slice(7))})}),e}),stopOnFailure:!0};var Qo=[pb,hb,gb,mb,$T,WT,KT,YT,JT,QT,ZT,tb,rb,nb,ob,ib,sb,lb,cb,ub,db];if(le!==Qo[Qo.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Qo.forEach((r,e)=>{if(!Gc.valid(r.toVersion)||!Gc.valid(r.fromVersion))throw new Error(`Migration '${r.name}' has invalid version`);if(!Gc.gt(r.toVersion,r.fromVersion))throw new Error(`Migration '${r.name}' has toVersion <= fromVersion`);if(e===0)return;if(Qo[e-1].toVersion!==r.fromVersion)throw new Error(`Migration '${r.name}' at index ${e} is not contiguous with previous migration`)});function fD(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var Is=async({metadata:r,steps:e,logger:t,toVersion:n})=>{let o=e,{schemaVersion:i,id:a}=r,l=Qo.findIndex(u=>Gc.gt(u.toVersion,i));if(l===-1)return{steps:o,newVersion:i};let c=i;for(let u=l;u<Qo.length;u++){if(n&&gD(c,n)){t.debug("Stopping migration early because toVersion was reached");break}let d=Qo[u],p={id:a,migration:d.name,toVersion:d.toVersion};try{o=await fb(o,d),c=d.toVersion}catch(m){throw t.error({err:m,...p},"Migration failed"),new Error(`Step migration ${d.name} failed: ${m}`)}}let s=hD(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return s.trim()&&t.debug({diffs:s,id:a},"Migration diffs"),{newVersion:c,steps:o}};async function fb(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)||fD(i)&&(n[o]=await fb(i,e))}return t}async function yb({rawSteps:r,metadata:e,logger:t,callbacks:n}){VT(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await jc({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),l={...e,steps:i,schemaVersion:a};for(let c of["beforeSteps","afterSteps"]){let s=r[c];if(!s)continue;let{resolvedSteps:u}=await jc({rawSteps:s,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});l[c]=u}return{resolvedTest:l,moduleIds:Array.from(Object.keys(o))}}async function Zo(r,e,t){let{newVersion:n,steps:o}=await Is({metadata:r,steps:e,logger:t});try{return{steps:ke.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 dc(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function jc({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await Zo(e,r,t),l=[];for(let c of a)l.push(await Ms({step:c,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:l,newSchemaVersion:i}}async function Ms({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,s=n[c];if(s)return{...Sb(s),...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 Is({metadata:{id:c,schemaVersion:u.schemaVersion},steps:u.steps,logger:t}),m;try{m=ke.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=>Ms({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]=Sb(g),{...g,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let c of r.blocks){let s=[];for(let u of c.steps)s.push(await Ms({step:u,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...c,steps:s})}let i;if(r.elseSteps){i=[];for(let c of r.elseSteps)i.push(await Ms({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 Ms({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{diff as Tb}from"deep-object-diff";import{cloneDeep as Eb}from"lodash-es";import{v4 as Jm}from"uuid";async function We(r){let e=new Map,t=new Set,n=Wn.parse({steps:r.stepLists.steps??[],beforeSteps:r.stepLists.beforeSteps??void 0,afterSteps:r.stepLists.afterSteps??void 0}),o=Eb(n.steps),i=await ei({...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 l of["beforeSteps","afterSteps"]){let c=Eb(n[l]);if(!c)continue;let s=await ei({...r,steps:c,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});a.cachesToSave.push(...s.cachesToSave),a.moduleUpdates.push(...s.moduleUpdates),a.stepsToSave[l]=s.stepsToSave}return a}async function ei({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:l,createNewCacheIds:c}=e,s={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(delete u.index,delete u.aiSuggested,u.id=c?Jm():u.id,u.type){case"PRESET_ACTION":{let p=u.command;p.id=c?Jm():p.id,"cache"in p&&p.cache&&(n&&(s.cachesToSave=s.cachesToSave.concat($m({id:p.id,orgId:n.orgId,testId:n.testId,value:En.parse(p),moduleIdParents:o,moduleStepParents:i}))),delete p.cache),p.thoughts&&delete p.thoughts,s.stepsToSave.push({...u,command:p});break}case"RESOLVED_MODULE":{let p=c?Jm():u.id,m=u.moduleId;a.has(m)?m=a.get(m):l!==void 0&&(m=await l(u),a.set(u.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await ei({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,p],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});s.moduleUpdates=s.moduleUpdates.concat(f),s.cachesToSave=s.cachesToSave.concat(h),t.has(m)||(t.add(m),s.moduleUpdates.push({...Kt.parse(u),steps:ke.array().parse(g),moduleId:m}));let S=Mr.parse({...u,type:"MODULE",moduleId:m,inputs:u.inputs,id:p,skipped:u.skipped,cacheConfig:u.cacheConfig,envKey:u.envKey});s.stepsToSave.push(S);break}case"AI_ACTION":{if(!u.steps){s.stepsToSave.push(u);break}let{stepsToSave:p,cachesToSave:m}=await ei({...e,steps:u.steps});try{u.steps=nr.array().parse(p)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}s.stepsToSave.push(u),s.cachesToSave=s.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{s.stepsToSave.push(u);break}case"CONDITIONAL":{let p=[];for(let h of u.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:S}=await ei({...e,steps:h.steps});p.push({...h,steps:g}),s.cachesToSave=s.cachesToSave.concat(f),s.moduleUpdates=s.moduleUpdates.concat(S)}let m={...u,elseSteps:void 0,blocks:p};if(u.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await ei({...e,steps:u.elseSteps});m.elseSteps=h,s.cachesToSave=s.cachesToSave.concat(g),s.moduleUpdates=s.moduleUpdates.concat(f)}s.stepsToSave.push(m);break}case"SECTION":{let{stepsToSave:p,cachesToSave:m,moduleUpdates:h}=await ei({...e,steps:u.steps}),g={...u,steps:p};s.moduleUpdates=s.moduleUpdates.concat(h),s.stepsToSave.push(g),s.cachesToSave=s.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 s}async function Vc({logger:r,cacheStorage:e,orgId:t,testId:n,originalSteps:o,updatedSteps:i}){let a=Tb(o,i);if(Object.keys(a).length!==0){r.debug("Updating step caches post-success");try{let{cachesToSave:l}=await We({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries({logger:r,testId:n,entries:l})}catch(l){r.error({err:l},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async function $c({logger:r,cacheStorage:e,orgId:t,testId:n,originalSteps:o,updatedSteps:i}){let a=Tb(o,i);if(Object.keys(a).length===0)return;r.debug({changes:a},"Updating memory post-run failure");let l={};for(let u of["steps","beforeSteps","afterSteps"]){let d=o[u];if(!d||!d.length)continue;let p=LT({steps:d});for(let[m,h]of Object.entries(p))l[m]=h}let{cachesToSave:c}=await We({stepLists:i,cacheCreationParams:{testId:n,orgId:t}}),s=NT({newEntries:c,originalCachesMap:l,logger:r});if(s.length){r.debug({prunedCaches:s},"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.")}}}import{cloneDeep as SD}from"lodash-es";import{stringify as bb}from"yaml";async function vb({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 yD({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:pe.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:bb(a),modules:o}}async function yD({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=SD(r);Object.values(o).forEach(l=>{ED(l??[])});let{stepsToSave:i,moduleUpdates:a}=await We({stepLists:o,createNewCacheIds:n});for(let l of a)t.has(l.name)||(e[l.name]=TD(l),t.add(l.name));return i}function ED(r){Cs({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 TD(r){let e=Kt.parse(r),t={fileType:pe.MODULE,...e,schemaVersion:le,steps:r.steps};return bb(t)}async function ne(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 Ps({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((l,c)=>{function s(){clearInterval(a),e?.removeEventListener("abort",s),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",s,{once:!0}),(async()=>{try{l(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",s)}})()})}async function ti({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,l=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",l),!i&&a.abort()},e);o?.addEventListener("abort",l,{once:!0});try{return await Ps({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",l),clearTimeout(c)}}function Rb(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 Wc(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(Mr.parse(n));break}case"SECTION":{let n={...t,steps:Wc(t.steps)};e.push(ke.parse(n));break}case"CONDITIONAL":{let n={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Wc(o.steps)})),elseSteps:t.elseSteps?Wc(t.elseSteps):void 0};e.push(Uo.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 qc(r){return Wc([r])[0]}import bD from"picomatch";var Kc=(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||bD(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},Yc=(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}},ra=r=>{try{return new URL(r),!0}catch{return!1}},wb=r=>!r.toLowerCase().startsWith("http"),na=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function ri(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 vD(r){let{logger:e,browserStateStorage:t,generator:n,results:o,error:i,maxItemsFromEnd:a,numStepsWithScreenshots:l,disableCache:c}=r,s=[];if(o.length>0){let{results:d}=await ea(e,t,o,{numStepsWithScreenshots:l,maxItemsFromEnd:a,includeBeforeScreenshots:!0,includeContainerTagsInDescription:!0});s=d}return await n.getTestResultClassification({results:s,errorMessage:i.message,errorStack:i.stack},{disableCache:c??!1})}async function Ab(r){let{logger:e,browserStateStorage:t,generator:n,fullResults:o,failureReason:i,error:a,maxItemsFromEnd:l,numStepsWithScreenshots:c,disableCache:s}=r,u=o?.results??[];if(i==="SetupFailureError"){let d=(o?.beforeResults??[]).at(0);u=[Bc("setup",{followingStepStart:d?.startedAt}),...o?.beforeResults??[]]}else if(i==="TeardownFailureError"){let d=u.at(-1),p=(o?.afterResults??[])[0],m=Bc("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=Bc("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 vD({logger:e,browserStateStorage:t,generator:n,results:u,error:a,maxItemsFromEnd:l,numStepsWithScreenshots:c,disableCache:s});return{classification:d,aiFailureReason:d.reason}}catch(d){return e.error({err:d},"Failed to classify test result"),{}}}import{v4 as Cb}from"uuid";function Qm(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Xc=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:Qm({},this.metadata)}]).catch(l=>e.error({err:l},"Failed to report billable event"))]}trackStepExecution(e){if(Ny(e.type)){this.creditsUsedV2+=1;return}let t=tm(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=rm(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:Cb(),properties:Qm({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:Cb(),properties:Qm({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};function oa({orgId:r,client:e,gitMetadata:t,alwaysSaveCache:n,noCache:o}){return o?new bc:new Zm(r,e,t,n)}var Zm=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{gitBranchName:i,gitProtectedBranches:a}=n;this.cacheHeaders=Cm(n),o?this.writeCaches=!0:i?this.writeCaches=!a.includes(i):this.writeCaches=!0}cacheHeaders;writeCaches;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){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}for(let l of[t,n,o])l&&Zi({steps:l,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await We({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import RD from"path";var wD=new xc(30,60*1e3),nh="https://api.momentic.ai",_b,Ib=r=>{nh=r},Nr=()=>nh;var ia,rh,Jc,Mb=async r=>{if(_b&&ia&&Jc)return ia;let e=new Qe({baseUrl:nh,apiKey:r,logger:T});_b=e;try{let t=await e.getAuthInfo();return ia=t.orgId,rh=t.userId,Jc=r,ia}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Et=()=>{if(!ia)throw new Error("Your organization ID is invalid.");return ia},aa=()=>{if(!rh)throw new Error("Your user ID is invalid.");return rh},Dr=()=>{if(!Jc)throw new Error("Your API key is invalid.");return Jc},oh,eh,Qc=(r,e)=>{oh=r,eh?.abort(),eh=new AbortController;let t=eh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=RD.resolve(r.rootDir,o.envFile);try{if(th.lstatSync(i).isSymbolicLink())return;th.existsSync(i)&&n.push(i)}catch(a){T.warn({err:a},`Failed to check if env file ${i} exists`)}});try{AD({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){T.error({err:o},"Failed to start config file watchers")}},se=()=>oh;function AD({filesToWatch:r,revalidator:e,signal:t,project:n}){r.forEach(o=>{th.watch(o,{signal:t,persistent:!1,recursive:!1},async(i,a)=>{a&&(wD.increment("setLocalProject")&&T.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.`),oh=await Promise.resolve(e(n.configFilePath)))})})}function Ee(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var Ls=CD();function Os(r){let e=se(),t=Tt.dirname(e.configFilePath);return Tt.join(t,...r)}function _D(r){let e=se(),t=Tt.dirname(e.configFilePath),n=Tt.relative(t,r);return n?n.split(Tt.sep):[]}function ID(r,e){let t=$t.statSync(r),n=_D(r);return ym.parse({name:e,absolutePath:r,relativePath:n.join(Tt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Ls.post("/",Ee(async(r,e,t)=>{let n;try{n=aE.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Os(n);if(!$t.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(Tt.sep)}`});return}if(!$t.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Tt.sep)}`});return}let a=se(),l=Array.from(a.config.exclude??[]).concat(gc),s=xD("*",{absolute:!1,cwd:o,ignore:l,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=Tt.join(o,d);return ID(p,d)}),u={absolutePath:o,pathSegments:n,contents:s};e.status(200).json(u)}));Ls.put("/",Ee(async(r,e,t)=>{let n;try{n=sE.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Os(n);if($t.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(Tt.sep)}`,pathSegments:n});return}$t.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(Tt.sep)}`,pathSegments:n};e.status(201).json(i)}));Ls.patch("/",Ee(async(r,e,t)=>{let n,o;try{let s=lE.parse(r.body);n=s.pathSegments,o=s.newPathSegments}catch(s){e.status(400).json({error:`Failed to parse folder update body: ${s}`});return}let i=Os(n),a=Os(o);if(!$t.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(Tt.sep)}`});return}if($t.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(Tt.sep)}`});return}let l=Tt.dirname(a);$t.existsSync(l)||$t.mkdirSync(l,{recursive:!0}),$t.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(Tt.sep)} to ${o.join(Tt.sep)}`,pathSegments:o};e.status(200).json(c)}));Ls.delete("/",Ee(async(r,e,t)=>{let n,o=!0;try{let c=cE.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=Os(n);if(!$t.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(Tt.sep)}`,pathSegments:n});return}if(!$t.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(Tt.sep)}`});return}if(o)$t.rmSync(i,{recursive:!0,force:!0});else{if($t.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}$t.rmdirSync(i)}let l={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(l)}));var ih=Ls;import QG from"events";import f_,{Router as ZG}from"express";import{diff as LD}from"deep-object-diff";import Fr from"fs";import ni from"path";import la from"yaml";import{z as Lb}from"zod";import{execSync as MD}from"child_process";function Rn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,T.debug({postSaveCommand:n},"Executing post-save hook command");try{MD(n,{encoding:"utf-8"})}catch(o){T.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as Pb}from"deep-object-diff";import nn from"fs";import{cloneDeep as PD}from"lodash-es";import Ns from"path";import{v4 as OD}from"uuid";import Ds from"yaml";function Wt({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!nn.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=nn.readFileSync(i,"utf-8"),l=Ds.parse(a),c;if(r.name&&r.name!==l.name){let m=`${Me(r.name)}.module.yaml`;if(c=Ns.join(Ns.dirname(i),m),nn.existsSync(c))throw new Error(`A conflicting file '${r.name}' already exists at path '${c}'`)}let s={...r,schemaVersion:e},u=tn({fileType:pe.MODULE,...bm.parse(s),steps:ke.array().parse(r.steps)}),d=Pb(u,l);if(d&&Object.keys(d).length===0&&!o){T.debug(`Skipping save for module ${r.moduleId} since there are no changes`);return}let p=Ds.stringify(u);nn.writeFileSync(i,p,"utf-8"),c&&nn.renameSync(i,c),Rn(c||i,n.config)}function Ob({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=wn(i,o),l={...a,...e},c=tn({fileType:pe.MODULE,...bm.parse(l),steps:a.steps}),s=Pb(c,a);if(s&&Object.keys(s).length===0){T.debug(`Skipping save for module ${r} since there are no changes`);return}let u=Ds.stringify(c);nn.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${Me(e.name)}.module.yaml`;if(d=Ns.join(Ns.dirname(i),p),nn.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);nn.renameSync(i,d)}Rn(d||i,n.config)}async function Zc({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Me(r),l=Ns.join(o,`${a}.module.yaml`),c=OD(),{stepsToSave:s}=await We({stepLists:{steps:n}}),u={fileType:pe.MODULE,schemaVersion:le,moduleId:c,name:r,description:e,enabled:t,steps:s.steps},d=Ds.stringify(u);return nn.writeFileSync(l,d,"utf-8"),Rn(l,i.config),{moduleId:c,name:r,description:e,enabled:t,steps:n}}function wn(r,e){let t=nn.readFileSync(r,"utf-8"),n=Ds.parse(t);try{return am.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 kr(r,e,t,n){let o=wn(r.fullFilePath,t),{resolvedSteps:i}=await jc({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:l})=>{let c=e.modules[l]?.fullFilePath;if(c)return wn(c,t)}}}),a={...o,steps:i};return n&&(n[r.id]=PD(a)),a}async function eu(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await kr(n,r,e,t)})),Array.from(Object.values(t))}async function Nb({test:r,name:e,folder:t}){let n=await vb({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Me(e)}.test.yaml`,a=ni.join(t,i);return Fr.writeFileSync(a,n.test,"utf-8"),a}function ah(r,e,t){let n=ni.join(t.rootDir,r);if(!Fr.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=Fr.readFileSync(n,"utf-8"),i=la.parse(o),a,l;if(e.name&&e.name!==i.name){let p=`${Me(e.name)}.test.yaml`;if(a=ni.join(ni.dirname(r),p),l=ni.join(t.rootDir,a),Fr.existsSync(l))throw new Error(`Test with name '${e.name}' already exists at path '${l}'`)}let c={...i,...e},s=yr.parse(c),u={fileType:pe.TEST,...yr.parse(s),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=la.stringify(u);return Fr.writeFileSync(n,d,"utf-8"),l&&Fr.renameSync(n,l),Rn(n,t.config),{newRelativeTestPath:a}}function Ft({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=ni.join(n.rootDir,r);if(!Fr.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=Fr.readFileSync(i,"utf-8"),l=la.parse(a),c=yr.parse({...l,schemaVersion:t}),s=ke.array().or(Lb.undefined()).parse(e.beforeSteps),u=ke.array().parse(e.steps),d=ke.array().or(Lb.undefined()).parse(e.afterSteps),p=tn({fileType:pe.TEST,...c,beforeSteps:s&&s.length>0?s:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=LD(p,l);if(m&&Object.keys(m).length===0&&!o){T.debug(`Skipping save for test ${c.name} since there are no changes`);return}let h=la.stringify(p);Fr.writeFileSync(i,h,"utf-8"),T.debug(`Saving test ${c.name} to ${i}`),Rn(i,n.config)}function ks(r,e){let t=ni.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=Fr.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
|
|
27
|
+
`)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=la.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return Dt.parse(o)}function oi(r,e,t){let n=t.project.rootDir,o;try{o=Fr.readFileSync(r,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=la.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${r} is missing steps`);return i}async function qe(r,e,t){let n=oi(r,e,t),o;try{o=yr.parse(n)}catch(a){throw new Error(`Test ${r} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await yb({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:l})=>{let c=t.modules[a]?.fullFilePath;if(c)return wn(c,l)}}});return i}import ND from"@dotenvx/dotenvx";import DD from"fs";import Db from"path";function tu(r,e){return(r.config.environments??[]).map(t=>Fs(t.name,r,e))}function kb(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 kD(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 l=kb(i);l&&(n[o]=l);continue}let a;try{a=DD.readFileSync(Db.resolve(t.rootDir,i.fromFile),"utf-8")}catch(l){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${l}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(l){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${l}`)}else n[o]=a}return Object.keys(n).length>0&&T.debug(n,"Set environment variables with interpolation from project configuration"),n}function FD(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=ND.config({path:Db.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 Fs(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={[St]:kb(n.baseUrl)},i=kD({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=FD({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 XD,readFileSync as JD,readdirSync as QD,writeFileSync as ZD}from"fs";import{glob as ek}from"glob";import ii,{dirname as Bb}from"path";import{cwd as dh}from"process";import zb from"yaml";import{z as ze}from"zod";import Fb from"fs";import{glob as UD}from"glob";import Us from"path";import BD from"yaml";import{z as sh}from"zod";var Ub=!1,lh=["**/*.test.yaml","**/*.module.yaml"],ch=sh.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),uh=15,zD=sh.object({fileType:sh.nativeEnum(pe)});async function K(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??lh,o=Array.from(r.config.exclude??[]).concat(gc),i=AbortSignal.timeout(3e3),a;try{a=await UD(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:uh,nodir:!0,signal:i})}catch(l){throw T.error({err:l},"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 3 seconds.",{cause:l})}for(let l of a){let c=HD(r.rootDir,l,t,e?bn:T);c&&(t.duplicateEntities[c.id]=c.paths)}return Ub=!0,t}function HD(r,e,t,n){let o=Us.join(r,e),i=GD(o,n);if(!i)return;let a=jD(i,o,n);if(!a)return;let l=zD.safeParse(a);if(l.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${l.error}`);return}let c=l.data.fileType,s=VD(o,n);if(!s)return;let u=$D(e,o,s);switch(c){case pe.TEST:try{return WD(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case pe.MODULE:try{return qD(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case pe.MOBILE_TEST:try{return YD(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case pe.MOBILE_MODULE:try{return KD(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 GD(r,e){try{return Fb.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function jD(r,e,t){try{let n=BD.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 VD(r,e){try{return Fb.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function $D(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:Us.sep,fullPathSegments:e.split(Us.sep),relativePathSegments:r.split(Us.sep),fileName:Us.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function WD(r,e,t,n,o){let i=yr.parse(r),a;if(e.tests[i.id]){let l=e.tests[i.id].fullFilePath;a={id:i.id,paths:[l,n]}}return e.tests[i.id]={type:pe.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function qD(r,e,t,n,o){let i=Kt.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:pe.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let l=t.fileName.replace(".module.yaml","");return!Ub&&Me(i.name)!==l&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${l}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function KD(r,e,t,n,o){let i=ic.parse(r),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let l=t.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:pe.MOBILE_MODULE,name:l,id:i.moduleId,description:i.description??void 0,...t},a}function YD(r,e,t,n,o){let i=hs.parse(r),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let l=t.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:pe.MOBILE_TEST,name:l,id:i.id,description:i.description??void 0,...t},a}var ca="momentic.config.yaml",ph="momentic.workspace.yaml",tk=ze.object({projects:ze.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),rk=ze.union([ze.string(),ze.object({fromFile:ze.string(),json:ze.boolean().optional()})]),nk=ze.object({name:ch,baseUrl:ze.string().optional().describe("Optional for mobile tests"),envFile:ze.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:ze.record(ze.string(),rk).optional(),inheritFromShell:ze.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Ho.optional().describe("deprecated: use project-level configuration only")}),ok=ze.object({postSave:ze.string().optional()}),ik=ze.object({name:ch,include:ze.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:ze.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:ze.string().optional(),reporterDir:ze.string().optional(),outputDir:ze.string().optional(),retries:ze.number().optional().describe("number of retries per test"),parallel:ze.number().optional().describe("degree of parallelism"),environments:ze.array(nk).optional(),gitMainBranch:ze.string().optional(),gitProtectedBranches:ze.string().array().optional(),ai:vm.optional(),browser:Ho.optional(),emulator:lm.optional(),advanced:Rm.optional(),hooks:ok.optional()});function Hb(r,e){let t;try{t=JD(r,"utf-8")}catch(o){T.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=zb.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){T.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function mh(r){let e=Hb(r,"project configuration");if(e!==void 0)try{return ik.parse(e)}catch(t){T.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function ak(r){let e=Hb(r,"workspace configuration");if(e!==void 0)try{return tk.parse(e)}catch(t){T.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function sk(){let r=[],e=dh(),t=ii.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=ii.basename(e);if(hc.includes(i))return T.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of QD(e))if(a.endsWith(ca)){let l=ii.join(e,a),c=mh(l);c&&r.push({configFilePath:l,config:c,rootDir:Bb(l)})}if(r.length)return r;if(e=ii.dirname(e),e===t)break}return r}async function bt(r={}){let{configFilePath:e,nameFilter:t}=r,n=await hh(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:
|
|
28
|
+
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return T.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function lk(r){let e=ak(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ca}`)),n=AbortSignal.timeout(2e3),o;try{o=await ek(t,{absolute:!1,cwd:dh(),dotRelative:!1,maxDepth:uh,nodir:!0,signal:n})}catch(a){throw T.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${ph} is misconfigured.`),a}let i=[];for(let a of o){let l=ii.join(dh(),a),c=mh(l);c&&i.push({configFilePath:l,config:c,rootDir:Bb(l)})}return i}async function hh(r){if(r){r=ii.resolve(r);let t=mh(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:ii.dirname(r)}]}if(XD(ph)){let t=await lk(ph);if(t)return t}return sk()}function ua(r,e){let t=zb.stringify(r);ZD(e,t)}import da from"fs";import gh from"path";import{z as fh}from"zod";var Gb="golden/visual-diff",jb="reports",Vb="test-results";var ck=fh.object({width:fh.number(),height:fh.number()}),pa=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let n=gh.join(e.rootDir,e.config.goldenFileDir??Gb);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=gh.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return da.mkdirSync(gh.dirname(o),{recursive:!0}),da.writeFileSync(o,n.buffer),da.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(da.existsSync(o)){let a=da.readFileSync(o),l=ck.parse(JSON.parse(da.readFileSync(i,"utf-8")));return{buffer:a,width:l.width,height:l.height}}else throw new C("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as uk}from"node:child_process";import{promisify as dk}from"node:util";import pk from"simple-git";var Oe=pk(),$b=dk(uk);async function mk(r){let e=await He(r,Oe.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
|
|
29
|
+
`)){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 hk(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 $b("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),l=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(l?.[1])return l[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await $b("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function gk(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return hk(r,e,t);if(o)return}catch{}}function ru(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 He(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function fk(){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 Sk(r){let[e,t,n]=await Promise.all([He(r,Oe.show(["--no-patch","--format=%ci"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.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{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 yk(r){let[e,t,n]=await Promise.all([He(r,Oe.listRemote(["--get-url","origin"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function Ek(r){let[e,t,n,o]=await Promise.all([He(r,Oe.show(["--no-patch","--format=%ci"])),He(r,Oe.listRemote(["--get-url","origin"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),l=t?ru(t):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function Tk(r){let[e,t,n]=await Promise.all([He(r,Oe.show(["--no-patch","--format=%ci"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),l=o?ru(o):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function bk(r){let[e,t,n]=await Promise.all([He(r,Oe.show(["--no-patch","--format=%ci"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),l=o?ru(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?l:void 0,gitlabProjectPath:a?l:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function vk(r,e){let[t,n,o,i,a,l,c,s,u]=await Promise.all([He(r,Oe.revparse(["HEAD"])),He(r,Oe.revparse(["--short","HEAD"])),He(r,Oe.revparse(["--abbrev-ref","HEAD"])),He(r,Oe.listRemote(["--get-url","origin"])),He(r,Oe.show(["--no-patch","--format=%ci"])),He(r,Oe.show(["-s","--pretty=%B"])),He(r,Oe.show(["-s","--pretty=%an"])),e?He(r,Oe.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),mk(r)]),d=s?await He(r,Oe.show(["--no-patch","--format=%ci",s])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),h=i?ru(i):void 0,g=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,y=await gk(r,i,u)??S??void 0;return{gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:y,gitLocalEmail:g,gitLocalName:f,lastCommitOnMainSha:s,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?h:void 0,gitlabProjectPath:m?h:void 0,pipelineId:void 0}}async function Rk(){let r=process.env._HEAD_REPO_URL;return{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 wk(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Bs(r,e){let t=fk();if(!t)return vk(r,e);switch(t){case"GithubActions":return Sk(r);case"GitlabCI":return yk(r);case"CircleCI":return Ek(r);case"Buildkite":return Tk(r);case"AzureDevOps":return bk(r);case"GCPCloudBuild":return Rk()}}async function Ak(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 Ck(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 xk(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await Ck(r,e,n,o,t)}else if(t.gitlabProjectPath)return await Ak(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function ao(r,e,t){let n=await wk(t),o=await Bs(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 xk(r,e,i);return{...n,...o,...a}}async function Wb(){try{return!!(await Oe.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as dle}from"deep-object-diff";import{cloneDeep as mle}from"lodash-es";import{v4 as Ale}from"uuid";import xle from"yaml";import jle from"yaml";import{randomUUID as _k}from"crypto";import An from"fs";import ai from"path";var qb={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 Ik(r,e,t){if(qb[t]){let i=qb[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 Kb=new Set([".DS_Store","__MACOSX"]);function Yb(r,e,t){let n=_k(),o=r.child({runGroupId:n});An.rmSync(e,{recursive:!0,force:!0});let i=An.readdirSync(t).filter(s=>!Kb.has(s)).map(s=>ai.join(t,s));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);An.mkdirSync(e,{recursive:!0});let a=ai.join(i[0],"metadata.json"),l={...vs.parse(JSON.parse(An.readFileSync(a,"utf-8"))),id:n};for(let s of i){let u=ai.join(s,"runs");if(!An.existsSync(u))continue;let d=An.readdirSync(u);for(let h of d){if(Kb.has(h))continue;let g=ai.join(u,h),f=ai.join(e,"runs",h);An.cpSync(g,f,{recursive:!0})}let p=ai.join(s,"metadata.json"),m=vs.parse(JSON.parse(An.readFileSync(p,"utf-8")));o.info({oldRunGroupId:m.id},"Merging metadata from run groups");for(let h in m){if(h==="id")continue;let g=h;l[g]=Ik(l,m,g)}}let c=ai.join(e,"metadata.json");An.writeFileSync(c,JSON.stringify(l,null,2))}import Xb from"adm-zip";import Sh from"fs";import nu from"path";function Mk(r){let e=new Xb,t=nu.join(r,"metadata.json"),n=vs.parse(JSON.parse(Sh.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Sh.readdirSync(nu.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new Xb(nu.join(r,"runs",o));for(let l of a.getEntries())l.isDirectory||e.addFile(nu.join("runs",i,l.entryName),l.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function ou(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Sh.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new Mc(e);try{let{runGroupId:i,buffer:a}=Mk(n),l=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${l}`;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 Pk from"adm-zip";import Ct from"fs";import or from"path";var zs=class r{constructor(e){this.filePath=e;Ct.rmSync(this.filePath,{recursive:!0,force:!0}),Ct.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(or.join(this.filePath,e))}mkdir(e){Ct.mkdirSync(or.join(this.filePath,e),{recursive:!0})}readFile(e){let t=or.join(this.filePath,e);if(Ct.existsSync(t))return Ct.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=or.join(this.filePath,t);try{Ct.writeFileSync(o,n)}catch{}}createFileStream(e){let t=or.join(this.filePath,e);return Ct.createWriteStream(t)}createRunArchive(e){return new yh(or.join(this.filePath,"runs"),e)}},yh=class{constructor(e,t){this.filePath=e;this.tempPath=or.join(e,`.${t}`),this.finalPath=or.join(e,`${t}.zip`),Ct.rmSync(this.tempPath,{recursive:!0,force:!0}),Ct.rmSync(this.finalPath,{recursive:!0,force:!0}),Ct.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=or.join(this.tempPath,e);if(Ct.existsSync(t))return Ct.readFileSync(t)}mkdir(e){Ct.mkdirSync(or.join(this.tempPath,e),{recursive:!0})}cd(e){return new zs(or.join(this.tempPath,e))}storeFile(e){let{name:t,contents:n}=e,o=or.join(this.tempPath,t);Ct.writeFileSync(o,n)}createFileStream(e){let t=or.join(this.tempPath,e);return Ct.createWriteStream(t)}close(){let e=new Pk;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Ct.writeFileSync(this.finalPath,t),Ct.rmSync(this.tempPath,{recursive:!0,force:!0})}};import ej from"http";import tj from"path";import{Server as O1}from"socket.io";var Ok=({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{}}},Jb={event:"cancel",createHandler:Ok};var Lk=({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 l=a.controller.browser;try{let s=(await l.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:s},"Fetched a11y tree from the browser"),i({a11yTree:s})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},Qb={event:"fetchA11yTree",createHandler:Lk};var Nk=({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 l=a.controller.browser;try{let c=await l.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})}}},Zb={event:"fetchDom",createHandler:Nk};var Dk=({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)}},ev={event:"disconnect",createHandler:Dk};function on(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=kk(t);Fk(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await Uk(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function kk(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertionResult){t=e;break}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 Fk(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 Uk(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as Yk}from"crypto";import{faker as Bk}from"@faker-js/faker";import zk from"assert";import Hk from"axios";import*as Gk from"child_process";import jk from"moment";import*as Vk from"otpauth";import $k from"pg";async function tv(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=rc(n,e);t.push(...o)}),t}function Wk(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 qk(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 Kk=Object.getPrototypeOf(async function(){}).constructor;async function rv(r,e,t){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:l}=e.bindings,c=e.tools,s={},u=(E,w)=>{o[E]=w,s[E]=w},d={},p=(E,w)=>{o[E]=w,d[E]=w},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 Kk("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Hk,jk,c.fakerInstance??Bk,zk,$k,m,h,Vk,Gk,tv,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,w=>c.sms.send(w),w=>c.sms.fetchLatest(w),c.email,c.sms,c.ai,Wk(a,l),...Object.values(i??{}))),f=!0,S,y;try{let E=await j(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await qk(e.options.responseSerialization??"RAW",E)}catch(E){t.error({err:E,env:o,evalCode:n},`[${r}] Error executing code: ${E}`),f=!1,E instanceof no?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=E instanceof Error?E.message:`${E}`}return{result:S,variableUpdates:s,persistentVariableUpdates:d,success:f,error:y}}async function nv({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=eo,disallowVariableUpdates:l,additionalBindings:c,responseSerialization:s,mock:u}){let d=Yk(),p=await rv(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:l,responseSerialization:s},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return T.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as Xk,randomUUID as Jk}from"crypto";import Qk from"fetch-retry";var Zk=Qk(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}}),ov=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,iv=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function av({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=eo,retries:i=2,signal:a,logger:l,additionalBindings:c,disallowVariableUpdates:s,responseSerialization:u,mock:d}){if(!ov)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!iv)throw new Error("Missing lambda auth secret.");let g=Xk("sha256",iv).update(r).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let S={id:Jk(),orgId:r,momenticLambdaAuthHash:g,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:s,responseSerialization:u};try{if(p=await j(Zk(ov,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw l.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=Fy.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function so(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await av(r);else if(r.localTools)e=await nv({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
30
30
|
${e.error}
|
|
31
31
|
Code received:
|
|
32
|
-
${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 e0}from"lodash-es";async function ir(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:l=Zn,allowUndefined:c=!1}=r,s=/{{(.*?)}}/g,u=t.matchAll(s),d=t;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),h;try{h=await ao({orgId:e,code:m,fragment:!0,context:n,timeoutMs:l,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 C("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 iu(r){return sv(r)}async function sv({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let l in r){if(e.includes(l))continue;let c=!1;if(t)if(t.includes(l))c=!0;else continue;let s=r[l],u=[...o,l];if(typeof s=="string"&&s.includes("{{")){let d=await ir({s,context:n,...a});if(s===d)continue;i.push({path:u,original:s}),r[l]=d}else typeof s=="object"&&s!==null&&!Array.isArray(s)&&await sv({obj:s,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function lv(r,e){for(let{path:t,original:n}of e)e0(r,t,n)}import t0 from"fetch-retry";var Fue=process.env.MAILINATOR_API_KEY,Uue=t0(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 l0}from"os";import{cloneDeep as uv}from"lodash-es";async function dv(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=dS(e.cache)?e.cache:void 0,a=uv(i),l=()=>{if(i){let m=Wm(a,i);i.target=m.target,i.updatedAt=m.updatedAt}},c=Date.now(),s=0,u,d=500,p=!1;for(;s<2||Date.now()-c<t;){s++,s>1&&await ne(d,o),o?.throwIfAborted();let{result:m,elementWasFound:h}=await cv({cacheToUse:i,params:r});if(u=m,p=h,m.success)break;l(),d=Math.min(d*2,1e4)}if(!u)throw new C("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!u.success&&i?.target&&_l(i.target)){let m=i?.target?.memory?{target:{id:-1,memory:i.target.memory}}:void 0,{result:h}=await cv({cacheToUse:m,params:r});u=h,u.success||l()}return u.success&&i?.target&&!p&&(i.target=_s(i.target),i.updatedAt=new Date),u}async function cv({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:l}=o;if(t.target&&!Hn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=n0(t.assertion),s,u=!1,d=uv(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=>r0(g.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Bo(t),targetName:"target"}});return s={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:h},u=!0,m.success||(l.warn({aiThoughts:h,elementString:p,err:m.err},"Element check found an element but failed"),s={...m,thoughts:h}),{result:s,elementWasFound:u}}catch(p){if(c)return s={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:s,elementWasFound:u};if(!(p instanceof C)||p.reason!="ActionFailureError")throw p;return s={success:!1,err:p,data:void 0,thoughts:void 0},l.warn({err:p},"Element check did not find an element and failed"),{result:s,elementWasFound:u}}}async function r0(r,{command:e,fixtures:t}){let n=e.assertion;await t.browser.highlight(r);let o=!0,i,a;switch(n.type){case"ELEMENT_CONTENT":{let c=await r.textContent()??"";if(a={elementTextContent:Ze(c,500,!0)},!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,i=new C("AssertionFailureError",`The content ${s} '${n.value}': ${c}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:Ze(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let c;try{c=await r.getAttribute(n.attr,{timeout:3e3})??""}catch(s){i=new C("AssertionFailureError",`The element does not have an attribute named ${n.attr}: ${s}`),o=!1;break}if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,n.operation==="EXISTS"?i=new C("AssertionFailureError",`The attribute ${n.attr} ${s}`):i=new C("AssertionFailureError",`The attribute ${n.attr} ${s} '${n.value}': ${c}`)}break}case"ELEMENT_EXISTENCE":{switch(n.condition){case"VISIBLE":{o=await r.evaluate(async(s,u)=>{let d=Date.now();for(;Date.now()-d<u;){await new Promise(m=>setTimeout(m,250));let p=s.getBoundingClientRect();if(!(p.width===0||p.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Wr*1e3);break}case"EDITABLE":{o=await r.isEditable({timeout:Wr*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await r.isEnabled({timeout:Wr*1e3});break}case"FOCUSED":{o=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"})(n.condition)}if(o=n.negated?!o:o,!o){let c=n.negated?qm[n.condition]:Km[n.condition];i=new C("AssertionFailureError",`The element ${c}`)}break}case"ELEMENT_NAME":{let c=await r.evaluate(s=>s.tagName);if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,i=new C("AssertionFailureError",`The element tag name ${s} '${n.value}': ${c}`)}break}case"ELEMENT_STYLE":{let c=await r.evaluate((s,u)=>window.getComputedStyle(s).getPropertyValue(u),n.property);if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,n.operation==="EXISTS"?i=new C("AssertionFailureError",`The style property ${n.property} ${s}`):i=new C("AssertionFailureError",`The style property ${n.property} ${s} '${n.value}': ${c}`)}break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{success:o,data:a,err:i}}function au(r,e,t,n){let o;switch(t){case"CONTAINS":{o=r.includes(e);break}case"EQUALS":{o=r.trim()===e.trim();break}case"STARTS_WITH":{o=r.trim().startsWith(e);break}case"EXISTS":{o=r.trim().length>0;break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return n?!o:o}function n0(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function pv(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as o0}from"jimp";async function Hs(r,e){let t=await r.screenshot(e),n=await o0.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as mv}from"jimp";import Eh from"jpeg-js";import i0 from"pixelmatch";async function hv({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:l}){if(t.target&&!Hn(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},s;t.target?.elementDescriptor?s=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async W=>Hs(o,{locator:W.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:s=await Hs(o,c);let u=await l.prepareGoldenScreenshotForComparison(a,t,s);if((s.height!==u.height||s.width!==u.width)&&a.warn({currHeight:s.height,currWidth:s.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(s.height-u.height)>10||Math.abs(s.width-u.width)>10){let Y=`${s.width}x${s.height}`,W=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${Y}) does not match saved screenshot dimensions (${W}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:s.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await mv.fromBuffer(s.buffer),p={width:s.width,height:s.height},m=await mv.fromBuffer(u.buffer),h={width:u.width,height:u.height},g,f=p.width*p.height,S=h.width*h.height,y=Math.abs(p.height-h.height),T=Math.abs(p.width-h.width);if(f>S){let Y=d.cover({w:h.width,h:h.height});s.buffer=await Y.getBuffer("image/jpeg"),g="current",s.width=h.width,s.height=h.height}else if(S>f){let Y=m.cover({w:p.width,h:p.height});u.buffer=await Y.getBuffer("image/jpeg"),g="saved"}let w={data:Buffer.alloc(s.width*s.height*4),width:s.width,height:s.height},v=t.threshold??.1,A=i0(Eh.decode(u.buffer).data,Eh.decode(s.buffer).data,w.data,s.width,s.height,{threshold:v,diffColorAlt:[0,255,0]})/(s.width*s.height)*100,_=A>v*100,M=`Visual diff of ${A.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${v*100}%.`;if(g&&(M+=` The ${g} screenshot was cropped since it was taller by ${y} pixels and wider by ${T} pixels.`),_)throw new C("ActionFailureError",M);return{fail:_,thoughts:M,beforeScreenshotOverride:s.buffer,afterScreenshotOverride:Eh.encode(w,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var a0=3e4;async function gv({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??a0/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 l=a.toString(),c;if(ra(r.url)&&(c=r.url),t&&na(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new C("ActionFailureError",`Invalid URL: ${r.url}`);e.info({url:c,searchParams:l,headers:i,body:r.body,method:r.method},"Making HTTP request");let u=await j((async()=>{let m=l?`${c}?${l}`:c;try{return await n(m,{headers:i,method:r.method,body:r.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new C("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 C("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 s0=5e3;async function su({timeout:r=Wr,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,l=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 fv(e),a=Date.now();let s=a-c;if(s>1e3&&e.logger.warn({pageAssertDuration:s},"Page assertion took longer than expected"),!i.success)await ne(l,e.signal),l=Math.min(Math.floor(l*1.5),s0);else return i}return i=await fv(e),i}async function fv({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":{let o,i=!1,a;try{let l;if(t){let c=await e.evaluateFunctionInAllFrames(Sv,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.negated?c.every(s=>s.evaluation):c.some(s=>s.evaluation),l=c.find(s=>s.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:l}=await e.evaluateFunctionInPage(Sv,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?Er.CONTAINS:Tr.CONTAINS;a=new C("AssertionFailureError",`The page ${c} '${r.value}'.`),o=l}}catch(l){a=new C("AssertionFailureError",`Failed to evaluate page content assertion: ${l instanceof Error?l.message:`${l}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function Sv({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 Th=async r=>{let{step:e,resolvedInputs:t}=r.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:l}=r.fixtures,c=l.browser,{orgId:s,runId:u}=r.inputs,d=l.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),n.info(ta({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||"",S=await ir({orgId:s,s:f,context:o,logger:n,localTools:a,signal:d});g={orgId:s,cacheKeys:[S,...Object.entries(t).map(([T,w])=>`${T}:${w}`)]},n.info({original:f,keyParams:g},"Module cache key params");let y=Date.now();for(;Date.now()-y<mE;){d?.throwIfAborted();let T=await i.getCacheResult(g);if(T){n.info({cacheResult:Ze(T,1e3,!0)},"Got result from module execution cache"),p=lu(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 w=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${l0()};runId:${u}`},d);if(w.acquired){h=w.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ne(2500+Math.random()*1e4,d)}}try{if(!p)p=await c0(r);else if(e.autoAuth){let f=nc.safeParse(p.data);if(!f.success)throw new C("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let T={type:"CONTENT",value:y.substring},w=await su({timeout:Wr,assertion:T,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});w.success?n.debug({invalResult:w},"Cached result still valid after page check, continuing..."):(n.info({invalResult:w},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),Th(r)}}finally{try{h!==void 0&&!m&&p?.status==="SUCCESS"&&await u0({step:e,result:p,browser:l.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return p},c0=async r=>{let{step:e,tracer:t}=r.moduleParams,n=lu(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 lu(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 yv({orgId:r,step:e,context:t,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){n.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}a[l]=await ao({orgId:r,code:c,fragment:!0,context:t,logger:n,localTools:o,signal:i})}return a}catch(l){throw i?.throwIfAborted(),new C("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function u0({step:r,result:e,browser:t,cacheKeyPrefix:n,logger:o,storage:i}){let a=r.cacheConfig?.cacheExpiryMs;(!a||a===QE)&&(a=r.defaultCacheTtl??ZE);let l;r.autoAuth?l=JSON.stringify(await t.saveAuthState()):e.data!==void 0?l=JSON.stringify(e.data):l='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:ta({json:l,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:l,keyPrefix:n,ttlMs:a})}async function ai(r,e,t){return d0(r,e,t)}async function d0(r,e,t){let n=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",l;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(l="Step aborted by user.",a="CANCELLED"):o instanceof C?l=`${o}`:l=`An unexpected error occurred: ${o.message}`,r.type==="RESOLVED_MODULE"){let c=lu(r,{},"FAILED");return c.message=l,c.startedAt=n,c.finishedAt=i,c}return{...qc(r),startedAt:n,finishedAt:i,status:a,data:null,message:l,results:[]}}}async function ma(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 BB}from"lodash-es";import{randomUUID as Ev}from"crypto";var cu=async r=>{let{step:e,tracer:t}=r.presetParams,{logger:n,controller:o,context:i}=r.fixtures,{collectDebugData:a}=r.options,{testMetadata:l}=r.inputs,c=e.command.type,s=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u=o.browser.url(),d=new Date,p,m=Ev(),h=Ev();if(a)try{if(p=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:s,snapshotId:m,html:T})}}catch(T){s.debug({err:T},"Failed to take before screenshot, continuing...")}let g,f,S,y=Zl();try{let T=await o.executePresetCommand(y,t,e.command,i,l?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(p=T.beforeScreenshotOverride),S=T.afterScreenshotOverride;let w=new Date,v=o.browser.url();f={beforeUrl:u,afterUrl:v,startedAt:d,finishedAt:w,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},g={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:u,afterUrl:v,finishedAt:w,startedAt:d,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[f],details:y.details},"assertion"in e.command&&(g.message=T.thoughts||"Assertion passed.")}catch(T){s.error({message:T.message,stack:T.stack},`Failed executing preset step ${rn(e.command)}`);let w=o.browser.url(),v=new Date,x=T instanceof Error?T.message:`${T}`;f={beforeUrl:u,afterUrl:w,startedAt:d,finishedAt:v,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:x},g={...e,startedAt:d,finishedAt:v,beforeUrl:u,afterUrl:w,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:x,failureReason:T instanceof C?T.reason:void 0,results:[f],details:y.details}}if(a)try{if(S||(S=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:s,snapshotId:h,html:T})}}catch(T){s.debug({err:T},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return f.beforeSnapshot=m,g.beforeSnapshot=m,f.afterSnapshot=h,g.afterSnapshot=h,p&&t.attachBeforeScreenshot({logger:s,snapshotId:m,screenshot:p}),S&&t.attachAfterScreenshot({logger:s,snapshotId:h,screenshot:S}),g};async function Tv(r){let{step:e,tracer:t}=r.conditionalParams,{logger:n,controller:o}=r.fixtures,i=new Date,a=qc(e),l=e.elseSteps,c=!0,s=[],u,d=Zl();for(let f=0;f<e.blocks.length;f++){n.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let y=await cu({...r,presetParams:{tracer:t,step:S.assertion}});s.push(y),n.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),c=!1,l=S.steps,u=y}catch(y){n.info({err:y},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(l)c&&n.info("No conditions resolved to true, executing the else block steps");else return n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped"),{...a,status:"SUCCESS",startedAt:i,data:s[s.length-1]?.data,message:s[s.length-1]?.message,results:[],finishedAt:new Date,details:d.details};n.info(`Executing ${l.length} steps in the selected conditional block`);let p=await r.conditionalParams.tracer.startSubSteps(),m=await r.executeStepList({...r,listParams:{steps:l,containerName:"conditional block",tracer:p}}),g={...a,assertionResult:u,...m,startedAt:i,finishedAt:new Date};return on({asyncTasks:r.work.asyncTasks,nestedResults:[...s,...m.results],result:g,logger:n}),g}import{randomUUID as bv}from"crypto";var vv=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 p0(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({}),l=bv();i.beforeSnapshot=l,e.attachBeforeScreenshot({logger:n,snapshotId:l,screenshot:o});let c=bv();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},p0=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 C("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await t.startSubSteps(),{status:s}=await r.executeStepList({...r,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=s,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let s=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=s?"CANCELLED":"FAILED"}return a};import{randomUUID as bh}from"crypto";var Rv=15,m0=7,wv=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 h0(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}),l=bh();i.beforeSnapshot=l,e.attachBeforeScreenshot({logger:t,snapshotId:l,screenshot:o});let c=bh();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:t,snapshotId:c,screenshot:a}),i},h0=async r=>{let{step:e,tracer:t}=r.aiStepParams,{testMetadata:n,orgId:o}=r.inputs,{controller:i,context:a,logger:l,codeEvalTools:c}=r.fixtures,{step:s}=r.callbacks,u=`${e.id}-${Date.now()}`,d=l.child({stepId:e.id,langfuseSessionId:u}),p={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await ir({orgId:o,s:e.text,context:a,logger:d,localTools:c});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,y=0,T,w;for(;;){if(S>Rv)return p.message=`Exceeded the maximum number of commands allowed per AI step (${Rv})`,p.status="FAILED",p;if(i.executeAbortController.signal.aborted)return p.message="Test execution was cancelled",p.status="CANCELLED",p;s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let v=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:u,lastError:w}),{evaluation:x,reasoning:A,summary:_}=v;d.info(v,"Got AI evaluation");let M=p.results[S-1]?.id;switch(x.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${A}`,p.status="SUCCESS",M&&s.onDynamicAIActionEvaluatingEvent?.({stepId:M,status:"SUCCESS",message:`${_}
|
|
33
|
-
${A}`}),p;case"RIGHT_TRACK":{
|
|
32
|
+
${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 e0}from"lodash-es";async function ir(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:l=eo,allowUndefined:c=!1}=r,s=/{{(.*?)}}/g,u=t.matchAll(s),d=t;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),h;try{h=await so({orgId:e,code:m,fragment:!0,context:n,timeoutMs:l,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 C("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 iu(r){return sv(r)}async function sv({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let l in r){if(e.includes(l))continue;let c=!1;if(t)if(t.includes(l))c=!0;else continue;let s=r[l],u=[...o,l];if(typeof s=="string"&&s.includes("{{")){let d=await ir({s,context:n,...a});if(s===d)continue;i.push({path:u,original:s}),r[l]=d}else typeof s=="object"&&s!==null&&!Array.isArray(s)&&await sv({obj:s,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function lv(r,e){for(let{path:t,original:n}of e)e0(r,t,n)}import t0 from"fetch-retry";var Fue=process.env.MAILINATOR_API_KEY,Uue=t0(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 l0}from"os";import{cloneDeep as uv}from"lodash-es";async function dv(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=dS(e.cache)?e.cache:void 0,a=uv(i),l=()=>{if(i){let m=Wm(a,i);i.target=m.target,i.updatedAt=m.updatedAt}},c=Date.now(),s=0,u,d=500,p=!1;for(;s<2||Date.now()-c<t;){s++,s>1&&await ne(d,o),o?.throwIfAborted();let{result:m,elementWasFound:h}=await cv({cacheToUse:i,params:r});if(u=m,p=h,m.success)break;l(),d=Math.min(d*2,1e4)}if(!u)throw new C("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!u.success&&i?.target&&_l(i.target)){let m=i?.target?.memory?{target:{id:-1,memory:i.target.memory}}:void 0,{result:h}=await cv({cacheToUse:m,params:r});u=h,u.success||l()}return u.success&&i?.target&&!p&&(i.target=_s(i.target),i.updatedAt=new Date),u}async function cv({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:l}=o;if(t.target&&!Hn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=n0(t.assertion),s,u=!1,d=uv(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=>r0(g.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:zo(t),targetName:"target"}});return s={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:h},u=!0,m.success||(l.warn({aiThoughts:h,elementString:p,err:m.err},"Element check found an element but failed"),s={...m,thoughts:h}),{result:s,elementWasFound:u}}catch(p){if(c)return s={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:s,elementWasFound:u};if(!(p instanceof C)||p.reason!="ActionFailureError")throw p;return s={success:!1,err:p,data:void 0,thoughts:void 0},l.warn({err:p},"Element check did not find an element and failed"),{result:s,elementWasFound:u}}}async function r0(r,{command:e,fixtures:t}){let n=e.assertion;await t.browser.highlight(r);let o=!0,i,a;switch(n.type){case"ELEMENT_CONTENT":{let c=await r.textContent()??"";if(a={elementTextContent:Ze(c,500,!0)},!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,i=new C("AssertionFailureError",`The content ${s} '${n.value}': ${c}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:Ze(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let c;try{c=await r.getAttribute(n.attr,{timeout:3e3})??""}catch(s){i=new C("AssertionFailureError",`The element does not have an attribute named ${n.attr}: ${s}`),o=!1;break}if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,n.operation==="EXISTS"?i=new C("AssertionFailureError",`The attribute ${n.attr} ${s}`):i=new C("AssertionFailureError",`The attribute ${n.attr} ${s} '${n.value}': ${c}`)}break}case"ELEMENT_EXISTENCE":{switch(n.condition){case"VISIBLE":{o=await r.evaluate(async(s,u)=>{let d=Date.now();for(;Date.now()-d<u;){await new Promise(m=>setTimeout(m,250));let p=s.getBoundingClientRect();if(!(p.width===0||p.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Wr*1e3);break}case"EDITABLE":{o=await r.isEditable({timeout:Wr*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await r.isEnabled({timeout:Wr*1e3});break}case"FOCUSED":{o=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"})(n.condition)}if(o=n.negated?!o:o,!o){let c=n.negated?qm[n.condition]:Km[n.condition];i=new C("AssertionFailureError",`The element ${c}`)}break}case"ELEMENT_NAME":{let c=await r.evaluate(s=>s.tagName);if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,i=new C("AssertionFailureError",`The element tag name ${s} '${n.value}': ${c}`)}break}case"ELEMENT_STYLE":{let c=await r.evaluate((s,u)=>window.getComputedStyle(s).getPropertyValue(u),n.property);if(!au(c,n.value,n.operation,!!n.negated)){let s=n.negated?Er[n.operation]:Tr[n.operation];o=!1,n.operation==="EXISTS"?i=new C("AssertionFailureError",`The style property ${n.property} ${s}`):i=new C("AssertionFailureError",`The style property ${n.property} ${s} '${n.value}': ${c}`)}break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{success:o,data:a,err:i}}function au(r,e,t,n){let o;switch(t){case"CONTAINS":{o=r.includes(e);break}case"EQUALS":{o=r.trim()===e.trim();break}case"STARTS_WITH":{o=r.trim().startsWith(e);break}case"EXISTS":{o=r.trim().length>0;break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return n?!o:o}function n0(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function pv(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as o0}from"jimp";async function Hs(r,e){let t=await r.screenshot(e),n=await o0.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as mv}from"jimp";import Eh from"jpeg-js";import i0 from"pixelmatch";async function hv({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:l}){if(t.target&&!Hn(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},s;t.target?.elementDescriptor?s=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async W=>Hs(o,{locator:W.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:s=await Hs(o,c);let u=await l.prepareGoldenScreenshotForComparison(a,t,s);if((s.height!==u.height||s.width!==u.width)&&a.warn({currHeight:s.height,currWidth:s.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(s.height-u.height)>10||Math.abs(s.width-u.width)>10){let Y=`${s.width}x${s.height}`,W=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${Y}) does not match saved screenshot dimensions (${W}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:s.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await mv.fromBuffer(s.buffer),p={width:s.width,height:s.height},m=await mv.fromBuffer(u.buffer),h={width:u.width,height:u.height},g,f=p.width*p.height,S=h.width*h.height,y=Math.abs(p.height-h.height),E=Math.abs(p.width-h.width);if(f>S){let Y=d.cover({w:h.width,h:h.height});s.buffer=await Y.getBuffer("image/jpeg"),g="current",s.width=h.width,s.height=h.height}else if(S>f){let Y=m.cover({w:p.width,h:p.height});u.buffer=await Y.getBuffer("image/jpeg"),g="saved"}let w={data:Buffer.alloc(s.width*s.height*4),width:s.width,height:s.height},v=t.threshold??.1,A=i0(Eh.decode(u.buffer).data,Eh.decode(s.buffer).data,w.data,s.width,s.height,{threshold:v,diffColorAlt:[0,255,0]})/(s.width*s.height)*100,_=A>v*100,M=`Visual diff of ${A.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${v*100}%.`;if(g&&(M+=` The ${g} screenshot was cropped since it was taller by ${y} pixels and wider by ${E} pixels.`),_)throw new C("ActionFailureError",M);return{fail:_,thoughts:M,beforeScreenshotOverride:s.buffer,afterScreenshotOverride:Eh.encode(w,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var a0=3e4;async function gv({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??a0/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 l=a.toString(),c;if(ra(r.url)&&(c=r.url),t&&na(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new C("ActionFailureError",`Invalid URL: ${r.url}`);e.info({url:c,searchParams:l,headers:i,body:r.body,method:r.method},"Making HTTP request");let u=await j((async()=>{let m=l?`${c}?${l}`:c;try{return await n(m,{headers:i,method:r.method,body:r.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new C("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 C("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 s0=5e3;async function su({timeout:r=Wr,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,l=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 fv(e),a=Date.now();let s=a-c;if(s>1e3&&e.logger.warn({pageAssertDuration:s},"Page assertion took longer than expected"),!i.success)await ne(l,e.signal),l=Math.min(Math.floor(l*1.5),s0);else return i}return i=await fv(e),i}async function fv({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":{let o,i=!1,a;try{let l;if(t){let c=await e.evaluateFunctionInAllFrames(Sv,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.negated?c.every(s=>s.evaluation):c.some(s=>s.evaluation),l=c.find(s=>s.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:l}=await e.evaluateFunctionInPage(Sv,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?Er.CONTAINS:Tr.CONTAINS;a=new C("AssertionFailureError",`The page ${c} '${r.value}'.`),o=l}}catch(l){a=new C("AssertionFailureError",`Failed to evaluate page content assertion: ${l instanceof Error?l.message:`${l}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function Sv({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 Th=async r=>{let{step:e,resolvedInputs:t}=r.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:l}=r.fixtures,c=l.browser,{orgId:s,runId:u}=r.inputs,d=l.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),n.info(ta({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||"",S=await ir({orgId:s,s:f,context:o,logger:n,localTools:a,signal:d});g={orgId:s,cacheKeys:[S,...Object.entries(t).map(([E,w])=>`${E}:${w}`)]},n.info({original:f,keyParams:g},"Module cache key params");let y=Date.now();for(;Date.now()-y<mE;){d?.throwIfAborted();let E=await i.getCacheResult(g);if(E){n.info({cacheResult:Ze(E,1e3,!0)},"Got result from module execution cache"),p=lu(e,t,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(E),m=!0;break}else n.info({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let w=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${l0()};runId:${u}`},d);if(w.acquired){h=w.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ne(2500+Math.random()*1e4,d)}}try{if(!p)p=await c0(r);else if(e.autoAuth){let f=nc.safeParse(p.data);if(!f.success)throw new C("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let E={type:"CONTENT",value:y.substring},w=await su({timeout:Wr,assertion:E,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});w.success?n.debug({invalResult:w},"Cached result still valid after page check, continuing..."):(n.info({invalResult:w},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),Th(r)}}finally{try{h!==void 0&&!m&&p?.status==="SUCCESS"&&await u0({step:e,result:p,browser:l.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return p},c0=async r=>{let{step:e,tracer:t}=r.moduleParams,n=lu(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 lu(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 yv({orgId:r,step:e,context:t,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){n.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}a[l]=await so({orgId:r,code:c,fragment:!0,context:t,logger:n,localTools:o,signal:i})}return a}catch(l){throw i?.throwIfAborted(),new C("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function u0({step:r,result:e,browser:t,cacheKeyPrefix:n,logger:o,storage:i}){let a=r.cacheConfig?.cacheExpiryMs;(!a||a===QE)&&(a=r.defaultCacheTtl??ZE);let l;r.autoAuth?l=JSON.stringify(await t.saveAuthState()):e.data!==void 0?l=JSON.stringify(e.data):l='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:ta({json:l,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:l,keyPrefix:n,ttlMs:a})}async function si(r,e,t){return d0(r,e,t)}async function d0(r,e,t){let n=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",l;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(l="Step aborted by user.",a="CANCELLED"):o instanceof C?l=`${o}`:l=`An unexpected error occurred: ${o.message}`,r.type==="RESOLVED_MODULE"){let c=lu(r,{},"FAILED");return c.message=l,c.startedAt=n,c.finishedAt=i,c}return{...qc(r),startedAt:n,finishedAt:i,status:a,data:null,message:l,results:[]}}}async function ma(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 BB}from"lodash-es";import{randomUUID as Ev}from"crypto";var cu=async r=>{let{step:e,tracer:t}=r.presetParams,{logger:n,controller:o,context:i}=r.fixtures,{collectDebugData:a}=r.options,{testMetadata:l}=r.inputs,c=e.command.type,s=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u=o.browser.url(),d=new Date,p,m=Ev(),h=Ev();if(a)try{if(p=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let E=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:s,snapshotId:m,html:E})}}catch(E){s.debug({err:E},"Failed to take before screenshot, continuing...")}let g,f,S,y=Zl();try{let E=await o.executePresetCommand(y,t,e.command,i,l?.advanced.disableAICaching??!1);E.beforeScreenshotOverride&&(p=E.beforeScreenshotOverride),S=E.afterScreenshotOverride;let w=new Date,v=o.browser.url();f={beforeUrl:u,afterUrl:v,startedAt:d,finishedAt:w,viewport:o.browser.getViewport(),status:E.fail?"FAILED":"SUCCESS",elementInteracted:E.elementInteracted},g={...e,message:E.thoughts??"Successfully executed preset action.",beforeUrl:u,afterUrl:v,finishedAt:w,startedAt:d,status:E.fail?"FAILED":"SUCCESS",data:E.data,results:[f],details:y.details},"assertion"in e.command&&(g.message=E.thoughts||"Assertion passed.")}catch(E){s.error({message:E.message,stack:E.stack},`Failed executing preset step ${rn(e.command)}`);let w=o.browser.url(),v=new Date,x=E instanceof Error?E.message:`${E}`;f={beforeUrl:u,afterUrl:w,startedAt:d,finishedAt:v,viewport:o.browser.getViewport(),status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:x},g={...e,startedAt:d,finishedAt:v,beforeUrl:u,afterUrl:w,status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:x,failureReason:E instanceof C?E.reason:void 0,results:[f],details:y.details}}if(a)try{if(S||(S=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let E=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:s,snapshotId:h,html:E})}}catch(E){s.debug({err:E},"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 f.beforeSnapshot=m,g.beforeSnapshot=m,f.afterSnapshot=h,g.afterSnapshot=h,p&&t.attachBeforeScreenshot({logger:s,snapshotId:m,screenshot:p}),S&&t.attachAfterScreenshot({logger:s,snapshotId:h,screenshot:S}),g};async function Tv(r){let{step:e,tracer:t}=r.conditionalParams,{logger:n,controller:o}=r.fixtures,i=new Date,a=qc(e),l=e.elseSteps,c=!0,s=[],u,d=Zl();for(let f=0;f<e.blocks.length;f++){n.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let y=await cu({...r,presetParams:{tracer:t,step:S.assertion}});s.push(y),n.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),c=!1,l=S.steps,u=y}catch(y){n.info({err:y},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(l)c&&n.info("No conditions resolved to true, executing the else block steps");else return n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped"),{...a,status:"SUCCESS",startedAt:i,data:s[s.length-1]?.data,message:s[s.length-1]?.message,results:[],finishedAt:new Date,details:d.details};n.info(`Executing ${l.length} steps in the selected conditional block`);let p=await r.conditionalParams.tracer.startSubSteps(),m=await r.executeStepList({...r,listParams:{steps:l,containerName:"conditional block",tracer:p}}),g={...a,assertionResult:u,...m,startedAt:i,finishedAt:new Date};return on({asyncTasks:r.work.asyncTasks,nestedResults:[...s,...m.results],result:g,logger:n}),g}import{randomUUID as bv}from"crypto";var vv=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 p0(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({}),l=bv();i.beforeSnapshot=l,e.attachBeforeScreenshot({logger:n,snapshotId:l,screenshot:o});let c=bv();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},p0=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 C("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await t.startSubSteps(),{status:s}=await r.executeStepList({...r,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=s,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let s=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=s?"CANCELLED":"FAILED"}return a};import{randomUUID as bh}from"crypto";var Rv=15,m0=7,wv=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 h0(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}),l=bh();i.beforeSnapshot=l,e.attachBeforeScreenshot({logger:t,snapshotId:l,screenshot:o});let c=bh();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:t,snapshotId:c,screenshot:a}),i},h0=async r=>{let{step:e,tracer:t}=r.aiStepParams,{testMetadata:n,orgId:o}=r.inputs,{controller:i,context:a,logger:l,codeEvalTools:c}=r.fixtures,{step:s}=r.callbacks,u=`${e.id}-${Date.now()}`,d=l.child({stepId:e.id,langfuseSessionId:u}),p={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await ir({orgId:o,s:e.text,context:a,logger:d,localTools:c});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,y=0,E,w;for(;;){if(S>Rv)return p.message=`Exceeded the maximum number of commands allowed per AI step (${Rv})`,p.status="FAILED",p;if(i.executeAbortController.signal.aborted)return p.message="Test execution was cancelled",p.status="CANCELLED",p;s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let v=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:u,lastError:w}),{evaluation:x,reasoning:A,summary:_}=v;d.info(v,"Got AI evaluation");let M=p.results[S-1]?.id;switch(x.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${A}`,p.status="SUCCESS",M&&s.onDynamicAIActionEvaluatingEvent?.({stepId:M,status:"SUCCESS",message:`${_}
|
|
33
|
+
${A}`}),p;case"RIGHT_TRACK":{E=void 0,S===0?s.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):M&&s.onDynamicAIActionEvaluatingEvent?.({stepId:M,status:"SUCCESS",message:A});break}case"WRONG_TRACK":{if(E=`${A}
|
|
34
34
|
${x.feedback}`,y++,y>=m0)return p.message=`Our AI agent requires additional information to achieve this goal:
|
|
35
35
|
${A}
|
|
36
|
-
${x.feedback}`,p.status="FAILED",s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;M&&s.onDynamicAIActionEvaluatingEvent?.({stepId:M,status:"FAILED",message:x.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",s.onDynamicAIActionEvaluatingEvent?.({stepId:M??e.id,status:"FAILED",message:p.message}),p}let Y=setTimeout(()=>{s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:T},`Generating new sub-command ${S} within AI action`);let W,D;try{({command:W,reasoning:D}=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:D},"Got proposed command")}finally{clearTimeout(Y)}if(W.type==="FAILURE")return clearTimeout(Y),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${D}`,p;let Q={id:bh(),type:"PRESET_ACTION",command:W},B={substepIndex:S+1,message:D||"Generated new command."};s.onDynamicCommandGenerated?.({...B,step:Q,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${S} within AI step: ${rn(W)}`);let H=await t.startSubSteps(),V=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[Q],tracer:H}})).results[0];s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let Ke=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(V),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Ke.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:rn(W),elementInteracted:V.results[0]?.elementInteracted,thoughts:D});let _e={substepIndex:S,output:{...V,message:V.message??"Successfully executed preset action."},step:Q,parentStepId:e.id};if(s.onDynamicCommandExecuted?.(_e),await t.finish({output:Vl.parse(V),step:V,message:V.message,attempt:1}),V.status==="FAILED")if(p.status="FAILED",p.message=V.message,y<3)y++,w=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${V.message}`;else return p;else if(V.status==="CANCELLED")return p.status="CANCELLED",p.message=V.message,p;S++}};import{randomUUID as OB}from"crypto";var uu=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function g0(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 du(r,e){let t=g0(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var Jv="=",gu=";",Lh=",";var Qv=8192;var Sa={};MI(Sa,{getKeyPairs:()=>K0,parseKeyPairsIntoRecord:()=>Y0,parsePairKeyValue:()=>Zv,serializeKeyPairs:()=>q0});Oe();var W0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function q0(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Lh:"")+t;return n.length>Qv?e:n},"")}function K0(r){return r.getAllEntries().map(function(e){var t=W0(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=gu+o.metadata.toString()),i})}function Zv(r){var e=r.split(gu);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(Jv);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=Rh(e.join(gu))),{key:o,value:i,metadata:a}}}}}function Y0(r){return typeof r!="string"||r.length===0?{}:r.split(Lh).map(function(e){return Zv(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Oe();var fu;(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"})(fu||(fu={}));var X0=",",J0=["OTEL_SDK_DISABLED"];function Q0(r){return J0.indexOf(r)>-1}var Z0=["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 eF(r){return Z0.indexOf(r)>-1}var tF=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function rF(r){return tF.indexOf(r)>-1}var Nh=1/0,Dh=128,nF=128,oF=128,kh={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:Ge.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:nF,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:oF,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:fu.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 iF(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function aF(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 sF(r,e,t,n){n===void 0&&(n=X0);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var lF={ALL:Ge.ALL,VERBOSE:Ge.VERBOSE,DEBUG:Ge.DEBUG,INFO:Ge.INFO,WARN:Ge.WARN,ERROR:Ge.ERROR,NONE:Ge.NONE};function cF(r,e,t){var n=t[r];if(typeof n=="string"){var o=lF[n.toUpperCase()];o!=null&&(e[r]=o)}}function eR(r){var e={};for(var t in kh){var n=t;switch(n){case"OTEL_LOG_LEVEL":cF(n,e,r);break;default:if(Q0(n))iF(n,e,r);else if(eF(n))aF(n,e,r);else if(rF(n))sF(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function xt(){var r=eR(process.env);return Object.assign({},kh,r)}function tR(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function Su(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=tR(r.charCodeAt(n)),i=tR(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var rR="1.25.1";var uF="deployment.environment";var dF="process.runtime.name";var pF="service.name";var mF="service.instance.id";var hF="telemetry.sdk.name",gF="telemetry.sdk.language",fF="telemetry.sdk.version";var nR=uF;var oR=dF;var yu=pF;var iR=mF;var Ks=hF,Ys=gF,Xs=fF;var SF="nodejs";var aR=SF;var ya,Eu=(ya={},ya[Ks]="opentelemetry",ya[oR]="node",ya[Ys]=aR,ya[Xs]=rR,ya);var yF=9,EF=6,TF=Math.pow(10,EF),bF=Math.pow(10,yF);function sR(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*TF);return[t,n]}function lR(r){return r[0]*bF+r[1]}function Js(r){return r[0]*1e6+r[1]/1e3}var li;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(li||(li={}));var cR=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 vF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},RF=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))},uR=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new cR}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,RF([this._that],vF(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 br;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(br||(br={}));var Ut;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Ut||(Ut={}));var wF=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 age=function(r){wF(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function dR(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}Oe();var vr;(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"})(vr||(vr={}));var pR=function(){function r(){this.kind=vr.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 ue;(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"})(ue||(ue={}));var AF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function CF(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 Fh=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=CF(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=dR(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 Uh=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=vr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Fh(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,l=new Array(i.length),c=0;c<i.length;c++)l[c]=i[c]+a[c];var s=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(s=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(s=n.min,u=n.max):o.hasMinMax&&(s=o.min,u=o.max)),new Fh(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:s,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,l=new Array(i.length),c=0;c<i.length;c++)l[c]=a[c]-i[c];return new Fh(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},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:Ut.HISTOGRAM,dataPoints:n.map(function(i){var a=AF(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,buckets:s.buckets,count:s.count}}})}},r}();Oe();var Bh=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(l){a={error:l}}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))},Hh=function(){function r(e,t,n,o){e===void 0&&(e=new xF),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 l=a%n;l<0&&(l+=n);for(var c=l;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 xF=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,zh([n,this._counts.length-t],Bh(this._counts.slice(t)),!1)),o.splice.apply(o,zh([0,t],Bh(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(zh([],Bh(this._counts),!1))},r}();var mR=52,_F=2146435072,IF=1048575,Gh=1023,Tu=-Gh+1,bu=Gh,Qs=Math.pow(2,-1022);function vu(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&_F)>>20;return n-Gh}function Ru(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&IF)*Math.pow(2,32);return o+n}function Zs(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function gR(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var MF=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)}}(),so=function(r){MF(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var SR=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Qs)return this._minNormalLowerBoundaryIndex();var t=vu(e),n=this._rightShift(Ru(e)-1,mR);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new so("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new so("overflow: "+e+" is > maximum lower boundary: "+n);return Zs(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=Tu>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return bu>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var yR=function(){function r(e){this._scale=e,this._scaleFactor=Zs(Math.LOG2E,e),this._inverseFactor=Zs(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Qs)return this._minNormalLowerBoundaryIndex()-1;if(Ru(e)===0){var t=vu(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 so("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Qs;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new so("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 Tu<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(bu+1<<this._scale)-1},r}();var ER=-10,TR=20,PF=Array.from({length:31},function(r,e){return e>10?new yR(e-10):new SR(e-10)});function jh(r){if(r>TR||r<ER)throw new so("expected scale >= "+ER+" && <= "+TR+", got: "+r);return PF[r+10]}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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wu=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}(),LF=20,NF=160,Vh=2,DF=function(){function r(e,t,n,o,i,a,l,c,s,u,d){e===void 0&&(e=e),t===void 0&&(t=NF),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),l===void 0&&(l=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),s===void 0&&(s=new Hh),u===void 0&&(u=new Hh),d===void 0&&(d=jh(LF)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=l,this._max=c,this._positive=s,this._negative=u,this._mapping=d,this._maxSize<Vh&&(G.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Vh),this._maxSize=Vh)}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,l=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,l=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,l=e.indexStart,a=o),i){var c=this._changeScale(a,l);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=gR(t);a>this._maxSize&&(a=this._maxSize);var l=a-o;e.backing.growTo(a,i,l)},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=jh(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=wu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=wu.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 wu(0,-1);var o=t-n;return new wu(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++)this._incrementIndexBy(e,i+l>>a,n.at(l))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++){var c=i+l>>a,s=c-e.indexBase;s<0&&(s+=e.backing.length),e.decrementBucket(s,n.at(l))}e.trim()},r}();var bR=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=vr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new DF(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:Ut.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=OF(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}},r}();var kF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$h=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=sR(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var vR=function(){function r(){this.kind=vr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new $h(e)},r.prototype.merge=function(e,t){var n=Js(t.sampleTime)>=Js(e.sampleTime)?t:e;return new $h(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Js(t.sampleTime)>=Js(e.sampleTime)?t:e;return new $h(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Ut.GAUGE,dataPoints:n.map(function(i){var a=kF(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var FF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},el=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 Wh=function(){function r(e){this.monotonic=e,this.kind=vr.SUM}return r.prototype.createAccumulation=function(e){return new el(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new el(t.startTime,this.monotonic,o,t.reset):new el(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 el(t.startTime,this.monotonic,o,!0):new el(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Ut.SUM,dataPoints:n.map(function(i){var a=FF(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var ci=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)}}(),sn=function(){function r(){}return r.Drop=function(){return MR},r.Sum=function(){return PR},r.LastValue=function(){return OR},r.Histogram=function(){return LR},r.ExponentialHistogram=function(){return UF},r.Default=function(){return BF},r}();var RR=function(r){ci(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 pR,e}(sn);var wR=function(r){ci(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Wh(!0),e.NON_MONOTONIC_INSTANCE=new Wh(!1),e}(sn);var AR=function(r){ci(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 vR,e}(sn);var CR=function(r){ci(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 Uh([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(sn);var xR=function(r){ci(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(l,c){return l-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 Uh(this._boundaries,this._recordMinMax)},e}(sn);var _R=function(r){ci(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 bR(this._maxSize,this._recordMinMax)},e}(sn);var IR=function(r){ci(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ue.COUNTER:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return PR;case ue.GAUGE:case ue.OBSERVABLE_GAUGE:return OR;case ue.HISTOGRAM:return t.advice.explicitBucketBoundaries?new xR(t.advice.explicitBucketBoundaries):LR}return G.warn("Unable to recognize instrument type: "+t.type),MR},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(sn);var MR=new RR,PR=new wR,OR=new AR,LR=new CR,UF=new _R,BF=new IR;Oe();function Au(){return"unknown_service:"+process.argv0}var lo=function(){return lo=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},lo.apply(this,arguments)},zF=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},HF=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},GF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},qh=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 G.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[yu]=Au(),e[Ys]=Eu[Ys],e[Ks]=Eu[Ks],e[Xs]=Eu[Xs],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&G.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 zF(this,void 0,void 0,function(){return HF(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=lo(lo({},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 l,c=GF(a,2),s=c[0],u=c[1];return lo(lo(lo(lo({},t._syncAttributes),s),(l=e._syncAttributes)!==null&&l!==void 0?l:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var ui;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(ui||(ui={}));Oe();var jF=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},VF=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},Kh=function(){return br.CUMULATIVE},NR=function(r){switch(r){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.GAUGE:case ue.HISTOGRAM:case ue.OBSERVABLE_GAUGE:return br.DELTA;case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return br.CUMULATIVE}},DR=function(r){switch(r){case ue.COUNTER:case ue.HISTOGRAM:return br.DELTA;case ue.GAUGE:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_GAUGE:return br.CUMULATIVE}};function $F(){var r=xt(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Kh:e==="delta"?NR:e==="lowmemory"?DR:(G.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."),Kh)}function WF(r){return r!=null?r===ui.DELTA?NR:r===ui.LOWMEMORY?DR:Kh:$F()}function qF(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return sn.Default()}}var kR=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=qF(t),this._aggregationTemporalitySelector=WF(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return jF(this,void 0,void 0,function(){return VF(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}();Oe();Oe();var KF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},FR=1e4,UR=5,BR=1e3,zR=5e3,HR=1.5;function tl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=KF(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):G.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function Yh(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function Xh(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return G.warn("Could not parse export URL: '"+r+"'"),r}}function Jh(r){return typeof r=="number"?r<=0?Qh(r,FR):r:YF()}function YF(){var r,e=Number((r=xt().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:xt().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?Qh(e,FR):e}function Qh(r,e){return G.warn("Timeout must be greater than 0",r),e}function GR(r){var e=[429,502,503,504];return e.includes(r)}function jR(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 VR=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 uR(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Jh(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:li.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:li.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:li.SUCCESS})}).catch(function(n){t({code:li.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{G.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 G.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Oe();import*as Zh from"url";import*as xu from"http";import*as _u from"https";import*as $R from"zlib";import{Readable as JF}from"stream";var co;(function(r){r.NONE="none",r.GZIP="gzip"})(co||(co={}));var XF=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)}}(),Ea=function(r){XF(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 Cu=function(){return Cu=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},Cu.apply(this,arguments)};function eg(r,e,t,n,o){var i=r.timeoutMillis,a=new Zh.URL(r.url),l=Number(process.versions.node.split(".")[0]),c,s,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,s.destroyed){var g=new Ea("Request Timeout");o(g)}else l>=14?s.destroy():s.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:Cu({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?xu.request:_u.request,h=function(g,f){switch(g===void 0&&(g=UR),f===void 0&&(f=BR),s=m(p,function(y){var T="";y.on("data",function(w){return T+=w}),y.on("aborted",function(){if(u){var w=new Ea("Request Timeout");o(w)}}),y.on("end",function(){if(u===!1)if(y.statusCode&&y.statusCode<299)G.debug("statusCode: "+y.statusCode,T),n(),clearTimeout(d),clearTimeout(c);else if(y.statusCode&&GR(y.statusCode)&&g>0){var w=void 0;f=HR*f,y.headers["retry-after"]?w=jR(y.headers["retry-after"]):w=Math.round(Math.random()*(zR-f)+f),c=setTimeout(function(){h(g-1,f)},w)}else{var v=new Ea(y.statusMessage,y.statusCode,T);o(v),clearTimeout(d),clearTimeout(c)}})}),s.on("error",function(y){if(u){var T=new Ea("Request Timeout",y.code);o(T)}else o(y);clearTimeout(d),clearTimeout(c)}),s.on("abort",function(){if(u){var y=new Ea("Request Timeout");o(y)}clearTimeout(d),clearTimeout(c)}),r.compression){case co.GZIP:{s.setHeader("Content-Encoding","gzip");var S=QF(e);S.on("error",o).pipe($R.createGzip()).on("error",o).pipe(s);break}default:s.end(Buffer.from(e));break}};h()}function QF(r){var e=new JF;return e.push(r),e.push(null),e}function tg(r){if(r.httpAgentOptions&&r.keepAlive===!1){G.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Zh.URL(r.url),t=e.protocol==="http:"?xu.Agent:_u.Agent;return new t(Cu({keepAlive:!0},r.httpAgentOptions))}catch(n){G.error("collector exporter failed to create http agent. err: "+n.message);return}}function rg(r){if(r)return r;var e=xt().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||xt().OTEL_EXPORTER_OTLP_COMPRESSION;return e===co.GZIP?co.GZIP:co.NONE}Oe();var ZF=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)}}(),Iu=function(r){ZF(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&&G.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,tl(t.headers),Sa.parseKeyPairsIntoRecord(xt().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=tg(t),i.compression=rg(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){G.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,s){var u;eg(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,s)}).then(n,o);this._sendingPromises.push(a);var l=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(l,l)},e.prototype.onShutdown=function(){},e}(VR);function qR(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function eU(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function KR(r){var e=qR(r);return eU(e)}function tU(r){var e=qR(r);return e.toString()}var rU=typeof BigInt<"u"?tU:lR;function WR(r){return r}function YR(r){if(r!==void 0)return Su(r)}var nU={encodeHrTime:KR,encodeSpanContext:Su,encodeOptionalSpanContext:YR};function XR(r){var e,t;if(r===void 0)return nU;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?KR:rU,encodeSpanContext:o?WR:Su,encodeOptionalSpanContext:o?WR:YR}}var oU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function JR(r){return{name:r.name,version:r.version}}function Ta(r){return Object.keys(r).map(function(e){return QR(e,r[e])})}function QR(r,e){return{key:r,value:ZR(e)}}function ZR(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(ZR)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=oU(t,2),o=n[0],i=n[1];return QR(o,i)})}}:{}}function ew(r){return{attributes:Ta(r.attributes),droppedAttributesCount:0}}Oe();function rw(r,e){var t=XR(e);return{resource:ew(r.resource),schemaUrl:void 0,scopeMetrics:iU(r.scopeMetrics,t)}}function iU(r,e){return Array.from(r.map(function(t){return{scope:JR(t.scope),metrics:t.metrics.map(function(n){return aU(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function aU(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=uU(r.aggregationTemporality);switch(r.dataPointType){case Ut.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:tw(r,e)};break;case Ut.GAUGE:t.gauge={dataPoints:tw(r,e)};break;case Ut.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:lU(r,e)};break;case Ut.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:cU(r,e)};break}return t}function sU(r,e,t){var n={attributes:Ta(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case ar.INT:n.asInt=r.value;break;case ar.DOUBLE:n.asDouble=r.value;break}return n}function tw(r,e){return r.dataPoints.map(function(t){return sU(t,r.descriptor.valueType,e)})}function lU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ta(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 cU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ta(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 uU(r){switch(r){case br.DELTA:return 1;case br.CUMULATIVE:return 2}}function nw(r,e){return{resourceMetrics:r.map(function(t){return rw(t,e)})}}var ng={serializeRequest:function(r){var e=nw(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 ow="0.52.1";var iw=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)}}(),ba=function(){return ba=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},ba.apply(this,arguments)},aw="v1/metrics",dU="http://localhost:4318/"+aw,pU={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+ow},mU=function(r){iw(e,r);function e(t){var n=r.call(this,t,ng,"application/json")||this;return n.headers=ba(ba(ba(ba({},n.headers),pU),Sa.parseKeyPairsIntoRecord(xt().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),tl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:xt().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?Xh(xt().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):xt().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Yh(xt().OTEL_EXPORTER_OTLP_ENDPOINT,aw):dU},e}(Iu),sw=function(r){iw(e,r);function e(t){return r.call(this,new mU(t),t)||this}return e}(kR);var va;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(va||(va={}));var ln;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(ln||(ln={}));Oe();var hU=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)}}(),lw=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},cw=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},gU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},fU=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))},SU=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 uw(r){return r!=null}function Mu(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function dw(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var og=function(r){hU(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function uo(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new og("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function pw(r){return lw(this,void 0,void 0,function(){var e=this;return cw(this,function(t){return[2,Promise.all(r.map(function(n){return lw(e,void 0,void 0,function(){var o,i;return cw(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 mw(r){return r.status==="rejected"}function ig(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,fU([],gU(e(n)),!1))}),t}function hw(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=SU(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(l){t={error:l}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function gw(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 fw(r,e){return r.toLowerCase()===e.toLowerCase()}Oe();var Rr;(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"})(Rr||(Rr={}));var ag=function(){function r(){this.kind=Rr.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}();Oe();var fe;(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"})(fe||(fe={}));function cn(r,e,t){var n,o,i,a;return EU(r)||G.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:ar.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Sw(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 yw(r,e){return fw(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var yU=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function EU(r){return r.match(yU)!=null}var TU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function bU(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 Pu=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=bU(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=gw(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 Ou=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Rr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Pu(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,l=new Array(i.length),c=0;c<i.length;c++)l[c]=i[c]+a[c];var s=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(s=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(s=n.min,u=n.max):o.hasMinMax&&(s=o.min,u=o.max)),new Pu(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:s,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,l=new Array(i.length),c=0;c<i.length;c++)l[c]=a[c]-i[c];return new Pu(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},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:ln.HISTOGRAM,dataPoints:n.map(function(i){var a=TU(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===fe.GAUGE||e.type===fe.UP_DOWN_COUNTER||e.type===fe.OBSERVABLE_GAUGE||e.type===fe.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,buckets:s.buckets,count:s.count}}})}},r}();Oe();var sg=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},lg=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))},cg=function(){function r(e,t,n,o){e===void 0&&(e=new vU),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 l=a%n;l<0&&(l+=n);for(var c=l;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 vU=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,lg([n,this._counts.length-t],sg(this._counts.slice(t)),!1)),o.splice.apply(o,lg([0,t],sg(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(lg([],sg(this._counts),!1))},r}();var Ew=52,RU=2146435072,wU=1048575,ug=1023,Lu=-ug+1,Nu=ug,rl=Math.pow(2,-1022);function Du(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&RU)>>20;return n-ug}function ku(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&wU)*Math.pow(2,32);return o+n}function nl(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function bw(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var AU=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)}}(),po=function(r){AU(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Rw=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<rl)return this._minNormalLowerBoundaryIndex();var t=Du(e),n=this._rightShift(ku(e)-1,Ew);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new po("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new po("overflow: "+e+" is > maximum lower boundary: "+n);return nl(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=Lu>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Nu>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var ww=function(){function r(e){this._scale=e,this._scaleFactor=nl(Math.LOG2E,e),this._inverseFactor=nl(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=rl)return this._minNormalLowerBoundaryIndex()-1;if(ku(e)===0){var t=Du(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 po("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return rl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new po("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 Lu<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Nu+1<<this._scale)-1},r}();var Aw=-10,Cw=20,CU=Array.from({length:31},function(r,e){return e>10?new ww(e-10):new Rw(e-10)});function dg(r){if(r>Cw||r<Aw)throw new po("expected scale >= "+Aw+" && <= "+Cw+", got: "+r);return CU[r+10]}var xU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fu=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}(),_U=20,IU=160,pg=2,xw=function(){function r(e,t,n,o,i,a,l,c,s,u,d){e===void 0&&(e=e),t===void 0&&(t=IU),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),l===void 0&&(l=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),s===void 0&&(s=new cg),u===void 0&&(u=new cg),d===void 0&&(d=dg(_U)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=l,this._max=c,this._positive=s,this._negative=u,this._mapping=d,this._maxSize<pg&&(G.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+pg),this._maxSize=pg)}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,l=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,l=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,l=e.indexStart,a=o),i){var c=this._changeScale(a,l);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=bw(t);a>this._maxSize&&(a=this._maxSize);var l=a-o;e.backing.growTo(a,i,l)},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=dg(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Fu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Fu.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 Fu(0,-1);var o=t-n;return new Fu(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++)this._incrementIndexBy(e,i+l>>a,n.at(l))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++){var c=i+l>>a,s=c-e.indexBase;s<0&&(s+=e.backing.length),e.decrementBucket(s,n.at(l))}e.trim()},r}();var mg=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Rr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new xw(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:ln.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=xU(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===fe.GAUGE||e.type===fe.UP_DOWN_COUNTER||e.type===fe.OBSERVABLE_GAUGE||e.type===fe.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}},r}();Oe();var MU=wh("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function _w(r){return r.setValue(MU,!0)}Oe();function Iw(){return function(r){G.error(PU(r))}}function PU(r){return typeof r=="string"?r:JSON.stringify(OU(r))}function OU(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 LU=Iw();function Uu(r){try{LU(r)}catch{}}var Mw="1.30.1";var NU="process.runtime.name";var DU="service.name";var kU="telemetry.sdk.name",FU="telemetry.sdk.language",UU="telemetry.sdk.version";var Pw=NU;var Ow=DU;var ol=kU,il=FU,al=UU;var BU="nodejs";var Lw=BU;var Ra,di=(Ra={},Ra[ol]="opentelemetry",Ra[Pw]="node",Ra[il]=Lw,Ra[al]=Mw,Ra);function sl(r){r.unref()}var WU=9,qU=6,KU=Math.pow(10,qU),uye=Math.pow(10,WU);function pi(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*KU);return[t,n]}function wa(r){return r[0]*1e6+r[1]/1e3}var ll;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ll||(ll={}));Oe();function Nw(r,e){return new Promise(function(t){fa.with(_w(fa.active()),function(){r.export(e,function(n){t(n)})})})}var Dw={_export:Nw};var YU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Bu=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=pi(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var hg=function(){function r(){this.kind=Rr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Bu(e)},r.prototype.merge=function(e,t){var n=wa(t.sampleTime)>=wa(e.sampleTime)?t:e;return new Bu(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=wa(t.sampleTime)>=wa(e.sampleTime)?t:e;return new Bu(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:ln.GAUGE,dataPoints:n.map(function(i){var a=YU(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var XU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Aa=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 zu=function(){function r(e){this.monotonic=e,this.kind=Rr.SUM}return r.prototype.createAccumulation=function(e){return new Aa(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Aa(t.startTime,this.monotonic,o,t.reset):new Aa(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 Aa(t.startTime,this.monotonic,o,!0):new Aa(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:ln.SUM,dataPoints:n.map(function(i){var a=XU(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var 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)}}(),wr=function(){function r(){}return r.Drop=function(){return Gw},r.Sum=function(){return jw},r.LastValue=function(){return Vw},r.Histogram=function(){return $w},r.ExponentialHistogram=function(){return JU},r.Default=function(){return QU},r}();var kw=function(r){mi(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 ag,e}(wr);var Fw=function(r){mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case fe.COUNTER:case fe.OBSERVABLE_COUNTER:case fe.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new zu(!0),e.NON_MONOTONIC_INSTANCE=new zu(!1),e}(wr);var Uw=function(r){mi(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 hg,e}(wr);var Bw=function(r){mi(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 Ou([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(wr);var Hu=function(r){mi(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(l,c){return l-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 Ou(this._boundaries,this._recordMinMax)},e}(wr);var zw=function(r){mi(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 mg(this._maxSize,this._recordMinMax)},e}(wr);var Hw=function(r){mi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case fe.COUNTER:case fe.UP_DOWN_COUNTER:case fe.OBSERVABLE_COUNTER:case fe.OBSERVABLE_UP_DOWN_COUNTER:return jw;case fe.GAUGE:case fe.OBSERVABLE_GAUGE:return Vw;case fe.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Hu(t.advice.explicitBucketBoundaries):$w}return G.warn("Unable to recognize instrument type: "+t.type),Gw},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(wr);var Gw=new kw,jw=new Fw,Vw=new Uw,$w=new Bw,JU=new zw,QU=new Hw;var Ww=function(r){return wr.Default()},qw=function(r){return va.CUMULATIVE};var gg=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},fg=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},Kw=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},ZU=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))},Yw=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:Ww,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:qw,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 gg(this,void 0,void 0,function(){var t,n,o,i,a,l;return fg(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(ZU([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],Kw(this._metricProducers.map(function(s){return s.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=Kw.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(ig(o,function(s){return s.errors})),a=n.resourceMetrics.resource,l=n.resourceMetrics.scopeMetrics.concat(ig(o,function(s){return s.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:l},errors:i}]}})})},r.prototype.shutdown=function(e){return gg(this,void 0,void 0,function(){return fg(this,function(t){switch(t.label){case 0:return this._shutdown?(G.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,uo(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return gg(this,void 0,void 0,function(){return fg(this,function(t){switch(t.label){case 0:return this._shutdown?(G.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,uo(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Oe();var eB=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)}}(),Gu=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},ju=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},tB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},rB=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))},Sg=function(r){eB(e,r);function e(t){var n,o,i,a,l=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 l._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,l._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,l._exporter=t.exporter,l}return e.prototype._runOnce=function(){return Gu(this,void 0,void 0,function(){var t;return ju(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,uo(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof og?(G.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Uu(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Gu(this,void 0,void 0,function(){var o,i,a,l,c,s;return ju(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&&(s=G).error.apply(s,rB(["PeriodicExportingMetricReader: metrics collection errors"],tB(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 l=u.sent(),G.debug("Error while resolving async portion of resource: ",l),Uu(l),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,Dw._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==ll.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),sl(this._interval)},e.prototype.onForceFlush=function(){return Gu(this,void 0,void 0,function(){return ju(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 Gu(this,void 0,void 0,function(){return ju(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}(Yw);Oe();Oe();function Vu(){return"unknown_service:"+process.argv0}var mo=function(){return mo=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},mo.apply(this,arguments)},nB=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},oB=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},iB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$u=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 G.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[Ow]=Vu(),e[il]=di[il],e[ol]=di[ol],e[al]=di[al],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&G.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 nB(this,void 0,void 0,function(){return oB(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=mo(mo({},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 l,c=iB(a,2),s=c[0],u=c[1];return mo(mo(mo(mo({},t._syncAttributes),s),(l=e._syncAttributes)!==null&&l!==void 0?l:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Xw=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}();Oe();var hi=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)}}(),Wu=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=fa.active()),typeof e!="number"){G.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===ar.INT&&!Number.isInteger(e)&&(G.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,pi(Date.now()))},r}();var Jw=function(r){hi(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}(Wu);var Qw=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){G.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wu);var Zw=function(r){hi(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}(Wu);var eA=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){G.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wu);var qu=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 tA=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);var rA=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);var nA=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);function cl(r){return r instanceof qu}var oA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=cn(e,fe.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new Zw(o,n)},r.prototype.createHistogram=function(e,t){var n=cn(e,fe.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new eA(o,n)},r.prototype.createCounter=function(e,t){var n=cn(e,fe.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Qw(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=cn(e,fe.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Jw(o,n)},r.prototype.createObservableGauge=function(e,t){var n=cn(e,fe.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new rA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=cn(e,fe.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new tA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=cn(e,fe.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new nA(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 Ku=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=cn(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var aB=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)}}(),iA=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},sB=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 iA(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 iA(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 Ur=function(r){aB(e,r);function e(){return r.call(this,Mu)||this}return e}(sB);var lB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yu=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Ur,this._cumulativeMemoStorage=new Ur,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Mu(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 l=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});l?.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=lB(o,3),a=i[0],l=i[1],c=i[2],s=n._aggregator.createAccumulation(t);s?.record(l);var u=s;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,s)}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,s)}if(n._activeCollectionStorage.has(a,c)){var p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,u)}n._cumulativeMemoStorage.set(a,s,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new Ur,e},r}();var yg=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.")},aA=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Xu=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,l;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),s=c.collectionTime;l=c.aggregationTemporality,l===va.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,s)}else l=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:l});var u=cB(a);if(u.length!==0)return this._aggregator.toMetricData(t,l,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=yg(o),a=i.next();!a.done;a=i.next()){var l=a.value,c=this._unreportedAccumulations.get(l);c===void 0&&(c=[],this._unreportedAccumulations.set(l,c)),c.push(e)}}catch(s){t={error:s}}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 Ur,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=yg(i),l=a.next();!l.done;l=a.next()){var c=l.value;o=r.merge(o,c,this._aggregator)}}catch(s){t={error:s}}finally{try{l&&!l.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 l=aA(a.value,3),c=l[0],s=l[1],u=l[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,s);o.set(c,p,u)}else o.set(c,s,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=yg(e.keys()),l=a.next();!l.done;l=a.next()){var c=aA(l.value,2),s=c[0],u=c[1],d=t.get(s,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function cB(r){return Array.from(r.entries())}var uB=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)}}(),dB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},sA=function(r){uB(e,r);function e(t,n,o,i,a){var l=r.call(this,t)||this;return l._attributesProcessor=o,l._aggregationCardinalityLimit=a,l._deltaMetricStorage=new Yu(n,l._aggregationCardinalityLimit),l._temporalMetricStorage=new Xu(n,i),l}return e.prototype.record=function(t,n){var o=this,i=new Ur;Array.from(t.entries()).forEach(function(a){var l=dB(a,2),c=l[0],s=l[1];i.set(o._attributesProcessor.process(c),s)}),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}(Ku);Oe();function Eg(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
|
|
36
|
+
${x.feedback}`,p.status="FAILED",s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;M&&s.onDynamicAIActionEvaluatingEvent?.({stepId:M,status:"FAILED",message:x.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",s.onDynamicAIActionEvaluatingEvent?.({stepId:M??e.id,status:"FAILED",message:p.message}),p}let Y=setTimeout(()=>{s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:E},`Generating new sub-command ${S} within AI action`);let W,D;try{({command:W,reasoning:D}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:E,langfuseSessionId:u})),d.info({command:W,reasoning:D},"Got proposed command")}finally{clearTimeout(Y)}if(W.type==="FAILURE")return clearTimeout(Y),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${D}`,p;let Q={id:bh(),type:"PRESET_ACTION",command:W},B={substepIndex:S+1,message:D||"Generated new command."};s.onDynamicCommandGenerated?.({...B,step:Q,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${S} within AI step: ${rn(W)}`);let H=await t.startSubSteps(),V=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[Q],tracer:H}})).results[0];s.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let Ke=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(V),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Ke.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:rn(W),elementInteracted:V.results[0]?.elementInteracted,thoughts:D});let Ie={substepIndex:S,output:{...V,message:V.message??"Successfully executed preset action."},step:Q,parentStepId:e.id};if(s.onDynamicCommandExecuted?.(Ie),await t.finish({output:Vl.parse(V),step:V,message:V.message,attempt:1}),V.status==="FAILED")if(p.status="FAILED",p.message=V.message,y<3)y++,w=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${V.message}`;else return p;else if(V.status==="CANCELLED")return p.status="CANCELLED",p.message=V.message,p;S++}};import{randomUUID as OB}from"crypto";var uu=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function g0(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 du(r,e){let t=g0(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var Jv="=",gu=";",Lh=",";var Qv=8192;var Sa={};MI(Sa,{getKeyPairs:()=>K0,parseKeyPairsIntoRecord:()=>Y0,parsePairKeyValue:()=>Zv,serializeKeyPairs:()=>q0});Le();var W0=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function q0(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Lh:"")+t;return n.length>Qv?e:n},"")}function K0(r){return r.getAllEntries().map(function(e){var t=W0(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=gu+o.metadata.toString()),i})}function Zv(r){var e=r.split(gu);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(Jv);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=Rh(e.join(gu))),{key:o,value:i,metadata:a}}}}}function Y0(r){return typeof r!="string"||r.length===0?{}:r.split(Lh).map(function(e){return Zv(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Le();var fu;(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"})(fu||(fu={}));var X0=",",J0=["OTEL_SDK_DISABLED"];function Q0(r){return J0.indexOf(r)>-1}var Z0=["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 eF(r){return Z0.indexOf(r)>-1}var tF=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function rF(r){return tF.indexOf(r)>-1}var Nh=1/0,Dh=128,nF=128,oF=128,kh={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:Ge.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Nh,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Dh,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:nF,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:oF,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:fu.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 iF(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function aF(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 sF(r,e,t,n){n===void 0&&(n=X0);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var lF={ALL:Ge.ALL,VERBOSE:Ge.VERBOSE,DEBUG:Ge.DEBUG,INFO:Ge.INFO,WARN:Ge.WARN,ERROR:Ge.ERROR,NONE:Ge.NONE};function cF(r,e,t){var n=t[r];if(typeof n=="string"){var o=lF[n.toUpperCase()];o!=null&&(e[r]=o)}}function eR(r){var e={};for(var t in kh){var n=t;switch(n){case"OTEL_LOG_LEVEL":cF(n,e,r);break;default:if(Q0(n))iF(n,e,r);else if(eF(n))aF(n,e,r);else if(rF(n))sF(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function xt(){var r=eR(process.env);return Object.assign({},kh,r)}function tR(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function Su(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=tR(r.charCodeAt(n)),i=tR(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var rR="1.25.1";var uF="deployment.environment";var dF="process.runtime.name";var pF="service.name";var mF="service.instance.id";var hF="telemetry.sdk.name",gF="telemetry.sdk.language",fF="telemetry.sdk.version";var nR=uF;var oR=dF;var yu=pF;var iR=mF;var Ks=hF,Ys=gF,Xs=fF;var SF="nodejs";var aR=SF;var ya,Eu=(ya={},ya[Ks]="opentelemetry",ya[oR]="node",ya[Ys]=aR,ya[Xs]=rR,ya);var yF=9,EF=6,TF=Math.pow(10,EF),bF=Math.pow(10,yF);function sR(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*TF);return[t,n]}function lR(r){return r[0]*bF+r[1]}function Js(r){return r[0]*1e6+r[1]/1e3}var ci;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ci||(ci={}));var cR=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 vF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},RF=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))},uR=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new cR}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,RF([this._that],vF(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 br;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(br||(br={}));var Ut;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Ut||(Ut={}));var wF=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 age=function(r){wF(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function dR(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}Le();var vr;(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"})(vr||(vr={}));var pR=function(){function r(){this.kind=vr.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 ue;(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"})(ue||(ue={}));var AF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function CF(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 Fh=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=CF(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=dR(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 Uh=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=vr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Fh(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,l=new Array(i.length),c=0;c<i.length;c++)l[c]=i[c]+a[c];var s=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(s=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(s=n.min,u=n.max):o.hasMinMax&&(s=o.min,u=o.max)),new Fh(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:s,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,l=new Array(i.length),c=0;c<i.length;c++)l[c]=a[c]-i[c];return new Fh(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},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:Ut.HISTOGRAM,dataPoints:n.map(function(i){var a=AF(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,buckets:s.buckets,count:s.count}}})}},r}();Le();var Bh=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(l){a={error:l}}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))},Hh=function(){function r(e,t,n,o){e===void 0&&(e=new xF),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 l=a%n;l<0&&(l+=n);for(var c=l;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 xF=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,zh([n,this._counts.length-t],Bh(this._counts.slice(t)),!1)),o.splice.apply(o,zh([0,t],Bh(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(zh([],Bh(this._counts),!1))},r}();var mR=52,_F=2146435072,IF=1048575,Gh=1023,Tu=-Gh+1,bu=Gh,Qs=Math.pow(2,-1022);function vu(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&_F)>>20;return n-Gh}function Ru(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&IF)*Math.pow(2,32);return o+n}function Zs(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function gR(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var MF=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){MF(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var SR=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Qs)return this._minNormalLowerBoundaryIndex();var t=vu(e),n=this._rightShift(Ru(e)-1,mR);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 Zs(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=Tu>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return bu>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var yR=function(){function r(e){this._scale=e,this._scaleFactor=Zs(Math.LOG2E,e),this._inverseFactor=Zs(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Qs)return this._minNormalLowerBoundaryIndex()-1;if(Ru(e)===0){var t=vu(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 Qs;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 Tu<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(bu+1<<this._scale)-1},r}();var ER=-10,TR=20,PF=Array.from({length:31},function(r,e){return e>10?new yR(e-10):new SR(e-10)});function jh(r){if(r>TR||r<ER)throw new lo("expected scale >= "+ER+" && <= "+TR+", got: "+r);return PF[r+10]}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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wu=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}(),LF=20,NF=160,Vh=2,DF=function(){function r(e,t,n,o,i,a,l,c,s,u,d){e===void 0&&(e=e),t===void 0&&(t=NF),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),l===void 0&&(l=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),s===void 0&&(s=new Hh),u===void 0&&(u=new Hh),d===void 0&&(d=jh(LF)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=l,this._max=c,this._positive=s,this._negative=u,this._mapping=d,this._maxSize<Vh&&(G.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Vh),this._maxSize=Vh)}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,l=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,l=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,l=e.indexStart,a=o),i){var c=this._changeScale(a,l);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=gR(t);a>this._maxSize&&(a=this._maxSize);var l=a-o;e.backing.growTo(a,i,l)},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=jh(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=wu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=wu.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 wu(0,-1);var o=t-n;return new wu(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++)this._incrementIndexBy(e,i+l>>a,n.at(l))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++){var c=i+l>>a,s=c-e.indexBase;s<0&&(s+=e.backing.length),e.decrementBucket(s,n.at(l))}e.trim()},r}();var bR=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=vr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new DF(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:Ut.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=OF(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}},r}();var kF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$h=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=sR(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var vR=function(){function r(){this.kind=vr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new $h(e)},r.prototype.merge=function(e,t){var n=Js(t.sampleTime)>=Js(e.sampleTime)?t:e;return new $h(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Js(t.sampleTime)>=Js(e.sampleTime)?t:e;return new $h(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Ut.GAUGE,dataPoints:n.map(function(i){var a=kF(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var FF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},el=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 Wh=function(){function r(e){this.monotonic=e,this.kind=vr.SUM}return r.prototype.createAccumulation=function(e){return new el(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new el(t.startTime,this.monotonic,o,t.reset):new el(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 el(t.startTime,this.monotonic,o,!0):new el(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Ut.SUM,dataPoints:n.map(function(i){var a=FF(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();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)}}(),sn=function(){function r(){}return r.Drop=function(){return MR},r.Sum=function(){return PR},r.LastValue=function(){return OR},r.Histogram=function(){return LR},r.ExponentialHistogram=function(){return UF},r.Default=function(){return BF},r}();var RR=function(r){ui(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 pR,e}(sn);var wR=function(r){ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Wh(!0),e.NON_MONOTONIC_INSTANCE=new Wh(!1),e}(sn);var AR=function(r){ui(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 vR,e}(sn);var CR=function(r){ui(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 Uh([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(sn);var xR=function(r){ui(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(l,c){return l-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 Uh(this._boundaries,this._recordMinMax)},e}(sn);var _R=function(r){ui(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 bR(this._maxSize,this._recordMinMax)},e}(sn);var IR=function(r){ui(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ue.COUNTER:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return PR;case ue.GAUGE:case ue.OBSERVABLE_GAUGE:return OR;case ue.HISTOGRAM:return t.advice.explicitBucketBoundaries?new xR(t.advice.explicitBucketBoundaries):LR}return G.warn("Unable to recognize instrument type: "+t.type),MR},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(sn);var MR=new RR,PR=new wR,OR=new AR,LR=new CR,UF=new _R,BF=new IR;Le();function Au(){return"unknown_service:"+process.argv0}var co=function(){return co=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},co.apply(this,arguments)},zF=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},HF=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},GF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},qh=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 G.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[yu]=Au(),e[Ys]=Eu[Ys],e[Ks]=Eu[Ks],e[Xs]=Eu[Xs],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&G.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 zF(this,void 0,void 0,function(){return HF(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=co(co({},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 l,c=GF(a,2),s=c[0],u=c[1];return co(co(co(co({},t._syncAttributes),s),(l=e._syncAttributes)!==null&&l!==void 0?l:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var di;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(di||(di={}));Le();var jF=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},VF=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},Kh=function(){return br.CUMULATIVE},NR=function(r){switch(r){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.GAUGE:case ue.HISTOGRAM:case ue.OBSERVABLE_GAUGE:return br.DELTA;case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return br.CUMULATIVE}},DR=function(r){switch(r){case ue.COUNTER:case ue.HISTOGRAM:return br.DELTA;case ue.GAUGE:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_GAUGE:return br.CUMULATIVE}};function $F(){var r=xt(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Kh:e==="delta"?NR:e==="lowmemory"?DR:(G.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."),Kh)}function WF(r){return r!=null?r===di.DELTA?NR:r===di.LOWMEMORY?DR:Kh:$F()}function qF(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return sn.Default()}}var kR=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=qF(t),this._aggregationTemporalitySelector=WF(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return jF(this,void 0,void 0,function(){return VF(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}();Le();Le();var KF=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},FR=1e4,UR=5,BR=1e3,zR=5e3,HR=1.5;function tl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=KF(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):G.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function Yh(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function Xh(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return G.warn("Could not parse export URL: '"+r+"'"),r}}function Jh(r){return typeof r=="number"?r<=0?Qh(r,FR):r:YF()}function YF(){var r,e=Number((r=xt().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:xt().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?Qh(e,FR):e}function Qh(r,e){return G.warn("Timeout must be greater than 0",r),e}function GR(r){var e=[429,502,503,504];return e.includes(r)}function jR(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 VR=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 uR(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Jh(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:ci.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:ci.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:ci.SUCCESS})}).catch(function(n){t({code:ci.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{G.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 G.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Le();import*as Zh from"url";import*as xu from"http";import*as _u from"https";import*as $R from"zlib";import{Readable as JF}from"stream";var uo;(function(r){r.NONE="none",r.GZIP="gzip"})(uo||(uo={}));var XF=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)}}(),Ea=function(r){XF(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 Cu=function(){return Cu=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},Cu.apply(this,arguments)};function eg(r,e,t,n,o){var i=r.timeoutMillis,a=new Zh.URL(r.url),l=Number(process.versions.node.split(".")[0]),c,s,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,s.destroyed){var g=new Ea("Request Timeout");o(g)}else l>=14?s.destroy():s.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:Cu({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?xu.request:_u.request,h=function(g,f){switch(g===void 0&&(g=UR),f===void 0&&(f=BR),s=m(p,function(y){var E="";y.on("data",function(w){return E+=w}),y.on("aborted",function(){if(u){var w=new Ea("Request Timeout");o(w)}}),y.on("end",function(){if(u===!1)if(y.statusCode&&y.statusCode<299)G.debug("statusCode: "+y.statusCode,E),n(),clearTimeout(d),clearTimeout(c);else if(y.statusCode&&GR(y.statusCode)&&g>0){var w=void 0;f=HR*f,y.headers["retry-after"]?w=jR(y.headers["retry-after"]):w=Math.round(Math.random()*(zR-f)+f),c=setTimeout(function(){h(g-1,f)},w)}else{var v=new Ea(y.statusMessage,y.statusCode,E);o(v),clearTimeout(d),clearTimeout(c)}})}),s.on("error",function(y){if(u){var E=new Ea("Request Timeout",y.code);o(E)}else o(y);clearTimeout(d),clearTimeout(c)}),s.on("abort",function(){if(u){var y=new Ea("Request Timeout");o(y)}clearTimeout(d),clearTimeout(c)}),r.compression){case uo.GZIP:{s.setHeader("Content-Encoding","gzip");var S=QF(e);S.on("error",o).pipe($R.createGzip()).on("error",o).pipe(s);break}default:s.end(Buffer.from(e));break}};h()}function QF(r){var e=new JF;return e.push(r),e.push(null),e}function tg(r){if(r.httpAgentOptions&&r.keepAlive===!1){G.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Zh.URL(r.url),t=e.protocol==="http:"?xu.Agent:_u.Agent;return new t(Cu({keepAlive:!0},r.httpAgentOptions))}catch(n){G.error("collector exporter failed to create http agent. err: "+n.message);return}}function rg(r){if(r)return r;var e=xt().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||xt().OTEL_EXPORTER_OTLP_COMPRESSION;return e===uo.GZIP?uo.GZIP:uo.NONE}Le();var ZF=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)}}(),Iu=function(r){ZF(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&&G.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,tl(t.headers),Sa.parseKeyPairsIntoRecord(xt().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=tg(t),i.compression=rg(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){G.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,s){var u;eg(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,s)}).then(n,o);this._sendingPromises.push(a);var l=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(l,l)},e.prototype.onShutdown=function(){},e}(VR);function qR(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function eU(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function KR(r){var e=qR(r);return eU(e)}function tU(r){var e=qR(r);return e.toString()}var rU=typeof BigInt<"u"?tU:lR;function WR(r){return r}function YR(r){if(r!==void 0)return Su(r)}var nU={encodeHrTime:KR,encodeSpanContext:Su,encodeOptionalSpanContext:YR};function XR(r){var e,t;if(r===void 0)return nU;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?KR:rU,encodeSpanContext:o?WR:Su,encodeOptionalSpanContext:o?WR:YR}}var oU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function JR(r){return{name:r.name,version:r.version}}function Ta(r){return Object.keys(r).map(function(e){return QR(e,r[e])})}function QR(r,e){return{key:r,value:ZR(e)}}function ZR(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(ZR)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=oU(t,2),o=n[0],i=n[1];return QR(o,i)})}}:{}}function ew(r){return{attributes:Ta(r.attributes),droppedAttributesCount:0}}Le();function rw(r,e){var t=XR(e);return{resource:ew(r.resource),schemaUrl:void 0,scopeMetrics:iU(r.scopeMetrics,t)}}function iU(r,e){return Array.from(r.map(function(t){return{scope:JR(t.scope),metrics:t.metrics.map(function(n){return aU(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function aU(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=uU(r.aggregationTemporality);switch(r.dataPointType){case Ut.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:tw(r,e)};break;case Ut.GAUGE:t.gauge={dataPoints:tw(r,e)};break;case Ut.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:lU(r,e)};break;case Ut.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:cU(r,e)};break}return t}function sU(r,e,t){var n={attributes:Ta(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case ar.INT:n.asInt=r.value;break;case ar.DOUBLE:n.asDouble=r.value;break}return n}function tw(r,e){return r.dataPoints.map(function(t){return sU(t,r.descriptor.valueType,e)})}function lU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ta(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 cU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ta(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 uU(r){switch(r){case br.DELTA:return 1;case br.CUMULATIVE:return 2}}function nw(r,e){return{resourceMetrics:r.map(function(t){return rw(t,e)})}}var ng={serializeRequest:function(r){var e=nw(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 ow="0.52.1";var iw=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)}}(),ba=function(){return ba=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},ba.apply(this,arguments)},aw="v1/metrics",dU="http://localhost:4318/"+aw,pU={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+ow},mU=function(r){iw(e,r);function e(t){var n=r.call(this,t,ng,"application/json")||this;return n.headers=ba(ba(ba(ba({},n.headers),pU),Sa.parseKeyPairsIntoRecord(xt().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),tl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:xt().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?Xh(xt().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):xt().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Yh(xt().OTEL_EXPORTER_OTLP_ENDPOINT,aw):dU},e}(Iu),sw=function(r){iw(e,r);function e(t){return r.call(this,new mU(t),t)||this}return e}(kR);var va;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(va||(va={}));var ln;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(ln||(ln={}));Le();var hU=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)}}(),lw=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},cw=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},gU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},fU=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))},SU=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 uw(r){return r!=null}function Mu(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function dw(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var og=function(r){hU(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function po(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new og("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function pw(r){return lw(this,void 0,void 0,function(){var e=this;return cw(this,function(t){return[2,Promise.all(r.map(function(n){return lw(e,void 0,void 0,function(){var o,i;return cw(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 mw(r){return r.status==="rejected"}function ig(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,fU([],gU(e(n)),!1))}),t}function hw(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=SU(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(l){t={error:l}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function gw(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 fw(r,e){return r.toLowerCase()===e.toLowerCase()}Le();var Rr;(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"})(Rr||(Rr={}));var ag=function(){function r(){this.kind=Rr.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}();Le();var fe;(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"})(fe||(fe={}));function cn(r,e,t){var n,o,i,a;return EU(r)||G.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:ar.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Sw(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 yw(r,e){return fw(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var yU=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function EU(r){return r.match(yU)!=null}var TU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function bU(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 Pu=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=bU(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=gw(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 Ou=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Rr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Pu(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,l=new Array(i.length),c=0;c<i.length;c++)l[c]=i[c]+a[c];var s=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(s=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(s=n.min,u=n.max):o.hasMinMax&&(s=o.min,u=o.max)),new Pu(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:s,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,l=new Array(i.length),c=0;c<i.length;c++)l[c]=a[c]-i[c];return new Pu(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:l},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:ln.HISTOGRAM,dataPoints:n.map(function(i){var a=TU(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===fe.GAUGE||e.type===fe.UP_DOWN_COUNTER||e.type===fe.OBSERVABLE_GAUGE||e.type===fe.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,buckets:s.buckets,count:s.count}}})}},r}();Le();var sg=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},lg=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))},cg=function(){function r(e,t,n,o){e===void 0&&(e=new vU),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 l=a%n;l<0&&(l+=n);for(var c=l;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 vU=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,lg([n,this._counts.length-t],sg(this._counts.slice(t)),!1)),o.splice.apply(o,lg([0,t],sg(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(lg([],sg(this._counts),!1))},r}();var Ew=52,RU=2146435072,wU=1048575,ug=1023,Lu=-ug+1,Nu=ug,rl=Math.pow(2,-1022);function Du(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&RU)>>20;return n-ug}function ku(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&wU)*Math.pow(2,32);return o+n}function nl(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function bw(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var AU=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)}}(),mo=function(r){AU(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Rw=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<rl)return this._minNormalLowerBoundaryIndex();var t=Du(e),n=this._rightShift(ku(e)-1,Ew);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new mo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new mo("overflow: "+e+" is > maximum lower boundary: "+n);return nl(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=Lu>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Nu>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var ww=function(){function r(e){this._scale=e,this._scaleFactor=nl(Math.LOG2E,e),this._inverseFactor=nl(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=rl)return this._minNormalLowerBoundaryIndex()-1;if(ku(e)===0){var t=Du(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 mo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return rl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new mo("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 Lu<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Nu+1<<this._scale)-1},r}();var Aw=-10,Cw=20,CU=Array.from({length:31},function(r,e){return e>10?new ww(e-10):new Rw(e-10)});function dg(r){if(r>Cw||r<Aw)throw new mo("expected scale >= "+Aw+" && <= "+Cw+", got: "+r);return CU[r+10]}var xU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Fu=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}(),_U=20,IU=160,pg=2,xw=function(){function r(e,t,n,o,i,a,l,c,s,u,d){e===void 0&&(e=e),t===void 0&&(t=IU),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),l===void 0&&(l=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),s===void 0&&(s=new cg),u===void 0&&(u=new cg),d===void 0&&(d=dg(_U)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=l,this._max=c,this._positive=s,this._negative=u,this._mapping=d,this._maxSize<pg&&(G.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+pg),this._maxSize=pg)}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,l=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,l=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,l=e.indexStart,a=o),i){var c=this._changeScale(a,l);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=bw(t);a>this._maxSize&&(a=this._maxSize);var l=a-o;e.backing.growTo(a,i,l)},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=dg(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Fu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Fu.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 Fu(0,-1);var o=t-n;return new Fu(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++)this._incrementIndexBy(e,i+l>>a,n.at(l))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,l=0;l<n.length;l++){var c=i+l>>a,s=c-e.indexBase;s<0&&(s+=e.backing.length),e.decrementBucket(s,n.at(l))}e.trim()},r}();var mg=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Rr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new xw(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:ln.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=xU(i,2),l=a[0],c=a[1],s=c.toPointValue(),u=e.type===fe.GAUGE||e.type===fe.UP_DOWN_COUNTER||e.type===fe.OBSERVABLE_GAUGE||e.type===fe.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:l,startTime:c.startTime,endTime:o,value:{min:s.hasMinMax?s.min:void 0,max:s.hasMinMax?s.max:void 0,sum:u?void 0:s.sum,positive:{offset:s.positive.offset,bucketCounts:s.positive.bucketCounts},negative:{offset:s.negative.offset,bucketCounts:s.negative.bucketCounts},count:s.count,scale:s.scale,zeroCount:s.zeroCount}}})}},r}();Le();var MU=wh("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function _w(r){return r.setValue(MU,!0)}Le();function Iw(){return function(r){G.error(PU(r))}}function PU(r){return typeof r=="string"?r:JSON.stringify(OU(r))}function OU(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 LU=Iw();function Uu(r){try{LU(r)}catch{}}var Mw="1.30.1";var NU="process.runtime.name";var DU="service.name";var kU="telemetry.sdk.name",FU="telemetry.sdk.language",UU="telemetry.sdk.version";var Pw=NU;var Ow=DU;var ol=kU,il=FU,al=UU;var BU="nodejs";var Lw=BU;var Ra,pi=(Ra={},Ra[ol]="opentelemetry",Ra[Pw]="node",Ra[il]=Lw,Ra[al]=Mw,Ra);function sl(r){r.unref()}var WU=9,qU=6,KU=Math.pow(10,qU),uye=Math.pow(10,WU);function mi(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*KU);return[t,n]}function wa(r){return r[0]*1e6+r[1]/1e3}var ll;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ll||(ll={}));Le();function Nw(r,e){return new Promise(function(t){fa.with(_w(fa.active()),function(){r.export(e,function(n){t(n)})})})}var Dw={_export:Nw};var YU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Bu=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=mi(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var hg=function(){function r(){this.kind=Rr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Bu(e)},r.prototype.merge=function(e,t){var n=wa(t.sampleTime)>=wa(e.sampleTime)?t:e;return new Bu(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=wa(t.sampleTime)>=wa(e.sampleTime)?t:e;return new Bu(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:ln.GAUGE,dataPoints:n.map(function(i){var a=YU(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var XU=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Aa=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 zu=function(){function r(e){this.monotonic=e,this.kind=Rr.SUM}return r.prototype.createAccumulation=function(e){return new Aa(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Aa(t.startTime,this.monotonic,o,t.reset):new Aa(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 Aa(t.startTime,this.monotonic,o,!0):new Aa(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:ln.SUM,dataPoints:n.map(function(i){var a=XU(i,2),l=a[0],c=a[1];return{attributes:l,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var hi=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)}}(),wr=function(){function r(){}return r.Drop=function(){return Gw},r.Sum=function(){return jw},r.LastValue=function(){return Vw},r.Histogram=function(){return $w},r.ExponentialHistogram=function(){return JU},r.Default=function(){return QU},r}();var kw=function(r){hi(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 ag,e}(wr);var Fw=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case fe.COUNTER:case fe.OBSERVABLE_COUNTER:case fe.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new zu(!0),e.NON_MONOTONIC_INSTANCE=new zu(!1),e}(wr);var Uw=function(r){hi(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 hg,e}(wr);var Bw=function(r){hi(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 Ou([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(wr);var Hu=function(r){hi(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(l,c){return l-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 Ou(this._boundaries,this._recordMinMax)},e}(wr);var zw=function(r){hi(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 mg(this._maxSize,this._recordMinMax)},e}(wr);var Hw=function(r){hi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case fe.COUNTER:case fe.UP_DOWN_COUNTER:case fe.OBSERVABLE_COUNTER:case fe.OBSERVABLE_UP_DOWN_COUNTER:return jw;case fe.GAUGE:case fe.OBSERVABLE_GAUGE:return Vw;case fe.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Hu(t.advice.explicitBucketBoundaries):$w}return G.warn("Unable to recognize instrument type: "+t.type),Gw},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(wr);var Gw=new kw,jw=new Fw,Vw=new Uw,$w=new Bw,JU=new zw,QU=new Hw;var Ww=function(r){return wr.Default()},qw=function(r){return va.CUMULATIVE};var gg=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},fg=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},Kw=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},ZU=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))},Yw=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:Ww,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:qw,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 gg(this,void 0,void 0,function(){var t,n,o,i,a,l;return fg(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(ZU([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],Kw(this._metricProducers.map(function(s){return s.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=Kw.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(ig(o,function(s){return s.errors})),a=n.resourceMetrics.resource,l=n.resourceMetrics.scopeMetrics.concat(ig(o,function(s){return s.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:l},errors:i}]}})})},r.prototype.shutdown=function(e){return gg(this,void 0,void 0,function(){return fg(this,function(t){switch(t.label){case 0:return this._shutdown?(G.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,po(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return gg(this,void 0,void 0,function(){return fg(this,function(t){switch(t.label){case 0:return this._shutdown?(G.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,po(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Le();var eB=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)}}(),Gu=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},ju=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},tB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},rB=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))},Sg=function(r){eB(e,r);function e(t){var n,o,i,a,l=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 l._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,l._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,l._exporter=t.exporter,l}return e.prototype._runOnce=function(){return Gu(this,void 0,void 0,function(){var t;return ju(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,po(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof og?(G.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Uu(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Gu(this,void 0,void 0,function(){var o,i,a,l,c,s;return ju(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&&(s=G).error.apply(s,rB(["PeriodicExportingMetricReader: metrics collection errors"],tB(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 l=u.sent(),G.debug("Error while resolving async portion of resource: ",l),Uu(l),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,Dw._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==ll.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),sl(this._interval)},e.prototype.onForceFlush=function(){return Gu(this,void 0,void 0,function(){return ju(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 Gu(this,void 0,void 0,function(){return ju(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}(Yw);Le();Le();function Vu(){return"unknown_service:"+process.argv0}var ho=function(){return ho=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},ho.apply(this,arguments)},nB=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},oB=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},iB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},$u=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 G.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[Ow]=Vu(),e[il]=pi[il],e[ol]=pi[ol],e[al]=pi[al],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&G.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 nB(this,void 0,void 0,function(){return oB(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=ho(ho({},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 l,c=iB(a,2),s=c[0],u=c[1];return ho(ho(ho(ho({},t._syncAttributes),s),(l=e._syncAttributes)!==null&&l!==void 0?l:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Xw=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}();Le();var gi=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)}}(),Wu=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=fa.active()),typeof e!="number"){G.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===ar.INT&&!Number.isInteger(e)&&(G.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,mi(Date.now()))},r}();var Jw=function(r){gi(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}(Wu);var Qw=function(r){gi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){G.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wu);var Zw=function(r){gi(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}(Wu);var eA=function(r){gi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){G.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Wu);var qu=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 tA=function(r){gi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);var rA=function(r){gi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);var nA=function(r){gi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(qu);function cl(r){return r instanceof qu}var oA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=cn(e,fe.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new Zw(o,n)},r.prototype.createHistogram=function(e,t){var n=cn(e,fe.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new eA(o,n)},r.prototype.createCounter=function(e,t){var n=cn(e,fe.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Qw(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=cn(e,fe.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new Jw(o,n)},r.prototype.createObservableGauge=function(e,t){var n=cn(e,fe.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new rA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=cn(e,fe.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new tA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=cn(e,fe.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new nA(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 Ku=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=cn(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var aB=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)}}(),iA=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},sB=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 iA(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 iA(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 Ur=function(r){aB(e,r);function e(){return r.call(this,Mu)||this}return e}(sB);var lB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yu=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Ur,this._cumulativeMemoStorage=new Ur,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Mu(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 l=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});l?.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=lB(o,3),a=i[0],l=i[1],c=i[2],s=n._aggregator.createAccumulation(t);s?.record(l);var u=s;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,s)}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,s)}if(n._activeCollectionStorage.has(a,c)){var p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,u)}n._cumulativeMemoStorage.set(a,s,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new Ur,e},r}();var yg=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.")},aA=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Xu=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,l;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),s=c.collectionTime;l=c.aggregationTemporality,l===va.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,s)}else l=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:l});var u=cB(a);if(u.length!==0)return this._aggregator.toMetricData(t,l,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=yg(o),a=i.next();!a.done;a=i.next()){var l=a.value,c=this._unreportedAccumulations.get(l);c===void 0&&(c=[],this._unreportedAccumulations.set(l,c)),c.push(e)}}catch(s){t={error:s}}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 Ur,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=yg(i),l=a.next();!l.done;l=a.next()){var c=l.value;o=r.merge(o,c,this._aggregator)}}catch(s){t={error:s}}finally{try{l&&!l.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 l=aA(a.value,3),c=l[0],s=l[1],u=l[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,s);o.set(c,p,u)}else o.set(c,s,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=yg(e.keys()),l=a.next();!l.done;l=a.next()){var c=aA(l.value,2),s=c[0],u=c[1],d=t.get(s,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function cB(r){return Array.from(r.entries())}var uB=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)}}(),dB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},sA=function(r){uB(e,r);function e(t,n,o,i,a){var l=r.call(this,t)||this;return l._attributesProcessor=o,l._aggregationCardinalityLimit=a,l._deltaMetricStorage=new Yu(n,l._aggregationCardinalityLimit),l._temporalMetricStorage=new Xu(n,i),l}return e.prototype.record=function(t,n){var o=this,i=new Ur;Array.from(t.entries()).forEach(function(a){var l=dB(a,2),c=l[0],s=l[1];i.set(o._attributesProcessor.process(c),s)}),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}(Ku);Le();function Eg(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
|
|
37
37
|
`),r.type!==e.type&&(t+=" - Type '"+r.type+"' does not match '"+e.type+`'
|
|
38
38
|
`),r.valueType!==e.valueType&&(t+=" - Value Type '"+r.valueType+"' does not match '"+e.valueType+`'
|
|
39
39
|
`),r.description!==e.description&&(t+=" - Description '"+r.description+"' does not match '"+e.description+`'
|
|
@@ -45,7 +45,7 @@ ${x.feedback}`,p.status="FAILED",s.onDynamicAIActionStatusUpdateEvent?.({parentS
|
|
|
45
45
|
To resolve the conflict:`,Tg(s,e))),i=c):G.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
|
|
46
46
|
`,`Details:
|
|
47
47
|
`,Eg(s,e),`To resolve the conflict:
|
|
48
|
-
`,Tg(s,e))}}catch(u){n={error:u}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},r}();var cA=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();Oe();Oe();var uA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Ur}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){G.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===ar.INT&&!Number.isInteger(e)&&(G.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var dA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!cl(e)){var o=this._buffer.get(e);if(o==null&&(o=new Ur,this._buffer.set(e,o)),typeof t!="number"){G.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===ar.INT&&!Number.isInteger(t)&&(G.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var vg=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},pA=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mA=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))},hA=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(cl));if(n.size===0){G.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(cl)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return vg(this,void 0,void 0,function(){var n,o,i,a;return Rg(this,function(l){switch(l.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,pw(mA(mA([],pA(n),!1),pA(o),!1))];case 1:return i=l.sent(),a=i.filter(mw).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return vg(n,void 0,void 0,function(){var l,c;return Rg(this,function(s){switch(s.label){case 0:return l=new uA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(l)),t!=null&&(c=uo(c,t)),[4,c];case 1:return s.sent(),a._metricStorages.forEach(function(u){u.record(l._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return vg(n,void 0,void 0,function(){var l,c;return Rg(this,function(s){switch(s.label){case 0:return l=new dA,c=Promise.resolve(i(l)),t!=null&&(c=uo(c,t)),[4,c];case 1:return s.sent(),a.forEach(function(u){var d=l._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&hw(n.instruments,t)})},r}();var fB=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)}}(),gA=function(r){fB(e,r);function e(t,n,o,i,a){var l=r.call(this,t)||this;return l._attributesProcessor=o,l._aggregationCardinalityLimit=a,l._deltaMetricStorage=new Yu(n,l._aggregationCardinalityLimit),l._temporalMetricStorage=new Xu(n,i),l}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Ku);var fA=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)}}(),Ca=function(){function r(){}return r.Noop=function(){return yB},r}();var SB=function(r){fA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ca);var SA=function(r){fA(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Ca);var yB=new SB;var EB=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},TB=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},bB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},yA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new lA,this.observableRegistry=new hA,this.meter=new oA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,gA);return t.length===1?t[0]:new cA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,sA);return t},r.prototype.collect=function(e,t,n){return EB(this,void 0,void 0,function(){var o,i,a;return TB(this,function(l){switch(l.label){case 0:return[4,this.observableRegistry.observe(t,n?.timeoutMillis)];case 1:return o=l.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,t)}).filter(uw),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var s=Sw(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(s);if(u!=null)return u;var d=c.aggregation.createAggregator(s),p=new t(s,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),l=a.map(function(c){var s=bB(c,2),u=s[0],d=s[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),h=u.selectCardinalityLimit(e.type),g=new t(e,m,Ca.Noop(),[u],h);return n.metricStorageRegistry.registerForCollector(u,g),g});i=i.concat(l)}return i},r}();var vB=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.")},EA=function(){function r(e){this.resource=e,this.viewRegistry=new Xw,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=dw(e),n=this.meterSharedStates.get(t);return n==null&&(n=new yA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=vB(this.metricCollectors),a=i.next();!a.done;a=i.next()){var l=a.value;o.push([l,l.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var Ju=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},Qu=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},RB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wB=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))},TA=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Ju(this,void 0,void 0,function(){var t,n,o,i,a=this;return Qu(this,function(l){switch(l.label){case 0:return t=pi(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Ju(a,void 0,void 0,function(){var s;return Qu(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return s=u.sent(),s?.scopeMetrics!=null&&n.push(s.scopeMetrics),s?.errors!=null&&o.push.apply(o,wB([],RB(s.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return l.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return Ju(this,void 0,void 0,function(){return Qu(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return Ju(this,void 0,void 0,function(){return Qu(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var bA=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},vA=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},RA=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 AB(r,e){var t=e??$u.empty();return r?$u.default().merge(t):t}var wg=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new EA(AB((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var l=RA(e.views),c=l.next();!c.done;c=l.next()){var s=c.value;this._sharedState.viewRegistry.addView(s)}}catch(m){t={error:m}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=RA(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(G.warn("A shutdown MeterProvider cannot provide a Meter"),Ih()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new TA(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return bA(this,void 0,void 0,function(){return vA(this,function(t){switch(t.label){case 0:return this._shutdown?(G.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return bA(this,void 0,void 0,function(){return vA(this,function(t){switch(t.label){case 0:return this._shutdown?(G.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var CB=/[\^$\\.+?()[\]{}|]/g,Zu=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(CB,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var xa=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var wA=function(){function r(e){var t;this._nameFilter=new Zu((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new xa(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var AA=function(){function r(e){this._nameFilter=new xa(e?.name),this._versionFilter=new xa(e?.version),this._schemaUrlFilter=new xa(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function xB(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Ag=function(){function r(e){var t;if(xB(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Zu.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new SA(e.attributeKeys):this.attributesProcessor=Ca.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:wr.Default(),this.instrumentSelector=new wA({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new AA({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var VTe=process.env.APP||"unknown";Oe();import{v4 as _B}from"uuid";function IB(){return new sw({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:ui.DELTA})}var MB=[new Ag({instrumentName:"test_operation_duration_ms",instrumentType:fe.HISTOGRAM,aggregation:new Hu([100,500,1e3,5e3,1e4,2e4])})],ed=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let t=typeof process<"u"?"production":"unknown",n=new qh({[yu]:e.serviceName,[nR]:t,[iR]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:_B()}),o=IB(),i=new Sg({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new wg({resource:n,readers:[i],views:MB}),hu.setGlobalMeterProvider(this.provider),this.meter=hu.getMeter("momentic-serverless")}increment(e,t,n){try{let o=du(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=du(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var qt=new uu;function CA(r){r.disabled||(qt=new ed(r))}var LB=3;async function _A(r){let{logger:e}=r.fixtures,{results:t}=r.failureRecoveryParams,n=t[t.length-1],o=DB(r.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),r.work.state.failureRecoveryAttempts=(r.work.state.failureRecoveryAttempts??0)+1;try{return await NB(r)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function NB(r){let{fixtures:e,work:t,failureRecoveryParams:n}=r,{controller:o,logger:i}=e,{testMetadata:a}=r.inputs,{results:l,failedStep:c,nextSteps:s,tracer:u}=n;if(!l.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:h}=await ea(i,u,l,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=s.map(_=>oo(_)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:y,thoughts:T,instructions:w}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:h,currentPageState:m,nextStepsSerialized:g,testDescription:f||void 0,customInstructions:S||void 0});if(y!=="RECOVERABLE")return i.info({scenario:y,thoughts:T,instructions:w},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${T}`};if(!w)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let v={id:OB(),type:"AI_ACTION_DYNAMIC",text:w},x=await ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[v,c],containerName:"AI-recovered step list",tracer:u}})),A=x.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(Oc({results:x.results,onPresetAction:_=>{_.aiSuggested=!0},onSimpleStepContainer:_=>{_.aiSuggested=!0}}),x.status==="SUCCESS"){let _=`The following steps were automatically executed by the failure recovery agent. Analysis: ${T}`;return A.message=_,qt.increment("test_event",1,["name:failure_recovery_success",`orgId:${r.inputs.orgId}`]),i.info({thoughts:T},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:x,message:_}}else{let _=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${T}`;return A.message=_,i.info({thoughts:T,aiActionResult:A},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:x,message:_}}return null}function DB(r,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let t=e.message;return t?t.includes("AbortError:")?"The user aborted the test":zS.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(r.state.failureRecoveryAttempts??0)>LB?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as td}from"crypto";import kB from"fast-json-patch";import{cloneDeep as FB}from"lodash-es";async function IA(r){let e=r.failedResults,t=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:l,tracer:c}=r,{step:s}=n,{controller:u,logger:d}=o,p=s?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},h=p?.attempts??1;for(let g=0;g<h;g++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=FB(s.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await ea(d,c,e.results,{numStepsWithScreenshots:4}),y=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:s.description});f=kB.applyPatch(f,y.patches).newDocument;let T=Yt.fromSnapshot({snapshot:l,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await UB({logger:d,controller:u,tracer:c,context:T,restartConfig:m,startingUrl:a});let w=await ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures,context:T},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(t.push(w.results),w.status==="SUCCESS")return{successfulHealing:{proposedStep:{...s,steps:f},listResult:w,context:T},healingAttempts:t};e=w}return{healingAttempts:t}}async function UB({logger:r,controller:e,tracer:t,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:td(),type:"PRESET_ACTION",command:{id:td(),type:"NAVIGATE",url:n.url}},l=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,l,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:td(),type:"PRESET_ACTION",command:{id:td(),type:"NAVIGATE",url:i}},l=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,l,a.command,o,!1);break}}}function MA(r,e){switch(r||(r="ON_FAILURE"),r){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&gS(e.command.type))}}async function PA(r){let{step:e,tracer:t}=r.sectionParams,{logger:n,controller:o,context:i}=r.fixtures,a=new Date,l=o.browser.url(),c=i.toObjectCopy(),s=await t.startSubSteps(),u=async()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:"section step list",tracer:s}}),d=e.autohealingConfig?await ma(r.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!r.work.state.autoHealingDisabled&&MA(e.autohealingConfig.trigger,d.terminalResult)){let g=await t.startSubSteps(),f=await IA({...r,startingContextSnapshot:c,startingUrl:l,failedResults:d,tracer:g});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,r.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return on({asyncTasks:r.work.asyncTasks,nestedResults:d.results,result:h,logger:n}),h}var zB=60*60*1e3;async function Br(r){let{results:e=[],containerName:t,steps:n,tracer:o}=r.listParams,{logger:i}=r.fixtures,a=o.getParentStepIdChain(),{fromStep:l,toStep:c}=r.inputs,s=r.work,u="SUCCESS",d,p=0;for(p;p<n.length;p++){let m=n[p];if(m.skipped)continue;if(s.fastForwardingToStep&&l){let T=JSON.stringify(a);if(m.id===l.fromStepId&&T===JSON.stringify(l.parentStepIdChain))s.fastForwardingToStep=!1;else if(!IT(m,a,l.fromStepId,l.parentStepIdChain))continue}let h=oo(m),g=0,f=1,S=Date.now();"retries"in m&&m.retries&&m.retries>0&&(f+=m.retries);let y;for(;g<f&&Date.now()-S<zB;){g++,i.info({step:m,currentAttempt:g},`Executing step ${p+1}/${n.length} in ${t}: ${h}`);let T=Date.now(),{stepResult:w,status:v,failureRecoveryResults:x,shouldStopExecuting:A}=await HB({attempt:g,params:r,step:m,i:p,steps:n,results:e,currentParentIdChain:a,work:s,fromStep:l,toStep:c,lastRetry:g===f});if(v==="FAILED"&&g<f){y=[...y??[],w],Date.now()-T<1e3&&await ne(1e3-(Date.now()-T));continue}else e.push(w),y&&(w.previousAttempts=y);if(x&&e.push(...x),A)return u=v,d=w,{status:u,results:e,terminalResult:d};break}}return{status:u,results:e,terminalResult:d}}async function HB({attempt:r,params:e,step:t,i:n,steps:o,results:i,currentParentIdChain:a,work:l,fromStep:c,toStep:s,lastRetry:u}){let{tracer:d}=e.listParams,{logger:p,context:m,controller:h,codeEvalTools:g,usageTracker:f}=e.fixtures,{orgId:S}=e.inputs,y=new Date,T=await d.startStep({logger:p,step:t,attempt:r}),w=BB(t),v=m.toRedactedDisplayCopy(),x=h.browser.url(),A=h.executeAbortController.signal;f.trackStepExecution(t);let _,M;switch(t.type){case"PRESET_ACTION":{_="Preset action",M=await ai(t,async()=>await cu({...e,presetParams:{tracer:T,step:t}}),A);break}case"AI_ACTION":{_="AI action",M=await ai(t,()=>vv({...e,aiStepParams:{step:t,tracer:T},executeStepList:Br}),A);break}case"AI_ACTION_DYNAMIC":{_="AI action",M=await ai(t,()=>wv({...e,aiStepParams:{step:t,tracer:T},executeStepList:Br}),A);break}case"RESOLVED_MODULE":{_=`Module (${t.name})`,M=await ai(t,async()=>{let B=await yv({orgId:S,step:t,context:m,logger:p,codeEvalTools:g,signal:A});return Th({...e,executeStepList:Br,moduleParams:{step:t,resolvedInputs:B,tracer:T}})},A);break}case"CONDITIONAL":{_="Conditional step",M=await ai(t,()=>Tv({...e,conditionalParams:{step:t,tracer:T},executeStepList:Br}),A);break}case"SECTION":{_="Section",M=await ai(t,()=>PA({...e,sectionParams:{step:t,tracer:T},executeStepList:Br}),A);break}default:return(H=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}M.beforeUrl=M.beforeUrl??x,M.beforeTestContext=v,t.envKey&&m.setVariable(t.envKey,M.data);let Y=h.browser.url();m.setCurrentUrl(Y),M.afterUrl=M.afterUrl??Y,M.afterTestContext=m.toRedactedDisplayCopy(),await GB({step:t,startedAt:y,stepTypeName:_,result:M,callbacks:e.callbacks,globalWorkRef:e.work,tracer:T,attempt:r});let W,D;if(u&&M.status==="FAILED"&&!l.state.failureRecoveryDisabled&&c?.fromStepId===void 0&&s?.toStepId===void 0){let B=await _A({...e,executeStepList:Br,failureRecoveryParams:{failedStep:w,nextSteps:o.slice(n+1),results:i.concat(M),tracer:d}});B&&(B.type==="ATTEMPTED"?(W=B.result.results,D=B.status):B.type==="NOT_ELIGIBLE"&&(M.message=M.message?`${M.message} ${B.message}`:B.message),M.type==="PRESET_ACTION"&&(M.failureRecoveryStatus={type:B.type,message:B.message}))}return l.fastForwardingToStep&&c&&(c.fromStepId===t.id&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)&&(l.fastForwardingToStep=!1),t.type==="RESOLVED_MODULE"&&Vm(a,c.parentStepIdChain)&&(l.fastForwardingToStep=!1)),M.status!=="SUCCESS"&&D!=="SUCCESS"||h.closed?{shouldStopExecuting:!0,status:M.status,stepResult:M,failureRecoveryResults:W}:s&&t.id===s.toStepId&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)?(h.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:M,failureRecoveryResults:W}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:M,failureRecoveryResults:W}}async function GB({stepTypeName:r,step:e,result:t,tracer:n,attempt:o,startedAt:i}){let a=r.toLowerCase(),l=r.charAt(0).toUpperCase()+r.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(t.status){case"SUCCESS":c=t.message??`${l} executed successfully.`;break;case"FAILED":c=t.message??`${l} failed.`;break;case"CANCELLED":c=t.message??`${l} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${t.status}`)}await n.finish({step:t,message:c,output:Vl.parse(t),attempt:o})}import mve,{multistream as gve}from"pino";import Sve from"pino-pretty";import{PostHog as jB}from"posthog-node";async function OA(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let l=await j(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=l.featureFlags||{},a=l.featureFlagPayloads||{};break}catch(l){t=l,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var rd=class r extends Ss{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new jB("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await OA(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await OA(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as VB}from"node:crypto";import{PostHog as $B}from"posthog-node";var nd=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new $B("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(!gy(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:VB(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import ul from"os";import WB from"v8";var LA,un,qB=ul.platform(),KB=ul.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),{});function NA(r){if(Jr)return;let e=()=>{try{let t=!1,n=YB(),o=XB();n.freeMemory<1e6&&(t=!0),o&&o?.total>70&&(t=!0);let i=WB.getHeapStatistics(),a=i.used_heap_size,l=i.heap_size_limit;if(a/l>.9&&(t=!0),t)for(let c of[r,E])c.warn({memory:n,cpu:o,heapStats:i},"Critical resource usage metrics detected");else r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,2e4),cpuMetadata:KB,platform:qB}}function YB(){let r=ul.totalmem(),e=ul.freemem(),t=r-e;return{totalMemory:r,freeMemory:e,usedMemory:t}}function XB(){let r=ul.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,!un)return un=t,null;let n={user:t.user-un.user,nice:t.nice-un.nice,sys:t.sys-un.sys,idle:t.idle-un.idle,irq:t.irq-un.irq,total:t.total-un.total};return LA={measurementTime:e,intervalMs:e-un.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},un=t,LA}async function DA({codePath:r,screenshotBuff:e,storage:t,logger:n}){if(e)try{let o=await t.uploadScreenshot(e);return n.info({screenshotUrl:o,codePath:r},"Saved screenshot for debugging"),o}catch(o){n.error({err:o,codePath:r},"Failed to save screenshot for debugging")}}async function dn({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var JB=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function kA({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(JB.includes(n.type))return;let l=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),s=0;for(;s===0||Date.now()-c<l;){await ne(250),s++;let u=(await t.getOpenPages()).map(p=>p.url),d=t.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(ti(m,o)&&m!==r&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(p)});break}}}}async function ho(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}var FA="MOMENTIC_RUN_ID",UA="FINAL_SCREENSHOT_URL";import{randomUUID as BA}from"crypto";async function zA({browser:r,signal:e}){let t=new Date;try{return await r.navigate({url:r.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:BA(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:t,finishedAt:new Date,results:[],command:{id:BA(),type:"NAVIGATE",url:r.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var od=async r=>{let{orgId:e,runId:t,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs;r.fixtures.logger=r.fixtures.logger.child({orgId:e,runId:t,testId:n?.id});let{logger:l,controller:c}=r.fixtures,{onTestComplete:s,onTestSuccess:u,onTestFailure:d}=r.callbacks.test,p=NA(l);if(r.options.reinitializeBrowser){let h=await zA({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await s?.(),clearInterval(p?.interval),h}let m;try{return l.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:hE.parse(r.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await ZB(r),m}finally{l.info({status:m?.status,labels:n?.labels,steps:o,beforeSteps:i,afterSteps:a},"Momentic test final result"),clearInterval(p?.interval),await s?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function QB({beforeStatus:r,mainStatus:e,afterStatus:t}){return r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var ZB=async r=>{let{tracer:e}=r.testParams,{fromStep:t,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs,{logger:l,controller:c,context:s,storage:u}=r.fixtures,{collectDebugData:d,disableHealing:p}=r.options;s.setCurrentUrl(c.browser.url());let m="test",h=o,g=[],f=p||t!==void 0||n!==void 0||void 0,S={results:g,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},y=!1;t?.fromStepId&&t.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):t?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",y=!0);let T,w,v;if(y&&i&&i.length>0){let D=await HA(i,"beforeSteps",r);T=D.status,w=D.results,v=D.terminalResult?{...D.terminalResult,failureReason:"SetupFailureError"}:void 0}let x,A;if(T===void 0||T==="PASSED"){l.info({fromStep:t,toStep:n},`Starting execution of ${m}`);let D=await e.startMainStepList(),Q=await Br({...r,work:S,listParams:{steps:h,containerName:m,results:g,tracer:D}});x=Q.status,A=Q.terminalResult}let _,M,Y;if(y&&a&&a.length>0){let D=await HA(a,"afterSteps",r);_=D.status,M=D.results,Y=D.terminalResult?{...D.terminalResult,failureReason:"TeardownFailureError"}:void 0}let W=QB({beforeStatus:T,mainStatus:x,afterStatus:_});if(d&&ez({tracer:e,work:S,controller:c,storage:u,context:s,logger:l,status:W}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({results:g,beforeResults:w,afterResults:M}))),W==="FAILED"){let D=T==="FAILED"?v:void 0,Q=_==="FAILED"?Y:void 0;return{status:"FAILED",results:g,beforeResults:w,afterResults:M,failedStepResult:D??A??Q}}else if(W==="CANCELLED")return{status:"CANCELLED",results:g,beforeResults:w,afterResults:M};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:g,beforeResults:w,afterResults:M}};async function HA(r,e,t){let n=t.fixtures.logger,o=e==="beforeSteps"?await t.testParams.tracer.startBeforeStepList():await t.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:l,results:c,terminalResult:s}=await Br({...t,work:i,callbacks:a,listParams:{steps:r,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return l==="SUCCESS"?u="PASSED":l==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:s}}function ez({tracer:r,work:e,controller:t,storage:n,logger:o,context:i,status:a}){let l=t.browser,c=l.retrieveAndClearDebugData(),s=DT(c.logsPerPage),u=cm(c.harPages||{},c.harEntries||{});r.attachConsoleLogs({logger:o,logs:s}),r.attachNetworkLogs({logger:o,logs:u}),a!=="PASSED"&&a!=="SUCCESS"&&(r.attachBrowserCrashDump({crashReportDirFetcher:()=>l.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let d=await l.screenshot({quality:75}),p=await DA({codePath:"test-complete-final",storage:n,screenshotBuff:d,logger:o}),m=await j(l.html(),{milliseconds:2e3});i.setVariable(UA,p),o.debug({finalPageHtml:m},"Final page state HTML"),o.debug({finalScreenshotUrl:p},"Uploaded final screenshot URL")}catch{}})()))}async function id({settings:r,customHeaders:e,envVariables:t,envName:n,testName:o,baseUrl:i,logger:a,localTools:l,orgId:c}){let s=ql.parse(r);e&&(s.extraHeaders={...s.extraHeaders,...e});let u=new Yt({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:t,currentUrl:i});await iu({obj:s,context:u,bannedKeys:[],allowList:VS,localTools:l,logger:a,orgId:c});try{return ql.parse(s)}catch(d){throw new C("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}import{cloneDeep as f1}from"lodash-es";var GA={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
|
|
48
|
+
`,Tg(s,e))}}catch(u){n={error:u}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},r}();var cA=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();Le();Le();var uA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Ur}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){G.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===ar.INT&&!Number.isInteger(e)&&(G.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var dA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!cl(e)){var o=this._buffer.get(e);if(o==null&&(o=new Ur,this._buffer.set(e,o)),typeof t!="number"){G.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===ar.INT&&!Number.isInteger(t)&&(G.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var vg=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},pA=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mA=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))},hA=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(cl));if(n.size===0){G.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(cl)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return vg(this,void 0,void 0,function(){var n,o,i,a;return Rg(this,function(l){switch(l.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,pw(mA(mA([],pA(n),!1),pA(o),!1))];case 1:return i=l.sent(),a=i.filter(mw).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return vg(n,void 0,void 0,function(){var l,c;return Rg(this,function(s){switch(s.label){case 0:return l=new uA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(l)),t!=null&&(c=po(c,t)),[4,c];case 1:return s.sent(),a._metricStorages.forEach(function(u){u.record(l._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return vg(n,void 0,void 0,function(){var l,c;return Rg(this,function(s){switch(s.label){case 0:return l=new dA,c=Promise.resolve(i(l)),t!=null&&(c=po(c,t)),[4,c];case 1:return s.sent(),a.forEach(function(u){var d=l._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&hw(n.instruments,t)})},r}();var fB=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)}}(),gA=function(r){fB(e,r);function e(t,n,o,i,a){var l=r.call(this,t)||this;return l._attributesProcessor=o,l._aggregationCardinalityLimit=a,l._deltaMetricStorage=new Yu(n,l._aggregationCardinalityLimit),l._temporalMetricStorage=new Xu(n,i),l}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Ku);var fA=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)}}(),Ca=function(){function r(){}return r.Noop=function(){return yB},r}();var SB=function(r){fA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ca);var SA=function(r){fA(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Ca);var yB=new SB;var EB=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},TB=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},bB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},yA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new lA,this.observableRegistry=new hA,this.meter=new oA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,gA);return t.length===1?t[0]:new cA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,sA);return t},r.prototype.collect=function(e,t,n){return EB(this,void 0,void 0,function(){var o,i,a;return TB(this,function(l){switch(l.label){case 0:return[4,this.observableRegistry.observe(t,n?.timeoutMillis)];case 1:return o=l.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,t)}).filter(uw),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var s=Sw(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(s);if(u!=null)return u;var d=c.aggregation.createAggregator(s),p=new t(s,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),l=a.map(function(c){var s=bB(c,2),u=s[0],d=s[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),h=u.selectCardinalityLimit(e.type),g=new t(e,m,Ca.Noop(),[u],h);return n.metricStorageRegistry.registerForCollector(u,g),g});i=i.concat(l)}return i},r}();var vB=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.")},EA=function(){function r(e){this.resource=e,this.viewRegistry=new Xw,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=dw(e),n=this.meterSharedStates.get(t);return n==null&&(n=new yA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=vB(this.metricCollectors),a=i.next();!a.done;a=i.next()){var l=a.value;o.push([l,l.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var Ju=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},Qu=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},RB=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(l){a={error:l}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wB=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))},TA=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Ju(this,void 0,void 0,function(){var t,n,o,i,a=this;return Qu(this,function(l){switch(l.label){case 0:return t=mi(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Ju(a,void 0,void 0,function(){var s;return Qu(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return s=u.sent(),s?.scopeMetrics!=null&&n.push(s.scopeMetrics),s?.errors!=null&&o.push.apply(o,wB([],RB(s.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return l.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return Ju(this,void 0,void 0,function(){return Qu(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return Ju(this,void 0,void 0,function(){return Qu(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var bA=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},vA=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:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function l(s){return function(u){return c([s,u])}}function c(s){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return t.label++,{value:s[1],done:!1};case 5:t.label++,o=s[1],s=[0];continue;case 7:s=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){t=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){t.label=s[1];break}if(s[0]===6&&t.label<i[1]){t.label=i[1],i=s;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(s);break}i[2]&&t.ops.pop(),t.trys.pop();continue}s=e.call(r,t)}catch(u){s=[6,u],o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},RA=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 AB(r,e){var t=e??$u.empty();return r?$u.default().merge(t):t}var wg=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new EA(AB((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var l=RA(e.views),c=l.next();!c.done;c=l.next()){var s=c.value;this._sharedState.viewRegistry.addView(s)}}catch(m){t={error:m}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=RA(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(G.warn("A shutdown MeterProvider cannot provide a Meter"),Ih()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new TA(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return bA(this,void 0,void 0,function(){return vA(this,function(t){switch(t.label){case 0:return this._shutdown?(G.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return bA(this,void 0,void 0,function(){return vA(this,function(t){switch(t.label){case 0:return this._shutdown?(G.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var CB=/[\^$\\.+?()[\]{}|]/g,Zu=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(CB,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var xa=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var wA=function(){function r(e){var t;this._nameFilter=new Zu((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new xa(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var AA=function(){function r(e){this._nameFilter=new xa(e?.name),this._versionFilter=new xa(e?.version),this._schemaUrlFilter=new xa(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function xB(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Ag=function(){function r(e){var t;if(xB(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Zu.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new SA(e.attributeKeys):this.attributesProcessor=Ca.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:wr.Default(),this.instrumentSelector=new wA({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new AA({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var VTe=process.env.APP||"unknown";Le();import{v4 as _B}from"uuid";function IB(){return new sw({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:di.DELTA})}var MB=[new Ag({instrumentName:"test_operation_duration_ms",instrumentType:fe.HISTOGRAM,aggregation:new Hu([100,500,1e3,5e3,1e4,2e4])})],ed=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let t=typeof process<"u"?"production":"unknown",n=new qh({[yu]:e.serviceName,[nR]:t,[iR]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:_B()}),o=IB(),i=new Sg({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new wg({resource:n,readers:[i],views:MB}),hu.setGlobalMeterProvider(this.provider),this.meter=hu.getMeter("momentic-serverless")}increment(e,t,n){try{let o=du(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=du(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var qt=new uu;function CA(r){r.disabled||(qt=new ed(r))}var LB=3;async function _A(r){let{logger:e}=r.fixtures,{results:t}=r.failureRecoveryParams,n=t[t.length-1],o=DB(r.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),r.work.state.failureRecoveryAttempts=(r.work.state.failureRecoveryAttempts??0)+1;try{return await NB(r)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function NB(r){let{fixtures:e,work:t,failureRecoveryParams:n}=r,{controller:o,logger:i}=e,{testMetadata:a}=r.inputs,{results:l,failedStep:c,nextSteps:s,tracer:u}=n;if(!l.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:h}=await ea(i,u,l,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=s.map(_=>io(_)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:y,thoughts:E,instructions:w}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:h,currentPageState:m,nextStepsSerialized:g,testDescription:f||void 0,customInstructions:S||void 0});if(y!=="RECOVERABLE")return i.info({scenario:y,thoughts:E,instructions:w},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${E}`};if(!w)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let v={id:OB(),type:"AI_ACTION_DYNAMIC",text:w},x=await ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[v,c],containerName:"AI-recovered step list",tracer:u}})),A=x.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(Oc({results:x.results,onPresetAction:_=>{_.aiSuggested=!0},onSimpleStepContainer:_=>{_.aiSuggested=!0}}),x.status==="SUCCESS"){let _=`The following steps were automatically executed by the failure recovery agent. Analysis: ${E}`;return A.message=_,qt.increment("test_event",1,["name:failure_recovery_success",`orgId:${r.inputs.orgId}`]),i.info({thoughts:E},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:x,message:_}}else{let _=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${E}`;return A.message=_,i.info({thoughts:E,aiActionResult:A},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:x,message:_}}return null}function DB(r,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let t=e.message;return t?t.includes("AbortError:")?"The user aborted the test":zS.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(r.state.failureRecoveryAttempts??0)>LB?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as td}from"crypto";import kB from"fast-json-patch";import{cloneDeep as FB}from"lodash-es";async function IA(r){let e=r.failedResults,t=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:l,tracer:c}=r,{step:s}=n,{controller:u,logger:d}=o,p=s?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},h=p?.attempts??1;for(let g=0;g<h;g++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=FB(s.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await ea(d,c,e.results,{numStepsWithScreenshots:4}),y=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:s.description});f=kB.applyPatch(f,y.patches).newDocument;let E=Yt.fromSnapshot({snapshot:l,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await UB({logger:d,controller:u,tracer:c,context:E,restartConfig:m,startingUrl:a});let w=await ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures,context:E},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(t.push(w.results),w.status==="SUCCESS")return{successfulHealing:{proposedStep:{...s,steps:f},listResult:w,context:E},healingAttempts:t};e=w}return{healingAttempts:t}}async function UB({logger:r,controller:e,tracer:t,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:td(),type:"PRESET_ACTION",command:{id:td(),type:"NAVIGATE",url:n.url}},l=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,l,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:td(),type:"PRESET_ACTION",command:{id:td(),type:"NAVIGATE",url:i}},l=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,l,a.command,o,!1);break}}}function MA(r,e){switch(r||(r="ON_FAILURE"),r){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&gS(e.command.type))}}async function PA(r){let{step:e,tracer:t}=r.sectionParams,{logger:n,controller:o,context:i}=r.fixtures,a=new Date,l=o.browser.url(),c=i.toObjectCopy(),s=await t.startSubSteps(),u=async()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:"section step list",tracer:s}}),d=e.autohealingConfig?await ma(r.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!r.work.state.autoHealingDisabled&&MA(e.autohealingConfig.trigger,d.terminalResult)){let g=await t.startSubSteps(),f=await IA({...r,startingContextSnapshot:c,startingUrl:l,failedResults:d,tracer:g});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,r.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return on({asyncTasks:r.work.asyncTasks,nestedResults:d.results,result:h,logger:n}),h}var zB=60*60*1e3;async function Br(r){let{results:e=[],containerName:t,steps:n,tracer:o}=r.listParams,{logger:i}=r.fixtures,a=o.getParentStepIdChain(),{fromStep:l,toStep:c}=r.inputs,s=r.work,u="SUCCESS",d,p=0;for(p;p<n.length;p++){let m=n[p];if(m.skipped)continue;if(s.fastForwardingToStep&&l){let E=JSON.stringify(a);if(m.id===l.fromStepId&&E===JSON.stringify(l.parentStepIdChain))s.fastForwardingToStep=!1;else if(!IT(m,a,l.fromStepId,l.parentStepIdChain))continue}let h=io(m),g=0,f=1,S=Date.now();"retries"in m&&m.retries&&m.retries>0&&(f+=m.retries);let y;for(;g<f&&Date.now()-S<zB;){g++,i.info({step:m,currentAttempt:g},`Executing step ${p+1}/${n.length} in ${t}: ${h}`);let E=Date.now(),{stepResult:w,status:v,failureRecoveryResults:x,shouldStopExecuting:A}=await HB({attempt:g,params:r,step:m,i:p,steps:n,results:e,currentParentIdChain:a,work:s,fromStep:l,toStep:c,lastRetry:g===f});if(v==="FAILED"&&g<f){y=[...y??[],w],Date.now()-E<1e3&&await ne(1e3-(Date.now()-E));continue}else e.push(w),y&&(w.previousAttempts=y);if(x&&e.push(...x),A)return u=v,d=w,{status:u,results:e,terminalResult:d};break}}return{status:u,results:e,terminalResult:d}}async function HB({attempt:r,params:e,step:t,i:n,steps:o,results:i,currentParentIdChain:a,work:l,fromStep:c,toStep:s,lastRetry:u}){let{tracer:d}=e.listParams,{logger:p,context:m,controller:h,codeEvalTools:g,usageTracker:f}=e.fixtures,{orgId:S}=e.inputs,y=new Date,E=await d.startStep({logger:p,step:t,attempt:r}),w=BB(t),v=m.toRedactedDisplayCopy(),x=h.browser.url(),A=h.executeAbortController.signal;f.trackStepExecution(t);let _,M;switch(t.type){case"PRESET_ACTION":{_="Preset action",M=await si(t,async()=>await cu({...e,presetParams:{tracer:E,step:t}}),A);break}case"AI_ACTION":{_="AI action",M=await si(t,()=>vv({...e,aiStepParams:{step:t,tracer:E},executeStepList:Br}),A);break}case"AI_ACTION_DYNAMIC":{_="AI action",M=await si(t,()=>wv({...e,aiStepParams:{step:t,tracer:E},executeStepList:Br}),A);break}case"RESOLVED_MODULE":{_=`Module (${t.name})`,M=await si(t,async()=>{let B=await yv({orgId:S,step:t,context:m,logger:p,codeEvalTools:g,signal:A});return Th({...e,executeStepList:Br,moduleParams:{step:t,resolvedInputs:B,tracer:E}})},A);break}case"CONDITIONAL":{_="Conditional step",M=await si(t,()=>Tv({...e,conditionalParams:{step:t,tracer:E},executeStepList:Br}),A);break}case"SECTION":{_="Section",M=await si(t,()=>PA({...e,sectionParams:{step:t,tracer:E},executeStepList:Br}),A);break}default:return(H=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}M.beforeUrl=M.beforeUrl??x,M.beforeTestContext=v,t.envKey&&m.setVariable(t.envKey,M.data);let Y=h.browser.url();m.setCurrentUrl(Y),M.afterUrl=M.afterUrl??Y,M.afterTestContext=m.toRedactedDisplayCopy(),await GB({step:t,startedAt:y,stepTypeName:_,result:M,callbacks:e.callbacks,globalWorkRef:e.work,tracer:E,attempt:r});let W,D;if(u&&M.status==="FAILED"&&!l.state.failureRecoveryDisabled&&c?.fromStepId===void 0&&s?.toStepId===void 0){let B=await _A({...e,executeStepList:Br,failureRecoveryParams:{failedStep:w,nextSteps:o.slice(n+1),results:i.concat(M),tracer:d}});B&&(B.type==="ATTEMPTED"?(W=B.result.results,D=B.status):B.type==="NOT_ELIGIBLE"&&(M.message=M.message?`${M.message} ${B.message}`:B.message),M.type==="PRESET_ACTION"&&(M.failureRecoveryStatus={type:B.type,message:B.message}))}return l.fastForwardingToStep&&c&&(c.fromStepId===t.id&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)&&(l.fastForwardingToStep=!1),t.type==="RESOLVED_MODULE"&&Vm(a,c.parentStepIdChain)&&(l.fastForwardingToStep=!1)),M.status!=="SUCCESS"&&D!=="SUCCESS"||h.closed?{shouldStopExecuting:!0,status:M.status,stepResult:M,failureRecoveryResults:W}:s&&t.id===s.toStepId&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)?(h.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:M,failureRecoveryResults:W}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:M,failureRecoveryResults:W}}async function GB({stepTypeName:r,step:e,result:t,tracer:n,attempt:o,startedAt:i}){let a=r.toLowerCase(),l=r.charAt(0).toUpperCase()+r.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(t.status){case"SUCCESS":c=t.message??`${l} executed successfully.`;break;case"FAILED":c=t.message??`${l} failed.`;break;case"CANCELLED":c=t.message??`${l} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${t.status}`)}await n.finish({step:t,message:c,output:Vl.parse(t),attempt:o})}import mve,{multistream as gve}from"pino";import Sve from"pino-pretty";import{PostHog as jB}from"posthog-node";async function OA(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let l=await j(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=l.featureFlags||{},a=l.featureFlagPayloads||{};break}catch(l){t=l,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var rd=class r extends Ss{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new jB("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await OA(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await OA(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as VB}from"node:crypto";import{PostHog as $B}from"posthog-node";var nd=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new $B("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(!gy(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:VB(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import ul from"os";import WB from"v8";var LA,un,qB=ul.platform(),KB=ul.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),{});function NA(r){if(Jr)return;let e=()=>{try{let t=!1,n=YB(),o=XB();n.freeMemory<1e6&&(t=!0),o&&o?.total>70&&(t=!0);let i=WB.getHeapStatistics(),a=i.used_heap_size,l=i.heap_size_limit;if(a/l>.9&&(t=!0),t)for(let c of[r,T])c.warn({memory:n,cpu:o,heapStats:i},"Critical resource usage metrics detected");else r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,2e4),cpuMetadata:KB,platform:qB}}function YB(){let r=ul.totalmem(),e=ul.freemem(),t=r-e;return{totalMemory:r,freeMemory:e,usedMemory:t}}function XB(){let r=ul.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,!un)return un=t,null;let n={user:t.user-un.user,nice:t.nice-un.nice,sys:t.sys-un.sys,idle:t.idle-un.idle,irq:t.irq-un.irq,total:t.total-un.total};return LA={measurementTime:e,intervalMs:e-un.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},un=t,LA}async function DA({codePath:r,screenshotBuff:e,storage:t,logger:n}){if(e)try{let o=await t.uploadScreenshot(e);return n.info({screenshotUrl:o,codePath:r},"Saved screenshot for debugging"),o}catch(o){n.error({err:o,codePath:r},"Failed to save screenshot for debugging")}}async function dn({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var JB=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function kA({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(JB.includes(n.type))return;let l=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),s=0;for(;s===0||Date.now()-c<l;){await ne(250),s++;let u=(await t.getOpenPages()).map(p=>p.url),d=t.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(ri(m,o)&&m!==r&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(p)});break}}}}async function go(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}var FA="MOMENTIC_RUN_ID",UA="FINAL_SCREENSHOT_URL";import{randomUUID as BA}from"crypto";async function zA({browser:r,signal:e}){let t=new Date;try{return await r.navigate({url:r.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:BA(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:t,finishedAt:new Date,results:[],command:{id:BA(),type:"NAVIGATE",url:r.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var od=async r=>{let{orgId:e,runId:t,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs;r.fixtures.logger=r.fixtures.logger.child({orgId:e,runId:t,testId:n?.id});let{logger:l,controller:c}=r.fixtures,{onTestComplete:s,onTestSuccess:u,onTestFailure:d}=r.callbacks.test,p=NA(l);if(r.options.reinitializeBrowser){let h=await zA({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await s?.(),clearInterval(p?.interval),h}let m;try{return l.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:hE.parse(r.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await ZB(r),m}finally{l.info({status:m?.status,labels:n?.labels,steps:o,beforeSteps:i,afterSteps:a},"Momentic test final result"),clearInterval(p?.interval),await s?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function QB({beforeStatus:r,mainStatus:e,afterStatus:t}){return r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var ZB=async r=>{let{tracer:e}=r.testParams,{fromStep:t,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs,{logger:l,controller:c,context:s,storage:u}=r.fixtures,{collectDebugData:d,disableHealing:p}=r.options;s.setCurrentUrl(c.browser.url());let m="test",h=o,g=[],f=p||t!==void 0||n!==void 0||void 0,S={results:g,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},y=!1;t?.fromStepId&&t.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):t?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",y=!0);let E,w,v;if(y&&i&&i.length>0){let D=await HA(i,"beforeSteps",r);E=D.status,w=D.results,v=D.terminalResult?{...D.terminalResult,failureReason:"SetupFailureError"}:void 0}let x,A;if(E===void 0||E==="PASSED"){l.info({fromStep:t,toStep:n},`Starting execution of ${m}`);let D=await e.startMainStepList(),Q=await Br({...r,work:S,listParams:{steps:h,containerName:m,results:g,tracer:D}});x=Q.status,A=Q.terminalResult}let _,M,Y;if(y&&a&&a.length>0){let D=await HA(a,"afterSteps",r);_=D.status,M=D.results,Y=D.terminalResult?{...D.terminalResult,failureReason:"TeardownFailureError"}:void 0}let W=QB({beforeStatus:E,mainStatus:x,afterStatus:_});if(d&&ez({tracer:e,work:S,controller:c,storage:u,context:s,logger:l,status:W}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({results:g,beforeResults:w,afterResults:M}))),W==="FAILED"){let D=E==="FAILED"?v:void 0,Q=_==="FAILED"?Y:void 0;return{status:"FAILED",results:g,beforeResults:w,afterResults:M,failedStepResult:D??A??Q}}else if(W==="CANCELLED")return{status:"CANCELLED",results:g,beforeResults:w,afterResults:M};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:g,beforeResults:w,afterResults:M}};async function HA(r,e,t){let n=t.fixtures.logger,o=e==="beforeSteps"?await t.testParams.tracer.startBeforeStepList():await t.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:l,results:c,terminalResult:s}=await Br({...t,work:i,callbacks:a,listParams:{steps:r,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return l==="SUCCESS"?u="PASSED":l==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:s}}function ez({tracer:r,work:e,controller:t,storage:n,logger:o,context:i,status:a}){let l=t.browser,c=l.retrieveAndClearDebugData(),s=DT(c.logsPerPage),u=cm(c.harPages||{},c.harEntries||{});r.attachConsoleLogs({logger:o,logs:s}),r.attachNetworkLogs({logger:o,logs:u}),a!=="PASSED"&&a!=="SUCCESS"&&(r.attachBrowserCrashDump({crashReportDirFetcher:()=>l.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let d=await l.screenshot({quality:75}),p=await DA({codePath:"test-complete-final",storage:n,screenshotBuff:d,logger:o}),m=await j(l.html(),{milliseconds:2e3});i.setVariable(UA,p),o.debug({finalPageHtml:m},"Final page state HTML"),o.debug({finalScreenshotUrl:p},"Uploaded final screenshot URL")}catch{}})()))}async function id({settings:r,customHeaders:e,envVariables:t,envName:n,testName:o,baseUrl:i,logger:a,localTools:l,orgId:c}){let s=ql.parse(r);e&&(s.extraHeaders={...s.extraHeaders,...e});let u=new Yt({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:t,currentUrl:i});await iu({obj:s,context:u,bannedKeys:[],allowList:VS,localTools:l,logger:a,orgId:c});try{return ql.parse(s)}catch(d){throw new C("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}import{cloneDeep as f1}from"lodash-es";var GA={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
|
|
49
49
|
var momenticConstants = {
|
|
50
50
|
bannedClassSubstrings: [
|
|
51
51
|
"relative",
|
|
@@ -3972,31 +3972,31 @@ registerAllMomenticListeners();
|
|
|
3972
3972
|
`};var Ar={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-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:["aria-label","data-testid","id","name","href","aria-describedby","aria-labelledby","aria-description","data-row","data-col","data-row-index","data-col-index","for","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","data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],ineligibleElementAttribute:"momentic-ineligible"};var jA="BoundingBoxMovedError",VA="ZeroOpacityError",ad="visual_actions",_n="data-momentic-id";function $A(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(`
|
|
3973
3973
|
`,o);a>0&&a<n&&(o=a);let l=i,c=0;for(;c<1e3&&l>n&&r[l]!==`
|
|
3974
3974
|
`;)c++,l--;return l>n&&r[l]===`
|
|
3975
|
-
`&&(i=l),r.slice(o,i)}function zr(r){let e=typeof r=="string"?r:r.toString();return`[${_n}="${e}"]`}import{execSync as kH}from"child_process";import{randomUUID as uf}from"crypto";import{diff as df}from"deep-object-diff";import{existsSync as fd,readFileSync as FH,readdirSync as UH,statSync as ex,writeFileSync as BH}from"fs";import{Jimp as tx}from"jimp";import zH from"js-beautify";import{cloneDeep as Oa}from"lodash-es";import HH from"mime";import{platform as GH}from"os";import{basename as jH,extname as VH,join as $H}from"path";import{v4 as WH}from"uuid";import{rmSync as wC}from"fs";import{basename as Vz,join as $z}from"path";import{errors as Wz}from"playwright-core";import{devices as rz}from"playwright-core";var WA=2,Cg=8e3;var _a=250,ft=500;var qA=5e3,KA=250,te=3e3,be=2e3,oe=1e3,xg=3e4,_g=8e3,YA=10,Ig=.05;var XA=6e4,JA=new Set(["about:blank","chrome-error://chromewebdata/"]);var Mg=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Pg=1e4,dl=500,sd=rz["Desktop Chrome"].userAgent,Ia=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as nz,rmSync as QA,statSync as oz}from"fs";import*as Dg from"node:fs";import iz from"nodejs-file-downloader";import{tmpdir as az}from"os";import go,{basename as sz,dirname as lz}from"path";var kg="file://",Ng=go.join(az(),"momentic","downloads"),Lg=1e4,cz=50*1024*1024;async function ZA(r){let{uri:e}=r;if(e.startsWith(kg))return dz(r);if(e.startsWith("http"))return mz(r);if(uE)return pz(r);throw new C("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function uz(r,e){let t=go.join(Ng,r,e.slice(kg.length)),n=go.join(Ng,r),o=t.startsWith(n);if(!Dg.existsSync(t)||!o)throw new C("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function dz({uri:r,orgId:e}){let t=uz(e,r);return{filePath:t,cleanup:()=>{QA(lz(t),{recursive:!0,force:!0})}}}async function pz({uri:r}){let e=go.resolve(r);if(!Dg.existsSync(e))throw new C("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 mz({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=sz(n.href),i=Ug(o),a=go.extname(i);if(Yy.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let l=Fg(t),c,s;for(let h=1;h<=3;h++){let g=new iz({url:r,fileName:i,directory:l,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:Lg});try{let{downloadStatus:f,filePath:S}=await j(g.download(),{milliseconds:Lg,message:`Download timed out after ${Lg}ms`});if(f!=="COMPLETE"||!S)throw new Error(`Download ended in non-success status: ${f}`);c=S;break}catch(f){s=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${s instanceof Error?s.message:s}`);let u=c,p=oz(u).size;if(p>cz)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(()=>QA(l,{recursive:!0,force:!0}),10*60*1e3)}}}function eC(r,e){return`${kg}${r}/${e}`}function Fg(r){let e=Math.random().toString(36).substring(4),t=go.join(Ng,r,e);return nz(t,{recursive:!0}),t}function Ug(r){let e=go.extname(r),t=go.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function In(r,e){try{return await r.evaluate(n=>window.serializeElementOnlyWithText?.(n,{truncateToLength:500}),void 0,{timeout:oe})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}async function tC(r,e){let t=r.evaluate(async()=>{let i=window,a={};try{let l=await indexedDB.databases();for(let c of l){if(!c.name)continue;let s=await i.exportIdbToObject?.(c.name,c.version);s&&(a[c.name]=s)}return[a,void 0]}catch(l){return[void 0,l.message]}}),[n,o]=await j(t,{milliseconds:te});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function rC(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,l]of Object.entries(o))await i.importObjectToIdb?.(a,l)},e);await j(n,{milliseconds:te})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function nC(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 j(t,{milliseconds:te})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function oC(r,e,t,n,o){try{await hz(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function hz(r,e,t,n){let o=n.text();o.length>dl&&(o=o.slice(0,dl)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let l=await a.jsonValue(),c=JSON.stringify(l);c.length>dl?i.push(c.slice(0,dl)+"...(TRUNCATED)"):(typeof l!="object"||Object.keys(l).length>0)&&i.push(l)}catch{}Bg(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function Bg(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>Pg&&(i[t]=i[t].slice(Math.floor(Pg/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 Cr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await Ps({promiseGenerator:r,signal:n,codePath:e,logger:o}),l=Date.now();return t[e]=l-i,a}import gz from"truncate-json";var fz="[redacted due to size]",iC=5e3,Sz=5e3;async function sC(r,e,t){let n=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[r]={id:r,startedDateTime:n,title:void 0,pageTimings:{}}}async function zg(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([l,c])=>({name:l,value:c})),i={...await cC(e),url:n.toString(),method:e.method(),queryString:o,postData:await Ez(e)};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:uC(t).timings}}async function lC(r,e,t){await t.finished();let n={};try{n=await Rz(t)}catch{}let o={...await cC(t),status:t.status(),statusText:t.statusText(),content:n,redirectURL:t.headers().location,_mocked:!1};r.response=o;let i;try{i=await e.sizes(),r.request.bodySize=i.requestBodySize,r.request.headersSize=i.requestHeadersSize}catch{}r.response&&i&&(r.response.bodySize=i.responseBodySize,r.response.headersSize=i.responseHeadersSize,r.response.content.size=i.responseBodySize);let a=e.timing();r.startedDateTime=new Date(a.startTime).toISOString();let{timings:l,total:c}=uC(a);r.time=c,r.timings=l}function pl(r,e,t){r.harEntries||(r.harEntries={}),r.harEntries[t]=e}function aC(r){try{return new Date(r).toISOString()}catch{return}}function yz(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=pn(i),e.value=pn(a);continue}i==="Domain"&&(e.domain=pn(a)),i==="Expires"&&(e.expires=aC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=aC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=pn(a)),i==="Secure"&&(e.secure=!0)}return e}async function cC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(yz)??[];return{headers:Object.entries(e).map(([n,o])=>({name:pn(n),value:pn(o)})),cookies:t}}async function Ez(r){let e=r.postData();if(!e)return;let t=await r.headerValue("content-type"),n={mimeType:t??"application/octet-stream",text:pn(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,a]of o.entries())n.params.push({name:pn(i),value:a?pn(a):void 0})}return n}var Tz=["text"],bz=["json","xml","html","javascript"];function vz(r){let[e,t]=r.split("/");return e?Tz.includes(e)?!0:t?!!bz.some(n=>t?.includes(n)):!1:!1}async function Rz(r){let t=((await r.headerValue("content-type"))?.toLowerCase()??void 0)?.split(";")[0]??void 0,n={mimeType:t,encoding:await r.headerValue("content-encoding")??void 0};return t&&vz(t)&&(n.text=pn(await r.text())),n}function pn(r){try{let e=JSON.parse(r),{jsonString:t}=gz(r,Sz);return t}catch{return r.length>iC?r.slice(0,iC)+fz:r}}function gi(r){return r<0?0:r}function uC(r){return{timings:{blocked:gi(r.domainLookupStart),dns:gi(r.domainLookupEnd-r.domainLookupStart),connect:gi(r.connectEnd-r.connectStart),send:gi(r.responseStart-r.requestStart),wait:0,receive:gi(r.responseEnd-r.responseStart),ssl:gi(r.connectEnd-r.secureConnectionStart)},total:gi(r.responseEnd)}}function dC(){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 pt({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await j(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}function Hg(){return window.lastCursorPos}import{errors as wz}from"playwright-core";async function fi({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),l;for(;Date.now()-a<o;)try{return await r(i)}catch(c){if(c instanceof wz.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),l=await Az(c,i.locator,n,t);else throw c}throw l instanceof C?l:new C("ActionFailureError",`Failed to interact with targeted element. Error: ${l.message}`,{errOptions:{cause:l}})}async function Az(r,e,t,n){return r.message.includes("attempt #")?Cz(r,e,t,n):xz(r)}async function Cz(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(`
|
|
3975
|
+
`&&(i=l),r.slice(o,i)}function zr(r){let e=typeof r=="string"?r:r.toString();return`[${_n}="${e}"]`}import{execSync as kH}from"child_process";import{randomUUID as uf}from"crypto";import{diff as df}from"deep-object-diff";import{existsSync as fd,readFileSync as FH,readdirSync as UH,statSync as ex,writeFileSync as BH}from"fs";import{Jimp as tx}from"jimp";import zH from"js-beautify";import{cloneDeep as Oa}from"lodash-es";import HH from"mime";import{platform as GH}from"os";import{basename as jH,extname as VH,join as $H}from"path";import{v4 as WH}from"uuid";import{rmSync as wC}from"fs";import{basename as Vz,join as $z}from"path";import{errors as Wz}from"playwright-core";import{devices as rz}from"playwright-core";var WA=2,Cg=8e3;var _a=250,ft=500;var qA=5e3,KA=250,te=3e3,be=2e3,oe=1e3,xg=3e4,_g=8e3,YA=10,Ig=.05;var XA=6e4,JA=new Set(["about:blank","chrome-error://chromewebdata/"]);var Mg=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Pg=1e4,dl=500,sd=rz["Desktop Chrome"].userAgent,Ia=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as nz,rmSync as QA,statSync as oz}from"fs";import*as Dg from"node:fs";import iz from"nodejs-file-downloader";import{tmpdir as az}from"os";import fo,{basename as sz,dirname as lz}from"path";var kg="file://",Ng=fo.join(az(),"momentic","downloads"),Lg=1e4,cz=50*1024*1024;async function ZA(r){let{uri:e}=r;if(e.startsWith(kg))return dz(r);if(e.startsWith("http"))return mz(r);if(uE)return pz(r);throw new C("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function uz(r,e){let t=fo.join(Ng,r,e.slice(kg.length)),n=fo.join(Ng,r),o=t.startsWith(n);if(!Dg.existsSync(t)||!o)throw new C("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function dz({uri:r,orgId:e}){let t=uz(e,r);return{filePath:t,cleanup:()=>{QA(lz(t),{recursive:!0,force:!0})}}}async function pz({uri:r}){let e=fo.resolve(r);if(!Dg.existsSync(e))throw new C("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 mz({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=sz(n.href),i=Ug(o),a=fo.extname(i);if(Yy.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let l=Fg(t),c,s;for(let h=1;h<=3;h++){let g=new iz({url:r,fileName:i,directory:l,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:Lg});try{let{downloadStatus:f,filePath:S}=await j(g.download(),{milliseconds:Lg,message:`Download timed out after ${Lg}ms`});if(f!=="COMPLETE"||!S)throw new Error(`Download ended in non-success status: ${f}`);c=S;break}catch(f){s=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${s instanceof Error?s.message:s}`);let u=c,p=oz(u).size;if(p>cz)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(()=>QA(l,{recursive:!0,force:!0}),10*60*1e3)}}}function eC(r,e){return`${kg}${r}/${e}`}function Fg(r){let e=Math.random().toString(36).substring(4),t=fo.join(Ng,r,e);return nz(t,{recursive:!0}),t}function Ug(r){let e=fo.extname(r),t=fo.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function In(r,e){try{return await r.evaluate(n=>window.serializeElementOnlyWithText?.(n,{truncateToLength:500}),void 0,{timeout:oe})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}async function tC(r,e){let t=r.evaluate(async()=>{let i=window,a={};try{let l=await indexedDB.databases();for(let c of l){if(!c.name)continue;let s=await i.exportIdbToObject?.(c.name,c.version);s&&(a[c.name]=s)}return[a,void 0]}catch(l){return[void 0,l.message]}}),[n,o]=await j(t,{milliseconds:te});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function rC(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,l]of Object.entries(o))await i.importObjectToIdb?.(a,l)},e);await j(n,{milliseconds:te})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function nC(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 j(t,{milliseconds:te})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function oC(r,e,t,n,o){try{await hz(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function hz(r,e,t,n){let o=n.text();o.length>dl&&(o=o.slice(0,dl)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let l=await a.jsonValue(),c=JSON.stringify(l);c.length>dl?i.push(c.slice(0,dl)+"...(TRUNCATED)"):(typeof l!="object"||Object.keys(l).length>0)&&i.push(l)}catch{}Bg(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function Bg(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>Pg&&(i[t]=i[t].slice(Math.floor(Pg/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 Cr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await Ps({promiseGenerator:r,signal:n,codePath:e,logger:o}),l=Date.now();return t[e]=l-i,a}import gz from"truncate-json";var fz="[redacted due to size]",iC=5e3,Sz=5e3;async function sC(r,e,t){let n=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[r]={id:r,startedDateTime:n,title:void 0,pageTimings:{}}}async function zg(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([l,c])=>({name:l,value:c})),i={...await cC(e),url:n.toString(),method:e.method(),queryString:o,postData:await Ez(e)};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:uC(t).timings}}async function lC(r,e,t){await t.finished();let n={};try{n=await Rz(t)}catch{}let o={...await cC(t),status:t.status(),statusText:t.statusText(),content:n,redirectURL:t.headers().location,_mocked:!1};r.response=o;let i;try{i=await e.sizes(),r.request.bodySize=i.requestBodySize,r.request.headersSize=i.requestHeadersSize}catch{}r.response&&i&&(r.response.bodySize=i.responseBodySize,r.response.headersSize=i.responseHeadersSize,r.response.content.size=i.responseBodySize);let a=e.timing();r.startedDateTime=new Date(a.startTime).toISOString();let{timings:l,total:c}=uC(a);r.time=c,r.timings=l}function pl(r,e,t){r.harEntries||(r.harEntries={}),r.harEntries[t]=e}function aC(r){try{return new Date(r).toISOString()}catch{return}}function yz(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=pn(i),e.value=pn(a);continue}i==="Domain"&&(e.domain=pn(a)),i==="Expires"&&(e.expires=aC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=aC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=pn(a)),i==="Secure"&&(e.secure=!0)}return e}async function cC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(yz)??[];return{headers:Object.entries(e).map(([n,o])=>({name:pn(n),value:pn(o)})),cookies:t}}async function Ez(r){let e=r.postData();if(!e)return;let t=await r.headerValue("content-type"),n={mimeType:t??"application/octet-stream",text:pn(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,a]of o.entries())n.params.push({name:pn(i),value:a?pn(a):void 0})}return n}var Tz=["text"],bz=["json","xml","html","javascript"];function vz(r){let[e,t]=r.split("/");return e?Tz.includes(e)?!0:t?!!bz.some(n=>t?.includes(n)):!1:!1}async function Rz(r){let t=((await r.headerValue("content-type"))?.toLowerCase()??void 0)?.split(";")[0]??void 0,n={mimeType:t,encoding:await r.headerValue("content-encoding")??void 0};return t&&vz(t)&&(n.text=pn(await r.text())),n}function pn(r){try{let e=JSON.parse(r),{jsonString:t}=gz(r,Sz);return t}catch{return r.length>iC?r.slice(0,iC)+fz:r}}function fi(r){return r<0?0:r}function uC(r){return{timings:{blocked:fi(r.domainLookupStart),dns:fi(r.domainLookupEnd-r.domainLookupStart),connect:fi(r.connectEnd-r.connectStart),send:fi(r.responseStart-r.requestStart),wait:0,receive:fi(r.responseEnd-r.responseStart),ssl:fi(r.connectEnd-r.secureConnectionStart)},total:fi(r.responseEnd)}}function dC(){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 pt({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await j(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}function Hg(){return window.lastCursorPos}import{errors as wz}from"playwright-core";async function Si({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),l;for(;Date.now()-a<o;)try{return await r(i)}catch(c){if(c instanceof wz.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),l=await Az(c,i.locator,n,t);else throw c}throw l instanceof C?l:new C("ActionFailureError",`Failed to interact with targeted element. Error: ${l.message}`,{errOptions:{cause:l}})}async function Az(r,e,t,n){return r.message.includes("attempt #")?Cz(r,e,t,n):xz(r)}async function Cz(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(`
|
|
3976
3976
|
`,";").replace(/\s+/g," ");let a="",l=await In(e,n);if(l&&(a=`Target element HTML: ${Ze(l,100,!0)}`),i.includes("element is not enabled"))return new C("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="",s=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(s){let u=(await t.state.getRoot()).locator(zr(s)),d=await In(u,n);d&&(c=`Covering element HTML: ${Ze(d,100,!0)}`)}return new C("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}
|
|
3977
|
-
${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 s=await e.boundingBox({timeout:te});s?s.height===0?c="The element you attempted to interact with has zero height.":s.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 C("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 C("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 xz(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 C("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{existsSync as hl,mkdirSync as qg,readdirSync as Nz,rmSync as gC}from"fs";import{homedir as Yg}from"os";import{join as Mn,resolve as Dz}from"path";import{chromium as fC}from"playwright-core";import{addExtra as kz}from"playwright-extra";import Fz from"puppeteer-extra-plugin-recaptcha";function pC(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:l}of r)(!l||l.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 Iz}from"crypto";function mC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function hC(r){let{route:e,mock:t,entry:n,debugData:o,requestId:i,requestRecorders:a,logger:l}=r,c={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(m=>[m.name,m.value]),body:n.request.postData?.text}},s;if(t.fetchOriginalResponse){let m=await e.fetch();s={body:await m.text(),options:{status:m.status(),statusText:m.statusText(),headers:Object.entries(await m.headers())}}}let u=await _z(t,c,s),d={};u.headers.forEach((m,h)=>{d[h]=m});let p={body:await u.text(),contentType:u.headers.get("content-type")||"text/plain",headers:d,status:u.status};await e.fulfill(p);try{n.response={status:p.status,statusText:u.statusText,headers:Object.entries(p.headers).map(([m,h])=>({name:m,value:h})),cookies:[],content:{mimeType:p.contentType,text:p.body},_mocked:!0},pl(o,n,i);for(let m of Object.values(a))m.onRequestComplete(i,n)}catch(m){m.message.includes("has been closed")||l.warn({err:m},"Failed to add response to HAR")}}async function _z(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 Gg(r){try{await Mz(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function Mz(r){let{pageId:e,route:t,request:n,debugData:o,logger:i,requestRecorders:a,mocks:l}=r,c=Iz(),s=await zg(e,n);try{pl(o,s,c);for(let d of Object.values(a))d.onRequestStart(c,s)}catch(d){i.warn({err:d},"Failed to add request to HAR")}let u=mC(n,l);u?await hC({logger:i,route:t,mock:u,entry:s,debugData:o,requestId:c,requestRecorders:a}):await Pz({route:t,request:n,debugData:o,logger:i,requestRecorders:a,entry:s,requestId:c})}async function Pz({route:r,request:e,debugData:t,logger:n,requestRecorders:o,entry:i,requestId:a}){await r.continue();try{let l=await e.response();if(!l||!i)return;await lC(i,e,l),pl(t,i,a);for(let c of Object.values(o))c.onRequestComplete(a,i)}catch(l){l.message.includes("has been closed")||n.warn({err:l},"Failed to add response to HAR")}}async function Oz(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 Lz(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 ld(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 jg(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Lz(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await Oz(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var fo=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:Kc(t,this.requestMatcher.urlMatcher)}};function ml(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 Vg,platform as $g}from"os";import{join as Wg}from"path";function cd(){let r=[];if($g()==="linux"){let e=Vg();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Wg(e,".config",t,"Crash Reports"))})}else if($g()==="darwin"){let e=Vg();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Wg(e,"Library","Application Support",t,"Crashpad"))})}else if($g()==="win32"){let e=Vg();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Wg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}var Kg=Mn(Yg(),"momentic","chromium"),Uz=Mn(Yg(),"video"),SC=kz(fC);SC.use(Fz({provider:{id:"2captcha",token:Ia},visualFeedback:!0}));var Bz=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],zz=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],Hz=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output"];async function yC({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,recordVideo:a,iconKnowledgeBase:l,callbacks:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let s;switch(o.browserType){case"Google Chrome":s="chrome";break;case"Chrome for Testing":s=void 0;break;case"Chromium":s="chromium";break;default:s="chromium";break}let u=[...zz],d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:s},p={...i??{},geolocation:i?.geolocation||Kn,locale:i?.locale||Wn,timezoneId:i?.timezoneId||qn,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??sd,viewport:i?.viewport??Lt};process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let m=null,h,g,f={systemDevicePixelRatio:i?.deviceScaleFactor,recordVideo:a,isNewHeadless:!1};(s==="chrome"||s==="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 y=cd();y.forEach(T=>{if(!hl(T))return;["new","pending","completed"].forEach(v=>{let x=Mn(T,v);if(!hl(x))return;let A=Nz(x);for(let _=0;_<A.length;_++){let M=Mn(x,A[_]);gC(M,{force:!0})}})}),y.forEach(T=>{hl(T)||qg(T,{recursive:!0});let w=Mn(T,`write-test-${Date.now()}`);qg(w,{recursive:!0}),gC(w,{recursive:!0,force:!0})}),u.push(...Bz)}catch(y){e.warn({err:y},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...Hz);let S=o.localChromeExtensionPaths?.map(y=>y.startsWith("~")?Mn(Yg(),y.slice(1)):y);if(S?.length){if(s===void 0)throw new C("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of S){let x=Mn(v,"manifest.json");if(!hl(x))throw new C("UserConfigurationError",`Chrome extension path ${x} does not exist.`)}if(Jr)throw new C("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let y=Mn(Kg,`momentic-session-${Date.now()}`);if(!hl(y))try{qg(y,{recursive:!0})}catch(v){throw new C("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Kg} folder: ${v}`)}let T=[...u],w=S.map(v=>Dz(v)).join(",");T.push(`--disable-extensions-except=${w}`),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 fC.launchPersistentContext(Mn(Kg,`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 SC.launch({...d,args:u});let y={...p,baseURL:r,recordVideo:a?{dir:Uz}:void 0};h=await m.newContext(y),e.info({contextArgs:y,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),g=await h.newPage()}return Jr&&await h.route("**",ml),{browser:m,context:h,page:g,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||Lt,properties:f,clientCallbacks:c,iconKnowledgeBase:l}}async function EC(r){try{return await Gz(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function Gz({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:oe}),o=await In(r,e),i=await r.boundingBox({timeout:oe});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:oe}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let s=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=s._MOMENTIC_FEATURE_FLAGS?.[ad],g=c.getAttribute(_n),f=!h&&g?zr(g):s.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:oe});if(a.type==="error")throw new Error(a.error);let l=r.page().locator(a.selector);return await l.waitFor({state:"visible",timeout:oe}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:l,relativePoint:a.relativePoint}}var bC=["date","datetime-local","month","time","week"],TC={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 vC(r){try{await j(jz(r),{milliseconds:te})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function jz({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await pt({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:oe,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!TC[i])return;TC[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 er}from"zod";var RC=er.object({doubleClick:er.boolean().optional(),rightClick:er.boolean().optional(),force:er.boolean().optional(),waitForDownload:er.boolean().optional(),delayMs:er.number().optional(),downloadTimeoutMs:er.number().optional(),relativePosition:er.object({x:er.number(),y:er.number()}).optional()}),jAe=er.object({repeat:er.number().optional(),convertMeta:er.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:er.number().optional()});async function ud({locator:r,callbacks:e,logger:t,timeoutMs:n=oe}){try{await Xg(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 l=0;for(;!a.momenticIsEligible(i)&&l<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,l++}let c=i.style.getPropertyValue("outline"),s=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,s),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 j(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 Xg(r,e=oe){let t=await r.state.getRoot();await pt({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 Jg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return fi({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>AC({...r,targetingResult:t,useVisualClick:e})})}async function qz(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await Kz(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 Kz(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:oe});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:oe}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),AC({...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 Yz(r){let{browserCallbacks:e,logger:t,targetingResult:n,position:o,options:i}=r,a=RC.safeParse(i),l=await e.state.getRoot(),c=l&&l!==n.locator.page()&&"frameElement"in l?await l.frameElement():null,s;try{s=c?await ei({promiseGenerator:async()=>c.boundingBox(),timeoutMs:te,logger:t}):null}catch(h){throw new C("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${h.message}`)}finally{await c?.dispose()}let u=Date.now(),{clickX:d,clickY:p,reason:m}=await Qz({frameCoordinates:s,logger:t,targetingResult:n,position:o,options:i});return t.info({frameCoordinates:s,position:o,options:a.success?a.data:void 0,clickLocation:{clickX:d,clickY:p,reason:m},duration:Date.now()-u},"Visual click"),{x:d,y:p}}async function Xz(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 s=await EC({locator:i,logger:o});s&&(i=s.locator,a=s.relativePoint??a)}let l=n?.force||t.hints?.force||!1,c=i.toString();try{o.info({locator:c},"Locator click"),n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:te,position:a,delay:n?.delayMs??25,force:l}):await i.click({button:n?.rightClick?"right":"left",timeout:te,position:a,delay:n?.delayMs??25,force:l})}catch(s){let u=s;if(eH(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..."),qz(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function AC(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,l;e?.waitForDownload&&(l=(async()=>{let u=e.downloadTimeoutMs??xg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof Wz.TimeoutError?new C("ActionFailureError",`Download did not complete in ${u}ms`):new C("ActionFailureError",`Download failed: ${d.message}`)}})());try{await ud({locator:a.locator,callbacks:n,logger:t,timeoutMs:oe})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,s;if(i?c=await Yz(r):s=(await Xz(r)).locatorSource,e?.waitForDownload)if(l){if(!o?.createIsolatedFolder)throw new C("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 j(l,{milliseconds:e.downloadTimeoutMs??xg});if(u instanceof Error)throw u;return{downloadedFile:await Zz(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:s}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:s}}async function Jz(r,e){if(e.hints?.clickableXY){let i=(r?.x??0)+e.hints.clickableXY.x,a=(r?.y??0)+e.hints.clickableXY.y;return[{x:i,y:a},"targeting hint"]}let t=await e.locator.boundingBox({timeout:te});if(!t)throw new C("ActionFailureError","Element does not have a bounding box");let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function Qz({frameCoordinates:r,logger:e,options:t,targetingResult:n,position:o}){let i,a,l;if(t?.relativePosition){let d=await n.locator.boundingBox({timeout:te}),p=t.relativePosition.x,m=t.relativePosition.y;d?.width&&(p=Math.max(0,Math.min(t.relativePosition.x,d.width))),d?.height&&(m=Math.max(0,Math.min(t.relativePosition.y,d.height))),i=(d?.x??0)+p,a=(d?.y??0)+m,l="relative position from user"}else if(o){let d=await n.locator.boundingBox({timeout:te});i=(d?.x??0)+o.x,a=(d?.y??0)+o.y,l="predefined position"}else{let[d,p]=await Jz(r,n);i=d.x,a=d.y,l=p}let c=n.locator.page(),s=t?.rightClick?"right":"left",u=t?.delayMs??25;return t?.doubleClick?await c.mouse.dblclick(i,a,{button:s,delay:u}):await c.mouse.click(i,a,{button:s,delay:u}),{clickX:i,clickY:a,reason:l}}async function Zz(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=Ug(r.suggestedFilename()),i=e();await r.saveAs($z(i,o)),wC(n,{force:!0}),setTimeout(()=>{wC(i,{recursive:!0,force:!0})},5*60*1e3);let a=eC(Vz(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function eH(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as tH}from"os";var rH={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 nH(){let r=tH();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function CC(r){return JSON.stringify(r.split("+").sort())}function dd(r){let e=nH(),t=CC(r);for(let n of Object.values(rH))if(Object.values(n).some(o=>CC(o)===t))return n[e];return process.platform==="darwin"?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Qg({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:l,logger:c}){if(!t&&!o)return;let s=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await pt({root:r,fn:([d,p,m,h])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*h),arg:[t,o,s,u],waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"scrolling page"});else{let d=e.viewportSize()||Lt,p=await pt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"computing page height"}),[m,h,g]=await pt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*s,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<be;){a?.throwIfAborted();let S=await j(e.evaluate(()=>document.body.scrollHeight),{milliseconds:oe}),[y,T,w]=await j(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let x=v.getBoundingClientRect();return[v.scrollTop,x.x,x.y]}),{milliseconds:oe});if(S===p&&y===m&&T===h&&w===g)break;p=S,m=y,h=T,g=w,await ne(ft)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Zg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await ne(ft)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}import{randomUUID as dH}from"crypto";import{cloneDeep as rf}from"lodash-es";function So(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as oH}from"crypto";var iH="v1";function ef(r,e){if(r.tagName.toLowerCase()==="svg"&&!sH(r))try{let t=xC(r,e),n=aH(JSON.stringify(t));return{version:iH,json:t,hash:n}}catch{return}}function aH(r){return oH("md5").update(r).digest("hex")}function xC(r,e){let t=r.tagName.toLowerCase(),n=lH(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 l=xC(a,e);l&&o.children.push(l)}}return o}function sH(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function lH(r){let e={},t=r.attributes;for(let n of Object.keys(t))Ar.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var Si={r:147,g:196,b:125,a:.55},IC={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Si,paddingColor:Si,borderColor:Si,marginColor:Si,eventTargetColor:Si,shapeColor:Si,shapeMarginColor:Si,showInfo:!0,showAccessibilityInfo:!0};function MC({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},l={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:l};return i.forEach((s,u)=>{let d=cH({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:l,logger:n});c.roots.push(d)}),c}function cH({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:l}){let c=r[o],s=c.layout,u={};s.nodeIndex.forEach((A,_)=>{u[A]=_});let d=s.styles,p=s.bounds??[],m=c.nodes,h=m.contentDocumentIndex??{index:[],value:[]},g=m.backendNodeId??[],f=m.attributes??[],S=m.parentIndex??[],y=m.nodeName??[],T=m.nodeType??[],w=m.pseudoType??{index:[],value:[]},v=m.inputChecked??{index:[]},x=e[c.frameId];for(let A=0;A<g.length;A++){let _=g[A],M=T[A],Y=f[A]??[],W=S[A]!==void 0&&S[A]>=0?S[A]:void 0,D=W!==void 0?g[W]:void 0,Q=D!==void 0?a[D]:void 0,B=w.index.indexOf(A),H=B!==-1?e[w.value[B]]:void 0,de=u[A],V;de?V=p[de]??[]:V=[];let Ke=y[A]!==void 0?e[y[A]]?.toLowerCase():void 0;if(!Ke){l.warn({backendNodeId:_,frameId:x,frameIndex:o,nodeBounds:V},"DOM node has no tag name");continue}let _e={backendNodeId:_,psuedoType:H,nodeType:M,frameIndex:o,parentFrameId:x,ownedFrameId:void 0,bounds:{x:V[0]??null,y:V[1]??null,width:V[2]??null,height:V[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:D??null,tagName:Ke,parent:Q??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};Q&&Q.childrenBackendIds.push(_);let nt=h.index.indexOf(A);if(nt!==-1){let X=h.value[nt];i[X]=_e;let Te=r[X]?.frameId;_e.ownedFrameId=Te!==void 0?e[Te]:void 0}for(let X of Object.keys(_e.bounds)){let Te=X;_e.bounds[Te]!==null&&(_e.bounds[Te]/=n)}let _t=de!==void 0?d[de]??[]:[];for(let X=0;X<_t.length&&!(X>=t.length);X++){let Te=_t[X];if(Te===void 0||isNaN(Te))continue;let ur=e[Te];if(ur===void 0)continue;let kn=t[X];_e.computedStyles[kn]=ur}for(let X=0;X<Y.length;X+=2){let Te=Y[X],ur=Y[X+1];if(!Te||!ur)continue;let kn=e[Te],Fn=e[ur];!kn||!Fn||(_e.attributes[kn]=Fn)}v.index.includes(A)&&(_e.attributes.checked="true"),a[_e.backendNodeId]=_e}return a[g[0]]}function tf(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=`${tf(t,e)}${a}`}return r.mPathSelector=n,n}function _C(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var uH=["html","#document","#document-fragment"];function PC({node:r,domGraph:e}){let t=[],n=r,o=_C(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=_C(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++,uH.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,s=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(${s})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&s++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function OC(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 LC(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:be});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:be}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:be})).attributes,i=So(o,_n);if(!i)throw new Error(`Could not find attribute ${_n} for object ${e}`);return i}var pH=["focusable","keyshortcuts","controls","live","relevant","orientation"],mH=["selected","readonly","modal","required","invalid"],hH=["id","name","role","content"],NC=["absolute","fixed","sticky"],gH=["i"],fH=["path"],SH=["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"],FC=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],UC=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],yH=["menulistpopup","statictext","inlinetextbox"],EH=80,DC=100,BC=50,af=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],TH=["cite"],bH={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"]},vH={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},kC={indentLevel:0},nf=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<BC?t:""),this.role=this.role||(e.domNode.attributes.role??""),CH(this.properties,e.domNode,e.importantProperties)}_H(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&&fH.includes(this.domNode.tagName)||this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(n=>UC.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>VC(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>$C(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),l=i[1]?.trim();if(a===void 0||l===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===l||l==="*")}))return!0}if(this.domNode&&gH.includes(this.domNode.tagName)||SH.includes(this.role.toLowerCase())||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Ar.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>jC(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")?!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"))}isNotActionable(){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=kC){let t=Object.assign({},kC,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:l,condensedMode:c}=t,s=rf(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=af.includes(this.role)||TH.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
|
|
3978
|
-
`;let S=`${u}<${p}`;!a&&!f&&(S+=` id="${this.id}"`);let y=l??!1;if((s.multiline||s.contenteditable)&&this.children.length>0&&(y=!0),d&&d!=="generic"&&d!==p&&!(bH[d]??[]).includes(p)&&(S+=` role=${JSON.stringify(d)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!y&&(S+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isNotActionable()&&(S+=` ${Ar.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,x=Math.round(v.x??0),A=Math.round(v.y??0),_=Math.round((v.x??0)+(v.width??0)),M=Math.round((v.y??0)+(v.height??0));S+=` bounds=[${x} ${A} ${_} ${M}]`}let
|
|
3977
|
+
${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 s=await e.boundingBox({timeout:te});s?s.height===0?c="The element you attempted to interact with has zero height.":s.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 C("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 C("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 xz(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 C("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{existsSync as hl,mkdirSync as qg,readdirSync as Nz,rmSync as gC}from"fs";import{homedir as Yg}from"os";import{join as Mn,resolve as Dz}from"path";import{chromium as fC}from"playwright-core";import{addExtra as kz}from"playwright-extra";import Fz from"puppeteer-extra-plugin-recaptcha";function pC(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:l}of r)(!l||l.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 Iz}from"crypto";function mC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function hC(r){let{route:e,mock:t,entry:n,debugData:o,requestId:i,requestRecorders:a,logger:l}=r,c={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(m=>[m.name,m.value]),body:n.request.postData?.text}},s;if(t.fetchOriginalResponse){let m=await e.fetch();s={body:await m.text(),options:{status:m.status(),statusText:m.statusText(),headers:Object.entries(await m.headers())}}}let u=await _z(t,c,s),d={};u.headers.forEach((m,h)=>{d[h]=m});let p={body:await u.text(),contentType:u.headers.get("content-type")||"text/plain",headers:d,status:u.status};await e.fulfill(p);try{n.response={status:p.status,statusText:u.statusText,headers:Object.entries(p.headers).map(([m,h])=>({name:m,value:h})),cookies:[],content:{mimeType:p.contentType,text:p.body},_mocked:!0},pl(o,n,i);for(let m of Object.values(a))m.onRequestComplete(i,n)}catch(m){m.message.includes("has been closed")||l.warn({err:m},"Failed to add response to HAR")}}async function _z(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 Gg(r){try{await Mz(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function Mz(r){let{pageId:e,route:t,request:n,debugData:o,logger:i,requestRecorders:a,mocks:l}=r,c=Iz(),s=await zg(e,n);try{pl(o,s,c);for(let d of Object.values(a))d.onRequestStart(c,s)}catch(d){i.warn({err:d},"Failed to add request to HAR")}let u=mC(n,l);u?await hC({logger:i,route:t,mock:u,entry:s,debugData:o,requestId:c,requestRecorders:a}):await Pz({route:t,request:n,debugData:o,logger:i,requestRecorders:a,entry:s,requestId:c})}async function Pz({route:r,request:e,debugData:t,logger:n,requestRecorders:o,entry:i,requestId:a}){await r.continue();try{let l=await e.response();if(!l||!i)return;await lC(i,e,l),pl(t,i,a);for(let c of Object.values(o))c.onRequestComplete(a,i)}catch(l){l.message.includes("has been closed")||n.warn({err:l},"Failed to add response to HAR")}}async function Oz(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 Lz(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 ld(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 jg(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Lz(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await Oz(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var So=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:Kc(t,this.requestMatcher.urlMatcher)}};function ml(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 Vg,platform as $g}from"os";import{join as Wg}from"path";function cd(){let r=[];if($g()==="linux"){let e=Vg();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Wg(e,".config",t,"Crash Reports"))})}else if($g()==="darwin"){let e=Vg();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Wg(e,"Library","Application Support",t,"Crashpad"))})}else if($g()==="win32"){let e=Vg();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Wg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}var Kg=Mn(Yg(),"momentic","chromium"),Uz=Mn(Yg(),"video"),SC=kz(fC);SC.use(Fz({provider:{id:"2captcha",token:Ia},visualFeedback:!0}));var Bz=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],zz=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],Hz=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output"];async function yC({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,recordVideo:a,iconKnowledgeBase:l,callbacks:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let s;switch(o.browserType){case"Google Chrome":s="chrome";break;case"Chrome for Testing":s=void 0;break;case"Chromium":s="chromium";break;default:s="chromium";break}let u=[...zz],d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:s},p={...i??{},geolocation:i?.geolocation||Yn,locale:i?.locale||qn,timezoneId:i?.timezoneId||Kn,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??sd,viewport:i?.viewport??Lt};o.initialLocalStorage&&(p.storageState={cookies:[],origins:Object.entries(o.initialLocalStorage).map(([y,E])=>({origin:y,localStorage:Object.entries(E).map(([w,v])=>({name:w,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,recordVideo:a,isNewHeadless:!1};(s==="chrome"||s==="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 y=cd();y.forEach(E=>{if(!hl(E))return;["new","pending","completed"].forEach(v=>{let x=Mn(E,v);if(!hl(x))return;let A=Nz(x);for(let _=0;_<A.length;_++){let M=Mn(x,A[_]);gC(M,{force:!0})}})}),y.forEach(E=>{hl(E)||qg(E,{recursive:!0});let w=Mn(E,`write-test-${Date.now()}`);qg(w,{recursive:!0}),gC(w,{recursive:!0,force:!0})}),u.push(...Bz)}catch(y){e.warn({err:y},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...Hz);let S=o.localChromeExtensionPaths?.map(y=>y.startsWith("~")?Mn(Yg(),y.slice(1)):y);if(S?.length){if(s===void 0)throw new C("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of S){let x=Mn(v,"manifest.json");if(!hl(x))throw new C("UserConfigurationError",`Chrome extension path ${x} does not exist.`)}if(Jr)throw new C("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let y=Mn(Kg,`momentic-session-${Date.now()}`);if(!hl(y))try{qg(y,{recursive:!0})}catch(v){throw new C("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Kg} folder: ${v}`)}let E=[...u],w=S.map(v=>Dz(v)).join(",");E.push(`--disable-extensions-except=${w}`),p?.deviceScaleFactor&&E.push(`--force-device-scale-factor=${p.deviceScaleFactor}`,`--device-scale-factor=${p.deviceScaleFactor}`),p.viewport&&E.push(`--window-size=${p.viewport.width},${p.viewport.height}`),h=await fC.launchPersistentContext(Mn(Kg,`momentic-session-${Date.now()}`),{...d,...p,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:E,baseURL:r}),e.info({sharedContextOptions:p,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:E,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),g=h.pages()[0]}else{m=await SC.launch({...d,args:u});let y={...p,baseURL:r,recordVideo:a?{dir:Uz}:void 0};h=await m.newContext(y),e.info({contextArgs:y,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),g=await h.newPage()}return Jr&&await h.route("**",ml),{browser:m,context:h,page:g,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||Lt,properties:f,clientCallbacks:c,iconKnowledgeBase:l}}async function EC(r){try{return await Gz(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function Gz({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:oe}),o=await In(r,e),i=await r.boundingBox({timeout:oe});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:oe}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let s=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=s._MOMENTIC_FEATURE_FLAGS?.[ad],g=c.getAttribute(_n),f=!h&&g?zr(g):s.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:oe});if(a.type==="error")throw new Error(a.error);let l=r.page().locator(a.selector);return await l.waitFor({state:"visible",timeout:oe}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:l,relativePoint:a.relativePoint}}var bC=["date","datetime-local","month","time","week"],TC={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 vC(r){try{await j(jz(r),{milliseconds:te})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function jz({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await pt({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:oe,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!TC[i])return;TC[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 er}from"zod";var RC=er.object({doubleClick:er.boolean().optional(),rightClick:er.boolean().optional(),force:er.boolean().optional(),waitForDownload:er.boolean().optional(),delayMs:er.number().optional(),downloadTimeoutMs:er.number().optional(),relativePosition:er.object({x:er.number(),y:er.number()}).optional()}),jAe=er.object({repeat:er.number().optional(),convertMeta:er.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:er.number().optional()});async function ud({locator:r,callbacks:e,logger:t,timeoutMs:n=oe}){try{await Xg(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 l=0;for(;!a.momenticIsEligible(i)&&l<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,l++}let c=i.style.getPropertyValue("outline"),s=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,s),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 j(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 Xg(r,e=oe){let t=await r.state.getRoot();await pt({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 Jg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Si({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>AC({...r,targetingResult:t,useVisualClick:e})})}async function qz(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await Kz(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 Kz(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:oe});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:oe}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),AC({...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 Yz(r){let{browserCallbacks:e,logger:t,targetingResult:n,position:o,options:i}=r,a=RC.safeParse(i),l=await e.state.getRoot(),c=l&&l!==n.locator.page()&&"frameElement"in l?await l.frameElement():null,s;try{s=c?await ti({promiseGenerator:async()=>c.boundingBox(),timeoutMs:te,logger:t}):null}catch(h){throw new C("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${h.message}`)}finally{await c?.dispose()}let u=Date.now(),{clickX:d,clickY:p,reason:m}=await Qz({frameCoordinates:s,logger:t,targetingResult:n,position:o,options:i});return t.info({frameCoordinates:s,position:o,options:a.success?a.data:void 0,clickLocation:{clickX:d,clickY:p,reason:m},duration:Date.now()-u},"Visual click"),{x:d,y:p}}async function Xz(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 s=await EC({locator:i,logger:o});s&&(i=s.locator,a=s.relativePoint??a)}let l=n?.force||t.hints?.force||!1,c=i.toString();try{o.info({locator:c},"Locator click"),n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:te,position:a,delay:n?.delayMs??25,force:l}):await i.click({button:n?.rightClick?"right":"left",timeout:te,position:a,delay:n?.delayMs??25,force:l})}catch(s){let u=s;if(eH(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..."),qz(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function AC(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,l;e?.waitForDownload&&(l=(async()=>{let u=e.downloadTimeoutMs??xg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof Wz.TimeoutError?new C("ActionFailureError",`Download did not complete in ${u}ms`):new C("ActionFailureError",`Download failed: ${d.message}`)}})());try{await ud({locator:a.locator,callbacks:n,logger:t,timeoutMs:oe})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,s;if(i?c=await Yz(r):s=(await Xz(r)).locatorSource,e?.waitForDownload)if(l){if(!o?.createIsolatedFolder)throw new C("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 j(l,{milliseconds:e.downloadTimeoutMs??xg});if(u instanceof Error)throw u;return{downloadedFile:await Zz(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:s}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:s}}async function Jz(r,e){if(e.hints?.clickableXY){let i=(r?.x??0)+e.hints.clickableXY.x,a=(r?.y??0)+e.hints.clickableXY.y;return[{x:i,y:a},"targeting hint"]}let t=await e.locator.boundingBox({timeout:te});if(!t)throw new C("ActionFailureError","Element does not have a bounding box");let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function Qz({frameCoordinates:r,logger:e,options:t,targetingResult:n,position:o}){let i,a,l;if(t?.relativePosition){let d=await n.locator.boundingBox({timeout:te}),p=t.relativePosition.x,m=t.relativePosition.y;d?.width&&(p=Math.max(0,Math.min(t.relativePosition.x,d.width))),d?.height&&(m=Math.max(0,Math.min(t.relativePosition.y,d.height))),i=(d?.x??0)+p,a=(d?.y??0)+m,l="relative position from user"}else if(o){let d=await n.locator.boundingBox({timeout:te});i=(d?.x??0)+o.x,a=(d?.y??0)+o.y,l="predefined position"}else{let[d,p]=await Jz(r,n);i=d.x,a=d.y,l=p}let c=n.locator.page(),s=t?.rightClick?"right":"left",u=t?.delayMs??25;return t?.doubleClick?await c.mouse.dblclick(i,a,{button:s,delay:u}):await c.mouse.click(i,a,{button:s,delay:u}),{clickX:i,clickY:a,reason:l}}async function Zz(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=Ug(r.suggestedFilename()),i=e();await r.saveAs($z(i,o)),wC(n,{force:!0}),setTimeout(()=>{wC(i,{recursive:!0,force:!0})},5*60*1e3);let a=eC(Vz(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function eH(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as tH}from"os";var rH={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 nH(){let r=tH();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function CC(r){return JSON.stringify(r.split("+").sort())}function dd(r){let e=nH(),t=CC(r);for(let n of Object.values(rH))if(Object.values(n).some(o=>CC(o)===t))return n[e];return process.platform==="darwin"?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Qg({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:l,logger:c}){if(!t&&!o)return;let s=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await pt({root:r,fn:([d,p,m,h])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*h),arg:[t,o,s,u],waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"scrolling page"});else{let d=e.viewportSize()||Lt,p=await pt({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"computing page height"}),[m,h,g]=await pt({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:l.waitForPageLoad,timeout:be,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*s,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<be;){a?.throwIfAborted();let S=await j(e.evaluate(()=>document.body.scrollHeight),{milliseconds:oe}),[y,E,w]=await j(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let x=v.getBoundingClientRect();return[v.scrollTop,x.x,x.y]}),{milliseconds:oe});if(S===p&&y===m&&E===h&&w===g)break;p=S,m=y,h=E,g=w,await ne(ft)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Zg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await ne(ft)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}import{randomUUID as dH}from"crypto";import{cloneDeep as rf}from"lodash-es";function yo(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as oH}from"crypto";var iH="v1";function ef(r,e){if(r.tagName.toLowerCase()==="svg"&&!sH(r))try{let t=xC(r,e),n=aH(JSON.stringify(t));return{version:iH,json:t,hash:n}}catch{return}}function aH(r){return oH("md5").update(r).digest("hex")}function xC(r,e){let t=r.tagName.toLowerCase(),n=lH(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 l=xC(a,e);l&&o.children.push(l)}}return o}function sH(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function lH(r){let e={},t=r.attributes;for(let n of Object.keys(t))Ar.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var yi={r:147,g:196,b:125,a:.55},IC={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:yi,paddingColor:yi,borderColor:yi,marginColor:yi,eventTargetColor:yi,shapeColor:yi,shapeMarginColor:yi,showInfo:!0,showAccessibilityInfo:!0};function MC({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},l={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:l};return i.forEach((s,u)=>{let d=cH({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:l,logger:n});c.roots.push(d)}),c}function cH({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:l}){let c=r[o],s=c.layout,u={};s.nodeIndex.forEach((A,_)=>{u[A]=_});let d=s.styles,p=s.bounds??[],m=c.nodes,h=m.contentDocumentIndex??{index:[],value:[]},g=m.backendNodeId??[],f=m.attributes??[],S=m.parentIndex??[],y=m.nodeName??[],E=m.nodeType??[],w=m.pseudoType??{index:[],value:[]},v=m.inputChecked??{index:[]},x=e[c.frameId];for(let A=0;A<g.length;A++){let _=g[A],M=E[A],Y=f[A]??[],W=S[A]!==void 0&&S[A]>=0?S[A]:void 0,D=W!==void 0?g[W]:void 0,Q=D!==void 0?a[D]:void 0,B=w.index.indexOf(A),H=B!==-1?e[w.value[B]]:void 0,de=u[A],V;de?V=p[de]??[]:V=[];let Ke=y[A]!==void 0?e[y[A]]?.toLowerCase():void 0;if(!Ke){l.warn({backendNodeId:_,frameId:x,frameIndex:o,nodeBounds:V},"DOM node has no tag name");continue}let Ie={backendNodeId:_,psuedoType:H,nodeType:M,frameIndex:o,parentFrameId:x,ownedFrameId:void 0,bounds:{x:V[0]??null,y:V[1]??null,width:V[2]??null,height:V[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:D??null,tagName:Ke,parent:Q??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};Q&&Q.childrenBackendIds.push(_);let nt=h.index.indexOf(A);if(nt!==-1){let X=h.value[nt];i[X]=Ie;let Te=r[X]?.frameId;Ie.ownedFrameId=Te!==void 0?e[Te]:void 0}for(let X of Object.keys(Ie.bounds)){let Te=X;Ie.bounds[Te]!==null&&(Ie.bounds[Te]/=n)}let _t=de!==void 0?d[de]??[]:[];for(let X=0;X<_t.length&&!(X>=t.length);X++){let Te=_t[X];if(Te===void 0||isNaN(Te))continue;let ur=e[Te];if(ur===void 0)continue;let kn=t[X];Ie.computedStyles[kn]=ur}for(let X=0;X<Y.length;X+=2){let Te=Y[X],ur=Y[X+1];if(!Te||!ur)continue;let kn=e[Te],Fn=e[ur];!kn||!Fn||(Ie.attributes[kn]=Fn)}v.index.includes(A)&&(Ie.attributes.checked="true"),a[Ie.backendNodeId]=Ie}return a[g[0]]}function tf(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=`${tf(t,e)}${a}`}return r.mPathSelector=n,n}function _C(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var uH=["html","#document","#document-fragment"];function PC({node:r,domGraph:e}){let t=[],n=r,o=_C(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=_C(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++,uH.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,s=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(${s})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&s++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function OC(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 LC(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:be});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:be}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:be})).attributes,i=yo(o,_n);if(!i)throw new Error(`Could not find attribute ${_n} for object ${e}`);return i}var pH=["focusable","keyshortcuts","controls","live","relevant","orientation"],mH=["selected","readonly","modal","required","invalid"],hH=["id","name","role","content"],NC=["absolute","fixed","sticky"],gH=["i"],fH=["path"],SH=["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"],FC=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],UC=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],yH=["menulistpopup","statictext","inlinetextbox"],EH=80,DC=100,BC=50,af=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],TH=["cite"],bH={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"]},vH={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},kC={indentLevel:0},nf=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<BC?t:""),this.role=this.role||(e.domNode.attributes.role??""),CH(this.properties,e.domNode,e.importantProperties)}_H(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&&fH.includes(this.domNode.tagName)||this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(n=>UC.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>VC(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>$C(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),l=i[1]?.trim();if(a===void 0||l===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===l||l==="*")}))return!0}if(this.domNode&&gH.includes(this.domNode.tagName)||SH.includes(this.role.toLowerCase())||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Ar.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>jC(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")?!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"))}isNotActionable(){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=kC){let t=Object.assign({},kC,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:l,condensedMode:c}=t,s=rf(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=af.includes(this.role)||TH.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
|
|
3978
|
+
`;let S=`${u}<${p}`;!a&&!f&&(S+=` id="${this.id}"`);let y=l??!1;if((s.multiline||s.contenteditable)&&this.children.length>0&&(y=!0),d&&d!=="generic"&&d!==p&&!(bH[d]??[]).includes(p)&&(S+=` role=${JSON.stringify(d)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!y&&(S+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isNotActionable()&&(S+=` ${Ar.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,x=Math.round(v.x??0),A=Math.round(v.y??0),_=Math.round((v.x??0)+(v.width??0)),M=Math.round((v.y??0)+(v.height??0));S+=` bounds=[${x} ${A} ${_} ${M}]`}let E=Date.now();if(Object.keys(s).length>0&&!i){if(Date.now()-E>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(s).forEach(([v,x])=>{if(!pH.includes(v)){{if(mH.includes(v)&&(!x||x==="false"))return;if(v==="value"&&y&&(s.type==="text"||this.role==="textbox"))return;if(v==="level"&&`${x}`=="1")return;if(v==="url"&&s.src&&p==="img")return;if(v==="url"&&s.href&&p==="a")return;if(v==="editable"&&x==="plaintext")return;if(v==="type"&&x===p)return;if(c&&!vH[v])return}typeof x=="string"?S+=` ${v}="${Ze(x,DC,!0)}"`:typeof x=="boolean"?x?S+=` ${v}`:S+=` ${v}={false}`:typeof x<"u"&&(S+=` ${v}={${Ze(JSON.stringify(x),DC,!0)}}`)}})}if(p==="::before"||p==="::after"){let v="";for(let x of this.children)v+=x.serialize({...e,indentLevel:n,neighbors:0});return v}let w=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||w)S+=` />
|
|
3979
3979
|
`;else{let v="";for(let A of this.children)v+=A.serialize({...e,indentLevel:n+2,neighbors:0});let x=v.trim();x.length<=EH&&!x.includes(`
|
|
3980
3980
|
`)?S+=`>${x}</${p}>
|
|
3981
3981
|
`:S+=`>
|
|
3982
3982
|
${v}${u}</${p}>
|
|
3983
3983
|
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let v=this.parent.children.findIndex(_=>_.id===this.id),x=v>0?this.parent.children[v-1]?.serialize({...e,neighbors:0}):"",A=v<this.parent.children.length-1?this.parent.children[v+1]?.serialize({...e,neighbors:0}):"";return`${x||""}
|
|
3984
3984
|
${S}
|
|
3985
|
-
${A||""}`}return S}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:rf(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=rf(this.properties),e}},of=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 s=c.shallowClone();if(e[c.id])return s.properties["data-momentic-summary"]=e[c.id],n[c.id]=s,c.dataMomenticId&&(o[c.dataMomenticId]=s),c.mPathSelector&&(i[c.mPathSelector]=s),s;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=s)}return s.children=u,n[c.id]=s,c.dataMomenticId&&(o[c.dataMomenticId]=s),c.mPathSelector&&(i[c.mPathSelector]=s),s},l=a(t);return new r(l,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 l=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),s=i.children,u=!1,d=[];for(let p of s){let m=n(p,l||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,l||u)return c;if(af.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=t.shallowClone(),o=()=>n.serialize().length,i=(a,l)=>{l.children=[];for(let c of a.children){let s=c.shallowClone();if(s.parent=l,l.children.push(s),o()>e){l.children.pop();break}if(i(c,s),o()>e){for(;s.children.length>0&&o()>e;)s.children.pop();if(o()>e){l.children.pop();break}}}};for(i(t,n);n.children.length>0&&o()>e;)n.children.pop();return new r(n,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function RH(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 wH(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?(yc({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?(yc({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 zC({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:l,showZeroOpacityElements:c,filterByViewport:s,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 S=(H,de={})=>{},y=r.backendDOMNodeId,T=yH.includes(r.role?.value?.toLowerCase()??"");if(!T&&y===void 0)return S("Filtering out node since it doesn't exist in the DOM"),[];let w=y?i.backendIdToNode[y]:void 0;if(!T&&!w)try{let H=await j(h.send({method:"DOM.describeNode",params:{backendNodeId:y}}),{milliseconds:750,fallback:()=>{g.debug("Timeout getting node from CDP while processing a11y tree")}});if(H&&H.node.nodeName.toLowerCase()==="slot"&&H.node.distributedNodes?.length)g.debug({redirectedDomNode:w,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:H},"Redirecting node to assigned slot");else return S("Filtering out node since it doesn't exist in the DOM",{cdpResult:H}),[]}catch(H){return S("Filtering out node since it doesn't exist in the DOM",{err:H}),[]}if(w&&e&&s&&u&&r.backendDOMNodeId&&!wH(w,u,g,f))return w.momenticIgnored=!0,[];if(w&&w.computedStyles.display==="none")return w.momenticIgnored=!0,[];if(w&&w.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&w.tagName.toLowerCase()!=="input")return w.momenticIgnored=!0,[];if(c===!1)return w.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",x=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new nf({domNode:w,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:x,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(H=>(m??FC).includes(H.name)||UC.includes(H.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+RH(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:l}),_=n,M=a[t],Y=t;if(w?.tagName.toLowerCase()==="iframe"&&w.ownedFrameId){let H=n.childFrames.find(Ke=>Ke.frameId===w.ownedFrameId),de=o[H?.frameId??""]?.root,V=a[H?.frameId??""];if(H&&de&&V){r.childIds&&r.childIds.length>0&&g.debug("Replacing existing node's children with children from the iframe");let Ke=de;r.childIds=Ke.childIds,_=H,M=V,Y=H.frameId}}let W=w?.childrenBackendIds?.length??0,D=(r.childIds??[]).filter(H=>!!M.get(parseInt(H))).length;if(W>D){let H=r.childIds?.map(V=>M.get(parseInt(V))).filter(Boolean).map(V=>V?.backendDOMNodeId).filter(V=>V!==void 0)??[],de=0;for(let V of w?.childrenBackendIds??[]){if(H.includes(V)){de=(r.childIds?.findIndex(X=>M.get(parseInt(X))?.backendDOMNodeId===V)??0)+1;continue}let Ke=i.backendIdToNode[V];if(!Ke||Ke?.tagName.toLowerCase()!=="svg")continue;let _e=Math.floor(-1*Math.random()*1e7),nt={nodeId:_e.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:V,frameId:Y,role:{type:"string",value:"graphics-symbol"}};M.set(_e,nt),r.childIds||(r.childIds=[]),r.childIds.splice(de,0,_e.toString()),de++}}if(r.childIds?.length===1&&w){let H=M.get(parseInt(r.childIds[0])),de=H?.role?.value,V=w.childrenBackendIds;if(H&&de==="StaticText"&&V.length===1){let Ke=i.backendIdToNode[V[0]];if(Ke?.tagName?.toLowerCase()==="span"){let _e=Math.floor(-1*Math.random()*1e7).toString(),nt={nodeId:_e,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ke.backendNodeId,frameId:Y,childIds:[H.nodeId]};H.parentId=_e,M.set(parseInt(_e),nt),r.childIds=[_e]}}}for(let H of r.childIds??[]){if(!H)continue;let de=M.get(parseInt(H));if(!de)continue;let V=await zC({node:de,parent:A,domGraph:i,axGraph:o,frameId:Y,frameContext:_,inputNodeMap:a,cdpClient:h,logger:g,callId:f,filterByViewport:s,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:l});V.length&&(A.children=A.children.concat(V))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let H=A.name,de=A.children[0]?.name;(H===de||!de)&&(A.children=[])}let Q=[];for(let H=A.children.length-1;H>=0;H--){let de=A.children[H];if(de.role!=="StaticText"){Q.push(de);continue}if(H===0||A.children[H-1].role!=="StaticText"){Q.push(de);continue}A.children[H-1].name+=de.name}if(A.children=Q.reverse(),!A.isInteresting(p)&&r.parentId)return w&&(w.momenticIgnored=!0),A.children;for(let H of A.children)H.parent=A;return xH(A),w&&d&&tf(w,i),[A]}function HC({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:l,iconKnowledgeBase:c,startId:s=1}){r.id=s,s+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:af.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(l[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let p=ef(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)s=HC({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:s,useMPaths:a,domGraph:i,selectorToNodeMap:l,iconKnowledgeBase:c});return s}async function GC({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:l,importantProperties:c,viewportDetails:s,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=dH(),S=A=>{let _=A.allNodes.filter(Y=>!Y.ignoredReasons?.find(D=>(m??FC).includes(D.name))),M=new Map;return _.forEach(Y=>{M.set(parseInt(Y.nodeId),Y)}),M},y={};Object.entries(r).forEach(([A,_])=>{y[A]=S(_)});let T=await zC({node:g,domGraph:e,parent:null,inputNodeMap:y,axGraph:r,frameId:h,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:s,useMPaths:u,flagNotActionableNodes:l,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 w={},v={},x={};return HC({node:T[0],a11yIdNodeMap:w,dataMomenticIdMap:v,selectorToNodeMap:x,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new of(T[0],w,v,x)}function AH(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<BC&&!Ar.bannedClassSubstrings.some(l=>a.includes(l))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(jC(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 CH(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,l])=>{let c=r[a]||a.startsWith("aria")||hH.includes(a);if((Ar.relevantElementAttributes.includes(a)||VC(a,t))&&!c){let u=AH(a,l,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&NC.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of NC)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 l=a.split(":"),c=l[0]?.trim(),s=l[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&s!==void 0&&u!==void 0&&(s==="*"||u===s)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function xH(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(s=>s.tagName==="tr");if(c){let s=c.children.filter(u=>u.tagName==="th");s.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(Ze(u.name,100,!1))}),i?.length!==s.length&&(i=void 0)}}let l=0;for(let c of r.children)if(c.tagName==="tbody")for(let s=0;s<c.children.length;s++){let u=c.children[s];if(u.tagName!=="tr")continue;if(s===0&&!i?.length){let m=u.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>Ze(h.name,100,!1)),i.length===m.length)continue;i=void 0}}l+=1,u.properties["row-index"]||(u.properties["row-index"]=l);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 _H(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function jC(r,e){if(e&&$C(r,e))return!0;if(Ar.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(Ar.alwaysInterestingClassNames.includes(r))return!0;for(let t of Ar.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function VC(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 $C(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 pd=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(),l,c;for(let u=0;u<2;u++)try{l=await j(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new C("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ne(ft),c=d}if(!l)throw c;let s=new r(l,e,t,n,o);try{await j(s.registerHandlers(l),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw s.cdpFullyDead=!0,new C("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return s}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await j(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new C("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 j(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 j(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new C("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 j(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 j(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 Ma="<empty>";function IH(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 qC(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||IH(r.url)}async function MH(r,e){let t=await r.send({timeout:te,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:te,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:te,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Pa({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:te,method:"Page.getFrameTree",params:{}}),r.send({timeout:te,method:"DOM.getDocument",params:{depth:0}})]),s=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(qC(d.frame))return null;try{return await KC({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(s);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function KC({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,l=await MH(r,a),c=l.attributes??[],s=null,u=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=So(c,h);g&&(u.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(s=g))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:s,childFrames:[],parent:n,domNode:l},m=(e.childFrames??[]).map(async(h,g)=>{if(qC(h.frame))return null;try{return await KC({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 PH(r){try{return await r.owner().count()===1}catch{return!1}}async function OH(r){try{return await r.count()===1}catch{return!1}}async function mn(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 s of t){let u=!1;for(let d of[...s.locationData.attributeSelectors,Ma]){let p=o.frameLocator(d===Ma?"iframe":`iframe[${d}]`);if(await PH(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new C("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${s.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let s of[...r.locationData.attributeSelectors,Ma]){let u=o.locator(s===Ma?"iframe":`iframe[${s}]`);if(await OH(u)){a=u,i.push(s);break}}if(!a)throw new C("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 l=await a.evaluateHandle(s=>s,{timeout:oe}),c=await l.asElement().contentFrame();if(!c)throw new C("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await l.dispose(),{frame:c,mPathSelectorTokens:i}}function WC(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 YC({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let l=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===Ma?l=l.length===1?l[0].childFrames:[]:l=l.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],s=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(s===Ma?c=l:c=l.filter(u=>u.locationData.attributeSelectors.includes(s)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await mn(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 l=new RegExp(t.frameSrcRegex),c=WC(o,s=>!!s.src&&l.test(s.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await mn(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 l=new RegExp(t.frameUrlRegex),c=WC(o,s=>!!s.url&&l.test(s.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await mn(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 l=0;l<t.indices.length-1;l++)a=a[t.indices[l]]?.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 mn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Kr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function md(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function sf(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function XC(r){let e=sf(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let l=a.shift();l.src&&o.push(l.src),l.url&&i.push(l.url),a.push(...l.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function JC(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 QC({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await LH({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 LH({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await ei({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 l=Date.now();for(;Date.now()-l<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(s=>setTimeout(s,250))}}),timeoutMs:be,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}async function ZC({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:l,properties:c}=r.target;if(l){i.error({error:l,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let s=n.parentFrame()?n.url():void 0,d=n.page().frames().map(h=>h.url());i.debug({frameUrl:s,...r},"Passive click event captured on element");let p,m;if(s)try{let h=await n.frameElement();p=await j(h?.boundingBox(),{milliseconds:te})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:s});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:s}}(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 hn}from"crypto";import NH from"js-beautify";var DH=["Dead"],hd=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:(l,c)=>{this.recordedSteps.set(c,{step:l}),t.onStepRecorded(l,c)},onActionReceived:(l,c)=>{this.recordedSteps.set(c,{step:l}),t.onActionReceived?.(l,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:hn(),type:"PRESET_ACTION",command:yn(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,l=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=l,s;switch(e.frameConfig?e.frameBoundingBox?s={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"):s=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=yn(i);a={id:hn(),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:s}}}};break}case"SELECT":{i="SELECT_OPTION";let g=yn(i);a={id:hn(),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:s}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=yn(i);a={id:hn(),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:Ue(this.logger),boundingBox:s}}}};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=NH.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=$A(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,...Ue(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),p=l}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(DH.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=yn("TYPE");i={id:hn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=yn("PRESS");i={id:hn(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,l=this.nextStepOffset-1,c=this.recordedSteps.get(l),s=c?.step,u=s?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:hn(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=l}else if(u?.type==="CLICK"&&i.command.type==="TYPE")s.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=l;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:hn(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=l}}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,l=this.recordedSteps.get(a)?.step.command,c;l?.type==="SCROLL_DOWN"&&l.deltaY?(i+=l.deltaY,c=a):l?.type==="SCROLL_UP"&&l.deltaY?(i-=l.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let s=i>0?"SCROLL_DOWN":"SCROLL_UP",u=yn(s);u.deltaY=Math.abs(i);let d={id:hn(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,l=this.recordedSteps.get(a)?.step.command,c;l?.type==="SCROLL_RIGHT"&&l.deltaX?(i+=l.deltaX,c=a):l?.type==="SCROLL_LEFT"&&l.deltaX?(i-=l.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let s=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=yn(s);u.deltaX=Math.abs(i);let d={id:hn(),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 lf}from"zod";var Hxe=lf.object({type:lf.literal("url"),url:lf.string()});var gd=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:l,enricher:c,iconKnowledgeBase:s,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=l,this.enricher=c,this.iconKnowledgeBase=s,this.userBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userBrowserSettings.importantStyles)for(let p of this.userBrowserSettings.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.userBrowserSettings.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=sf(e),{frame:o,mPathSelectorTokens:i}=await mn(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 Pa({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await YC({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(md(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:md(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await QC({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Pa({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[j(n.evaluate(e,t),{milliseconds:be})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),s=c.url;s==="about:blank"||s.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(mn(c,n).then(({frame:u})=>j(u.evaluate(e,t),{milliseconds:be})).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 Pa({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,l,c=null;if(this.frameConfig?.type==="url"){if(a=await Cr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new C("ActionFailureError","Got null frame details despite active frame config");l=a.handle,c=l.frameId}else this.userBrowserSettings.autoExpandIframes?(l=await Cr({fn:()=>Pa({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(l={type:"root",page:i,childFrames:[]},c=null);await Cr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:l.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let s=await Cr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await Cr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:l.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await Cr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:s,startingFrameId:c,frameContext:l,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=s,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:bn,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.userBrowserSettings.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=PC({node:o,domGraph:this.domGraph});return OC(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:be});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await LC(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(zr(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,l,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await Pa({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(s){if(l=s,s instanceof C&&s.reason==="UserInfrastructureError")throw s;c%3===0&&this.logger.warn({attempt:c,err:s},"Failed to resolve active frame, retrying..."),await ne(ft,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:md(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw l}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let l=i.shift(),c=l.domNode;i.push(...l.childFrames);let s=So(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!s&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[s,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:l,matchType:"regex",...await mn(l,o)});break}}else if(n.trim()===d.trim()){a.push({handle:l,matchType:"url",...await mn(l,o)});break}}}if(a.length===1){let l=a[0];return this.userBrowserSettings.autoExpandIframes||(l.handle.childFrames=[]),l}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new C("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:l,showZeroOpacityElements:c,flagNotActionableNodes:s}){let u=await GC({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:s,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userBrowserSettings.importantAttributes,classes:this.userBrowserSettings.importantClasses,styles:this.userBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:l,useMPaths:this.userBrowserSettings.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.userBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),l=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let s=async()=>{try{let{frame:u}=await mn(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...")}};l.push(s())}await Promise.all(l)}async addMomenticIdsHelper(e,t){if(this.userBrowserSettings.visualActions)return t;let n=this.logger;return await pt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:be,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(So(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=So(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:te,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:te,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:te,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 l=[];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,s;for(let m=0;m<3;m++)try{s=await Cr({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(!s)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=s,!this.userBrowserSettings.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:l});if(!g)continue}catch(g){if(g.message.includes("Could not compute box model"))continue;l.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 Cr({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),l.length>0&&this.logger.warn({warnings:l},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await Cr({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 Cr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:be}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await Cr({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:te}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(l){await ne(ft,t),i++,a=l}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new C("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 MC({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=XC(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 cf(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var xr=class r{static USER_AGENT=sd;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;videos=[];baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:l,userBrowserSettings:c,viewport:s,properties:u,clientCallbacks:d,iconKnowledgeBase:p}){if(lT(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=l,this.userControlledBrowserSettings=c,this.viewport=s,this.properties=u,this.clientCallbacks=d,u.recordVideo){let m=this.page.video();m&&this.videos.push(m)}this.iconKnowledgeBase=p}registerAbortSignal(e){this.abortSignal=e}async initialize({grantPermissions:e,runInitScripts:t}){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),e&&await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera","geolocation"]);let n={[ad]:this.userBrowserSettings.visualActions},o=[this.context.addInitScript({content:GA.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(n)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})],i=a=>this.handleNewPageEvent(a);this.context.on("page",i),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",i)}),await Promise.all(o),t&&await this.page.reload(),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&GH()==="darwin"&&kH("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):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await pd.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new gd({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 yC(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}){let l=e.pages()[0];if(!l)throw new Error("No page found in existing context");let c=l.viewportSize();c||(c=await l.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})));let s=l?.url(),u=new r({browser:e.browser(),context:e,page:l,baseUrl:s,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:c,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await u.initialize({grantPermissions:!1,runInitScripts:!0}),u}async handleAvailableTabsChangeHelper(){try{let e=await Zg(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=uf(),o=`${e}-${n}`,i=Date.now(),a=!1,l=async()=>{try{await j(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.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]=l().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()||!ti(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let n=e.video();n&&this.videos.push(n)}try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=uf(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",a=>{oC(e,o,this.debugData,a,this.logger)});let i=async()=>{await sC(t,this.debugData,e),await e.route("**/*",async(a,l)=>{await Gg({pageId:t,route:a,request:l,debugData:this.debugData,logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",pC(this.customHeaders,this.logger)),Jr&&await e.route("**/*",ml),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"||!ti(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(l){this.logger.warn({err:l},"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){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await j(Xg(this.getBrowserCallbacks()),{milliseconds:oe})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0;try{this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Cg;){a++,n?.throwIfAborted();try{if(await pt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:oe,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(l){if(i++,i>=3){t.warn({err:l},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ne(ft),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),pt({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:te,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 ne(_a),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 l=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??be}),c=Buffer.from(l.data,"base64"),s=await tx.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(s.bitmap.width!==u||s.bitmap.height!==d)&&(c=await s.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&BH(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:te});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 S=await tx.fromBuffer(c),y=S.bitmap.width,T=S.bitmap.height;m=Math.max(0,Math.min(m,y-1)),h=Math.max(0,Math.min(h,T-1)),g=Math.max(1,Math.min(g,y-m)),f=Math.max(1,Math.min(f,T-h)),c=await S.crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}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}){wb(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(s){if(a=s,this.abortSignal?.throwIfAborted(),this.logger.warn({err:s},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await ne(ft),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:oe})}if(!i)throw new C("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 l=this.url();if(JA.has(l))throw new C("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(c){c instanceof Error&&c.message.includes("already registered")||this.logger.error({err:c},"Failed to install Momentic libraries for action recording")}await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElement(e){try{return await pt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;return n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n}:void 0},arg:void 0,timeout:oe,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 vC({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ne(_a),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25)):this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??pS}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:be})}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(l=>setTimeout(l,250))}},void 0,{timeout:be})}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 ud({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:oe}),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 nC(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:oe});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:oe,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(l){this.logger.warn({err:l,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 rC(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 tC(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 C("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Zg(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 l=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});l?(t.generatedSelectors=l.generatedSelectors,t.serializedHtml=l.serializedHtml,t.nodeOnlySerializedHtml=l.nodeOnlySerializedHtml,t.hybridSelector=l.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(l){if(l instanceof Yr)throw a.warn({err:l},"Cache attributes disqualify found element"),l;a.warn({err:l},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(l){a.debug({err:l},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Mg.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:te})),!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:l=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-l)<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 s=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(s),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({locator:e,requirements:t}){let n={};if(t?.boundingBox){let o=await e.boundingBox({timeout:te});if(!o||!o.width||!o.height)throw new C("ActionFailureError","Element does not have a bounding box as required");n.boundingBox=o??void 0}if(t?.text){let o=await e.innerText({timeout:te});n.text=o?.trim()}if(t?.attributes&&t.attributes.length>0){let o={};for(let i of t.attributes){let a=i.trim().toLowerCase();if(!(!a||Ar.bannedAiRequiredCacheAttributes.includes(a)))try{let l=await e.getAttribute(a,{timeout:te});l!==null&&(o[i]=l)}catch(l){this.logger.warn({err:l,attr:i},"Failed to fetch required attribute, continuing...")}}n.attributes=o}return n}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 l=await this.fetchHtmlAttributes({locator:a,logger:o});if(!l?.generatedSelectors||l.generatedSelectors.length===0)return;let c={selectors:l.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,l=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let s=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!s)continue;l.push(s)}catch(s){this.logger.warn({err:s,additionalElement:c},"Failed to fetch additional element details, continuing...")}return l}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:l}){t&&(o.requirements=await this.getElementRequiredValues({locator:i,requirements:t})),n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:l}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:l}){if(e<0)throw new C("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new C("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let s=this.stateManager.frameConfig,u,d,p,m;if(this.userBrowserSettings.autoExpandIframes&&!s&&c.parentFrame){let y=c.parentFrame,{cache:T,config:w}=await this.stateManager.getAutoFrameDetailsFromHandle(y);d=T,p=w,u=w.frame,m="auto iframe"}else c.parentFrame&&s?(p=s,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:Ue(i),frameCache:d},f,S=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:JC(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),S=!0),await this.updateCacheWithNewNodeDetails({node:c,target:g,locator:h,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:l,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{S&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:l}=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 ne(ft,a)}if(!h)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let s=Date.now(),u=0,d=0,p;for(;Date.now()-s<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-s>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,logger:m?i:bn,allowNotActionableNodesOverride:l,signal:a});break}catch(h){if(h instanceof fs)break;if(h instanceof Yr){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 ne(ft,a)}a?.throwIfAborted(),m&&i.info({err:h},`Could not resolve target using primary cache only (x${u})`),await ne(ft,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:l}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Ue(i),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}){let l=Oa(t),c=[],s=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),u;if(t.generatedSelectors||t.hybridSelector){let d;try{d=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a})}catch(p){u=p,p instanceof Kr&&c.push(...p.decisions)}if(d)return{...d,pageState:void 0,decisions:[...c,...d.decisions]};n||(c.push({type:"CSS_SELECTOR",matched:!1,reason:u?.message,selectors:Oa(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw u;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let d=await this.resolveTargetWithSecondaryMethods({root:e,tree:s,target:t,decisions:c,logger:o,signal:i,allowNotActionableNodesOverride:a});if(d)return d}throw new Kr(`Could not find any relevant node given target: ${JSON.stringify(l)}`,c)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o}){if(!t.nodeOnlySerializedHtml)throw new fs("Insufficient data to resolve target using primary methods (missing node HTML)");let i=this.userControlledBrowserSettings.hybridSelectorMode,a={ldistThreshold:Ig,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements},{css:l,hybrid:c}=await pt({fn:S=>window.evaluatePrimaryCaches(S),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:a},hybridParams:i&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:a}:void 0},root:e,timeout:te,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),s,u,d=[];if(i==="prefer"&&c?.result){s=c.result;let S={type:"HYBRID_SELECTOR",matched:!0,logs:c.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};d.push(S),u="HYBRID_SELECTOR"}else if(l?.result){s=l.result;let S=`${s.workingSelectors.length} CSS selectors matched the following element: ${s.serializedElement}`,y=s.workingSelectors.slice(0,5);d.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:S,selectors:y}),n.debug({reason:S,workingSelectors:y},"Resolved with CSS selectors"),u="CSS_SELECTOR"}else throw d.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),c&&d.push({type:"HYBRID_SELECTOR",matched:!1,reason:c.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:c.logs}),new Kr("Cache evaluation failed",d);let p,m,h;if(this.userBrowserSettings.visualActions){let S=s.mPath;if(!S)throw new Error("Found element did not have an mPath despite using visual actions");let y=S.join(" > ");p=e.locator(y),m=this.stateManager.getNodeUsingMPathSelector(y)}else if(s.dataMomenticId!==void 0)h=parseInt(s.dataMomenticId),m=this.stateManager.dataMomenticIdToNodeMap[h],"workingSelectors"in s?p=e.locator(s.workingSelectors[0]):p=e.locator(zr(h));else throw new C("InternalWebAgentError","Received an element resolution result with no identifying attributes");i&&t.hybridSelector&&(c?.logs.length===1?n.warn({hybridResult:c,cssResult:l,hybridMode:i},"Hybrid selector resolution rejected, continuing..."):c?.result?l?.result&&c?.result&&c.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(c.result.mPath)?n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==c.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let g=Oa(t);await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:p,logger:n,startingBoundingBox:s.boundingBox,allowNotActionableNodesOverride:o});let f=df(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(n),t.cacheResolutionUpdateSource=u,n.debug({diffs:f},"Updated cache")),{a11yNode:m,displayString:s.serializedElement,locator:p,decisions:d}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,l=await this.getActivePageOrFrame(),c=Date.now(),s=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),s++;let p=l.locator(n),m;try{return await p.waitFor({state:"attached",timeout:oe}),m=await In(p,o)??"",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 C("ActionFailureError",`CSS selector '${n}' failed to resolve after ${s} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ne(ft,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 l=await a.locator.boundingBox({timeout:te});if(!l){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:s,width:u,height:d}=l;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||!s){this.logger.debug({oldX:t,oldY:n,newX:c,newY:s,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(s-n)>100){this.logger.debug({newX:c,newY:s,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<YA){let s="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:s})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let s=await pt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:be,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(Ig*t.nodeOnlySerializedHtml.length);if(s&&s.closestDistance&&s.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${s.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:s.closestDistance,closestElement:s.closestNodeSerialized})}else{if(s?.error)throw new Error(s.error);if(s?.dataMomenticId||s?.mPathSelector){let d=s.dataMomenticId?parseInt(s.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(zr(d));else if(s.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(s.mPathSelector),m=e.locator(s.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=s.closestNodeSerialized??await In(m,o)??"unknown element";o.warn({result:s,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance");let g=Oa(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:s.boundingBox,allowNotActionableNodesOverride:a});let f=df(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:s},"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:s.logs,distance:s.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(s)}`)}}catch(s){o.info({err:s},"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: ${s}`})}let l=t.screenshotUrl,c=t.role??"";if(l&&Mg.includes(c))try{let s=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:l,signal:i,allowNotActionableNodesOverride:a});return{...s,decisions:[...n,...s.decisions],pageState:void 0}}catch(s){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${s}`,elementImageUrl:l}),o.warn({err:s},"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(),s=WH(),u=await this.enricher.runTemplateMatching({id:s,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],S=Oa(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let y=df(S,t);return y&&Object.keys(y).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:s,diffs:y,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:oe})??"",i=bC.some(a=>a===o.toLowerCase());return await Jg({targetingResult:t,options:{force:n.force},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks()}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Jg({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks()})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,l=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),l=this.url(),Kc(l,t,n)){a=!0;break}await ne(ft,this.abortSignal)}if(!a)throw new C("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Fc(t)} in ${o}ms.
|
|
3986
|
-
Current tab: ${l}`);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:te});if(!o)throw new C("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,l=n.steps??5;await this.page.mouse.move(i,a,{steps:l}),await ne(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,be):500),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(Hg);i||(this.logger.warn("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:n}),await ne(_a),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await fi({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:te});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 fi({func:t=>t.locator.focus({timeout:be}),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 pt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:oe,codePath:"blurring the active element"});return}await this.highlight(e.locator),await fi({func:t=>t.locator.blur({timeout:be}),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 fi({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 C("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:te})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=dd(e);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=dd(e);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of cf(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=dd(e);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of cf(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}=e,a=e.abortSignal??this.abortSignal,l=!i,c=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:a});let s=0,u;for(;s<t;){s++;try{return await j(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:a,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:c,flagNotActionableNodes:l}),{milliseconds:this.pageLoadTimeout*s,signal:a,message:"Getting browser state took too long"})}catch(d){if(a?.throwIfAborted(),u=d instanceof Error?d.message:`${d}`,s>=t)throw d;n.warn({err:d,url:this.url()},"Error getting a11y tree, retrying...")}}throw new C("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${u}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await pt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:te,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()},l=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",l);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let s=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",s);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",l),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",s),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),l,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},s=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await ne(_a,this.abortSignal),l)try{let d=await this.screenshot(c);if(!d.equals(l)){l=d,s=!1;continue}s=!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{l=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<KA)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:s}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ne(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,_g):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,n,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(Hg);i||(this.logger.warn("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:n}),await ne(_a),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:te}),n=await j(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:be});process.platform==="darwin"&&n===1&&(n=WA);let o=t.documents[0],i=o.layout,a=o.nodes,l=a.nodeName||[],c=a.backendNodeId||[],s=i.nodeIndex,u=i.bounds,d=-1;for(let y=0;y<l.length;y++)if(c[y]===e){d=s.indexOf(y);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,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return Qg({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 Qg({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){await this.stopScreencast(),this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await ne(ft)}}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 C("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)}.
|
|
3987
|
-
Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!ti(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=rc(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 l of Object.values(this.stateManager.a11yIdToNodeMap))if(l.role==="image"&&l.name.toLowerCase().includes("captcha")){if(!l.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,l.backendNodeId);break}if(!e){let l=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!l.captchas||!l.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:te}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:Ia,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let l=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},l),new Error(l)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<XA;){await ne(2500);let l=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Ia,taskId:o})});if(!l.ok){let s=`Captcha solution API returned error response: ${l.statusText}`;throw this.logger.error({text:await l.text()},s),new Error(s)}let c=await l.json();if(c.errorId){let s=`Captcha solution API returned error ID ${c.errorId}`;throw this.logger.error(s),new Error(s)}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(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&ZC({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 s=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];ti(d,this.logger)&&d!==s&&this.logger.info({lastActivePages:n,currentUrl:s,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}}},ft);let l=async()=>{clearInterval(t)};e.addEventListener("abort",l,{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:oe})}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 ei({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let l=a;if(l.name==="AbortError")throw new C("UserInfrastructureError",`The page with URL ${Ze(i,50)} did not load within the configured timeout (${o}ms): ${l}`);if(!l.message.includes("detached"))throw l}try{await ei({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 zH.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 pt({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:be,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new C("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=be){let i=await this.getActivePageOrFrame();return pt({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=Zn}){let i=dC(),a={code:e,fragment:t,context:n},{result:l}=await j(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new C("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return l}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:be});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:oe})}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 C("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:l}=await this.getViewportOffsetDetails(e),c=Math.round(a),s=Math.round(l),u=Math.ceil(o*t),d=Math.ceil(i*n),p=u+s,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:oe,params:{highlightConfig:IC,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:oe,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:oe})}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[_n],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let l=e.locator(zr(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 s=await this.fetchHtmlAttributes({locator:l,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...s};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:l}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await j(this.performTargetRedirectionHelper(e,t,n),{milliseconds:te})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now(),i=await In(e,t);if(n===void 0&&(n=await e.boundingBox({timeout:te})??void 0),!n){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:a,y:l,width:c,height:s}=n,u=this.getViewport();if(a<0||l<0||!u||a+c>u.width||l+s>u.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let d=await this.getActivePageOrFrame(),{dataMomenticId:p,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:y}=await e.evaluate(w=>{let v=window;if(!v.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return v.performTargetRedirection(w)},void 0,{timeout:oe}),T=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:T,force:S,logs:y},"Got error from target redirection with bounding box");return}else{if(p)return t.info({newDataMomenticId:p,serializedElement:g,duration:T,force:S,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{locator:d.locator(zr(p)),hints:{clickableXY:f,force:S}};if(m)return t.info({newMPathSelector:m,serializedElement:g,duration:T,force:S,logs:y},"Redirected target to new element with bounding box with mPath"),{locator:d.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.info({point:f,serializedElement:g,duration:T,force:S,logs:y},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.info({serializedElement:g,duration:T,force:S,logs:y},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,l=await e.evaluate((c,s)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,s):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:be});if("error"in l&&l.error)throw l.error.startsWith(jA)?new pc(l.error):l.error.startsWith(VA)?new mc(l.error):new Error(l.error);return l.warnings.length&&t.warn(l,"Got warnings while generating HTML attributes for target"),l.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:oe})}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),l=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:l,x:n,y:o}}),{deltaX:a,deltaY:l}}canSolveCaptchas(){return!!Ia}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,Bg(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!fd(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()||jH(e),o=FH(e),i=VH(e),a=fm[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!fd(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:HH.getType(e)||"application/octet-stream"},{timeout:_g})}catch(s){this.logger.error({err:s},"Error handling file chooser"),this.logToUserConsole(this.page,"error",s.message)}});let l=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:s,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=s;let p=atob(s),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:l,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:[],harPages:{},harEntries:{}},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t,n){this.requestRecorders[e]={onRequestStart:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestStart(o,i)},onRequestComplete:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestComplete(o,i)}}}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??uf();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??qA}get userBrowserSettings(){return Oa(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Cg}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=cd();for(let t of e)if(!(!fd(t)||!ex(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=$H(t,o);return fd(i)&&ex(i).isDirectory()&&UH(i).length>0})))return t}};import u1 from"fetch-cookie";import{cloneDeep as gx}from"lodash-es";import{CookieJar as d1}from"tough-cookie";var yi=3.1783027;function qH(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 Pn(r){return Math.ceil(pf(r)/yi)}function pf(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
|
|
3988
|
-
`,""),t=t.replaceAll(" ","");let n=qH(t);return t.length-n+
|
|
3985
|
+
${A||""}`}return S}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:rf(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=rf(this.properties),e}},of=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 s=c.shallowClone();if(e[c.id])return s.properties["data-momentic-summary"]=e[c.id],n[c.id]=s,c.dataMomenticId&&(o[c.dataMomenticId]=s),c.mPathSelector&&(i[c.mPathSelector]=s),s;let u=[];for(let d of c.children){let p=a(d);p&&(u.push(p),p.parent=s)}return s.children=u,n[c.id]=s,c.dataMomenticId&&(o[c.dataMomenticId]=s),c.mPathSelector&&(i[c.mPathSelector]=s),s},l=a(t);return new r(l,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 l=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),s=i.children,u=!1,d=[];for(let p of s){let m=n(p,l||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,l||u)return c;if(af.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=t.shallowClone(),o=()=>n.serialize().length,i=(a,l)=>{l.children=[];for(let c of a.children){let s=c.shallowClone();if(s.parent=l,l.children.push(s),o()>e){l.children.pop();break}if(i(c,s),o()>e){for(;s.children.length>0&&o()>e;)s.children.pop();if(o()>e){l.children.pop();break}}}};for(i(t,n);n.children.length>0&&o()>e;)n.children.pop();return new r(n,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function RH(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 wH(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?(yc({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?(yc({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 zC({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:l,showZeroOpacityElements:c,filterByViewport:s,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 S=(H,de={})=>{},y=r.backendDOMNodeId,E=yH.includes(r.role?.value?.toLowerCase()??"");if(!E&&y===void 0)return S("Filtering out node since it doesn't exist in the DOM"),[];let w=y?i.backendIdToNode[y]:void 0;if(!E&&!w)try{let H=await j(h.send({method:"DOM.describeNode",params:{backendNodeId:y}}),{milliseconds:750,fallback:()=>{g.debug("Timeout getting node from CDP while processing a11y tree")}});if(H&&H.node.nodeName.toLowerCase()==="slot"&&H.node.distributedNodes?.length)g.debug({redirectedDomNode:w,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:H},"Redirecting node to assigned slot");else return S("Filtering out node since it doesn't exist in the DOM",{cdpResult:H}),[]}catch(H){return S("Filtering out node since it doesn't exist in the DOM",{err:H}),[]}if(w&&e&&s&&u&&r.backendDOMNodeId&&!wH(w,u,g,f))return w.momenticIgnored=!0,[];if(w&&w.computedStyles.display==="none")return w.momenticIgnored=!0,[];if(w&&w.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&w.tagName.toLowerCase()!=="input")return w.momenticIgnored=!0,[];if(c===!1)return w.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",x=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new nf({domNode:w,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:x,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(H=>(m??FC).includes(H.name)||UC.includes(H.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+RH(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:l}),_=n,M=a[t],Y=t;if(w?.tagName.toLowerCase()==="iframe"&&w.ownedFrameId){let H=n.childFrames.find(Ke=>Ke.frameId===w.ownedFrameId),de=o[H?.frameId??""]?.root,V=a[H?.frameId??""];if(H&&de&&V){r.childIds&&r.childIds.length>0&&g.debug("Replacing existing node's children with children from the iframe");let Ke=de;r.childIds=Ke.childIds,_=H,M=V,Y=H.frameId}}let W=w?.childrenBackendIds?.length??0,D=(r.childIds??[]).filter(H=>!!M.get(parseInt(H))).length;if(W>D){let H=r.childIds?.map(V=>M.get(parseInt(V))).filter(Boolean).map(V=>V?.backendDOMNodeId).filter(V=>V!==void 0)??[],de=0;for(let V of w?.childrenBackendIds??[]){if(H.includes(V)){de=(r.childIds?.findIndex(X=>M.get(parseInt(X))?.backendDOMNodeId===V)??0)+1;continue}let Ke=i.backendIdToNode[V];if(!Ke||Ke?.tagName.toLowerCase()!=="svg")continue;let Ie=Math.floor(-1*Math.random()*1e7),nt={nodeId:Ie.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:V,frameId:Y,role:{type:"string",value:"graphics-symbol"}};M.set(Ie,nt),r.childIds||(r.childIds=[]),r.childIds.splice(de,0,Ie.toString()),de++}}if(r.childIds?.length===1&&w){let H=M.get(parseInt(r.childIds[0])),de=H?.role?.value,V=w.childrenBackendIds;if(H&&de==="StaticText"&&V.length===1){let Ke=i.backendIdToNode[V[0]];if(Ke?.tagName?.toLowerCase()==="span"){let Ie=Math.floor(-1*Math.random()*1e7).toString(),nt={nodeId:Ie,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ke.backendNodeId,frameId:Y,childIds:[H.nodeId]};H.parentId=Ie,M.set(parseInt(Ie),nt),r.childIds=[Ie]}}}for(let H of r.childIds??[]){if(!H)continue;let de=M.get(parseInt(H));if(!de)continue;let V=await zC({node:de,parent:A,domGraph:i,axGraph:o,frameId:Y,frameContext:_,inputNodeMap:a,cdpClient:h,logger:g,callId:f,filterByViewport:s,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:l});V.length&&(A.children=A.children.concat(V))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let H=A.name,de=A.children[0]?.name;(H===de||!de)&&(A.children=[])}let Q=[];for(let H=A.children.length-1;H>=0;H--){let de=A.children[H];if(de.role!=="StaticText"){Q.push(de);continue}if(H===0||A.children[H-1].role!=="StaticText"){Q.push(de);continue}A.children[H-1].name+=de.name}if(A.children=Q.reverse(),!A.isInteresting(p)&&r.parentId)return w&&(w.momenticIgnored=!0),A.children;for(let H of A.children)H.parent=A;return xH(A),w&&d&&tf(w,i),[A]}function HC({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:l,iconKnowledgeBase:c,startId:s=1}){r.id=s,s+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:af.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(l[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let p=ef(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)s=HC({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:s,useMPaths:a,domGraph:i,selectorToNodeMap:l,iconKnowledgeBase:c});return s}async function GC({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:l,importantProperties:c,viewportDetails:s,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=dH(),S=A=>{let _=A.allNodes.filter(Y=>!Y.ignoredReasons?.find(D=>(m??FC).includes(D.name))),M=new Map;return _.forEach(Y=>{M.set(parseInt(Y.nodeId),Y)}),M},y={};Object.entries(r).forEach(([A,_])=>{y[A]=S(_)});let E=await zC({node:g,domGraph:e,parent:null,inputNodeMap:y,axGraph:r,frameId:h,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:s,useMPaths:u,flagNotActionableNodes:l,allowedA11yIgnoreReasonsOverride:m});if(E.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(E)}`);if(E.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let w={},v={},x={};return HC({node:E[0],a11yIdNodeMap:w,dataMomenticIdMap:v,selectorToNodeMap:x,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new of(E[0],w,v,x)}function AH(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<BC&&!Ar.bannedClassSubstrings.some(l=>a.includes(l))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(jC(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 CH(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,l])=>{let c=r[a]||a.startsWith("aria")||hH.includes(a);if((Ar.relevantElementAttributes.includes(a)||VC(a,t))&&!c){let u=AH(a,l,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&NC.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of NC)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 l=a.split(":"),c=l[0]?.trim(),s=l[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&s!==void 0&&u!==void 0&&(s==="*"||u===s)){let d=e.computedStyles[c],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function xH(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(s=>s.tagName==="tr");if(c){let s=c.children.filter(u=>u.tagName==="th");s.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(Ze(u.name,100,!1))}),i?.length!==s.length&&(i=void 0)}}let l=0;for(let c of r.children)if(c.tagName==="tbody")for(let s=0;s<c.children.length;s++){let u=c.children[s];if(u.tagName!=="tr")continue;if(s===0&&!i?.length){let m=u.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>Ze(h.name,100,!1)),i.length===m.length)continue;i=void 0}}l+=1,u.properties["row-index"]||(u.properties["row-index"]=l);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 _H(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function jC(r,e){if(e&&$C(r,e))return!0;if(Ar.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(Ar.alwaysInterestingClassNames.includes(r))return!0;for(let t of Ar.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function VC(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 $C(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 pd=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(),l,c;for(let u=0;u<2;u++)try{l=await j(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new C("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ne(ft),c=d}if(!l)throw c;let s=new r(l,e,t,n,o);try{await j(s.registerHandlers(l),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw s.cdpFullyDead=!0,new C("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return s}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await j(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new C("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 j(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 j(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new C("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 j(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 j(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 Ma="<empty>";function IH(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 qC(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||IH(r.url)}async function MH(r,e){let t=await r.send({timeout:te,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:te,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:te,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Pa({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:te,method:"Page.getFrameTree",params:{}}),r.send({timeout:te,method:"DOM.getDocument",params:{depth:0}})]),s=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(qC(d.frame))return null;try{return await KC({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(s);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function KC({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,l=await MH(r,a),c=l.attributes??[],s=null,u=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=yo(c,h);g&&(u.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(s=g))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:s,childFrames:[],parent:n,domNode:l},m=(e.childFrames??[]).map(async(h,g)=>{if(qC(h.frame))return null;try{return await KC({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 PH(r){try{return await r.owner().count()===1}catch{return!1}}async function OH(r){try{return await r.count()===1}catch{return!1}}async function mn(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 s of t){let u=!1;for(let d of[...s.locationData.attributeSelectors,Ma]){let p=o.frameLocator(d===Ma?"iframe":`iframe[${d}]`);if(await PH(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new C("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${s.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let s of[...r.locationData.attributeSelectors,Ma]){let u=o.locator(s===Ma?"iframe":`iframe[${s}]`);if(await OH(u)){a=u,i.push(s);break}}if(!a)throw new C("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 l=await a.evaluateHandle(s=>s,{timeout:oe}),c=await l.asElement().contentFrame();if(!c)throw new C("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await l.dispose(),{frame:c,mPathSelectorTokens:i}}function WC(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 YC({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let l=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===Ma?l=l.length===1?l[0].childFrames:[]:l=l.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],s=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(s===Ma?c=l:c=l.filter(u=>u.locationData.attributeSelectors.includes(s)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await mn(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 l=new RegExp(t.frameSrcRegex),c=WC(o,s=>!!s.src&&l.test(s.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await mn(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 l=new RegExp(t.frameUrlRegex),c=WC(o,s=>!!s.url&&l.test(s.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await mn(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 l=0;l<t.indices.length-1;l++)a=a[t.indices[l]]?.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 mn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Kr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function md(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function sf(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function XC(r){let e=sf(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let l=a.shift();l.src&&o.push(l.src),l.url&&i.push(l.url),a.push(...l.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function JC(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 QC({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await LH({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 LH({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await ti({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 l=Date.now();for(;Date.now()-l<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(s=>setTimeout(s,250))}}),timeoutMs:be,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}async function ZC({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:l,properties:c}=r.target;if(l){i.error({error:l,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let s=n.parentFrame()?n.url():void 0,d=n.page().frames().map(h=>h.url());i.debug({frameUrl:s,...r},"Passive click event captured on element");let p,m;if(s)try{let h=await n.frameElement();p=await j(h?.boundingBox(),{milliseconds:te})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:s});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:s}}(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 hn}from"crypto";import NH from"js-beautify";var DH=["Dead"],hd=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:(l,c)=>{this.recordedSteps.set(c,{step:l}),t.onStepRecorded(l,c)},onActionReceived:(l,c)=>{this.recordedSteps.set(c,{step:l}),t.onActionReceived?.(l,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:hn(),type:"PRESET_ACTION",command:yn(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,l=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=l,s;switch(e.frameConfig?e.frameBoundingBox?s={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"):s=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=yn(i);a={id:hn(),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:s}}}};break}case"SELECT":{i="SELECT_OPTION";let g=yn(i);a={id:hn(),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:s}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=yn(i);a={id:hn(),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:Ue(this.logger),boundingBox:s}}}};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=NH.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=$A(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,...Ue(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),p=l}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(DH.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=yn("TYPE");i={id:hn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=yn("PRESS");i={id:hn(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,l=this.nextStepOffset-1,c=this.recordedSteps.get(l),s=c?.step,u=s?.command;if(n){if(u?.type===i.command.type){let d=u.value,p=i.command.value;i={id:hn(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},a=l}else if(u?.type==="CLICK"&&i.command.type==="TYPE")s.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=l;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:hn(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=l}}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,l=this.recordedSteps.get(a)?.step.command,c;l?.type==="SCROLL_DOWN"&&l.deltaY?(i+=l.deltaY,c=a):l?.type==="SCROLL_UP"&&l.deltaY?(i-=l.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let s=i>0?"SCROLL_DOWN":"SCROLL_UP",u=yn(s);u.deltaY=Math.abs(i);let d={id:hn(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,l=this.recordedSteps.get(a)?.step.command,c;l?.type==="SCROLL_RIGHT"&&l.deltaX?(i+=l.deltaX,c=a):l?.type==="SCROLL_LEFT"&&l.deltaX?(i-=l.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let s=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=yn(s);u.deltaX=Math.abs(i);let d={id:hn(),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 lf}from"zod";var Hxe=lf.object({type:lf.literal("url"),url:lf.string()});var gd=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:l,enricher:c,iconKnowledgeBase:s,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=l,this.enricher=c,this.iconKnowledgeBase=s,this.userBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userBrowserSettings.importantStyles)for(let p of this.userBrowserSettings.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.userBrowserSettings.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=sf(e),{frame:o,mPathSelectorTokens:i}=await mn(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 Pa({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await YC({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(md(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:md(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await QC({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Pa({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[j(n.evaluate(e,t),{milliseconds:be})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),s=c.url;s==="about:blank"||s.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(mn(c,n).then(({frame:u})=>j(u.evaluate(e,t),{milliseconds:be})).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 Pa({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,l,c=null;if(this.frameConfig?.type==="url"){if(a=await Cr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new C("ActionFailureError","Got null frame details despite active frame config");l=a.handle,c=l.frameId}else this.userBrowserSettings.autoExpandIframes?(l=await Cr({fn:()=>Pa({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(l={type:"root",page:i,childFrames:[]},c=null);await Cr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:l.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let s=await Cr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await Cr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:l.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await Cr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:s,startingFrameId:c,frameContext:l,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=s,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:bn,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.userBrowserSettings.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=PC({node:o,domGraph:this.domGraph});return OC(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:be});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await LC(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(zr(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,l,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await Pa({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(s){if(l=s,s instanceof C&&s.reason==="UserInfrastructureError")throw s;c%3===0&&this.logger.warn({attempt:c,err:s},"Failed to resolve active frame, retrying..."),await ne(ft,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:md(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw l}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let l=i.shift(),c=l.domNode;i.push(...l.childFrames);let s=yo(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!s&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[s,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:l,matchType:"regex",...await mn(l,o)});break}}else if(n.trim()===d.trim()){a.push({handle:l,matchType:"url",...await mn(l,o)});break}}}if(a.length===1){let l=a[0];return this.userBrowserSettings.autoExpandIframes||(l.handle.childFrames=[]),l}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new C("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:l,showZeroOpacityElements:c,flagNotActionableNodes:s}){let u=await GC({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:s,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userBrowserSettings.importantAttributes,classes:this.userBrowserSettings.importantClasses,styles:this.userBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:l,useMPaths:this.userBrowserSettings.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.userBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),l=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let s=async()=>{try{let{frame:u}=await mn(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...")}};l.push(s())}await Promise.all(l)}async addMomenticIdsHelper(e,t){if(this.userBrowserSettings.visualActions)return t;let n=this.logger;return await pt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:be,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(yo(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=yo(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:te,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:te,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:te,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 l=[];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,s;for(let m=0;m<3;m++)try{s=await Cr({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(!s)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=s,!this.userBrowserSettings.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:l});if(!g)continue}catch(g){if(g.message.includes("Could not compute box model"))continue;l.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 Cr({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),l.length>0&&this.logger.warn({warnings:l},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await Cr({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 Cr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:be}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await Cr({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:te}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(l){await ne(ft,t),i++,a=l}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new C("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 MC({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=XC(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 cf(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var xr=class r{static USER_AGENT=sd;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;videos=[];baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:l,userBrowserSettings:c,viewport:s,properties:u,clientCallbacks:d,iconKnowledgeBase:p}){if(lT(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=l,this.userControlledBrowserSettings=c,this.viewport=s,this.properties=u,this.clientCallbacks=d,u.recordVideo){let m=this.page.video();m&&this.videos.push(m)}this.iconKnowledgeBase=p}registerAbortSignal(e){this.abortSignal=e}async initialize({grantPermissions:e,runInitScripts:t}){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),e&&await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera","geolocation"]);let n={[ad]:this.userBrowserSettings.visualActions},o=[this.context.addInitScript({content:GA.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(n)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})],i=a=>this.handleNewPageEvent(a);this.context.on("page",i),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",i)}),await Promise.all(o),t&&await this.page.reload(),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&GH()==="darwin"&&kH("system_profiler SPDisplaysDataType").toString().includes("Retina")?(T.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await pd.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new gd({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 yC(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}){let l=e.pages()[0];if(!l)throw new Error("No page found in existing context");let c=l.viewportSize();c||(c=await l.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})));let s=l?.url(),u=new r({browser:e.browser(),context:e,page:l,baseUrl:s,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:c,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await u.initialize({grantPermissions:!1,runInitScripts:!0}),u}async handleAvailableTabsChangeHelper(){try{let e=await Zg(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=uf(),o=`${e}-${n}`,i=Date.now(),a=!1,l=async()=>{try{await j(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.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]=l().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()||!ri(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let n=e.video();n&&this.videos.push(n)}try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=uf(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",a=>{oC(e,o,this.debugData,a,this.logger)});let i=async()=>{await sC(t,this.debugData,e),await e.route("**/*",async(a,l)=>{await Gg({pageId:t,route:a,request:l,debugData:this.debugData,logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",pC(this.customHeaders,this.logger)),Jr&&await e.route("**/*",ml),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"||!ri(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(l){this.logger.warn({err:l},"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){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await j(Xg(this.getBrowserCallbacks()),{milliseconds:oe})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0;try{this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Cg;){a++,n?.throwIfAborted();try{if(await pt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:oe,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(l){if(i++,i>=3){t.warn({err:l},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ne(ft),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),pt({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:te,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 ne(_a),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 l=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??be}),c=Buffer.from(l.data,"base64"),s=await tx.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(s.bitmap.width!==u||s.bitmap.height!==d)&&(c=await s.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&BH(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:te});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 S=await tx.fromBuffer(c),y=S.bitmap.width,E=S.bitmap.height;m=Math.max(0,Math.min(m,y-1)),h=Math.max(0,Math.min(h,E-1)),g=Math.max(1,Math.min(g,y-m)),f=Math.max(1,Math.min(f,E-h)),c=await S.crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}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}){wb(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(s){if(a=s,this.abortSignal?.throwIfAborted(),this.logger.warn({err:s},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await ne(ft),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:oe})}if(!i)throw new C("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 l=this.url();if(JA.has(l))throw new C("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(c){c instanceof Error&&c.message.includes("already registered")||this.logger.error({err:c},"Failed to install Momentic libraries for action recording")}await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElement(e){try{return await pt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;return n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n}:void 0},arg:void 0,timeout:oe,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 vC({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ne(_a),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25)):this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??pS}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:be})}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(l=>setTimeout(l,250))}},void 0,{timeout:be})}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 ud({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:oe}),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 nC(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:oe});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:oe,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(l){this.logger.warn({err:l,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 rC(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 tC(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 C("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Zg(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 l=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});l?(t.generatedSelectors=l.generatedSelectors,t.serializedHtml=l.serializedHtml,t.nodeOnlySerializedHtml=l.nodeOnlySerializedHtml,t.hybridSelector=l.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(l){if(l instanceof Yr)throw a.warn({err:l},"Cache attributes disqualify found element"),l;a.warn({err:l},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(l){a.debug({err:l},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Mg.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:te})),!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:l=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-l)<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 s=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(s),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({locator:e,requirements:t}){let n={};if(t?.boundingBox){let o=await e.boundingBox({timeout:te});if(!o||!o.width||!o.height)throw new C("ActionFailureError","Element does not have a bounding box as required");n.boundingBox=o??void 0}if(t?.text){let o=await e.innerText({timeout:te});n.text=o?.trim()}if(t?.attributes&&t.attributes.length>0){let o={};for(let i of t.attributes){let a=i.trim().toLowerCase();if(!(!a||Ar.bannedAiRequiredCacheAttributes.includes(a)))try{let l=await e.getAttribute(a,{timeout:te});l!==null&&(o[i]=l)}catch(l){this.logger.warn({err:l,attr:i},"Failed to fetch required attribute, continuing...")}}n.attributes=o}return n}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 l=await this.fetchHtmlAttributes({locator:a,logger:o});if(!l?.generatedSelectors||l.generatedSelectors.length===0)return;let c={selectors:l.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,l=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let s=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!s)continue;l.push(s)}catch(s){this.logger.warn({err:s,additionalElement:c},"Failed to fetch additional element details, continuing...")}return l}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:l}){t&&(o.requirements=await this.getElementRequiredValues({locator:i,requirements:t})),n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:l}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:l}){if(e<0)throw new C("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new C("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let s=this.stateManager.frameConfig,u,d,p,m;if(this.userBrowserSettings.autoExpandIframes&&!s&&c.parentFrame){let y=c.parentFrame,{cache:E,config:w}=await this.stateManager.getAutoFrameDetailsFromHandle(y);d=E,p=w,u=w.frame,m="auto iframe"}else c.parentFrame&&s?(p=s,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:Ue(i),frameCache:d},f,S=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:JC(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),S=!0),await this.updateCacheWithNewNodeDetails({node:c,target:g,locator:h,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:l,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{S&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:l}=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 ne(ft,a)}if(!h)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let s=Date.now(),u=0,d=0,p;for(;Date.now()-s<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-s>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,logger:m?i:bn,allowNotActionableNodesOverride:l,signal:a});break}catch(h){if(h instanceof fs)break;if(h instanceof Yr){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 ne(ft,a)}a?.throwIfAborted(),m&&i.info({err:h},`Could not resolve target using primary cache only (x${u})`),await ne(ft,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:l}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Ue(i),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}){let l=Oa(t),c=[],s=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),u;if(t.generatedSelectors||t.hybridSelector){let d;try{d=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a})}catch(p){u=p,p instanceof Kr&&c.push(...p.decisions)}if(d)return{...d,pageState:void 0,decisions:[...c,...d.decisions]};n||(c.push({type:"CSS_SELECTOR",matched:!1,reason:u?.message,selectors:Oa(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw u;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let d=await this.resolveTargetWithSecondaryMethods({root:e,tree:s,target:t,decisions:c,logger:o,signal:i,allowNotActionableNodesOverride:a});if(d)return d}throw new Kr(`Could not find any relevant node given target: ${JSON.stringify(l)}`,c)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o}){if(!t.nodeOnlySerializedHtml)throw new fs("Insufficient data to resolve target using primary methods (missing node HTML)");let i=this.userControlledBrowserSettings.hybridSelectorMode,a={ldistThreshold:Ig,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements},{css:l,hybrid:c}=await pt({fn:S=>window.evaluatePrimaryCaches(S),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:a},hybridParams:i&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:a}:void 0},root:e,timeout:te,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),s,u,d=[];if(i==="prefer"&&c?.result){s=c.result;let S={type:"HYBRID_SELECTOR",matched:!0,logs:c.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};d.push(S),u="HYBRID_SELECTOR"}else if(l?.result){s=l.result;let S=`${s.workingSelectors.length} CSS selectors matched the following element: ${s.serializedElement}`,y=s.workingSelectors.slice(0,5);d.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:S,selectors:y}),n.debug({reason:S,workingSelectors:y},"Resolved with CSS selectors"),u="CSS_SELECTOR"}else throw d.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),c&&d.push({type:"HYBRID_SELECTOR",matched:!1,reason:c.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:c.logs}),new Kr("Cache evaluation failed",d);let p,m,h;if(this.userBrowserSettings.visualActions){let S=s.mPath;if(!S)throw new Error("Found element did not have an mPath despite using visual actions");let y=S.join(" > ");p=e.locator(y),m=this.stateManager.getNodeUsingMPathSelector(y)}else if(s.dataMomenticId!==void 0)h=parseInt(s.dataMomenticId),m=this.stateManager.dataMomenticIdToNodeMap[h],"workingSelectors"in s?p=e.locator(s.workingSelectors[0]):p=e.locator(zr(h));else throw new C("InternalWebAgentError","Received an element resolution result with no identifying attributes");i&&t.hybridSelector&&(c?.logs.length===1?n.warn({hybridResult:c,cssResult:l,hybridMode:i},"Hybrid selector resolution rejected, continuing..."):c?.result?l?.result&&c?.result&&c.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(c.result.mPath)?n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==c.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):n.warn({originalCache:t,hybridResult:c,cssResult:l,hybridMode:i},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let g=Oa(t);await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:p,logger:n,startingBoundingBox:s.boundingBox,allowNotActionableNodesOverride:o});let f=df(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(n),t.cacheResolutionUpdateSource=u,n.debug({diffs:f},"Updated cache")),{a11yNode:m,displayString:s.serializedElement,locator:p,decisions:d}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,l=await this.getActivePageOrFrame(),c=Date.now(),s=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),s++;let p=l.locator(n),m;try{return await p.waitFor({state:"attached",timeout:oe}),m=await In(p,o)??"",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 C("ActionFailureError",`CSS selector '${n}' failed to resolve after ${s} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ne(ft,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 l=await a.locator.boundingBox({timeout:te});if(!l){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:s,width:u,height:d}=l;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||!s){this.logger.debug({oldX:t,oldY:n,newX:c,newY:s,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(s-n)>100){this.logger.debug({newX:c,newY:s,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<YA){let s="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:s})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let s=await pt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:be,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(Ig*t.nodeOnlySerializedHtml.length);if(s&&s.closestDistance&&s.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${s.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:s.closestDistance,closestElement:s.closestNodeSerialized})}else{if(s?.error)throw new Error(s.error);if(s?.dataMomenticId||s?.mPathSelector){let d=s.dataMomenticId?parseInt(s.dataMomenticId):void 0,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(zr(d));else if(s.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(s.mPathSelector),m=e.locator(s.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=s.closestNodeSerialized??await In(m,o)??"unknown element";o.warn({result:s,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance");let g=Oa(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:s.boundingBox,allowNotActionableNodesOverride:a});let f=df(g,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:s},"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:s.logs,distance:s.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(s)}`)}}catch(s){o.info({err:s},"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: ${s}`})}let l=t.screenshotUrl,c=t.role??"";if(l&&Mg.includes(c))try{let s=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:l,signal:i,allowNotActionableNodesOverride:a});return{...s,decisions:[...n,...s.decisions],pageState:void 0}}catch(s){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${s}`,elementImageUrl:l}),o.warn({err:s},"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(),s=WH(),u=await this.enricher.runTemplateMatching({id:s,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],S=Oa(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let y=df(S,t);return y&&Object.keys(y).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ue(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:s,diffs:y,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:oe})??"",i=bC.some(a=>a===o.toLowerCase());return await Jg({targetingResult:t,options:{force:n.force},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks()}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Jg({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks()})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,l=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),l=this.url(),Kc(l,t,n)){a=!0;break}await ne(ft,this.abortSignal)}if(!a)throw new C("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Fc(t)} in ${o}ms.
|
|
3986
|
+
Current tab: ${l}`);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:te});if(!o)throw new C("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,l=n.steps??5;await this.page.mouse.move(i,a,{steps:l}),await ne(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,be):500),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(Hg);i||(this.logger.warn("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:n}),await ne(_a),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Si({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:te});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 Si({func:t=>t.locator.focus({timeout:be}),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 pt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:oe,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Si({func:t=>t.locator.blur({timeout:be}),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 Si({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 C("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:te})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=dd(e);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=dd(e);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of cf(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=dd(e);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of cf(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}=e,a=e.abortSignal??this.abortSignal,l=!i,c=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:a});let s=0,u;for(;s<t;){s++;try{return await j(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:a,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:c,flagNotActionableNodes:l}),{milliseconds:this.pageLoadTimeout*s,signal:a,message:"Getting browser state took too long"})}catch(d){if(a?.throwIfAborted(),u=d instanceof Error?d.message:`${d}`,s>=t)throw d;n.warn({err:d,url:this.url()},"Error getting a11y tree, retrying...")}}throw new C("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${u}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await pt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:te,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()},l=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",l);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let s=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",s);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",l),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",s),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),l,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},s=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await ne(_a,this.abortSignal),l)try{let d=await this.screenshot(c);if(!d.equals(l)){l=d,s=!1;continue}s=!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{l=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<KA)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:s}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ne(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,_g):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,n,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(Hg);i||(this.logger.warn("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:n}),await ne(_a),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:te}),n=await j(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:be});process.platform==="darwin"&&n===1&&(n=WA);let o=t.documents[0],i=o.layout,a=o.nodes,l=a.nodeName||[],c=a.backendNodeId||[],s=i.nodeIndex,u=i.bounds,d=-1;for(let y=0;y<l.length;y++)if(c[y]===e){d=s.indexOf(y);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,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return Qg({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 Qg({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){await this.stopScreencast(),this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await ne(ft)}}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 C("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)}.
|
|
3987
|
+
Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!ri(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=rc(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 l of Object.values(this.stateManager.a11yIdToNodeMap))if(l.role==="image"&&l.name.toLowerCase().includes("captcha")){if(!l.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,l.backendNodeId);break}if(!e){let l=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!l.captchas||!l.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:te}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:Ia,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let l=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},l),new Error(l)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<XA;){await ne(2500);let l=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Ia,taskId:o})});if(!l.ok){let s=`Captcha solution API returned error response: ${l.statusText}`;throw this.logger.error({text:await l.text()},s),new Error(s)}let c=await l.json();if(c.errorId){let s=`Captcha solution API returned error ID ${c.errorId}`;throw this.logger.error(s),new Error(s)}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(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&ZC({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 s=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];ri(d,this.logger)&&d!==s&&this.logger.info({lastActivePages:n,currentUrl:s,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}}},ft);let l=async()=>{clearInterval(t)};e.addEventListener("abort",l,{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:oe})}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 ti({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let l=a;if(l.name==="AbortError")throw new C("UserInfrastructureError",`The page with URL ${Ze(i,50)} did not load within the configured timeout (${o}ms): ${l}`);if(!l.message.includes("detached"))throw l}try{await ti({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 zH.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 pt({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:be,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new C("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=be){let i=await this.getActivePageOrFrame();return pt({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=eo}){let i=dC(),a={code:e,fragment:t,context:n},{result:l}=await j(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new C("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return l}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:be});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:oe})}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 C("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:l}=await this.getViewportOffsetDetails(e),c=Math.round(a),s=Math.round(l),u=Math.ceil(o*t),d=Math.ceil(i*n),p=u+s,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:oe,params:{highlightConfig:IC,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:oe,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:oe})}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[_n],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let l=e.locator(zr(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 s=await this.fetchHtmlAttributes({locator:l,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...s};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:l}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await j(this.performTargetRedirectionHelper(e,t,n),{milliseconds:te})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now(),i=await In(e,t);if(n===void 0&&(n=await e.boundingBox({timeout:te})??void 0),!n){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:a,y:l,width:c,height:s}=n,u=this.getViewport();if(a<0||l<0||!u||a+c>u.width||l+s>u.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let d=await this.getActivePageOrFrame(),{dataMomenticId:p,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:y}=await e.evaluate(w=>{let v=window;if(!v.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return v.performTargetRedirection(w)},void 0,{timeout:oe}),E=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:E,force:S,logs:y},"Got error from target redirection with bounding box");return}else{if(p)return t.info({newDataMomenticId:p,serializedElement:g,duration:E,force:S,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{locator:d.locator(zr(p)),hints:{clickableXY:f,force:S}};if(m)return t.info({newMPathSelector:m,serializedElement:g,duration:E,force:S,logs:y},"Redirected target to new element with bounding box with mPath"),{locator:d.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.info({point:f,serializedElement:g,duration:E,force:S,logs:y},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.info({serializedElement:g,duration:E,force:S,logs:y},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,l=await e.evaluate((c,s)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,s):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:be});if("error"in l&&l.error)throw l.error.startsWith(jA)?new pc(l.error):l.error.startsWith(VA)?new mc(l.error):new Error(l.error);return l.warnings.length&&t.warn(l,"Got warnings while generating HTML attributes for target"),l.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:oe})}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),l=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:l,x:n,y:o}}),{deltaX:a,deltaY:l}}canSolveCaptchas(){return!!Ia}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,Bg(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!fd(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()||jH(e),o=FH(e),i=VH(e),a=fm[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!fd(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:HH.getType(e)||"application/octet-stream"},{timeout:_g})}catch(s){this.logger.error({err:s},"Error handling file chooser"),this.logToUserConsole(this.page,"error",s.message)}});let l=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:s,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=s;let p=atob(s),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:l,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:[],harPages:{},harEntries:{}},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t,n){this.requestRecorders[e]={onRequestStart:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestStart(o,i)},onRequestComplete:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestComplete(o,i)}}}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??uf();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??qA}get userBrowserSettings(){return Oa(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Cg}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=cd();for(let t of e)if(!(!fd(t)||!ex(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=$H(t,o);return fd(i)&&ex(i).isDirectory()&&UH(i).length>0})))return t}};import u1 from"fetch-cookie";import{cloneDeep as gx}from"lodash-es";import{CookieJar as d1}from"tough-cookie";var Ei=3.1783027;function qH(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 Pn(r){return Math.ceil(pf(r)/Ei)}function pf(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
|
|
3988
|
+
`,""),t=t.replaceAll(" ","");let n=qH(t);return t.length-n+Ei*n}if(typeof r>"u")return 0;if(typeof r=="number")return String(r).length;if(Array.isArray(r))return r.forEach(t=>{e+=pf(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*Ei:e+=85*Ei:e+=pf(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 ox={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},ix={minChunkTokenCount:5e3,acceptableChunkTokenCount:15e3,maxChunkTokenCount:5e4,maxLineLength:500},nx=/<(\S+) id="(\d+)".*?>/g,KH=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,ax=["h1","h2","section","footer","nav","aside","form","label","dialog"],YH=[...ax,"span","div","h3"],XH=["table","select","form","ul","ol","menu","pre","code","dialog"],JH=["table","form","dialog","nav","section","ul","select"];function Sd(r){return QH(r)}function QH({serializedTree:r,options:e,logger:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=e,l=[],c=r.split(`
|
|
3989
3989
|
`),s=0,u=[],d=0,p=[],m=[],h=!1;for(;s<c.length;){h&&(l.push({ids:p,content:u.join(`
|
|
3990
|
-
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],h=!1);let g=c[s],f=Pn(g);d+=f,g.length>a&&(g=g.slice(0,a));let
|
|
3991
|
-
`),tokenLength:d}),l.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${l.length})`)}),{chunks:l}}var ZH=9e5,yd=3e5,e1=5e3;async function
|
|
3990
|
+
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],h=!1);let g=c[s],f=Pn(g);d+=f,g.length>a&&(g=g.slice(0,a));let E=Array.from(g.matchAll(nx)).map(B=>B&&B.length>=3?{tagName:B[1],id:B[2]}:void 0).filter(B=>!!B),v=Array.from(g.matchAll(KH)).map(B=>B&&(B[2]||B[4])).filter(B=>!!B);v.reverse();let x=g.replace(/ id="[0-9]+"/g,"");u.push(x);for(let B of E)p.push(B.id),m.push(B);for(let B of v){let H=m[m.length-1];H&&H.tagName===B&&m.pop()}let A=m.some(B=>XH.includes(B.tagName)),_=c[s+1]??"",M=Pn(_),W=Array.from(_.matchAll(nx)).map(B=>B&&B.length>2?B[1]:void 0).filter(B=>!!B),D=W.some(B=>ax.includes(B)),Q=W.some(B=>YH.includes(B));d+M>=i&&(h=!0),d>=n&&(D&&!A||v.some(B=>JH.includes(B)))&&(h=!0),d>=o&&Q&&!A&&(h=!0),s++}return u.length&&l.push({ids:p,content:u.join(`
|
|
3991
|
+
`),tokenLength:d}),l.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${l.length})`)}),{chunks:l}}var ZH=9e5,yd=3e5,e1=5e3;async function Ti(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:l,signal:c}=t,s=r.tree,u=r.serializedTree,d=Pn(u);if(d>ZH)try{let p=Sd({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});s=await r1({...r,tokenLimit:yd-1e4,chunks:p.chunks}),u=s.serialize();let m=Pn(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"),s=s.pruneToSerializedCharLimit(yd*Ei),u=s.serialize(),i.info("Filtered page using naive truncation")}if(d>yd)try{if(o){let p=Sd({serializedTree:u,options:ix,logger:i});s=await j(t1({...r,chunks:p.chunks}),{milliseconds:12e3}),u=s.serialize();let m=Pn(u);i.info({oldTokens:d,newTokens:m},"Filtered page using AI chunk ranking"),d=m}else{let p=Sd({serializedTree:u,options:ox,logger:i});s=await j(n1({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=s.serialize();let m=Pn(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"),s=s.pruneToSerializedCharLimit(yd*Ei),u=s.serialize(),i.info("Filtered page using naive truncation")}if(o&&d>e1&&r.type==="locator"&&(l==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||l==="org_01HMJTX4GT1KG94KZRCT8MZ6YB"))try{let p=await a.getPageSummary({browserContext:u,currentStep:r.description,screenshot:n,type:r.type},{logger:i,loggerTags:Ue(i),abortSignal:c});if(i.info(p,"Got AI summaries"),p.category!=="OTHER"){let m=new Set;for(let g of p.relevantSections){let f=Math.min(g.startId,g.endId),S=Math.max(g.startId,g.endId);for(let y=f;y<=S;y++)m.add(y.toString())}s=s.pruneUsingRelevantIds(m),u=s.serialize();let h=Pn(u);i.info({newTokens:h,oldTokens:d},"Filtered page using AI summary"),d=h}}catch(p){i.warn({err:p},"Error filtering page using AI summary, continuing...")}return u}async function t1({type:r,chunks:e,description:t,fixtures:n,tree:o}){let{generator:i,signal:a,logger:l}=n,c=await i.rankChunksWithAi({chunks:e,description:t,type:r,softTokenLimit:4e4,hardTokenLimit:8e4},{abortSignal:a,logger:l,loggerTags:Ue(l)}),s=[];return e.forEach((d,p)=>{c.indices.includes(p)&&(s=s.concat(d.ids))}),o.pruneUsingRelevantIds(new Set(s))}async function r1(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 l=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:Ue(i),abortSignal:a});i.info({keywordsResult:l},"Got keywords for page filtering");for(let c of l.keywords){let s=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!s.length||s.reduce((m,h)=>m+h.tokenLength,0)>r.tokenLimit&&s.length>1)continue;let d=s.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function n1(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:l,signal:c}=t,s=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:l,loggerTags:Ue(l)});if(s.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(s.ids.map(d=>`${d}`)))}async function hf(r,e){if(!r.description)throw new C("UserConfigurationError","Cannot locate element with empty description");return dn({action:async()=>o1(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function o1(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:l,aiPageFiltering:c,logger:s,allowNotActionableNodesOverride:u}=r,{ctx:d,orgId:p,browser:m,localCodeEvalTools:h,generator:g,abortSignal:f}=e,S=r.description,y=r.useMemory&&!t;n&&(S=await ir({orgId:p,s:S,context:n,localTools:h,signal:f,logger:s})),a&&(S=a1(S,a));let{serializedTree:E,tree:w}=await go(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:s}),v,x=Date.now(),A;for(;!v&&Date.now()-x<3e3;){f.throwIfAborted();try{v=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(V){A=V}}if(!v)throw new C("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${A?.message}`);let _=E,M=!1,W=`data:image/jpeg;base64,${v.toString("base64")}`;_=await Ti({type:"locator",description:S,screenshot:W,serializedTree:E,options:{aiPageFiltering:c},tree:w,fixtures:{generator:g,signal:f,logger:s,orgId:p}}),_!==E&&(M=!0);let D=await g.getElementLocation({browserState:_,goal:S,screenshot:W,source:a,memory:y?l:void 0},{disableCache:t,abortSignal:f,loggerTags:Ue(s),useMemory:y});s.debug({usedRag:M,result:D},"Got locator result");let Q=D.id>0;if(d?.details?.push({type:"AI_LOCATION",matched:Q,pageState:_,ragUsed:M,thoughts:D.thoughts}),!Q)throw new Wi(`Could not find any relevant element: ${D.thoughts}`,D.updatedMemory?{type:"GCS_TRACES",traces:D.updatedMemory}:void 0);let{resolution:B,target:H,frameConfig:de}=await m.createTargetFromA11yId({id:D.id,requirements:D.requirements,additionalElements:D.additionalElements,description:S,targetSource:"AI",logger:s});if(B.a11yNode?.properties?.hidden&&B.a11yNode?.properties?.hidden!=="false")throw new C("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${B.displayString}`);return y&&(D.updatedMemory?H.memory={type:"GCS_TRACES",traces:D.updatedMemory}:l&&(H.memory=l)),{thoughts:D.thoughts,target:H,resolution:B,frameConfig:de,screenshot:W}}var i1=["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:"],sx="<select> element:",lx="text input or contenteditable element:",cx="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:",ux="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:",mf=[sx,lx,cx,ux,...i1];function dx(r,e){if(r===e)return!0;for(let t of mf){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(mf.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!mf.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function a1(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${sx} ${r}`;case"TYPE":return`${lx} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${cx}
|
|
3992
3992
|
${r}`;case"ELEMENT_CHECK":return`${ux}
|
|
3993
|
-
${r}`;default:return r}}var s1=15;async function Ed({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=s1}){if(!r.assertion.trim())throw new C("ActionFailureError","Assertion command is missing the assertion content");let{browser:l}=n,c=r.timeout?r.timeout*1e3:l.smartWaitingTimeout,s=Rb(c),u=0,d=Date.now(),p,m,h;try{await dn({action:()=>l.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:l,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 ne(s,n.abortSignal),g=Date.now();try{if(p=await dn({action:async()=>{let S=await px(l,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?p:(m=S,mx({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:l}),p?.updatedMemory&&Dc(r,p.updatedMemory,t),p?.success)break;throw p?.thoughts?new C("AssertionFailureError",p.thoughts):new C("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`),t.info({err:f},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await dn({action:async()=>mx({command:r,state:await px(l,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:l})}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(!p?.success){let f=`AI check still failing after ${u} attempts.`;throw h&&(f+=` Latest result: ${h.message}`),new C("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:l.url()}}async function px(r,e,t){let[n,o]=await Promise.all([ho(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function mx({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:l,source:c,logger:s}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,S=f.toString("base64"),y=u.url(),T=r.contextChoice??"MULTIMODAL",w=h;T!=="VISION_ONLY"&&(w=await Ei({type:"assertion",serializedTree:h,tree:g,description:r.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:s,orgId:t.orgId}}),w!==h&&(m.ragUsed=!0),m.pageState=w);let v={goal:r.assertion,url:y,memory:o?r.cache?.memory:void 0,browserState:w,screenshot:S,contextChoice:T,source:c},A=await(T==="VISION_ONLY"?(_,M)=>d.getVisualAssertionResult(_,M):(_,M)=>d.getAssertionResult(_,M))(v,{useConsensus:n,attemptNumber:l,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:s,loggerTags:Ue(s)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await l1(A.relevantElements,u,s)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function l1(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 j(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 c1=3e4;async function hx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??c1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let l;if(ra(r.url)&&(l=r.url),t&&na(r.url,t)&&(l=new URL(r.url,t).toString()),!l)throw new C("ActionFailureError",`Invalid URL: ${r.url}`);let s=await j((async()=>{try{return await n(l,{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(!s)throw new C("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!s.ok){let d,p=await s.text();try{d=JSON.parse(p)}catch{throw new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${d.errors[0].message}`):new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${p}`)}let u={};return s.headers.forEach((d,p)=>{u[p]=d}),{status:s.status,headers:u,json:await s.json()}}var yo=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:l,visualDiffScreenshotStorage:c,options:s}){this.orgId=i,this.options=s,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=l,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:l=this.logger}){let[c,s]=await Promise.all([ho(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:l}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${s.toString("base64")}`,d=await Ei({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:l,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:{...Ue(l)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:l}){let c=this.browser.url(),[s,u]=await Promise.all([ho(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 Ei({type:"ai-action",description:e,screenshot:d,serializedTree:s.serializedTree,tree:s.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:{...Ue(a)},langfuseSessionId:l})}catch(h){throw new C("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return ho(this.browser,e)}async locateElement(e){return await hf({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return dn({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:l,options:c,retriesWithAI:s=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 l(...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(),s>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:l,options:c,retriesWithAI:s-1});throw new C("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 dn({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&&dm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(mm(i)||pm(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(hm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Yr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof C?n:new C("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:l}=o;if(t.type!=="description")throw new C("ActionFailureError","Cannot use selector with non-description target");let c,s=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){s=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:l,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()-s<500&&await ne(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:l,command:c}=e,{disableCache:s,useSelector:u,targetName:d,targetHealingInProgress:p,source:m}=l,h=this.logger.child({commandId:c.id}),g=this.shouldUseMemory(),f=l.retriesWithAI??1,S=!1,y=gx(e.cache);if((!y||s)&&!pp(o))throw new C("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);s&&(h.info("Cache explicitly disabled for this step"),S=!0,y=void 0),y&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&y.targetSource==="HEURISTIC_HEALED"&&(S=!0,y=void 0),y?.inputDescription&&!dx(o.elementDescriptor,y.inputDescription)&&(h.warn({old:y.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),S=!0,y=void 0);let T=v=>!!v&&_l(v),w=!0;if(!T(y)){w=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:S,memory:l.memory,useMemory:g},"Prompting AI for an updated element location"),S&&await ne(this.browser.smartWaitingTimeout,this.executeAbortController.signal),f--;let v;try{v=await hf({description:o.elementDescriptor,disableCache:!!l.disableCache,iframeUrl:l.iframeUrl,source:m,useMemory:g,memory:g?l.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:l.allowNotActionableNodesOverride,logger:h},this.getControllerFixtures(t))}catch(_){if(_ instanceof Wi&&_.updatedLocatorMemory){let M={id:-1,...i,memory:_.updatedLocatorMemory};Nc({cmd:c,key:d,newTarget:M,logger:h,updatedWithAI:!0})}throw new C("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let x=l.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),A=await a(x);return Nc({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=Ue(h)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,y,{allowNotActionableNodesOverride:l.allowNotActionableNodesOverride,targetName:d,logger:h,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let x=l.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),A=await a(x);if(qt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`]),Nc({cmd:c,key:d,newTarget:y,logger:h,updatedWithAI:!1}),w){let _=v.decisions.filter(M=>M.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let M=_[0].type;n.recordTargetAutoHeal({healType:M})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed(),qt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`]);let x=!1;if((v instanceof Yr||dm(v)||mm(v)||hm(v)||qy(v)||pm(v))&&(x=!0),v instanceof C&&!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 A;return y.memory&&Il(y.memory)&&(A=y.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...l,memory:A,retriesWithAI:f,targetHealingInProgress:!0}})}throw new C("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 Hs(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ne(this.options.slowMoMs);let a=await this.browser.getOpenPages(),l=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(s){throw this.throwIfClosed(),new C("ActionFailureError",`Failed to substitute template strings in command: ${s.message}`,{errOptions:{cause:s}})}try{let s=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&hS(n)?await this.browser.waitForDOMStability({timeout:be}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:oe}),this.options?.autoFollowNewTabs&&await kA({beforeUrl:l,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),s}catch(s){throw s.name!=="AbortError"&&this.logger.error({err:s},"Error thrown in action controller"),s}finally{lv(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Fg(e)}}async resolveCommandTemplateStrings(e,t){return iu({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 l=n.condition;return l?.assertion.trim()?Ed({command:l,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 C("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new C("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ed({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new C("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=sT(n.schema);if(f)throw new C("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:Ue(a)});if(f.result==="NOT_FOUND")throw new C("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new C("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let S=f.message;throw S.includes("MaxGenerationLengthExceededError")?new C("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."):S.includes("AIProviderError")&&S.includes("time")?new C("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(!ra(n.url)&&!na(n.url,this.browser.baseUrl))throw new C("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&&$r(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:y,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:w=>this.browser.hover(w),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});h=y,g=T}let f=this.browser.getViewport()?.height??Lt.height,S=this.browser.getViewport()?.width??Lt.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??S));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??S);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new C("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 C("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=n.delay*1e3;await ne(s,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if($r(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let h=this.browser.url(),{elementInteractedDisplayString:g,result:f,thoughts:S}=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}}),y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:S,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return Yc(h,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}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($r(n.fromTarget)&&$r(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if($r(n.fromTarget)||$r(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,S)=>this.browser.dragAndDrop(f.locator,S.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 C("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&$r(n.target)){await this.browser.mouseDragUsingVisualCoordinates(h,g,f,n.target.pixels,{force:n.force});break}let S,y,T;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:w,result:v,thoughts:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async A=>A.locator,options:{disableCache:i,targetName:"target",...n}});S=v,y=w,T=x}return await this.browser.mouseDrag(h,g,f,S,{force:n.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:T}}case"SELECT_OPTION":{if(!Hn(n.target))throw new Error("Select with x/y is not supported yet");let h=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:f,thoughts:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:h},cache:n.cache?.target,action:y=>this.browser.selectOption(y,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Bo(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}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 ao({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 C("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(h)}catch(g){throw new C("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&&$r(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,S=gx(n.target);if(S){let{elementInteractedDisplayString:T,thoughts:w}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:S,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!0,source:Bo(n)}});g=T,f=w}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f};return Yc(h,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}case"HOVER":{if($r(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(!Hn(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&&!Hn(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 Yc(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 d1,g=u1(fetch,h),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await gv({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g}),cookies:by(h,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await hx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return hv({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 ZA({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 C("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 ao({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof h!="object")throw new C("ActionFailureError",`Credentials must evaluate to an object (received ${typeof h} instead)`);let g;try{g=nc.optional().parse(h)}catch(f){throw new C("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let h=(n.timeout??Wr)*1e3,g=this.generator.getAgentConfig()?.assertion;if(pv(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let S={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 y=await Ed({command:S,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: ${y.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:y.afterScreenshotOverride}}finally{S.cache?.memory&&Dc(n,S.cache?.memory.traces,a)}}let f=await dv({command:n,tracer:t,timeoutMs:h,targetingWrapper:S=>this.wrapElementTargetingCommand(S),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 dn({action:async()=>su({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 fo(n.requestMatcher),g=this.browser.registerRequestListener(h);return this.registeredListeners[n.key]=g.then(async f=>await jg(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 C("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await j(h,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let h=new fo(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,h,{onRequestStart:(g,f)=>{this.recordedRequests[n.key][g]=ld(f)},onRequestComplete:(g,f)=>{this.recordedRequests[n.key][g]=ld(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let h=this.recordedRequests[n.key];if(!h)throw new C("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 fo(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 fo(n.requestMatcher),async(g,f)=>{let S=await ao({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"}),y=ky.parse(S);return new Response(y.body,{status:y.status,headers:y.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:Ue(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new hd({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}};import{cloneDeep as p1}from"lodash-es";var m1={showOverlay:!1},Td=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:p1(m1),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 fx(r,e,t,n){let o=Date.now(),i=Date.now(),a,l,c,s,u=!1,d=async(g,f)=>{if(!g.closed&&!g.isInPageLoad)try{let S=c;c=void 0;let y=g.url(),T=f.toEditorDisplayCopy();JSON.stringify(T)===JSON.stringify(a)&&y===s&&o>i||(r.emit("browserState",{logsPerPage:S?.logsPerPage,harPages:S?.harPages,harEntries:S?.harEntries,viewport:g.getViewport(),url:y,iframeSrcUrls:l??[],context:T,isInPageLoad:g.isInPageLoad}),o=Date.now()),s=y,a=T}catch(S){if(!r.connected)return;let y=S instanceof Error?S.message:`${S}`;if(y.includes("Frame was detached")||y.includes("Not attached to an active page")||y.includes("browser has been closed")||y.includes("UserInfrastructureError"))return;t.error({err:S,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(l)||f.logsPerPage.some(S=>S.length>0)||f.harPages&&Object.keys(f.harPages).length>0||f.harEntries&&Object.keys(f.harEntries).length>0),h=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(h);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),y=f.retrieveAndClearDebugData();m(S,y)&&(l=S,c=y,i=Date.now())}catch(S){t.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var h1=4;async function Sx({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:l,authorization:c,settingsFactory:s,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 S=await a(g,e),y=await l(g,e),T=await s(g,e),w=await t(g),{testMetadata:v,baseUrl:x,envName:A,browserConfig:_,aiSettings:M,environmentVariables:Y,localCodeEvalTools:W}=await Ti({testId:h,orgId:g,logger:e,storage:w,authorization:c,settings:T}),D=p.getSession(m);if(D)return e.info("Associating connection with existing session (likely reconnect)"),await D.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let Q=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:Q,event:"connect",args:r.handshake.query},"Websocket event (connect)"),Q&&p.getCurrentConnectionsByIp(Q)>=h1)throw e.error({clientIp:Q,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(Q);try{await g1({socket:r,baseUrl:x,envName:A,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:Y,clientIp:Q,devicePixelRatio:i,storage:w,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:W,generator:S,enricher:y,browserConfig:_,aiSettings:M,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(Q),B}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function g1({socket:r,baseUrl:e,envName:t,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:l,storage:c,uploadedFileStorage:s,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:h,aiSettings:g,clientIp:f,enricher:S,globalE2eStateManager:y}){let T={viewport:o.advanced?.viewport??Lt,locale:o.advanced?.locale??Wn,timezoneId:o.advanced?.timezone??qn,geolocation:o.advanced?.geolocation??Kn,colorScheme:o.advanced?.colorScheme};n&&(T.deviceScaleFactor=n);let w=o.id,v=await id({settings:h,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:l,customHeaders:void 0});l=l.child({orgId:i,sessionId:a,testId:w});let x=await xr.init({baseUrl:e,userBrowserSettings:v,enricher:S,storage:c,logger:l,contextArgs:T,iconKnowledgeBase:null,callbacks:{onTabsChange:(W,D)=>{r.emit("tabs",{tabs:W,activeTab:D})},onScreencastFrame:(W,D)=>{let Q=r;Jr&&(Q=r.compress(!0)),Q.emit("screenshot",{buffer:W},()=>{D()})},onSvgsCollected:W=>{r.emit("newIconDetected",{numIcons:W.newSvgs.length}),c.saveNewIcons(W,l)}}});await x.navigate({url:e,initialNavigation:!0});let A=new yo({browser:x,generator:p,logger:l,orgId:i,options:{scratchPadId:void 0,slowMoMs:v.slowMoMs,autoFollowNewTabs:v.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:s,visualDiffScreenshotStorage:u}),_=fx(r,a,l,y),M=async()=>{_.timers.forEach(W=>clearInterval(W))},Y=new Yt({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await x.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:xr.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),y.registerSession({controller:A,context:Y,sessionId:a,cleanup:M,clientIp:f,socket:r})}async function Ti({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 l;o?.type==="API_KEY"&&(l=new en({httpClient:new At({...o,logger:t}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),s;c&&(s=await n.fetchEnvironment(c.name,t));let u=s&&"browser"in s?s.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||s?.variables?.[St];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...s?.variables};await Promise.all((a.parameters??[]).map(async g=>{let f=await ir({orgId:e,s:g.defaultValue,context:Yt.dummyContext(a.name,s?.name,m),logger:t,localTools:l});m[g.name]=f}));let h={...i.ai,...a.advanced};return{localCodeEvalTools:l,baseUrl:p,envName:s?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:h}}var gf=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;qt.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))qt.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 gf({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},bd=class{constructor(e,t,n,o,i){this.socket=e;this.storage=t;this.orgId=n;this.testId=o;this.stepsBeforeRun=i}children=[];loggerBindings;async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}attachConsoleLogs(){}attachNetworkLogs(){}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 ff={currentlyExecutingRequests:{}},S1=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),l,c=await Ti({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),s=`${n}|${c.baseUrl}`;try{let u=ff.currentlyExecutingRequests[s]??0;ff.currentlyExecutingRequests[s]=u+1,l=await y1({...r,...e,...c,done:t})}finally{r.logger.info({result:l,sessionId:r.metadata.sessionId},"Test execution complete"),ff.currentlyExecutingRequests[s]--}},y1=async({socket:r,steps:e,baseUrl:t,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:l,aiSettings:c,browserConfig:s,metadata:u,logger:d,envName:p,testName:m,environmentVariables:h,localCodeEvalTools:g,done:f,cacheStorageFactory:S,globalE2eStateManager:y})=>{let{testId:T,sessionId:w,orgId:v}=u,x=w,A=y.getSession(w);if(!A)throw new Error("No active session found");let{controller:_,context:M}=A;_.setOpen(),d=d.child({testId:T,orgId:v,sessionId:w,runId:x}),d.info({steps:e.map(X=>`${X.type}${"command"in X?` - ${X.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:M,browserConfig:s,aiSettings:c},"Socket execution parameters");let Y=h??{},W=async()=>{o&&(await _.browser.reset({newUrl:t}),M.reset({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:Y,envName:p,testName:m}))},D=await l(v),Q=await S(v),B=async()=>{try{await Q.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:T,stepLists:{steps:e},logger:d})}catch(X){d.error({err:X},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await Ps({promiseGenerator:async()=>Promise.all([W(),B()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(X){if(r.emit("finished"),X.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${X}`)}let H=f1(e),de={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},V={orgId:v,runId:x,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:s}},Ke={controller:_,context:M,storage:D,codeEvalTools:g,usageTracker:new Gi,logger:d},_e={test:{},step:{onDynamicAIActionStatusUpdateEvent:X=>{r.emit("dynamicCommandStatusUpdate",X)},onDynamicAIActionEvaluatingEvent:X=>{r.emit("dynamicCommandEvaluating",X)},onDynamicCommandGenerated:X=>{r.emit("dynamicCommandGenerated",X)},onDynamicCommandExecuted:X=>{r.emit("dynamicCommandExecuted",X)}}},nt=new bd(r,D,v,T,H),_t=await od({fixtures:Ke,options:de,callbacks:_e,inputs:V,testParams:{tracer:nt}});return _t?.status==="PASSED"?await Vc({logger:d,cacheStorage:Q,orgId:v,testId:T,originalSteps:{steps:H},updatedSteps:{steps:e}}):_t?.status==="FAILED"&&await $c({logger:d,cacheStorage:Q,orgId:v,testId:T,originalSteps:{steps:H},updatedSteps:{steps:e}}),await nt.finish(),f?.(_t),_t.status};var yx={event:"execute",createHandler:S1};import{cloneDeep as E1}from"lodash-es";var T1=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=E1(e),l=jT(a);if(l.category!=="NO_DESCRIPTION_PROVIDED"){if(l.category!=="NONE"){t?.({result:l});return}"cache"in a&&(a.cache=void 0);try{let s=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:s})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},Ex={event:"lintStep",createHandler:T1};var b1=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;return async(a,l)=>{let{description:c,command:s,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=Vo.parse(u.advanced??{}),S={},y;if(c){if("useSelector"in s&&s.useSelector)try{let T=await m.locateElementWithSelector(c,"iframeUrl"in s?s.iframeUrl:void 0);y=T.resolution.locator,S={target:T.target,thoughts:T.thoughts}}catch(T){e.warn({err:T},"Failed resolving target with selector"),l({err:`Failed locating element: ${T.message}`,decisions:T instanceof Kr?T.decisions:void 0});return}else try{let T=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:Bo(s),iframeUrl:"iframeUrl"in s?s.iframeUrl:void 0,memory:"cache"in s&&s.cache&&"target"in s.cache&&Il(s.cache.target.memory)?s.cache.target.memory:void 0,logger:e});S={target:T.target,thoughts:T.thoughts},y=T.resolution.locator}catch(T){(async()=>{try{let w=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:T,html:w.slice(0,1e5)},"Failed locating element with AI")}catch(w){e.warn({err:w},"Failed grabbing HTML after trying to locate element with AI")}})(),l({err:`${T.message}`});return}if(s.type==="SELECT_OPTION"&&y)try{S.options=await m.browser.getSelectOptions(y)}catch(T){e.warn({err:T},"Failed getting select options"),l({err:`Failed getting select options: ${T.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:T,width:w,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:y}),x=await g.uploadScreenshot(T);S.screenshot={data:x,width:w,height:v},e.info({width:w,height:v},"Captured screenshot during locate")}catch(T){e.error({err:T},"Error capturing screenshot during locate"),l({err:`Error taking screenshot: ${T.message}`});return}if(l({result:S}),y)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(y),m.browser.highlight(y)])}catch(T){e.warn({err:T},"Error highlighting element, continuing...")}}},Tx={event:"locate",createHandler:b1};var v1=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let l=t.getSession(n);if(!l)throw new Error("No active session found");let c=l.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(s){e.error({err:s},"Error performing click during cloud recording in control mode")}}},bx={event:"mouseClickEvent",createHandler:v1};var R1=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:l}=r;return async({stepId:c,parentStepIdChain:s,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(S){t.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(S,y)=>{y.type!=="PRESET_ACTION"||y.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:s,command:y.command,attribute:u}),h.abort(),g=!0)};setTimeout(()=>{g||(h.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:s,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:t,testId:l,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:s,attribute:u})}},vx={event:"recordTargetClick",createHandler:R1};var w1=({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(l){if(l.message.includes("has been closed")){e.debug({sessionId:n,err:l},"Browser is closed, ignoring key down socket event error");return}throw l}}},Rx={event:"keyDownEvent",createHandler:w1};var A1=({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(l){if(l.message.includes("has been closed")){e.debug({sessionId:n,err:l},"Browser is closed, ignoring key up socket event error");return}throw l}}},wx={event:"keyUpEvent",createHandler:A1};var C1=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,o,i=0,a=(s,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},l,c=0;return async s=>{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(s.event==="scroll"){let h=await m.scrollFromPositionPercentages(s.percentX,s.percentY,l?.x??0,l?.y??0),g=u.browserBehavior.recordingState?.transformer;g&&h&&g.recordScroll(h);return}p.showOverlay&&a(m,s);try{let h=await m.moveMouseFromPositionPercentages(s.percentX,s.percentY);c=0,l=h}catch(h){c++,c%5===0&&e.warn({err:h,mouseErrors:c},"Error in socket mouse move handler")}}},Ax={event:"mouseMoveEvent",createHandler:C1};var x1=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:l}=r;return async({stepId:c})=>{let s=o.getSession(i);if(!s)throw new Error("No active session found");let{controller:u,browserBehavior:d}=s,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,h=await u.startRecordMode({params:{generator:p,logger:n,testId:l,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}}},Cx={event:"recordingStart",createHandler:x1};var _1=({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}},xx={event:"recordingStop",createHandler:_1};var I1=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(l,c)=>{let{testId:s,sessionId:u,orgId:d}=e;t.info({testId:s,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:h}=await Ti({testId:s,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 S=f.browser.getViewport();t.info({baseUrl:h,viewport:S},`Session refreshed for test ${s} at ${h}`),c()},_x={event:"refresh",createHandler:I1};var M1=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:l,sessionId:c,orgId:s}=e;t.info({testId:l,sessionId:c},"Reset event received");let u=await i(s,t),d=await n(s),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await Ti({testId:l,orgId:s,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:S,context:y}=f;await S.browser.reset({newUrl:p});let T=S.browser.baseUrl;y.reset({baseUrl:T,currentUrl:S.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let w=S.browser.getViewport(),v=xr.USER_AGENT;t.info({baseUrl:p,viewport:w},`Session reset for test ${l} at ${T}`),r.emit("session",{url:T,userAgent:v,viewport:w,sessionId:c})},Ix={event:"reset",createHandler:M1};var P1=({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})}},Mx={event:"switchTab",createHandler:P1};async function Px(r){return Sx(r)}var Ox=[ev,yx,Tx,Ix,_x,Jb,Mx,Ex,vx,Cx,xx,Ax,bx,Rx,wx,Zb,Qb];var Lx=r=>{let{logger:e}=r,t=new O1(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 Px({...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}Ox.forEach(i=>L1(i,{...r,socket:n,metadata:o,logger:e}))}),t},L1=(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 U1}from"express";import{Router as D1}from"express";import fl from"fs";import gl from"path";import{v4 as k1}from"uuid";import F1 from"yaml";import{hostname as N1}from"os";var Sf="2.17.19",et=Rc({app:"desktop-server",hostname:N1(),disableConsoleLogs:!0}).child({cliVersion:Sf});(async()=>{try{let r=await Bs(et);r.gitBranchName&&et.addBinding("branch",r.gitBranchName)}catch{}})();var La=D1();async function yf(r){return(await eu(r,et)).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)}La.get("/",Ee(async(r,e)=>{let t=se(),n=await K(t),o=await yf(n);e.status(200).json(o)}));La.post("/",Ee(async(r,e)=>{let t;try{t=rE.parse(r.body)}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}try{Yn(t.name)}catch(l){e.status(400).json({error:`Invalid module name: ${l}`});return}let n=se(),o=(await K(n)).modules;if(Object.values(o).find(l=>l.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=gl.join(n.rootDir,t.folderPath??"");if(!fl.existsSync(i)||!fl.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Zc({...t,folder:i,project:n});e.status(201).json(a)}));La.get("/:moduleId",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await K(se()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await kr(n,t,E);e.json(o)}catch(o){e.status(400).json({err:o})}}));La.post("/:moduleId/duplicate",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=tE.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{Yn(t.name)}catch(g){e.status(400).json({error:g.message});return}let n=se(),o=await K(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 kr(i,o,E),l=gl.join(n.rootDir,gl.dirname(i.relativePath));if(!fl.existsSync(l)||!fl.statSync(l).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${l}' does not exist.`});return}let c=Ie(t.name),s=gl.join(l,`${c}.module.yaml`),u=k1(),{stepsToSave:d}=await We({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:Et()}}),p={fileType:pe.MODULE,schemaVersion:le,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=F1.stringify(p);fl.writeFileSync(s,m,"utf-8");let h={relativeFilePath:gl.relative(n.rootDir,s)};e.status(201).json(h)}));La.patch("/:moduleId/metadata",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=nE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=se(),o=await K(n);Ob({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:E,project:n}),e.status(201).json({message:"ok"})}));var Nx=La;var Dx=U1();Dx.get("/",Ee(async(r,e)=>{let t=se(),n=await K(t),o=new Set;n?.tests&&Object.values(n.tests).forEach(s=>{s.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),l=await yf(n),c={labels:i,tests:a,modules:l};e.status(200).json(c)}));var kx=Dx;import{Router as B1}from"express";var Ef=B1();Ef.get("/",Ee((r,e)=>{let t=tu(se(),et);e.status(200).json(t)}));Ef.get("/names",Ee((r,e)=>{let n=se().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var Fx=Ef;import{Router as z1}from"express";var Ux=z1();Ux.get("/",Ee((r,e)=>{e.status(200).json({userId:aa(),orgId:Et()})}));var Bx=Ux;import{StreamableHTTPServerTransport as UG}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as BG}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as zG}from"crypto";import{Router as HG}from"express";import{McpServer as kG}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as FG}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as $1}from"ai";import Cd from"dedent";import{z as To}from"zod";import{tool as H1}from"ai";import{z as G1}from"zod";var vd=r=>({builder:(t,n)=>H1({description:r.schema.description,inputSchema:G1.object(r.schema.inputSchema),execute:async o=>{t.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(t,o,n,void 0)}catch(a){n.addError(String(a))}let i=await n.serialize();return i.isError?t.logger.error({toolName:r.schema.name,input:o,err:i.content.map(a=>a.text).join(`
|
|
3993
|
+
${r}`;default:return r}}var s1=15;async function Ed({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=s1}){if(!r.assertion.trim())throw new C("ActionFailureError","Assertion command is missing the assertion content");let{browser:l}=n,c=r.timeout?r.timeout*1e3:l.smartWaitingTimeout,s=Rb(c),u=0,d=Date.now(),p,m,h;try{await dn({action:()=>l.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:l,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 ne(s,n.abortSignal),g=Date.now();try{if(p=await dn({action:async()=>{let S=await px(l,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?p:(m=S,mx({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:l}),p?.updatedMemory&&Dc(r,p.updatedMemory,t),p?.success)break;throw p?.thoughts?new C("AssertionFailureError",p.thoughts):new C("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`),t.info({err:f},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await dn({action:async()=>mx({command:r,state:await px(l,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:l})}catch(f){n.abortSignal.throwIfAborted(),h=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(!p?.success){let f=`AI check still failing after ${u} attempts.`;throw h&&(f+=` Latest result: ${h.message}`),new C("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:l.url()}}async function px(r,e,t){let[n,o]=await Promise.all([go(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function mx({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:l,source:c,logger:s}){let{browser:u,generator:d,abortSignal:p}=t,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,S=f.toString("base64"),y=u.url(),E=r.contextChoice??"MULTIMODAL",w=h;E!=="VISION_ONLY"&&(w=await Ti({type:"assertion",serializedTree:h,tree:g,description:r.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:s,orgId:t.orgId}}),w!==h&&(m.ragUsed=!0),m.pageState=w);let v={goal:r.assertion,url:y,memory:o?r.cache?.memory:void 0,browserState:w,screenshot:S,contextChoice:E,source:c},A=await(E==="VISION_ONLY"?(_,M)=>d.getVisualAssertionResult(_,M):(_,M)=>d.getAssertionResult(_,M))(v,{useConsensus:n,attemptNumber:l,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:s,loggerTags:Ue(s)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await l1(A.relevantElements,u,s)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function l1(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 j(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 c1=3e4;async function hx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??c1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let l;if(ra(r.url)&&(l=r.url),t&&na(r.url,t)&&(l=new URL(r.url,t).toString()),!l)throw new C("ActionFailureError",`Invalid URL: ${r.url}`);let s=await j((async()=>{try{return await n(l,{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(!s)throw new C("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!s.ok){let d,p=await s.text();try{d=JSON.parse(p)}catch{throw new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${d.errors[0].message}`):new C("ActionFailureError",`GraphQL request failed with status ${s.status}: ${p}`)}let u={};return s.headers.forEach((d,p)=>{u[p]=d}),{status:s.status,headers:u,json:await s.json()}}var Eo=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:l,visualDiffScreenshotStorage:c,options:s}){this.orgId=i,this.options=s,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=l,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:l=this.logger}){let[c,s]=await Promise.all([go(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:l}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${s.toString("base64")}`,d=await Ti({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:l,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:{...Ue(l)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:l}){let c=this.browser.url(),[s,u]=await Promise.all([go(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 Ti({type:"ai-action",description:e,screenshot:d,serializedTree:s.serializedTree,tree:s.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:{...Ue(a)},langfuseSessionId:l})}catch(h){throw new C("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return go(this.browser,e)}async locateElement(e){return await hf({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return dn({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:l,options:c,retriesWithAI:s=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 l(...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(),s>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:l,options:c,retriesWithAI:s-1});throw new C("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 dn({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&&dm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(mm(i)||pm(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(hm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Yr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof C?n:new C("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:l}=o;if(t.type!=="description")throw new C("ActionFailureError","Cannot use selector with non-description target");let c,s=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){s=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:l,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()-s<500&&await ne(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:l,command:c}=e,{disableCache:s,useSelector:u,targetName:d,targetHealingInProgress:p,source:m}=l,h=this.logger.child({commandId:c.id}),g=this.shouldUseMemory(),f=l.retriesWithAI??1,S=!1,y=gx(e.cache);if((!y||s)&&!pp(o))throw new C("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);s&&(h.info("Cache explicitly disabled for this step"),S=!0,y=void 0),y&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&y.targetSource==="HEURISTIC_HEALED"&&(S=!0,y=void 0),y?.inputDescription&&!dx(o.elementDescriptor,y.inputDescription)&&(h.warn({old:y.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),S=!0,y=void 0);let E=v=>!!v&&_l(v),w=!0;if(!E(y)){w=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:S,memory:l.memory,useMemory:g},"Prompting AI for an updated element location"),S&&await ne(this.browser.smartWaitingTimeout,this.executeAbortController.signal),f--;let v;try{v=await hf({description:o.elementDescriptor,disableCache:!!l.disableCache,iframeUrl:l.iframeUrl,source:m,useMemory:g,memory:g?l.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:l.allowNotActionableNodesOverride,logger:h},this.getControllerFixtures(t))}catch(_){if(_ instanceof Wi&&_.updatedLocatorMemory){let M={id:-1,...i,memory:_.updatedLocatorMemory};Nc({cmd:c,key:d,newTarget:M,logger:h,updatedWithAI:!0})}throw new C("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let x=l.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),A=await a(x);return Nc({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=Ue(h)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,y,{allowNotActionableNodesOverride:l.allowNotActionableNodesOverride,targetName:d,logger:h,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let x=l.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),A=await a(x);if(qt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`]),Nc({cmd:c,key:d,newTarget:y,logger:h,updatedWithAI:!1}),w){let _=v.decisions.filter(M=>M.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let M=_[0].type;n.recordTargetAutoHeal({healType:M})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed(),qt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`]);let x=!1;if((v instanceof Yr||dm(v)||mm(v)||hm(v)||qy(v)||pm(v))&&(x=!0),v instanceof C&&!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 A;return y.memory&&Il(y.memory)&&(A=y.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...l,memory:A,retriesWithAI:f,targetHealingInProgress:!0}})}throw new C("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 Hs(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ne(this.options.slowMoMs);let a=await this.browser.getOpenPages(),l=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(s){throw this.throwIfClosed(),new C("ActionFailureError",`Failed to substitute template strings in command: ${s.message}`,{errOptions:{cause:s}})}try{let s=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&hS(n)?await this.browser.waitForDOMStability({timeout:be}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:oe}),this.options?.autoFollowNewTabs&&await kA({beforeUrl:l,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),s}catch(s){throw s.name!=="AbortError"&&this.logger.error({err:s},"Error thrown in action controller"),s}finally{lv(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Fg(e)}}async resolveCommandTemplateStrings(e,t){return iu({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 l=n.condition;return l?.assertion.trim()?Ed({command:l,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 C("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new C("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ed({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new C("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=sT(n.schema);if(f)throw new C("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:Ue(a)});if(f.result==="NOT_FOUND")throw new C("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new C("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let S=f.message;throw S.includes("MaxGenerationLengthExceededError")?new C("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."):S.includes("AIProviderError")&&S.includes("time")?new C("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(!ra(n.url)&&!na(n.url,this.browser.baseUrl))throw new C("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&&$r(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:y,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:w=>this.browser.hover(w),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});h=y,g=E}let f=this.browser.getViewport()?.height??Lt.height,S=this.browser.getViewport()?.width??Lt.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??S));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??S);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new C("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 C("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let s=n.delay*1e3;await ne(s,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if($r(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let h=this.browser.url(),{elementInteractedDisplayString:g,result:f,thoughts:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:E=>this.browser.click(E,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:S,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return Yc(h,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}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($r(n.fromTarget)&&$r(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if($r(n.fromTarget)||$r(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,S)=>this.browser.dragAndDrop(f.locator,S.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 C("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&$r(n.target)){await this.browser.mouseDragUsingVisualCoordinates(h,g,f,n.target.pixels,{force:n.force});break}let S,y,E;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:w,result:v,thoughts:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async A=>A.locator,options:{disableCache:i,targetName:"target",...n}});S=v,y=w,E=x}return await this.browser.mouseDrag(h,g,f,S,{force:n.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:E}}case"SELECT_OPTION":{if(!Hn(n.target))throw new Error("Select with x/y is not supported yet");let h=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:f,thoughts:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:h},cache:n.cache?.target,action:y=>this.browser.selectOption(y,g,n.force),options:{...n,targetName:"target",disableCache:i,source:zo(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}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 so({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 C("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(h)}catch(g){throw new C("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&&$r(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,S=gx(n.target);if(S){let{elementInteractedDisplayString:E,thoughts:w}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:S,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!0,source:zo(n)}});g=E,f=w}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f};return Yc(h,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}case"HOVER":{if($r(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(!Hn(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&&!Hn(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 Yc(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 d1,g=u1(fetch,h),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await gv({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g}),cookies:by(h,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await hx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return hv({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 ZA({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 C("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 so({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof h!="object")throw new C("ActionFailureError",`Credentials must evaluate to an object (received ${typeof h} instead)`);let g;try{g=nc.optional().parse(h)}catch(f){throw new C("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let h=(n.timeout??Wr)*1e3,g=this.generator.getAgentConfig()?.assertion;if(pv(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let S={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 y=await Ed({command:S,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: ${y.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:y.afterScreenshotOverride}}finally{S.cache?.memory&&Dc(n,S.cache?.memory.traces,a)}}let f=await dv({command:n,tracer:t,timeoutMs:h,targetingWrapper:S=>this.wrapElementTargetingCommand(S),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 dn({action:async()=>su({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 So(n.requestMatcher),g=this.browser.registerRequestListener(h);return this.registeredListeners[n.key]=g.then(async f=>await jg(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 C("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await j(h,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let h=new So(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,h,{onRequestStart:(g,f)=>{this.recordedRequests[n.key][g]=ld(f)},onRequestComplete:(g,f)=>{this.recordedRequests[n.key][g]=ld(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let h=this.recordedRequests[n.key];if(!h)throw new C("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 So(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 So(n.requestMatcher),async(g,f)=>{let S=await so({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"}),y=ky.parse(S);return new Response(y.body,{status:y.status,headers:y.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:Ue(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new hd({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}};import{cloneDeep as p1}from"lodash-es";var m1={showOverlay:!1},Td=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:p1(m1),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 fx(r,e,t,n){let o=Date.now(),i=Date.now(),a,l,c,s,u=!1,d=async(g,f)=>{if(!g.closed&&!g.isInPageLoad)try{let S=c;c=void 0;let y=g.url(),E=f.toEditorDisplayCopy();JSON.stringify(E)===JSON.stringify(a)&&y===s&&o>i||(r.emit("browserState",{logsPerPage:S?.logsPerPage,harPages:S?.harPages,harEntries:S?.harEntries,viewport:g.getViewport(),url:y,iframeSrcUrls:l??[],context:E,isInPageLoad:g.isInPageLoad}),o=Date.now()),s=y,a=E}catch(S){if(!r.connected)return;let y=S instanceof Error?S.message:`${S}`;if(y.includes("Frame was detached")||y.includes("Not attached to an active page")||y.includes("browser has been closed")||y.includes("UserInfrastructureError"))return;t.error({err:S,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(l)||f.logsPerPage.some(S=>S.length>0)||f.harPages&&Object.keys(f.harPages).length>0||f.harEntries&&Object.keys(f.harEntries).length>0),h=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(h);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),y=f.retrieveAndClearDebugData();m(S,y)&&(l=S,c=y,i=Date.now())}catch(S){t.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var h1=4;async function Sx({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:l,authorization:c,settingsFactory:s,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 S=await a(g,e),y=await l(g,e),E=await s(g,e),w=await t(g),{testMetadata:v,baseUrl:x,envName:A,browserConfig:_,aiSettings:M,environmentVariables:Y,localCodeEvalTools:W}=await bi({testId:h,orgId:g,logger:e,storage:w,authorization:c,settings:E}),D=p.getSession(m);if(D)return e.info("Associating connection with existing session (likely reconnect)"),await D.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let Q=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:Q,event:"connect",args:r.handshake.query},"Websocket event (connect)"),Q&&p.getCurrentConnectionsByIp(Q)>=h1)throw e.error({clientIp:Q,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(Q);try{await g1({socket:r,baseUrl:x,envName:A,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:Y,clientIp:Q,devicePixelRatio:i,storage:w,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:W,generator:S,enricher:y,browserConfig:_,aiSettings:M,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(Q),B}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function g1({socket:r,baseUrl:e,envName:t,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:l,storage:c,uploadedFileStorage:s,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:h,aiSettings:g,clientIp:f,enricher:S,globalE2eStateManager:y}){let E={viewport:o.advanced?.viewport??Lt,locale:o.advanced?.locale??qn,timezoneId:o.advanced?.timezone??Kn,geolocation:o.advanced?.geolocation??Yn,colorScheme:o.advanced?.colorScheme};n&&(E.deviceScaleFactor=n);let w=o.id,v=await id({settings:h,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:l,customHeaders:void 0});l=l.child({orgId:i,sessionId:a,testId:w});let x=await xr.init({baseUrl:e,userBrowserSettings:v,enricher:S,storage:c,logger:l,contextArgs:E,iconKnowledgeBase:null,callbacks:{onTabsChange:(W,D)=>{r.emit("tabs",{tabs:W,activeTab:D})},onScreencastFrame:(W,D)=>{let Q=r;Jr&&(Q=r.compress(!0)),Q.emit("screenshot",{buffer:W},()=>{D()})},onSvgsCollected:W=>{r.emit("newIconDetected",{numIcons:W.newSvgs.length}),c.saveNewIcons(W,l)}}});await x.navigate({url:e,initialNavigation:!0});let A=new Eo({browser:x,generator:p,logger:l,orgId:i,options:{scratchPadId:void 0,slowMoMs:v.slowMoMs,autoFollowNewTabs:v.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:s,visualDiffScreenshotStorage:u}),_=fx(r,a,l,y),M=async()=>{_.timers.forEach(W=>clearInterval(W))},Y=new Yt({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await x.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:xr.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),y.registerSession({controller:A,context:Y,sessionId:a,cleanup:M,clientIp:f,socket:r})}async function bi({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 l;o?.type==="API_KEY"&&(l=new en({httpClient:new At({...o,logger:t}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),s;c&&(s=await n.fetchEnvironment(c.name,t));let u=s&&"browser"in s?s.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||s?.variables?.[St];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...s?.variables};await Promise.all((a.parameters??[]).map(async g=>{let f=await ir({orgId:e,s:g.defaultValue,context:Yt.dummyContext(a.name,s?.name,m),logger:t,localTools:l});m[g.name]=f}));let h={...i.ai,...a.advanced};return{localCodeEvalTools:l,baseUrl:p,envName:s?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:h}}var gf=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;qt.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 To({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},To=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))qt.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 gf({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},bd=class{constructor(e,t,n,o,i){this.socket=e;this.storage=t;this.orgId=n;this.testId=o;this.stepsBeforeRun=i}children=[];loggerBindings;async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}attachConsoleLogs(){}attachNetworkLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new To({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new To({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new To({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var ff={currentlyExecutingRequests:{}},S1=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),l,c=await bi({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),s=`${n}|${c.baseUrl}`;try{let u=ff.currentlyExecutingRequests[s]??0;ff.currentlyExecutingRequests[s]=u+1,l=await y1({...r,...e,...c,done:t})}finally{r.logger.info({result:l,sessionId:r.metadata.sessionId},"Test execution complete"),ff.currentlyExecutingRequests[s]--}},y1=async({socket:r,steps:e,baseUrl:t,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:l,aiSettings:c,browserConfig:s,metadata:u,logger:d,envName:p,testName:m,environmentVariables:h,localCodeEvalTools:g,done:f,cacheStorageFactory:S,globalE2eStateManager:y})=>{let{testId:E,sessionId:w,orgId:v}=u,x=w,A=y.getSession(w);if(!A)throw new Error("No active session found");let{controller:_,context:M}=A;_.setOpen(),d=d.child({testId:E,orgId:v,sessionId:w,runId:x}),d.info({steps:e.map(X=>`${X.type}${"command"in X?` - ${X.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:M,browserConfig:s,aiSettings:c},"Socket execution parameters");let Y=h??{},W=async()=>{o&&(await _.browser.reset({newUrl:t}),M.reset({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:Y,envName:p,testName:m}))},D=await l(v),Q=await S(v),B=async()=>{try{await Q.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:E,stepLists:{steps:e},logger:d})}catch(X){d.error({err:X},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await Ps({promiseGenerator:async()=>Promise.all([W(),B()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(X){if(r.emit("finished"),X.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${X}`)}let H=f1(e),de={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},V={orgId:v,runId:x,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:s}},Ke={controller:_,context:M,storage:D,codeEvalTools:g,usageTracker:new Gi,logger:d},Ie={test:{},step:{onDynamicAIActionStatusUpdateEvent:X=>{r.emit("dynamicCommandStatusUpdate",X)},onDynamicAIActionEvaluatingEvent:X=>{r.emit("dynamicCommandEvaluating",X)},onDynamicCommandGenerated:X=>{r.emit("dynamicCommandGenerated",X)},onDynamicCommandExecuted:X=>{r.emit("dynamicCommandExecuted",X)}}},nt=new bd(r,D,v,E,H),_t=await od({fixtures:Ke,options:de,callbacks:Ie,inputs:V,testParams:{tracer:nt}});return _t?.status==="PASSED"?await Vc({logger:d,cacheStorage:Q,orgId:v,testId:E,originalSteps:{steps:H},updatedSteps:{steps:e}}):_t?.status==="FAILED"&&await $c({logger:d,cacheStorage:Q,orgId:v,testId:E,originalSteps:{steps:H},updatedSteps:{steps:e}}),await nt.finish(),f?.(_t),_t.status};var yx={event:"execute",createHandler:S1};import{cloneDeep as E1}from"lodash-es";var T1=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=E1(e),l=jT(a);if(l.category!=="NO_DESCRIPTION_PROVIDED"){if(l.category!=="NONE"){t?.({result:l});return}"cache"in a&&(a.cache=void 0);try{let s=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:s})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},Ex={event:"lintStep",createHandler:T1};var b1=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;return async(a,l)=>{let{description:c,command:s,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=$o.parse(u.advanced??{}),S={},y;if(c){if("useSelector"in s&&s.useSelector)try{let E=await m.locateElementWithSelector(c,"iframeUrl"in s?s.iframeUrl:void 0);y=E.resolution.locator,S={target:E.target,thoughts:E.thoughts}}catch(E){e.warn({err:E},"Failed resolving target with selector"),l({err:`Failed locating element: ${E.message}`,decisions:E instanceof Kr?E.decisions:void 0});return}else try{let E=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:zo(s),iframeUrl:"iframeUrl"in s?s.iframeUrl:void 0,memory:"cache"in s&&s.cache&&"target"in s.cache&&Il(s.cache.target.memory)?s.cache.target.memory:void 0,logger:e});S={target:E.target,thoughts:E.thoughts},y=E.resolution.locator}catch(E){(async()=>{try{let w=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:E,html:w.slice(0,1e5)},"Failed locating element with AI")}catch(w){e.warn({err:w},"Failed grabbing HTML after trying to locate element with AI")}})(),l({err:`${E.message}`});return}if(s.type==="SELECT_OPTION"&&y)try{S.options=await m.browser.getSelectOptions(y)}catch(E){e.warn({err:E},"Failed getting select options"),l({err:`Failed getting select options: ${E.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:E,width:w,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:y}),x=await g.uploadScreenshot(E);S.screenshot={data:x,width:w,height:v},e.info({width:w,height:v},"Captured screenshot during locate")}catch(E){e.error({err:E},"Error capturing screenshot during locate"),l({err:`Error taking screenshot: ${E.message}`});return}if(l({result:S}),y)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(y),m.browser.highlight(y)])}catch(E){e.warn({err:E},"Error highlighting element, continuing...")}}},Tx={event:"locate",createHandler:b1};var v1=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let l=t.getSession(n);if(!l)throw new Error("No active session found");let c=l.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(s){e.error({err:s},"Error performing click during cloud recording in control mode")}}},bx={event:"mouseClickEvent",createHandler:v1};var R1=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:l}=r;return async({stepId:c,parentStepIdChain:s,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(S){t.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(S,y)=>{y.type!=="PRESET_ACTION"||y.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:s,command:y.command,attribute:u}),h.abort(),g=!0)};setTimeout(()=>{g||(h.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:s,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:t,testId:l,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:s,attribute:u})}},vx={event:"recordTargetClick",createHandler:R1};var w1=({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(l){if(l.message.includes("has been closed")){e.debug({sessionId:n,err:l},"Browser is closed, ignoring key down socket event error");return}throw l}}},Rx={event:"keyDownEvent",createHandler:w1};var A1=({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(l){if(l.message.includes("has been closed")){e.debug({sessionId:n,err:l},"Browser is closed, ignoring key up socket event error");return}throw l}}},wx={event:"keyUpEvent",createHandler:A1};var C1=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,o,i=0,a=(s,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},l,c=0;return async s=>{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(s.event==="scroll"){let h=await m.scrollFromPositionPercentages(s.percentX,s.percentY,l?.x??0,l?.y??0),g=u.browserBehavior.recordingState?.transformer;g&&h&&g.recordScroll(h);return}p.showOverlay&&a(m,s);try{let h=await m.moveMouseFromPositionPercentages(s.percentX,s.percentY);c=0,l=h}catch(h){c++,c%5===0&&e.warn({err:h,mouseErrors:c},"Error in socket mouse move handler")}}},Ax={event:"mouseMoveEvent",createHandler:C1};var x1=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:l}=r;return async({stepId:c})=>{let s=o.getSession(i);if(!s)throw new Error("No active session found");let{controller:u,browserBehavior:d}=s,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,h=await u.startRecordMode({params:{generator:p,logger:n,testId:l,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}}},Cx={event:"recordingStart",createHandler:x1};var _1=({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}},xx={event:"recordingStop",createHandler:_1};var I1=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(l,c)=>{let{testId:s,sessionId:u,orgId:d}=e;t.info({testId:s,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:h}=await bi({testId:s,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 S=f.browser.getViewport();t.info({baseUrl:h,viewport:S},`Session refreshed for test ${s} at ${h}`),c()},_x={event:"refresh",createHandler:I1};var M1=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:l,sessionId:c,orgId:s}=e;t.info({testId:l,sessionId:c},"Reset event received");let u=await i(s,t),d=await n(s),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await bi({testId:l,orgId:s,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:S,context:y}=f;await S.browser.reset({newUrl:p});let E=S.browser.baseUrl;y.reset({baseUrl:E,currentUrl:S.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let w=S.browser.getViewport(),v=xr.USER_AGENT;t.info({baseUrl:p,viewport:w},`Session reset for test ${l} at ${E}`),r.emit("session",{url:E,userAgent:v,viewport:w,sessionId:c})},Ix={event:"reset",createHandler:M1};var P1=({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})}},Mx={event:"switchTab",createHandler:P1};async function Px(r){return Sx(r)}var Ox=[ev,yx,Tx,Ix,_x,Jb,Mx,Ex,vx,Cx,xx,Ax,bx,Rx,wx,Zb,Qb];var Lx=r=>{let{logger:e}=r,t=new O1(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 Px({...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}Ox.forEach(i=>L1(i,{...r,socket:n,metadata:o,logger:e}))}),t},L1=(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 U1}from"express";import{Router as D1}from"express";import fl from"fs";import gl from"path";import{v4 as k1}from"uuid";import F1 from"yaml";import{hostname as N1}from"os";var Sf="2.18.0",et=Rc({app:"desktop-server",hostname:N1(),disableConsoleLogs:!0}).child({cliVersion:Sf});(async()=>{try{let r=await Bs(et);r.gitBranchName&&et.addBinding("branch",r.gitBranchName)}catch{}})();var La=D1();async function yf(r){return(await eu(r,et)).map(n=>{let o=r.modules[n.moduleId];if(!o){T.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)}La.get("/",Ee(async(r,e)=>{let t=se(),n=await K(t),o=await yf(n);e.status(200).json(o)}));La.post("/",Ee(async(r,e)=>{let t;try{t=rE.parse(r.body)}catch(l){e.status(400).json({error:`Invalid request body: ${l}`});return}try{Xn(t.name)}catch(l){e.status(400).json({error:`Invalid module name: ${l}`});return}let n=se(),o=(await K(n)).modules;if(Object.values(o).find(l=>l.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=gl.join(n.rootDir,t.folderPath??"");if(!fl.existsSync(i)||!fl.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Zc({...t,folder:i,project:n});e.status(201).json(a)}));La.get("/:moduleId",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await K(se()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await kr(n,t,T);e.json(o)}catch(o){e.status(400).json({err:o})}}));La.post("/:moduleId/duplicate",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=tE.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{Xn(t.name)}catch(g){e.status(400).json({error:g.message});return}let n=se(),o=await K(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 kr(i,o,T),l=gl.join(n.rootDir,gl.dirname(i.relativePath));if(!fl.existsSync(l)||!fl.statSync(l).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${l}' does not exist.`});return}let c=Me(t.name),s=gl.join(l,`${c}.module.yaml`),u=k1(),{stepsToSave:d}=await We({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:Et()}}),p={fileType:pe.MODULE,schemaVersion:le,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=F1.stringify(p);fl.writeFileSync(s,m,"utf-8");let h={relativeFilePath:gl.relative(n.rootDir,s)};e.status(201).json(h)}));La.patch("/:moduleId/metadata",Ee(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=nE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=se(),o=await K(n);Ob({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:T,project:n}),e.status(201).json({message:"ok"})}));var Nx=La;var Dx=U1();Dx.get("/",Ee(async(r,e)=>{let t=se(),n=await K(t),o=new Set;n?.tests&&Object.values(n.tests).forEach(s=>{s.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),l=await yf(n),c={labels:i,tests:a,modules:l};e.status(200).json(c)}));var kx=Dx;import{Router as B1}from"express";var Ef=B1();Ef.get("/",Ee((r,e)=>{let t=tu(se(),et);e.status(200).json(t)}));Ef.get("/names",Ee((r,e)=>{let n=se().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var Fx=Ef;import{Router as z1}from"express";var Ux=z1();Ux.get("/",Ee((r,e)=>{e.status(200).json({userId:aa(),orgId:Et()})}));var Bx=Ux;import{StreamableHTTPServerTransport as UG}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as BG}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as zG}from"crypto";import{Router as HG}from"express";import{McpServer as kG}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as FG}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as $1}from"ai";import Cd from"dedent";import{z as bo}from"zod";import{tool as H1}from"ai";import{z as G1}from"zod";var vd=r=>({builder:(t,n)=>H1({description:r.schema.description,inputSchema:G1.object(r.schema.inputSchema),execute:async o=>{t.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(t,o,n,void 0)}catch(a){n.addError(String(a))}let i=await n.serialize();return i.isError?t.logger.error({toolName:r.schema.name,input:o,err:i.content.map(a=>a.text).join(`
|
|
3994
3994
|
`)},"Tool execution resulted in error"):t.logger.info({toolName:r.schema.name,input:o},"Tool execution completed"),i}}),tool:r});var Rd=class{results=[];isError;addResult(e){this.results.push(e)}addError(e){this.results.push(`Error: ${e}`),this.isError=!0}getResult(){return this.results.join(`
|
|
3995
3995
|
`)}async serialize(){let e=[];return this.results.length&&(e.push("### Result"),e.push(this.results.join(`
|
|
3996
3996
|
`)),e.push("")),{content:[{type:"text",text:e.join(`
|
|
3997
|
-
`)}],isError:this.isError}}};var Hr=r=>{let e=(n,o)=>{let i=async(a,l)=>{let c=l.sessionId??void 0,s=Date.now(),u=n.logger.child({...c&&{sessionId:c},toolName:r.schema.name});u.debug({toolName:r.schema.name,params:ta({json:a,maxJsonStringSize:500}),sessionId:c},`MCP tool invoked: ${r.schema.name}`);let d=new Rd,p;try{await r.handle(n,a,d,l)}catch(g){g instanceof Error?(p=g,d.addError(String(g))):d.addError(`Unknown value thrown: ${String(g)}`)}let m=Date.now()-s,h=await d.serialize();if(p)u.error({toolName:r.schema.name,sessionId:c,duration:m,err:p},`MCP tool failed: ${r.schema.name}`);else{let g=h.content.filter(f=>f.type==="text");u.debug({toolName:r.schema.name,sessionId:c,duration:m,responseIsError:h.isError,response:ta({json:g,maxJsonStringSize:500})},`MCP tool completed: ${r.schema.name}`)}return h};o.registerTool(r.schema.name,{title:r.schema.name,description:r.schema.description,inputSchema:r.schema.inputSchema},i)};return{...vd(r),addToolToMcpServer:e,name:r.schema.name}};import{randomUUID as j1}from"crypto";function wd(r){return _c({baseUrl:Nr(),apiKey:Dr(),sessionId:r})}function Tf(r){switch(r.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":return`AI action: ${r.text}`;case"PRESET_ACTION":return rn(r.command);case"RESOLVED_MODULE":return`Module: ${r.name} with inputs ${JSON.stringify(r.inputs)}`;case"CONDITIONAL":case"SECTION":throw new Error("Not implemented.");default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}var Ad=async({step:r,controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l})=>{let{results:c}=await bf({steps:[r],controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l});return c[0]},bf=async({steps:r,controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l})=>{let c={controller:e,storage:t,codeEvalTools:n,logger:o,context:a,usageTracker:new Gi},s=i?new
|
|
3998
|
-
`))}return Rf(i,n)}else if(e.path){let a=e.path;if(i.length===0)throw new
|
|
3999
|
-
`))}return Rf(i,n)}else throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function Rf(r,e){let t=r[0];if(!t)throw r.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return{entity:t,momenticFiles:e}}function V1(r,e){if(e.id){let t=Object.values(r).find(n=>n.id===e.id);return t?[t]:[]}else{if(e.name)return Object.values(r).filter(t=>t.name===e.name);if(e.path){let t=e.path;return Object.values(r).filter(n=>n.fullFilePath.includes(t)||n.relativePath.includes(t))}else throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}}var W1=Hr({schema:{name:"momentic_module_get",description:"Get a single fully loaded module by id, exact name, or file path. This returns complete module details including: parameters (required input names), defaultParameters (optional inputs with defaults), parameterEnums (allowed values for enum params), and the full step list. REQUIRED: Always call this before inserting a module step to understand what inputs to provide. Exactly one selector must be provided. Module names must follow valid entity name rules.",inputSchema:{selector:On}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r;try{let a=await gn(o,e.selector,"module"),l=await kr(a.entity,a.momenticFiles,i);t.addResult(JSON.stringify({module:l},null,2))}catch(a){t.addError(String(a));return}}}),q1=Hr({schema:{name:"momentic_module_list",description:"List all modules in the project with basic metadata (id, name, description, path). Use this to discover available modules. IMPORTANT: This does NOT include parameter definitions. You MUST call momentic_module_get to inspect parameter requirements (parameters, defaultParameters, parameterEnums) before inserting any module into a test.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o}=r,i=await K(o),l=Object.values(i.modules).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}));t.addResult(JSON.stringify({modules:l,note:"Parameters are not included in this list. Use momentic_module_get to inspect parameter requirements before inserting modules."},null,2))}}),wf=
|
|
3997
|
+
`)}],isError:this.isError}}};var Hr=r=>{let e=(n,o)=>{let i=async(a,l)=>{let c=l.sessionId??void 0,s=Date.now(),u=n.logger.child({...c&&{sessionId:c},toolName:r.schema.name});u.debug({toolName:r.schema.name,params:ta({json:a,maxJsonStringSize:500}),sessionId:c},`MCP tool invoked: ${r.schema.name}`);let d=new Rd,p;try{await r.handle(n,a,d,l)}catch(g){g instanceof Error?(p=g,d.addError(String(g))):d.addError(`Unknown value thrown: ${String(g)}`)}let m=Date.now()-s,h=await d.serialize();if(p)u.error({toolName:r.schema.name,sessionId:c,duration:m,err:p},`MCP tool failed: ${r.schema.name}`);else{let g=h.content.filter(f=>f.type==="text");u.debug({toolName:r.schema.name,sessionId:c,duration:m,responseIsError:h.isError,response:ta({json:g,maxJsonStringSize:500})},`MCP tool completed: ${r.schema.name}`)}return h};o.registerTool(r.schema.name,{title:r.schema.name,description:r.schema.description,inputSchema:r.schema.inputSchema},i)};return{...vd(r),addToolToMcpServer:e,name:r.schema.name}};import{randomUUID as j1}from"crypto";function wd(r){return _c({baseUrl:Nr(),apiKey:Dr(),sessionId:r})}function Tf(r){switch(r.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":return`AI action: ${r.text}`;case"PRESET_ACTION":return rn(r.command);case"RESOLVED_MODULE":return`Module: ${r.name} with inputs ${JSON.stringify(r.inputs)}`;case"CONDITIONAL":case"SECTION":throw new Error("Not implemented.");default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}var Ad=async({step:r,controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l})=>{let{results:c}=await bf({steps:[r],controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l});return c[0]},bf=async({steps:r,controller:e,storage:t,codeEvalTools:n,logger:o,socket:i,testContext:a,orgId:l})=>{let c={controller:e,storage:t,codeEvalTools:n,logger:o,context:a,usageTracker:new Gi},s=i?new To({orgId:l,parentStep:null,parentTracer:null,socket:i}):new bs;return e.setOpen(),Br({listParams:{containerName:"copilot-steps",steps:r,tracer:s},fixtures:c,options:{collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},inputs:{orgId:l,runId:j1(),steps:r,testMetadata:null,orgSettings:{}},callbacks:{test:{},step:{}},work:{results:[],asyncTasks:[],state:{}}})};import{z as vf}from"zod";var On=vf.object({id:vf.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:Hi.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:vf.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.");async function gn(r,e,t){let n=await K(r),o=t==="test"?n.tests:t==="module"?n.modules:n.mobileTests,i=V1(o,e);if(e.id){if(i.length===0)throw new Pe(`No ${t} found with id '${e.id}' in project '${r.rootDir}'.`);return Rf(i,n)}else if(e.name){if(i.length===0)throw new Pe(`No ${t} found with exact name '${e.name}' in project '${r.rootDir}'.`);if(i.length>1){let a=i.map(l=>({id:l.id,path:l.relativePath}));throw new Pe([`Multiple ${t}s found with exact name '${e.name}'. Please disambiguate by id or path.`,JSON.stringify(a,null,2)].join(`
|
|
3998
|
+
`))}return Rf(i,n)}else if(e.path){let a=e.path;if(i.length===0)throw new Pe(`No ${t} found at path '${a}'. Provide an absolute path or a path relative to '${r.rootDir}'.`);if(i.length>1){let l=i.map(c=>({id:c.id,path:c.fullFilePath}));throw new Pe([`Multiple ${t}s matched the provided path '${a}'. Please pass the absolute path.`,JSON.stringify(l,null,2)].join(`
|
|
3999
|
+
`))}return Rf(i,n)}else throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function Rf(r,e){let t=r[0];if(!t)throw r.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return{entity:t,momenticFiles:e}}function V1(r,e){if(e.id){let t=Object.values(r).find(n=>n.id===e.id);return t?[t]:[]}else{if(e.name)return Object.values(r).filter(t=>t.name===e.name);if(e.path){let t=e.path;return Object.values(r).filter(n=>n.fullFilePath.includes(t)||n.relativePath.includes(t))}else throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}}var W1=Hr({schema:{name:"momentic_module_get",description:"Get a single fully loaded module by id, exact name, or file path. This returns complete module details including: parameters (required input names), defaultParameters (optional inputs with defaults), parameterEnums (allowed values for enum params), and the full step list. REQUIRED: Always call this before inserting a module step to understand what inputs to provide. Exactly one selector must be provided. Module names must follow valid entity name rules.",inputSchema:{selector:On}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r;try{let a=await gn(o,e.selector,"module"),l=await kr(a.entity,a.momenticFiles,i);t.addResult(JSON.stringify({module:l},null,2))}catch(a){t.addError(String(a));return}}}),q1=Hr({schema:{name:"momentic_module_list",description:"List all modules in the project with basic metadata (id, name, description, path). Use this to discover available modules. IMPORTANT: This does NOT include parameter definitions. You MUST call momentic_module_get to inspect parameter requirements (parameters, defaultParameters, parameterEnums) before inserting any module into a test.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o}=r,i=await K(o),l=Object.values(i.modules).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}));t.addResult(JSON.stringify({modules:l,note:"Parameters are not included in this list. Use momentic_module_get to inspect parameter requirements before inserting modules."},null,2))}}),wf=bo.object({recommendations:bo.array(bo.object({moduleId:bo.string().describe("The UUID of the recommended module"),moduleName:bo.string().describe("The name of the module"),reasoning:bo.string().describe("Why this module might be useful for the test"),confidence:bo.enum(["high","medium","low"]).describe("Confidence level of the recommendation")})).describe("List of module IDs that could be useful for this test")});function K1(r){let e=r.parameters&&r.parameters.length>0?r.parameters.join(", "):"none",t=r.defaultParameters?Object.entries(r.defaultParameters).map(([i,a])=>`${i}: ${a}`).join(", "):"none",n=r.parameterEnums?Object.entries(r.parameterEnums).map(([i,a])=>`${i}: [${a.join(", ")}]`).join(", "):"none",o=r.steps.length>0?r.steps.map((i,a)=>{try{return` ${a+1}. ${Tf(i)}`}catch{return` ${a+1}. [Unsupported step type: ${i.type}]`}}).join(`
|
|
4000
4000
|
`):" (no steps)";return Cd`
|
|
4001
4001
|
Module ID: ${r.moduleId}
|
|
4002
4002
|
Name: ${r.name}
|
|
@@ -4053,7 +4053,7 @@ ${o}
|
|
|
4053
4053
|
Steps:
|
|
4054
4054
|
${e}
|
|
4055
4055
|
</test>
|
|
4056
|
-
`}var Q1=Hr({schema:{name:"momentic_module_recommend",description:"Use AI to recommend modules that might be useful for a test based on test context and available modules. Returns a list of module IDs with reasoning.",inputSchema:{userRequest:
|
|
4056
|
+
`}var Q1=Hr({schema:{name:"momentic_module_recommend",description:"Use AI to recommend modules that might be useful for a test based on test context and available modules. Returns a list of module IDs with reasoning.",inputSchema:{userRequest:bo.string().describe("The user's desired changes to the test and any other relevant context. Include any specific information helpful for finding where in the test they want changes, what pages these changes will happen on, etc.")}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r,a="testPath"in r?r.testPath:void 0,l,c=n?.sessionId??("sessionId"in r?r.sessionId:void 0);try{l=Dr()}catch{t.addError("API key is not configured. Please ensure the desktop server is properly initialized with an API key.");return}try{let s=await K(o),u=Object.values(s.modules);if(u.length===0){t.addResult(JSON.stringify({recommendations:[],message:"No modules found in project"},null,2));return}i.info({moduleCount:u.length},"Fetching full module details for recommendation");let d=await Promise.all(u.map(v=>kr(v,s,i))),p=wd(c),m=`Use this description:
|
|
4057
4057
|
|
|
4058
4058
|
`;if(m+=Cd`
|
|
4059
4059
|
<description>
|
|
@@ -4067,7 +4067,7 @@ with this test we are editing:
|
|
|
4067
4067
|
|
|
4068
4068
|
to pick which of these modules are relevant:
|
|
4069
4069
|
|
|
4070
|
-
`;let h=X1(d);m+=h;let g=$1({schema:wf,model:p("claude-sonnet-4-5-20250929"),system:Y1,messages:[{role:"user",content:m}]}),f=[];for await(let v of g.textStream)f.push(v);let S=f.join(""),y;try{let v=JSON.parse(S);y=wf.parse(v)}catch(v){i.error({rawResponse:S,parseError:v},"Failed to parse AI response as JSON"),t.addError(`Failed to parse AI response: ${String(v)}. Raw response: ${S}`);return}let
|
|
4070
|
+
`;let h=X1(d);m+=h;let g=$1({schema:wf,model:p("claude-sonnet-4-5-20250929"),system:Y1,messages:[{role:"user",content:m}]}),f=[];for await(let v of g.textStream)f.push(v);let S=f.join(""),y;try{let v=JSON.parse(S);y=wf.parse(v)}catch(v){i.error({rawResponse:S,parseError:v},"Failed to parse AI response as JSON"),t.addError(`Failed to parse AI response: ${String(v)}. Raw response: ${S}`);return}let E=new Set(d.map(v=>v.moduleId)),w=y.recommendations.filter(v=>E.has(v.moduleId)?!0:(i.warn({moduleId:v.moduleId,moduleName:v.moduleName},"AI recommended a module that doesn't exist"),!1));t.addResult(JSON.stringify({recommendations:w,totalModulesAnalyzed:d.length},null,2))}catch(s){i.error({err:s},"Error in module recommendation"),t.addError(`Failed to recommend modules: ${String(s)}`)}}}),xd=[Q1,W1,q1];var Z1=Hr({schema:{name:"momentic_environment_list",description:"List environments defined in the project's momentic.config.yaml file.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r,a=tu(o,i);t.addResult(JSON.stringify({environments:a},null,2))}}),zx=[Z1];import{streamText as _G}from"ai";import IG from"path";import{z as MG}from"zod";var _d=new Td;var vo=class extends Ji{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchTestMetadata(t){let n=se(),i=(await K(n)).tests[t];if(i)return ks(i.relativePath,n)}async fetchApiTestMetadata(){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,n){let o=se();return Fs(t,o,bn)}async fetchIconKnowledgeBase(t){try{return await this.client.fetchIconKnowledgeBase(t)}catch(n){return t.error({err:n},"Failed to fetch icon knowledge base"),null}}};var vi=class{async prepareGoldenScreenshotForComparison(e,t,n){return await new pa(se(),!1).prepareGoldenScreenshotForComparison(e,t,n)}};import Hx from"path";import{v4 as eG}from"uuid";async function Id({project:r,input:e}){try{Xn(e.name)}catch(s){throw new Pe(`${s} when validating the test entity name`)}if(!e.baseUrl&&!e.environment)throw new Pe("Either 'baseUrl' or 'environment' must be provided when creating a test.");let t=await K(r);if(Object.values(t.tests).find(s=>s.name===e.name))throw new Pe(`A test with the name "${e.name}" already exists. Please use a different name.`);let i={id:eG(),name:e.name,description:e.description,baseUrl:e.baseUrl,schemaVersion:le,advanced:{browserType:e.browserType??"Chromium",viewport:e.viewport??Lt},retries:0,steps:[]};e.environment&&(i.envs=[{name:e.environment,default:!0}]);let a=Hx.join(r.rootDir,...e.pathSegments||[]),l=await Nb({test:i,name:e.name,folder:a});return{...i,relativeFilePath:Hx.relative(r.rootDir,l)}}import{pruneMessages as vG,stepCountIs as RG}from"ai";import Md from"dedent";var tG=Md`
|
|
4071
4071
|
<ai-actions>
|
|
4072
4072
|
AI actions (type: AI_ACTION_DYNAMIC) are special steps that dynamically generate up to 15 sub-steps to achieve a complex goal. They are useful for:
|
|
4073
4073
|
- Multi-step workflows that require decision-making (e.g., "Find and click the first available appointment slot")
|
|
@@ -4291,30 +4291,30 @@ ${n}`}import rG from"path";var Pd=class{_result=[];_includeSnapshot=!1;_includeT
|
|
|
4291
4291
|
`)}setIncludeTest(){this._includeTest=!0}async test(){if(!this._includeTest)return"";let e=await K(this._project),t=await qe(rG.join(this._project.rootDir,this._testPath),this._logger,e),n=[];return n.push("### Test","```json",JSON.stringify(t,null,2),"```"),n.join(`
|
|
4292
4292
|
`)}addError(e){this._result.push(e),this._isError=!0}async serialize(){let e=[];this._result.length&&(e.push("### Result"),e.push(this._result.join(`
|
|
4293
4293
|
`)),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(`
|
|
4294
|
-
`)}],isError:this._isError}}};var mt=r=>({builder:vd(r).builder,name:r.schema.name});var nG=mt({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),Vx=[nG];import Dd from"path";import{z as Le}from"zod";function vo(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import{randomUUID as Ld}from"crypto";import{z as sr}from"zod";import{z as oG}from"zod";var vi={id:!0,cache:!0},Od=oG.discriminatedUnion("type",[Mo.omit(vi),No.omit(vi),Oo.omit(vi),Vn.omit(vi),jn.omit(vi),Po.omit(vi),Lo.omit(vi),bp.omit({id:!0}),yp.omit({id:!0}),Cp.omit({id:!0}),Pi.omit({id:!0}),Ap.omit({id:!0}),xp.omit({id:!0}),Ep.omit({id:!0})]);var iG=sr.object({selector:On,inputs:sr.record(sr.string()).optional()}),$x=sr.object({type:sr.literal("PRESET_ACTION"),action:Od}),Wx=sr.object({type:sr.literal("MODULE"),module:iG}),aG=sr.object({type:sr.literal("AI_ACTION_DYNAMIC"),text:sr.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}."),retries:sr.number().optional()});function Nd(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?sr.discriminatedUnion("type",[$x,Wx,aG]).describe(t):sr.discriminatedUnion("type",[$x,Wx]).describe(t)}function sG(r,e){let t=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=r??{},a=new Set([...t,...Object.keys(n)]),l=Object.keys(i).filter(u=>!a.has(u));if(l.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${l.join(", ")}. Valid parameters are: ${u}`)}let s=t.filter(u=>!(u in n)).filter(u=>!(u in i));if(s.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${s.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}"`)}}async function Ri(r,e,t){switch(r.type){case"PRESET_ACTION":return{type:"PRESET_ACTION",command:{...r.action,id:Ld()},id:Ld()};case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await gn(e,n,"module"),l=await kr(i,a,t);sG(o,l);let s=Object.keys(o??{}).length>0?o:(l.parameters?.length??0)>0?{}:void 0,u={id:Ld(),inputs:s};return{...l,...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:Ld(),retries:r.retries}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function qx({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await We({stepLists:{steps:e}});Wt({content:{...r,steps:o.steps},schemaVersion:le,momenticFiles:t,project:n})}var lG=mt({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:Le.string(),description:Le.string(),enabled:Le.boolean().default(!0),parameters:Le.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Le.record(Le.string(),Le.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Le.record(Le.string(),Le.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Le.record(Le.string(),Le.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:Le.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:Le.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:Le.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:l}=r,c=e.startIndex??0,s=e.endIndex??c+1,u=await K(o);if(Object.values(u.modules).find(h=>h.name===e.name))throw new Me(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let h=e.defaultParameters?Object.keys(e.defaultParameters):[],g=e.parameterEnums?Object.keys(e.parameterEnums):[],f=new Set([...h,...g]);for(let S of f)if(!e.parameters.includes(S))throw new Me(`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 Me("testPath is required when extracting steps from the current test.");let h=await qe(Dd.join(o.rootDir,a),i,u);if(c<0||c>=h.steps.length)throw new Me(`startIndex ${c} is out of bounds. Test has ${h.steps.length} steps.`);if(s<=c||s>h.steps.length)throw new Me(`endIndex ${s} is out of bounds. Must be between ${c+1} and ${h.steps.length}.`);p=h.steps.slice(c,s);for(let g of p)if(g.type==="RESOLVED_MODULE")throw new Me("Modules cannot be nested. Please select steps that do not include module references.")}let m=await Zc({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Dd.join(o.rootDir,e.subDir):o.rootDir,project:o});if(u=await K(o),e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let h={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 qx({moduleMetadata:h,steps:p,momenticFiles:u,project:o}),u=await K(o)}if(e.startIndex!==void 0){let h=await qe(Dd.join(o.rootDir,a),i,u),g={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},f=await Ri(g,o,i);h.steps.splice(c,s-c,f);let{stepsToSave:S,moduleUpdates:y}=await We({stepLists:{steps:h.steps,beforeSteps:h.beforeSteps,afterSteps:h.afterSteps}});y.forEach(T=>{Wt({content:T,schemaVersion:le,momenticFiles:u,project:o})}),Ft({relativeTestPath:a,steps:S,schemaVersion:le,project:o}),vo("copilotStepsUpdated",i,l,{steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function cG(r,e,t,n){if(r===void 0&&e!==void 0)throw new Me("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Me("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Me(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Me("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Me("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Me(`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 Me("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function uG(r){return mt({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:On,steps:r.array(),startIndex:Le.number().optional(),endIndex:Le.number().optional(),description:Le.string().optional().describe("New description for the module."),enabled:Le.boolean().optional().describe("New enabled state for the module."),parameters:Le.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:Le.record(Le.string(),Le.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Le.record(Le.string(),Le.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:l,testPath:c}=e,s=await Promise.all(t.steps.map(y=>Ri(y,i,a))),{entity:u,momenticFiles:d}=await gn(i,t.selector,"module"),p=await kr(u,d,a),m=s.find(y=>!Op(y));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{cG(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(y){n.addError(String(y));return}let h=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){h=[...p.steps];let y=t.startIndex!==void 0?t.startIndex:h.length,T=t.endIndex!==void 0?t.endIndex:y;h.splice(y,T-y,...s)}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 qx({moduleMetadata:g,steps:h,momenticFiles:d,project:i});let f=await K(i);if(c){let y=await qe(Dd.join(i.rootDir,c),a,f);vo("copilotStepsUpdated",a,l,{steps:y.steps??[],beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[]})}let S={...g,stepCount:h.length};n.addResult(JSON.stringify(S,null,2))}})}function dG(r){let e=Nd(r);return[lG,uG(e)]}var Kx=dG;import{randomUUID as Sl}from"crypto";import{z as kd}from"zod";var Yx=mt({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:kd.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}`)}}}),Xx=mt({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:kd.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:l,socket:c,orgId:s,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:Sl()},id:Sl()},p=await Ad({step:d,controller:a,storage:i,codeEvalTools:l,logger:o,socket:c,orgId:s,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}`)}}),Jx=mt({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:Od}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:l,socket:c,orgId:s,testContext:u}=r;t.setIncludeSnapshot();let d={type:"PRESET_ACTION",command:{...e.command,id:Sl()},id:Sl()},p=await Ad({step:d,controller:a,storage:i,codeEvalTools:l,logger:o,socket:c,orgId:s,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}`)}}),pG=mt({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:kd.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:kd.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:l,codeEvalTools:c,socket:s,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:Sl(),retries:e.retries},h=await Ad({step:m,controller:l,storage:a,codeEvalTools:c,logger:i,socket:s,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 Qx(r){return r.config.ai?.aiAction??!1?[Yx,Xx,Jx,pG]:[Yx,Xx,Jx]}import yG from"path";import{z as e_}from"zod";import Fd from"path";import{z as Na}from"zod";var Ud=r=>{throw new Error(`Unknown test section: ${r}`)},Da=Na.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)"),mG=mt({schema:{name:"test_get",description:"Get test contents.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function hG(r){return mt({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:Na.number(),step:r,targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await Ri(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 Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),vo("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}function gG(r){return mt({schema:{name:"test_replace_step",description:"Replace a step in the test.",inputSchema:{index:Na.number(),step:r,targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await Ri(t.step,i,a);switch(t.targetSection){case"setup":if(!u.beforeSteps)throw new Error(`Cannot replace step in ${t.targetSection} section: no ${t.targetSection} steps exist`);if(t.index<0||t.index>=u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.beforeSteps.length} steps`);u.beforeSteps.splice(t.index,1,d);break;case"teardown":if(!u.afterSteps)throw new Error(`Cannot replace step in ${t.targetSection} section: no ${t.targetSection} steps exist`);if(t.index<0||t.index>=u.afterSteps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.afterSteps.length} steps`);u.afterSteps.splice(t.index,1,d);break;case"main":if(t.index<0||t.index>=u.steps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.steps.length} steps`);u.steps.splice(t.index,1,d);break;default:return Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),vo("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}var fG=mt({schema:{name:"test_remove_step",description:"Remove a step from the test. Never use this as a means to bypass a failure",inputSchema:{index:Na.number(),targetSection:Da.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTest();let{project:o,logger:i,testPath:a,socket:l}=r,c=await K(o),s=await qe(Fd.join(o.rootDir,a),i,c);switch(e.targetSection){case"setup":if(!s.beforeSteps)throw new Error(`Cannot remove step from ${e.targetSection} section: no ${e.targetSection} steps exist`);if(e.index<0||e.index>=s.beforeSteps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.beforeSteps.length} steps`);s.beforeSteps.splice(e.index,1);break;case"teardown":if(!s.afterSteps)throw new Error(`Cannot remove step from ${e.targetSection} section: no ${e.targetSection} steps exist`);if(e.index<0||e.index>=s.afterSteps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.afterSteps.length} steps`);s.afterSteps.splice(e.index,1);break;case"main":if(e.index<0||e.index>=s.steps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.steps.length} steps`);s.steps.splice(e.index,1);break;default:return Ud(e.targetSection)}let{stepsToSave:u,moduleUpdates:d}=await We({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps}});d.forEach(p=>{Wt({content:p,schemaVersion:le,momenticFiles:c,project:o})}),Ft({relativeTestPath:a,steps:u,schemaVersion:le,project:o}),vo("copilotStepsUpdated",i,l,{steps:s.steps??[],beforeSteps:s.beforeSteps??[],afterSteps:s.afterSteps??[]})}});function SG(r){return mt({schema:{name:"test_splice_steps",description:"Splice steps in the test. Never use this as a means to bypass a failure",inputSchema:{startIndex:Na.number(),deleteCount:Na.number(),steps:r.array(),targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await Promise.all(t.steps.map(h=>Ri(h,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 Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),vo("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}function Zx(r){let e=Nd(r);return[mG,hG(e),gG(e),fG,SG(e)]}var EG=mt({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),TG=mt({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(),await r.controller.browser.reset({})}}),bG=mt({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:e_.number(),toIndex:e_.number().optional(),targetSection:Da.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:l,controller:c,codeEvalTools:s,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,h=e.toIndex??m,g=await K(o),f=await qe(yG.join(o.rootDir,a),i,g),S;switch(e.targetSection){case"setup":S=f.beforeSteps??[];break;case"teardown":S=f.afterSteps??[];break;case"main":S=f.steps;break;default:return(_=>{throw new Error(`Unknown test section: ${_}`)})(e.targetSection)}if(m<0||m>=S.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${S.length} steps.`);return}if(h<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(h>=S.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${S.length} steps.`);return}let y=S.slice(m,h+1);if(y.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:T}=await bf({steps:y,controller:c,storage:l,codeEvalTools:s,logger:i,socket:u,orgId:d,testContext:p});if(!T||T.length===0){t.addError("No steps were executed.");return}let w=T.at(-1);if(!w){t.addError("No steps were executed.");return}if(w.status!=="SUCCESS"){let A=m+T.length-1;t.addError(`Step at index ${A} failed: ${w.message}`);return}let v=e.targetSection==="main"?"":` in ${e.targetSection}`,x=m===h?`Step at index ${h}${v}`:`Steps ${m}-${h}${v}`;if(w.status==="SUCCESS"){t.addResult(`${x} executed successfully. Last step result: ${w.message}`),w.data&&t.addResult(`Data: ${JSON.stringify(w.data,null,2)}`);return}t.addError(`${x} failed: ${w.message}`)}}),t_=[EG,TG,bG];function r_(r){return[...Kx(r),...Vx,...t_,...Qx(r),...Zx(r),...xd]}function Bd(r,e,t,n,o){let i=Dr(),a=Et(),l=Nr(),c=se(),s=new Qe({apiKey:i,baseUrl:l,logger:t}),u=new bo(s,a),d=new en({httpClient:new At({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:t}),fakerSeed:c.config.advanced?.fakerConstantSeed?$i:void 0}),p={project:c,apiKey:i,orgId:a,baseUrl:l,sessionId:o,logger:t,storage:u,codeEvalTools:d,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},h=r_(c).reduce((y,{name:T,builder:w})=>(y[T]=w(p,new Pd(p.controller.browser,p.testContext,p.project,p.logger,p.testPath)),y),{}),g=wd(o),f=vG({messages:e,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["test_get","momentic_module_get"]},{type:"before-last-8-messages",tools:["momentic_module_create"]},{type:"before-last-5-messages",tools:["observe_page","run_step","preview_ai_action","momentic_module_list","momentic_module_change"]},{type:"before-last-3-messages",tools:["reset_session","test_insert_step","test_splice_steps","preview_ensure"]},{type:"before-last-2-messages",tools:["preview_preflight","preview_step","test_replace_step","test_remove_step"]}],emptyMessages:"remove"});return{model:g("claude-sonnet-4-5-20250929"),stopWhen:RG(30),maxRetries:4,system:jx(c),messages:f,tools:h}}var T0e=new Error("timeout while waiting for mutex to become available"),b0e=new Error("mutex already locked"),wG=new Error("request for lock canceled"),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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},Af=class{constructor(e,t=wG){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=n_(this._queue,l=>t<=l.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return AG(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]=[]),CG(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 CG(r,e){let t=n_(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function n_(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var xG=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},zd=class{constructor(e){this._semaphore=new Af(1,e)}acquire(){return xG(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 Cf=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new zd);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()}}},o_=new Cf;var PG=Hr({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:Sm},handle:async(r,e,t,n)=>{let{project:o}=r;try{let i=await Id({project:o,input:e});t.addResult(JSON.stringify(i,null,2))}catch(i){t.addError(String(i));return}}}),OG=Hr({schema:{name:"momentic_test_list",description:"List tests.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o}=r,i=await K(o),l=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:l},null,2))}}),LG=Hr({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:On}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r;try{let a=await gn(o,e.selector,"test"),l=await qe(a.entity.fullFilePath,i,a.momenticFiles);t.addResult(JSON.stringify({test:l},null,2))}catch(a){t.addError(String(a));return}}});async function NG(r,e,t){let n=Dr(),o=Et(),i=Nr(),a=new bi,l=new Qe({apiKey:n,baseUrl:i,logger:r}),c=new bo(l,o),s=(await qe(t.fullFilePath,r,await K(e))).advanced?.viewport??Lt,u=new vn(e.config.ai?.agentConfig,{baseUrl:i,apiKey:n,logger:r}),d=new no({baseUrl:i,apiKey:n,logger:r},u),p=await xr.init({baseUrl:"about:blank",userBrowserSettings:{},enricher:d,storage:c,logger:r,contextArgs:{viewport:s,locale:Wn,timezoneId:qn,geolocation:Kn},iconKnowledgeBase:null,callbacks:{}}),m=new yo({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 en({httpClient:new At({baseUrl:i,apiKey:n,logger:r}),fakerSeed:e.config.advanced?.fakerConstantSeed?$i:void 0}),visualDiffScreenshotStorage:a}),h=new Yt({baseUrl:"about:blank",testName:IG.basename(t.relativePath),currentUrl:p.url(),variablesFromEnvironment:{},envName:void 0});return{controller:m,context:h,socket:void 0}}var DG=Hr({schema:{name:"momentic_test_edit",description:"Edit a test.",inputSchema:{selector:On,message:MG.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 l=Dr(),c=Nr(),u=await new vn(o.config.ai?.agentConfig,{baseUrl:c,apiKey:l,logger:i}).getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(u.category!=="NONE"){t.addError(`${u.thoughts}
|
|
4294
|
+
`)}],isError:this._isError}}};var mt=r=>({builder:vd(r).builder,name:r.schema.name});var nG=mt({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),Vx=[nG];import Dd from"path";import{z as Ne}from"zod";function Ro(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import{randomUUID as Ld}from"crypto";import{z as sr}from"zod";import{z as oG}from"zod";var Ri={id:!0,cache:!0},Od=oG.discriminatedUnion("type",[Po.omit(Ri),Do.omit(Ri),Lo.omit(Ri),Vn.omit(Ri),jn.omit(Ri),Oo.omit(Ri),No.omit(Ri),bp.omit({id:!0}),yp.omit({id:!0}),Cp.omit({id:!0}),Oi.omit({id:!0}),Ap.omit({id:!0}),xp.omit({id:!0}),Ep.omit({id:!0})]);var iG=sr.object({selector:On,inputs:sr.record(sr.string()).optional()}),$x=sr.object({type:sr.literal("PRESET_ACTION"),action:Od}),Wx=sr.object({type:sr.literal("MODULE"),module:iG}),aG=sr.object({type:sr.literal("AI_ACTION_DYNAMIC"),text:sr.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}."),retries:sr.number().optional()});function Nd(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?sr.discriminatedUnion("type",[$x,Wx,aG]).describe(t):sr.discriminatedUnion("type",[$x,Wx]).describe(t)}function sG(r,e){let t=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=r??{},a=new Set([...t,...Object.keys(n)]),l=Object.keys(i).filter(u=>!a.has(u));if(l.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${l.join(", ")}. Valid parameters are: ${u}`)}let s=t.filter(u=>!(u in n)).filter(u=>!(u in i));if(s.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${s.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}"`)}}async function wi(r,e,t){switch(r.type){case"PRESET_ACTION":return{type:"PRESET_ACTION",command:{...r.action,id:Ld()},id:Ld()};case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await gn(e,n,"module"),l=await kr(i,a,t);sG(o,l);let s=Object.keys(o??{}).length>0?o:(l.parameters?.length??0)>0?{}:void 0,u={id:Ld(),inputs:s};return{...l,...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:Ld(),retries:r.retries}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function qx({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await We({stepLists:{steps:e}});Wt({content:{...r,steps:o.steps},schemaVersion:le,momenticFiles:t,project:n})}var lG=mt({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:Ne.string(),description:Ne.string(),enabled:Ne.boolean().default(!0),parameters:Ne.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Ne.record(Ne.string(),Ne.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ne.record(Ne.string(),Ne.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Ne.record(Ne.string(),Ne.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:Ne.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:Ne.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:Ne.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:l}=r,c=e.startIndex??0,s=e.endIndex??c+1,u=await K(o);if(Object.values(u.modules).find(h=>h.name===e.name))throw new Pe(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let h=e.defaultParameters?Object.keys(e.defaultParameters):[],g=e.parameterEnums?Object.keys(e.parameterEnums):[],f=new Set([...h,...g]);for(let S of f)if(!e.parameters.includes(S))throw new Pe(`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 Pe("testPath is required when extracting steps from the current test.");let h=await qe(Dd.join(o.rootDir,a),i,u);if(c<0||c>=h.steps.length)throw new Pe(`startIndex ${c} is out of bounds. Test has ${h.steps.length} steps.`);if(s<=c||s>h.steps.length)throw new Pe(`endIndex ${s} is out of bounds. Must be between ${c+1} and ${h.steps.length}.`);p=h.steps.slice(c,s);for(let g of p)if(g.type==="RESOLVED_MODULE")throw new Pe("Modules cannot be nested. Please select steps that do not include module references.")}let m=await Zc({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Dd.join(o.rootDir,e.subDir):o.rootDir,project:o});if(u=await K(o),e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let h={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 qx({moduleMetadata:h,steps:p,momenticFiles:u,project:o}),u=await K(o)}if(e.startIndex!==void 0){let h=await qe(Dd.join(o.rootDir,a),i,u),g={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},f=await wi(g,o,i);h.steps.splice(c,s-c,f);let{stepsToSave:S,moduleUpdates:y}=await We({stepLists:{steps:h.steps,beforeSteps:h.beforeSteps,afterSteps:h.afterSteps}});y.forEach(E=>{Wt({content:E,schemaVersion:le,momenticFiles:u,project:o})}),Ft({relativeTestPath:a,steps:S,schemaVersion:le,project:o}),Ro("copilotStepsUpdated",i,l,{steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function cG(r,e,t,n){if(r===void 0&&e!==void 0)throw new Pe("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Pe("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Pe(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Pe("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Pe("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Pe(`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 Pe("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function uG(r){return mt({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:On,steps:r.array(),startIndex:Ne.number().optional(),endIndex:Ne.number().optional(),description:Ne.string().optional().describe("New description for the module."),enabled:Ne.boolean().optional().describe("New enabled state for the module."),parameters:Ne.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:Ne.record(Ne.string(),Ne.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ne.record(Ne.string(),Ne.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:l,testPath:c}=e,s=await Promise.all(t.steps.map(y=>wi(y,i,a))),{entity:u,momenticFiles:d}=await gn(i,t.selector,"module"),p=await kr(u,d,a),m=s.find(y=>!Op(y));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{cG(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(y){n.addError(String(y));return}let h=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){h=[...p.steps];let y=t.startIndex!==void 0?t.startIndex:h.length,E=t.endIndex!==void 0?t.endIndex:y;h.splice(y,E-y,...s)}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 qx({moduleMetadata:g,steps:h,momenticFiles:d,project:i});let f=await K(i);if(c){let y=await qe(Dd.join(i.rootDir,c),a,f);Ro("copilotStepsUpdated",a,l,{steps:y.steps??[],beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[]})}let S={...g,stepCount:h.length};n.addResult(JSON.stringify(S,null,2))}})}function dG(r){let e=Nd(r);return[lG,uG(e)]}var Kx=dG;import{randomUUID as Sl}from"crypto";import{z as kd}from"zod";var Yx=mt({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:kd.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}`)}}}),Xx=mt({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:kd.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:l,socket:c,orgId:s,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:Sl()},id:Sl()},p=await Ad({step:d,controller:a,storage:i,codeEvalTools:l,logger:o,socket:c,orgId:s,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}`)}}),Jx=mt({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:Od}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:l,socket:c,orgId:s,testContext:u}=r;t.setIncludeSnapshot();let d={type:"PRESET_ACTION",command:{...e.command,id:Sl()},id:Sl()},p=await Ad({step:d,controller:a,storage:i,codeEvalTools:l,logger:o,socket:c,orgId:s,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}`)}}),pG=mt({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:kd.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:kd.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:l,codeEvalTools:c,socket:s,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:Sl(),retries:e.retries},h=await Ad({step:m,controller:l,storage:a,codeEvalTools:c,logger:i,socket:s,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 Qx(r){return r.config.ai?.aiAction??!1?[Yx,Xx,Jx,pG]:[Yx,Xx,Jx]}import yG from"path";import{z as e_}from"zod";import Fd from"path";import{z as Na}from"zod";var Ud=r=>{throw new Error(`Unknown test section: ${r}`)},Da=Na.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)"),mG=mt({schema:{name:"test_get",description:"Get test contents.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function hG(r){return mt({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:Na.number(),step:r,targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await wi(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 Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),Ro("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}function gG(r){return mt({schema:{name:"test_replace_step",description:"Replace a step in the test.",inputSchema:{index:Na.number(),step:r,targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await wi(t.step,i,a);switch(t.targetSection){case"setup":if(!u.beforeSteps)throw new Error(`Cannot replace step in ${t.targetSection} section: no ${t.targetSection} steps exist`);if(t.index<0||t.index>=u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.beforeSteps.length} steps`);u.beforeSteps.splice(t.index,1,d);break;case"teardown":if(!u.afterSteps)throw new Error(`Cannot replace step in ${t.targetSection} section: no ${t.targetSection} steps exist`);if(t.index<0||t.index>=u.afterSteps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.afterSteps.length} steps`);u.afterSteps.splice(t.index,1,d);break;case"main":if(t.index<0||t.index>=u.steps.length)throw new Error(`Invalid index ${t.index} for ${t.targetSection} section with ${u.steps.length} steps`);u.steps.splice(t.index,1,d);break;default:return Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),Ro("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}var fG=mt({schema:{name:"test_remove_step",description:"Remove a step from the test. Never use this as a means to bypass a failure",inputSchema:{index:Na.number(),targetSection:Da.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTest();let{project:o,logger:i,testPath:a,socket:l}=r,c=await K(o),s=await qe(Fd.join(o.rootDir,a),i,c);switch(e.targetSection){case"setup":if(!s.beforeSteps)throw new Error(`Cannot remove step from ${e.targetSection} section: no ${e.targetSection} steps exist`);if(e.index<0||e.index>=s.beforeSteps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.beforeSteps.length} steps`);s.beforeSteps.splice(e.index,1);break;case"teardown":if(!s.afterSteps)throw new Error(`Cannot remove step from ${e.targetSection} section: no ${e.targetSection} steps exist`);if(e.index<0||e.index>=s.afterSteps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.afterSteps.length} steps`);s.afterSteps.splice(e.index,1);break;case"main":if(e.index<0||e.index>=s.steps.length)throw new Error(`Invalid index ${e.index} for ${e.targetSection} section with ${s.steps.length} steps`);s.steps.splice(e.index,1);break;default:return Ud(e.targetSection)}let{stepsToSave:u,moduleUpdates:d}=await We({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps}});d.forEach(p=>{Wt({content:p,schemaVersion:le,momenticFiles:c,project:o})}),Ft({relativeTestPath:a,steps:u,schemaVersion:le,project:o}),Ro("copilotStepsUpdated",i,l,{steps:s.steps??[],beforeSteps:s.beforeSteps??[],afterSteps:s.afterSteps??[]})}});function SG(r){return mt({schema:{name:"test_splice_steps",description:"Splice steps in the test. Never use this as a means to bypass a failure",inputSchema:{startIndex:Na.number(),deleteCount:Na.number(),steps:r.array(),targetSection:Da.default("main")}},handle:async(e,t,n,o)=>{n.setIncludeTest();let{project:i,logger:a,testPath:l,socket:c}=e,s=await K(i),u=await qe(Fd.join(i.rootDir,l),a,s),d=await Promise.all(t.steps.map(h=>wi(h,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 Ud(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await We({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(h=>{Wt({content:h,schemaVersion:le,momenticFiles:s,project:i})}),Ft({relativeTestPath:l,steps:p,schemaVersion:le,project:i}),Ro("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]})}})}function Zx(r){let e=Nd(r);return[mG,hG(e),gG(e),fG,SG(e)]}var EG=mt({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),TG=mt({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(),await r.controller.browser.reset({})}}),bG=mt({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:e_.number(),toIndex:e_.number().optional(),targetSection:Da.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:l,controller:c,codeEvalTools:s,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,h=e.toIndex??m,g=await K(o),f=await qe(yG.join(o.rootDir,a),i,g),S;switch(e.targetSection){case"setup":S=f.beforeSteps??[];break;case"teardown":S=f.afterSteps??[];break;case"main":S=f.steps;break;default:return(_=>{throw new Error(`Unknown test section: ${_}`)})(e.targetSection)}if(m<0||m>=S.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${S.length} steps.`);return}if(h<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(h>=S.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${S.length} steps.`);return}let y=S.slice(m,h+1);if(y.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:E}=await bf({steps:y,controller:c,storage:l,codeEvalTools:s,logger:i,socket:u,orgId:d,testContext:p});if(!E||E.length===0){t.addError("No steps were executed.");return}let w=E.at(-1);if(!w){t.addError("No steps were executed.");return}if(w.status!=="SUCCESS"){let A=m+E.length-1;t.addError(`Step at index ${A} failed: ${w.message}`);return}let v=e.targetSection==="main"?"":` in ${e.targetSection}`,x=m===h?`Step at index ${h}${v}`:`Steps ${m}-${h}${v}`;if(w.status==="SUCCESS"){t.addResult(`${x} executed successfully. Last step result: ${w.message}`),w.data&&t.addResult(`Data: ${JSON.stringify(w.data,null,2)}`);return}t.addError(`${x} failed: ${w.message}`)}}),t_=[EG,TG,bG];function r_(r){return[...Kx(r),...Vx,...t_,...Qx(r),...Zx(r),...xd]}function Bd(r,e,t,n,o){let i=Dr(),a=Et(),l=Nr(),c=se(),s=new Qe({apiKey:i,baseUrl:l,logger:t}),u=new vo(s,a),d=new en({httpClient:new At({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:t}),fakerSeed:c.config.advanced?.fakerConstantSeed?$i:void 0}),p={project:c,apiKey:i,orgId:a,baseUrl:l,sessionId:o,logger:t,storage:u,codeEvalTools:d,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},h=r_(c).reduce((y,{name:E,builder:w})=>(y[E]=w(p,new Pd(p.controller.browser,p.testContext,p.project,p.logger,p.testPath)),y),{}),g=wd(o),f=vG({messages:e,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["test_get","momentic_module_get"]},{type:"before-last-8-messages",tools:["momentic_module_create"]},{type:"before-last-5-messages",tools:["observe_page","run_step","preview_ai_action","momentic_module_list","momentic_module_change"]},{type:"before-last-3-messages",tools:["reset_session","test_insert_step","test_splice_steps","preview_ensure"]},{type:"before-last-2-messages",tools:["preview_preflight","preview_step","test_replace_step","test_remove_step"]}],emptyMessages:"remove"});return{model:g("claude-sonnet-4-5-20250929"),stopWhen:RG(30),maxRetries:4,system:jx(c),messages:f,tools:h}}var T0e=new Error("timeout while waiting for mutex to become available"),b0e=new Error("mutex already locked"),wG=new Error("request for lock canceled"),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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},Af=class{constructor(e,t=wG){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=n_(this._queue,l=>t<=l.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return AG(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]=[]),CG(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 CG(r,e){let t=n_(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function n_(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var xG=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 l(u){try{s(n.next(u))}catch(d){a(d)}}function c(u){try{s(n.throw(u))}catch(d){a(d)}}function s(u){u.done?i(u.value):o(u.value).then(l,c)}s((n=n.apply(r,e||[])).next())})},zd=class{constructor(e){this._semaphore=new Af(1,e)}acquire(){return xG(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 Cf=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new zd);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()}}},o_=new Cf;var PG=Hr({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:Sm},handle:async(r,e,t,n)=>{let{project:o}=r;try{let i=await Id({project:o,input:e});t.addResult(JSON.stringify(i,null,2))}catch(i){t.addError(String(i));return}}}),OG=Hr({schema:{name:"momentic_test_list",description:"List tests.",inputSchema:{}},handle:async(r,e,t,n)=>{let{project:o}=r,i=await K(o),l=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:l},null,2))}}),LG=Hr({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:On}},handle:async(r,e,t,n)=>{let{project:o,logger:i}=r;try{let a=await gn(o,e.selector,"test"),l=await qe(a.entity.fullFilePath,i,a.momenticFiles);t.addResult(JSON.stringify({test:l},null,2))}catch(a){t.addError(String(a));return}}});async function NG(r,e,t){let n=Dr(),o=Et(),i=Nr(),a=new vi,l=new Qe({apiKey:n,baseUrl:i,logger:r}),c=new vo(l,o),s=(await qe(t.fullFilePath,r,await K(e))).advanced?.viewport??Lt,u=new vn(e.config.ai?.agentConfig,{baseUrl:i,apiKey:n,logger:r}),d=new oo({baseUrl:i,apiKey:n,logger:r},u),p=await xr.init({baseUrl:"about:blank",userBrowserSettings:{},enricher:d,storage:c,logger:r,contextArgs:{viewport:s,locale:qn,timezoneId:Kn,geolocation:Yn},iconKnowledgeBase:null,callbacks:{}}),m=new Eo({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 en({httpClient:new At({baseUrl:i,apiKey:n,logger:r}),fakerSeed:e.config.advanced?.fakerConstantSeed?$i:void 0}),visualDiffScreenshotStorage:a}),h=new Yt({baseUrl:"about:blank",testName:IG.basename(t.relativePath),currentUrl:p.url(),variablesFromEnvironment:{},envName:void 0});return{controller:m,context:h,socket:void 0}}var DG=Hr({schema:{name:"momentic_test_edit",description:"Edit a test.",inputSchema:{selector:On,message:MG.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 l=Dr(),c=Nr(),u=await new vn(o.config.ai?.agentConfig,{baseUrl:c,apiKey:l,logger:i}).getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(u.category!=="NONE"){t.addError(`${u.thoughts}
|
|
4295
4295
|
|
|
4296
|
-
Category: ${u.category}`);return}let d,p;try{({entity:d,momenticFiles:p}=await gn(o,e.selector,"test"))}catch(v){t.addError(String(v));return}let m=i.child({applicationName:"momentic-mcp-copilot",testId:d.id}),h=Bd(d.relativePath,[{role:"user",content:e.message}],m,await NG(m,o,d),n?.sessionId),{signal:g,release:f}=await o_.startOrReplace(d.id,a),S=_G({...h,abortSignal:g}),y=[];try{for await(let v of S.textStream)y.push(v)}catch(v){if(g.aborted)i.debug("AI stream was cancelled, returning partial output"),t.addResult(JSON.stringify({aborted:String(v),partialOutput:y.join("")},null,2));else throw v}finally{f()}let
|
|
4297
|
-
`).map(v=>v.trim()).filter(v=>v.length>0);t.addResult(JSON.stringify({editedTest:T,messages:w},null,2))}}),i_=[OG,PG,LG,DG];var a_=[...zx,...i_,...xd];function xf(r,e){let t=new kG({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of a_)n.addToolToMcpServer(r,t);return t}async function s_(r,e,t,n){let o=new FG(t,e,n);return await r.connect(o),{close:async()=>{try{await r.close()}catch{}},transport:o}}var _f="mcp-session-id",GG="sessionId",ka=HG(),yl=new Map;function l_(){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Sf??"0.0.0"},e=se(),t=et.child({orgId:Et(),userId:aa(),...r});return{context:{project:e,logger:t},info:r}}ka.get("/sse",async(r,e)=>{let{context:t,info:n}=l_(),o=xf(t,n),{transport:i}=await s_(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,l={transport:i,close:async()=>{yl.delete(a);try{await o.close()}catch(c){t.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};yl.set(a,l),i.onclose=()=>{let c=yl.get(a);c&&c.close()}});ka.post("/sse",async(r,e)=>{let t=String(r.query[GG]??"");if(!t||!yl.has(t)){e.status(400).send("Invalid or missing sessionId");return}await yl.get(t).transport.handlePostMessage(r,e,r.body)});var c_=ka,Ln={};ka.post("/",async(r,e)=>{let t=String(r.headers[_f]??"");try{if(t&&Ln[t]){await Ln[t].handleRequest(r,e,r.body);return}if(!t&&BG(r.body)){let{context:n,info:o}=l_(),i=xf(n,o),a=new UG({sessionIdGenerator:()=>zG(),enableDnsRebindingProtection:!1,onsessioninitialized:l=>{Ln[l]=a}});a.onclose=()=>{let l=a.sessionId;l&&Ln[l]&&delete Ln[l],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})}});ka.get("/",async(r,e)=>{let t=String(r.headers[_f]??"");if(!t||!Ln[t]){e.status(400).send("Invalid or missing session ID");return}await Ln[t].handleRequest(r,e)});ka.delete("/",async(r,e)=>{let t=String(r.headers[_f]??"");if(!t||!Ln[t]){e.status(400).send("Invalid or missing session ID");return}let n=Ln[t];try{await n.handleRequest(r,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as jG}from"express";var Hd=jG();Hd.get("/",Ee(async(r,e)=>{let t=(await hh()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(t)}));Hd.get("/current",Ee((r,e)=>{let t=se();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)}));Hd.post("/set",Ee(async(r,e)=>{let t;try{t=iE.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=await bt({configFilePath:t.configFilePath});Qc(n,o=>bt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var u_=Hd;import{Router as VG}from"express";var d_=VG();d_.get("/",Ee((r,e)=>{let n={ai:se().config.ai};e.status(200).json(n)}));var p_=d_;import{convertToModelMessages as $G,streamText as WG}from"ai";import{Router as qG}from"express";import m_ from"fs";import Tl from"path";import{v4 as KG}from"uuid";import YG from"yaml";var El=new nd({platform:"local_app"},{flushAt:1,flushInterval:0});var Ro=qG();Ro.post("/",Ee(async(r,e)=>{let t;try{t=Zy.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=se(),o=await Id({project:n,input:t});El.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof Me){e.status(400).json({error:n.message});return}throw n}}));Ro.get("/:testPath",Ee(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=se(),o=await K(n),i;try{i=await qe(Tl.join(n.rootDir,t),et,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:l}=await We({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});l.forEach(c=>{Wt({content:c,schemaVersion:le,momenticFiles:o,project:n})}),Ft({relativeTestPath:t,steps:a,schemaVersion:le,project:n})}catch(a){et.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Ro.patch("/:testPath/metadata",Ee(async(r,e)=>{if(!r.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Qy.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:ah(r.params.testPath,t,se()).newRelativeTestPath};e.status(200).json(o)}));Ro.patch("/:testPath",Ee(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=Jy.parse(r.body)}catch(m){et.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}et.info({testPath:t},"Save received");let o=se(),i=await K(o),a;try{a=ks(t,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:l,moduleUpdates:c,cachesToSave:s}=await We({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:Et()}}),u=new Qe({apiKey:Dr(),baseUrl:Nr(),logger:et}),d=await io(et,u,o);await oa({orgId:Et(),client:u,gitMetadata:d}).saveStepCacheEntries({logger:et,testId:a.id,entries:s}),c.forEach(m=>{Wt({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),Ft({relativeTestPath:t,steps:l,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Ro.patch("/:testPath/environments",Ee(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=oE.parse(r.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}ah(t,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},se()),e.status(201).json({message:"ok"})}));Ro.post("/:testPath/duplicate",Ee(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=eE.parse(r.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Yn(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=se(),i=Tl.join(o.rootDir,t);if(!m_.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await K(o),l;try{l=await qe(i,et,a)}catch(f){e.status(400).send({error:f.message});return}let c=KG(),s=yr.parse({...l,name:n.name,id:c}),{stepsToSave:u}=await We({stepLists:{steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:Et()}}),d=tn({fileType:pe.TEST,...s,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=Tl.dirname(i),m=Tl.join(p,`${n.name}.test.yaml`),h=YG.stringify(d);m_.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Tl.relative(o.rootDir,m)};El.track({type:"test_editor:test_create"}),e.status(201).json(g)}));Ro.post("/:testPath/chat",Ee(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=$G(n),a=_d.getSession(o);if(!a){e.status(400).json({error:"No active browser session. Start a session first."});return}let l=se(),c=ks(t,l),s=et.child({orgId:Et(),applicationName:"momentic-desktop-server-copilot",testId:c.id,sessionId:o});s.debug("Initializing copilot with sessionId",o);let u=Bd(t,i,s,a,o);WG(u).pipeUIMessageStreamToResponse(e,{onError:p=>p instanceof Error?p.message:String(p)})}));var h_=Ro;async function y_(r){let{momenticServerUrl:e,apiKey:t,serverPort:n,staticDir:o,devicePixelRatio:i,alwaysSaveCache:a,noCache:l,initialProject:c}=r;e&&Ib(e),await Mb(t);let s=Et(),u=aa();El.identify({user_id:u,org_id:s});let d=r.logger??et;d=d.child({orgId:s,userId:u}),d.debug({params:r},"Desktop server init and api key check done");let p=rj(o,n,d),m=`http://localhost:${n}`;E.info(`Desktop server is running at ${m}`),Qc(c,w=>bt({configFilePath:w})),await new Promise(w=>{try{p.listen(n,()=>{d.info(`Desktop server is running at ${m}`),w()})}catch(v){v.message.includes("EADDRINUSE")?E_(n):E.error(`An unexpected error occurred while starting the server: ${v.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Nr(),apiKey:t,logger:d},f=async()=>{let w=se();return new vn(w.config.ai?.agentConfig,g)},S=async()=>new no(g,await f()),y=new Qe(g),T=new bi;Lx({baseServer:p,getOrgId:async()=>Et(),generatorFactory:f,enricherFactory:S,cacheStorageFactory:async w=>{let v=se(),x=await io(d,y,v);return oa({orgId:w,client:y,gitMetadata:x,alwaysSaveCache:a,noCache:l})},branchGetter:async()=>{try{return(await Bs(d))?.gitBranchName}catch(w){d.error({err:w},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let w=se();return{ai:{},browser:{},...w.config}},storageFactory:async w=>new bo(y,w),logger:d,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:T,globalE2eStateManager:_d})}var S_="25mb";function rj(r,e,t){let n=f_();n.use(XG()),n.use(g_.json({limit:S_})),n.use(g_.urlencoded({extended:!1,limit:S_}));let o=ZG();if(o.use("/tests",h_),o.use("/modules",Nx),o.use("/environments",Fx),o.use("/projects",u_),o.use("/folders",ih),o.use("/settings",p_),o.use("/identify",Bx),o.use("/entities",kx),o.use("/mcp",c_),n.use("/api",o),n.use((a,l,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"),l.on("close",()=>{l.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:l.statusCode},"Request completed in error")}),c()}),n.use((a,l,c,s)=>{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:l.url,method:l.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}
|
|
4298
|
-
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),r){let a=f_.static(r,{setHeaders:l=>{l.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(l,c)=>{c.sendFile(tj.join(r,"index.html"))})}let i=ej.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(E_(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}QG.setMaxListeners(20);process.on("warning",r=>{et.warn({err:r},`Node warning received on desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{et.error({err:r},"Uncaught exception on desktop-server"),
|
|
4296
|
+
Category: ${u.category}`);return}let d,p;try{({entity:d,momenticFiles:p}=await gn(o,e.selector,"test"))}catch(v){t.addError(String(v));return}let m=i.child({applicationName:"momentic-mcp-copilot",testId:d.id}),h=Bd(d.relativePath,[{role:"user",content:e.message}],m,await NG(m,o,d),n?.sessionId),{signal:g,release:f}=await o_.startOrReplace(d.id,a),S=_G({...h,abortSignal:g}),y=[];try{for await(let v of S.textStream)y.push(v)}catch(v){if(g.aborted)i.debug("AI stream was cancelled, returning partial output"),t.addResult(JSON.stringify({aborted:String(v),partialOutput:y.join("")},null,2));else throw v}finally{f()}let E=await qe(d.fullFilePath,i,p),w=y.join("").split(`
|
|
4297
|
+
`).map(v=>v.trim()).filter(v=>v.length>0);t.addResult(JSON.stringify({editedTest:E,messages:w},null,2))}}),i_=[OG,PG,LG,DG];var a_=[...zx,...i_,...xd];function xf(r,e){let t=new kG({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of a_)n.addToolToMcpServer(r,t);return t}async function s_(r,e,t,n){let o=new FG(t,e,n);return await r.connect(o),{close:async()=>{try{await r.close()}catch{}},transport:o}}var _f="mcp-session-id",GG="sessionId",ka=HG(),yl=new Map;function l_(){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Sf??"0.0.0"},e=se(),t=et.child({orgId:Et(),userId:aa(),...r});return{context:{project:e,logger:t},info:r}}ka.get("/sse",async(r,e)=>{let{context:t,info:n}=l_(),o=xf(t,n),{transport:i}=await s_(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,l={transport:i,close:async()=>{yl.delete(a);try{await o.close()}catch(c){t.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};yl.set(a,l),i.onclose=()=>{let c=yl.get(a);c&&c.close()}});ka.post("/sse",async(r,e)=>{let t=String(r.query[GG]??"");if(!t||!yl.has(t)){e.status(400).send("Invalid or missing sessionId");return}await yl.get(t).transport.handlePostMessage(r,e,r.body)});var c_=ka,Ln={};ka.post("/",async(r,e)=>{let t=String(r.headers[_f]??"");try{if(t&&Ln[t]){await Ln[t].handleRequest(r,e,r.body);return}if(!t&&BG(r.body)){let{context:n,info:o}=l_(),i=xf(n,o),a=new UG({sessionIdGenerator:()=>zG(),enableDnsRebindingProtection:!1,onsessioninitialized:l=>{Ln[l]=a}});a.onclose=()=>{let l=a.sessionId;l&&Ln[l]&&delete Ln[l],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})}});ka.get("/",async(r,e)=>{let t=String(r.headers[_f]??"");if(!t||!Ln[t]){e.status(400).send("Invalid or missing session ID");return}await Ln[t].handleRequest(r,e)});ka.delete("/",async(r,e)=>{let t=String(r.headers[_f]??"");if(!t||!Ln[t]){e.status(400).send("Invalid or missing session ID");return}let n=Ln[t];try{await n.handleRequest(r,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as jG}from"express";var Hd=jG();Hd.get("/",Ee(async(r,e)=>{let t=(await hh()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(t)}));Hd.get("/current",Ee((r,e)=>{let t=se();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)}));Hd.post("/set",Ee(async(r,e)=>{let t;try{t=iE.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=await bt({configFilePath:t.configFilePath});Qc(n,o=>bt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var u_=Hd;import{Router as VG}from"express";var d_=VG();d_.get("/",Ee((r,e)=>{let n={ai:se().config.ai};e.status(200).json(n)}));var p_=d_;import{convertToModelMessages as $G,streamText as WG}from"ai";import{Router as qG}from"express";import m_ from"fs";import Tl from"path";import{v4 as KG}from"uuid";import YG from"yaml";var El=new nd({platform:"local_app"},{flushAt:1,flushInterval:0});var wo=qG();wo.post("/",Ee(async(r,e)=>{let t;try{t=Zy.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=se(),o=await Id({project:n,input:t});El.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof Pe){e.status(400).json({error:n.message});return}throw n}}));wo.get("/:testPath",Ee(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=se(),o=await K(n),i;try{i=await qe(Tl.join(n.rootDir,t),et,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:l}=await We({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});l.forEach(c=>{Wt({content:c,schemaVersion:le,momenticFiles:o,project:n})}),Ft({relativeTestPath:t,steps:a,schemaVersion:le,project:n})}catch(a){et.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));wo.patch("/:testPath/metadata",Ee(async(r,e)=>{if(!r.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Qy.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:ah(r.params.testPath,t,se()).newRelativeTestPath};e.status(200).json(o)}));wo.patch("/:testPath",Ee(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=Jy.parse(r.body)}catch(m){et.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}et.info({testPath:t},"Save received");let o=se(),i=await K(o),a;try{a=ks(t,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:l,moduleUpdates:c,cachesToSave:s}=await We({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:Et()}}),u=new Qe({apiKey:Dr(),baseUrl:Nr(),logger:et}),d=await ao(et,u,o);await oa({orgId:Et(),client:u,gitMetadata:d}).saveStepCacheEntries({logger:et,testId:a.id,entries:s}),c.forEach(m=>{Wt({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),Ft({relativeTestPath:t,steps:l,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));wo.patch("/:testPath/environments",Ee(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=oE.parse(r.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}ah(t,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},se()),e.status(201).json({message:"ok"})}));wo.post("/:testPath/duplicate",Ee(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=eE.parse(r.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Xn(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=se(),i=Tl.join(o.rootDir,t);if(!m_.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await K(o),l;try{l=await qe(i,et,a)}catch(f){e.status(400).send({error:f.message});return}let c=KG(),s=yr.parse({...l,name:n.name,id:c}),{stepsToSave:u}=await We({stepLists:{steps:l.steps,beforeSteps:l.beforeSteps,afterSteps:l.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:Et()}}),d=tn({fileType:pe.TEST,...s,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=Tl.dirname(i),m=Tl.join(p,`${n.name}.test.yaml`),h=YG.stringify(d);m_.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Tl.relative(o.rootDir,m)};El.track({type:"test_editor:test_create"}),e.status(201).json(g)}));wo.post("/:testPath/chat",Ee(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=$G(n),a=_d.getSession(o);if(!a){e.status(400).json({error:"No active browser session. Start a session first."});return}let l=se(),c=ks(t,l),s=et.child({orgId:Et(),applicationName:"momentic-desktop-server-copilot",testId:c.id,sessionId:o});s.debug("Initializing copilot with sessionId",o);let u=Bd(t,i,s,a,o);WG(u).pipeUIMessageStreamToResponse(e,{onError:p=>p instanceof Error?p.message:String(p)})}));var h_=wo;async function y_(r){let{momenticServerUrl:e,apiKey:t,serverPort:n,staticDir:o,devicePixelRatio:i,alwaysSaveCache:a,noCache:l,initialProject:c}=r;e&&Ib(e),await Mb(t);let s=Et(),u=aa();El.identify({user_id:u,org_id:s});let d=r.logger??et;d=d.child({orgId:s,userId:u}),d.debug({params:r},"Desktop server init and api key check done");let p=rj(o,n,d),m=`http://localhost:${n}`;T.info(`Desktop server is running at ${m}`),Qc(c,w=>bt({configFilePath:w})),await new Promise(w=>{try{p.listen(n,()=>{d.info(`Desktop server is running at ${m}`),w()})}catch(v){v.message.includes("EADDRINUSE")?E_(n):T.error(`An unexpected error occurred while starting the server: ${v.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Nr(),apiKey:t,logger:d},f=async()=>{let w=se();return new vn(w.config.ai?.agentConfig,g)},S=async()=>new oo(g,await f()),y=new Qe(g),E=new vi;Lx({baseServer:p,getOrgId:async()=>Et(),generatorFactory:f,enricherFactory:S,cacheStorageFactory:async w=>{let v=se(),x=await ao(d,y,v);return oa({orgId:w,client:y,gitMetadata:x,alwaysSaveCache:a,noCache:l})},branchGetter:async()=>{try{return(await Bs(d))?.gitBranchName}catch(w){d.error({err:w},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let w=se();return{ai:{},browser:{},...w.config}},storageFactory:async w=>new vo(y,w),logger:d,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:E,globalE2eStateManager:_d})}var S_="25mb";function rj(r,e,t){let n=f_();n.use(XG()),n.use(g_.json({limit:S_})),n.use(g_.urlencoded({extended:!1,limit:S_}));let o=ZG();if(o.use("/tests",h_),o.use("/modules",Nx),o.use("/environments",Fx),o.use("/projects",u_),o.use("/folders",ih),o.use("/settings",p_),o.use("/identify",Bx),o.use("/entities",kx),o.use("/mcp",c_),n.use("/api",o),n.use((a,l,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"),l.on("close",()=>{l.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:l.statusCode},"Request completed in error")}),c()}),n.use((a,l,c,s)=>{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:l.url,method:l.method},"Unhandled exception leading to 500 on desktop-server"),T.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
4298
|
+
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),r){let a=f_.static(r,{setHeaders:l=>{l.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(l,c)=>{c.sendFile(tj.join(r,"index.html"))})}let i=ej.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(E_(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}QG.setMaxListeners(20);process.on("warning",r=>{et.warn({err:r},`Node warning received on desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{et.error({err:r},"Uncaught exception on desktop-server"),T.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",(r,e)=>{et.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on desktop-server (promise rejection)"),T.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function E_(r){T.error(JG`Port ${r} is already in use by another process. Please close the other process and try again.
|
|
4299
4299
|
Using Bash on MacOS or Linux:
|
|
4300
4300
|
lsof -t -i :58888 | xargs kill -9
|
|
4301
4301
|
|
|
4302
4302
|
Using Command Prompt on Windows:
|
|
4303
4303
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
|
|
4304
|
-
`)}import sV from"events";import ip from"fs";import lV from"open";import{cpus as TI}from"os";import op from"path";import{fileURLToPath as cV}from"url";import nj from"diff-lines";import{gt as oj}from"semver";async function T_({test:r,fragment:e,entities:t,client:n,logger:o,yes:i}){oj(e.schemaVersion,le)&&(
|
|
4304
|
+
`)}import sV from"events";import ip from"fs";import lV from"open";import{cpus as TI}from"os";import op from"path";import{fileURLToPath as cV}from"url";import nj from"diff-lines";import{gt as oj}from"semver";async function T_({test:r,fragment:e,entities:t,client:n,logger:o,yes:i}){oj(e.schemaVersion,le)&&(T.error(`This version of the CLI does not support the schema version of the fragment (${e.schemaVersion}). Please update to the latest version of the CLI and retry this command.`),process.exit(1)),OT(e.steps).forEach(h=>{t.modules[h]||(T.error(`The test patch contains a module with id ${h} that could not be found in the current project. This suggests that either this test patch or your local file system may be out of date.`),process.exit(1))}),e.createdAt.getTime()<Date.now()-7*24*60*60*1e3&&!i&&!await wt("The test patch you are applying is more than 7 days old. Are you sure you want to continue?")&&process.exit(1);let l=r.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<l&&!i&&!await wt("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?")&&process.exit(1);let c=oi(r.fullFilePath,o,t),s=c.steps;if(!Array.isArray(s))throw new Error(`Test ${r.fullFilePath} is missing steps array`);let u,d;if(e.schemaVersion!==le){let{steps:h,newVersion:g}=await Is({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:T});u=g,d=tt.array().parse(h)}else d=tt.array().parse(e.steps);let{stepsToSave:p}=await We({stepLists:{steps:d}});p.beforeSteps=c.beforeSteps??void 0,p.afterSteps=c.afterSteps??void 0;let m=nj(JSON.stringify(s,void 0,2),JSON.stringify(p,void 0,2),{n_surrounding:5});T.dimmed("=".repeat(30)),T.dimmed(m),T.dimmed("=".repeat(30)),T.dimmed(""),u&&T.warn(`If this patch is applied, your test will also be automatically upgraded to the latest schema version (${u}). Schema upgrades have no impact on functionality, although you may notice minor differences in the test YAML.`),!i&&!await wt("Do you want to apply this patch?")&&(T.dimmed("Cancelled."),process.exit(1)),Ft({relativeTestPath:r.relativePath,steps:p,schemaVersion:u??e.schemaVersion,project:t.project}),T.success("Patch applied successfully."),await n.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as lr}from"crypto";import{z as b_}from"zod";function bl(r){return b_.string().uuid().safeParse(r).success}async function Gd({fix:r,project:e}){let t=await K(e),n=Object.values(t.tests),o={},i={},a=new Set,l={},c=new Set,s=0;for(let d of n)try{let p=oi(d.fullFilePath,re,t),m=!1,h=!1;bl(d.id)||(T.error(`Test '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${d.id}'`),s++,h=!0,r&&(d.id=lr(),m=!0)),t.duplicateEntities[d.id]&&(T.error(`Test '${d.name}' (${d.relativePath}) has a duplicate ID: '${d.id}'`),s++,h=!0,r&&(d.id=lr(),m=!0));let g=p.steps;if(!g||g.length===0||!Array.isArray(g)){T.debug(`Test ${d.name} (${d.relativePath}) has no steps, skipping...`);continue}let f=Dt.parse(p),S=await Zo(f,g,T);S.steps=S.steps.map((y,E)=>{y.id||(T.error(`Step ${E} in test '${d.name}' (${d.relativePath}) does not have an ID`),h=!0,r&&(m=!0,y.id=lr())),bl(y.id)||(T.error(`Step ${E} in test '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${y.id}'`),s++,h=!0,r&&(m=!0,y.id=lr()));let w=o[y.id]?.testId,v=o[y.id]?.testRelativePath;if(w?(s++,h=!0,w===d.id?T.error(`Multiple steps in the test '${d.name}' (${d.relativePath}) have the same ID '${y.id}'`):T.error(`Step ${E} in test '${d.name}' (${d.relativePath}) has the ID ${y.id} which is duplicated in ${v}`),r&&(m=!0,y.id=lr())):o[y.id]={testId:d.id,testRelativePath:d.relativePath},y.type==="PRESET_ACTION"){let x=y.command.id;bl(x)||(T.error(`Command ${E} in test '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${x}'`),s++,h=!0,r&&(m=!0,y.command.id=lr()));let A=i[x]?.testId,_=i[x]?.testRelativePath;A?(s++,h=!0,A===d.id?T.error(`Multiple commands in the test '${d.name}' (${d.relativePath}) have the same ID '${x}'`):T.error(`Command ${E} in test '${d.name}' (${d.relativePath}) has the ID ${x} which is duplicated in test ${_}`),r&&(m=!0,y.command.id=lr())):i[x]={testId:d.id,testRelativePath:d.relativePath}}return ke.parse(y)}),h&&T.dimmed("=".repeat(80)),m&&r&&(Ft({relativeTestPath:d.relativePath,steps:{beforeSteps:p.beforeSteps,steps:S.steps,afterSteps:p.afterSteps},schemaVersion:le,project:e}),a.add(d.fullFilePath))}catch(p){T.error({err:p},`Failed to parse test ${d.name} (${d.relativePath})`);continue}let u=Object.values(t.modules);for(let d of u)try{let p=!1,m=!1;bl(d.id)||(T.error(`Module '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${d.id}'`),s++,m=!0,r&&(d.id=lr(),p=!0)),t.duplicateEntities[d.id]&&(T.error(`Module '${d.name}' (${d.relativePath}) has a duplicate ID: '${d.id}'`),s++,m=!0,r&&(d.id=lr(),p=!0));let h=wn(d.fullFilePath,T),g=h.steps;if(!g||g.length===0||!Array.isArray(g)){T.debug(`Module ${d.name} (${d.relativePath}) has no steps, skipping...`);continue}let f,S;try{let E=await Zo({id:h.moduleId,schemaVersion:h.schemaVersion},h.steps,T);f=E.steps,S=E.newVersion}catch(E){T.error({err:E},`Failed to migrate module ${d.name} (${d.relativePath})`);continue}let y=f.map((E,w)=>{if(b_.string().uuid().safeParse(E.id)||(T.error(`Step ${w} in module '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${E.id}'`),s++,m=!0,r&&(p=!0,E.id=lr())),o[E.id]?.testId){let x=o[E.id]?.testRelativePath;s++,m=!0,T.error(`Step ${w} in module '${d.name}' (${d.relativePath}) has the ID ${E.id} which is duplicated in test ${x}`),r&&(p=!0,E.id=lr())}if(E.type==="PRESET_ACTION"){let x=E.command.id;bl(x)||(T.error(`Command ${w} in module '${d.name}' (${d.relativePath}) has an ID that does not parse as a UUID: '${x}'`),s++,m=!0,r&&(p=!0,E.command.id=lr()));let A=i[x],_=l[x];A||_?(s++,m=!0,_?.moduleId===d.id?T.error(`Multiple commands in module '${d.name}' (${d.relativePath}) have the same ID '${x}'`):A?T.error(`Command in module '${d.name}' (${d.relativePath}) has the ID ${x} which is duplicated in test ${A.testRelativePath}`):T.error(`Command ${w} in module '${d.name}' (${d.relativePath}) has the ID ${x} which is duplicated in module ${_.moduleRelativePath}`),r&&(p=!0,E.command.id=lr())):l[x]={moduleId:d.id,moduleRelativePath:d.relativePath}}return ke.parse(E)});m&&T.dimmed("=".repeat(80)),p&&r&&(Wt({content:{...h,steps:y},schemaVersion:S,momenticFiles:t,project:e,forceSaveOnNoDiffs:!0}),c.add(d.fullFilePath))}catch(p){T.error({err:p},`Failed to parse module ${d.name} (${d.relativePath})`);continue}return{errors:s,modifiedTestFilePaths:a,modifiedModuleFilePaths:c}}async function v_({fix:r,project:e}){let{errors:t,modifiedTestFilePaths:n,modifiedModuleFilePaths:o}=await Gd({fix:r,project:e});t>0?(T.error(`Found errors in ${t} steps`),r?(T.warn(`Modified the following test files:
|
|
4305
4305
|
${[...n].map(i=>`${st}- ${i}`).join(`
|
|
4306
|
-
`)}`),o.size>0&&
|
|
4306
|
+
`)}`),o.size>0&&T.warn(`Modified the following module files:
|
|
4307
4307
|
${[...o].map(i=>`${st}- ${i}`).join(`
|
|
4308
|
-
`)}`)):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 R_({project:r}){let e=await K(r),t=Object.values(e.tests),n=await eu(e,re),o={},i={},a=new Set,l=new Set;for(let s of t)o[s.name]?i[s.name]?i[s.name].push(s.fullFilePath):i[s.name]=[o[s.name],s.fullFilePath]:o[s.name]=s.fullFilePath;for(let s of n)l.has(s.name)&&a.add(s.name),l.add(s.name);if(Object.entries(i).length>0||a.size>0){for(let[s,u]of Object.entries(i))for(let d of u)E.error(`Test Name ${s} is duplicated in ${d}`);for(let s of a)E.error(`Module name ${s} 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 ij}from"lodash-es";async function w_({client:r,skipPrompts:e,project:t}){let n=await r.getAllEnvironments(),o=ij(t.config);o.environments||(o.environments=[]);for(let i of n){let a=o.environments?.find(l=>l.name===i.name);if(a)!e&&!await wt(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),a.baseUrl=i.variables[St],delete i.variables[St],a.envVariables=i.variables;else{let l=i.variables[St];delete i.variables[St],o.environments.push({name:i.name,baseUrl:l,envVariables:i.variables})}}ua(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 A_}from"crypto";import C_ from"fs";async function If({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,s]of Object.entries(o)){let u=x_(c,pe.TEST);!n&&!await Fm(u)||(a+=1,C_.writeFileSync(u,s,"utf-8"),re.info({checksum:A_("md5").update(s).digest("hex")},`Wrote '${u}'`))}let l=0;for(let[c,s]of Object.entries(i)){let u=x_(c,pe.MODULE);!n&&!await Fm(u)||(l+=1,C_.writeFileSync(u,s,"utf-8"),re.info({checksum:A_("md5").update(s).digest("hex")},`Wrote '${u}'`))}a===0?E.success("Pulled 0 tests."):E.success(`Pulled ${a} test${a>1?"s":""}${l?` and ${l} module${l>1?"s":""}`:""}!`)}function x_(r,e){switch(e){case pe.TEST:return`${Ie(r)}.test.yaml`;case pe.MODULE:return`${Ie(r)}.module.yaml`;default:throw new Error(`Unknown entity type ${e}`)}}async function __(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 wt("Are you sure you want to proceed?")||(E.info("Aborting..."),process.exit(1)),await w_({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 If({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 I_(r){let{client:e,skipPrompts:t,paths:n}=r;await If({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 wi,InvalidArgumentError as vl,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as aj}from"http";import{z as M_}from"zod";var jd=58888;function wo(r){let e=parseInt(r,10);if(isNaN(e))throw new vl("Not a number.");return e}function Vd(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);aj(o,i),e[o]=i}return e}var Gr=new Ne("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new vl("API key is required.");return r}).makeOptionMandatory(),jr=new Ne("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return M_.string().url().parse(r),r}catch{throw new vl("Not a valid URL.")}}),Ao=new Ne("-y, --yes","Skip all confirmation prompts.").env("CI"),Mf=new Ne("-w, --wait","Wait for tests to finish running before exiting."),Pf=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(wo),$d=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."),P_=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Ql)),O_=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"),Of=new Ne("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),L_=new Ne("--upload-results","Upload test results to Momentic Cloud.").default(!1),Lf=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."),Nf=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Df=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(wo),kf=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."),Wd=new Ne("--env <env>","Name of the environment to use when running tests."),qd=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 M_.string().url().parse(r),r}catch{throw new vl("Not a valid URL.")}}),N_=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=wo(r);if(e<1)throw new vl("Shard index must be greater than 0.");return e}),D_=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(wo),cr=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Fa=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."),k_=new Ne("--fix","Attempt to fix any issues found."),Ff=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"),Uf=new Ne("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes."),F_=new Ne("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:!1,ignoreQuarantine:!1}),U_=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}),B_=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}),z_=new wi("<tests...>","One or more test paths to queue on Momentic Cloud."),H_=new wi("<tests...>","One or more test paths to import from Momentic Cloud.").argOptional(),Bf=new wi("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional(),G_=new wi("<suites...>","One or more suite paths that exist on Momentic Cloud."),j_=new wi("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),V_=new wi("<results>","Path to the results archive.").argRequired(),zf=new Ne("--reason <reason>","The reason for quarantining the test. This will be used to generate a report on the test run."),Hf=new wi("<test>","Name of the test to quarantine.").argOptional();async function $_(r){let e=await K(r),t=Object.values(e.tests);for(let n of t)try{let o=ni(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=Dt.parse(o),l=await Qo(a,i,E);E.dimmed(`Updating ${n.relativePath}`),Ft({relativeTestPath:n.relativePath,steps:{beforeSteps:o.beforeSteps,steps:l.steps,afterSteps:o.afterSteps},schemaVersion:le,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=wn(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 Qo({id:o.moduleId,schemaVersion:o.schemaVersion},i,E);Wt({content:{...o,steps:a.steps},schemaVersion:le,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 lj}from"child_process";function cj(){try{let e=lj("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:
|
|
4309
|
-
${e}`)}}async function W_({project:r,orgId:e,apiClient:t}){E.info("Pulling browser and AI configuration options from Cloud");let n=await rd.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=cj(),ua(r.config,r.configFilePath),E.success("Migration complete!")}import{input as uj,search as dj}from"@inquirer/prompts";import pj from"fuse.js";async function Kd({prompt:r,inputtedTest:e,testOptions:t}){if(e){let a=t.find(l=>l.name===e);if(!a)E.error(`${e} is not a valid test option.`);else return{name:a.name,id:a.value}}let n=new pj(t,{keys:[{name:"name",weight:1}],threshold:.4,includeScore:!0,findAllMatches:!0,ignoreLocation:!0,useExtendedSearch:!0,shouldSort:!0,includeMatches:!0,distance:100,ignoreFieldNorm:!1}),o=await dj({message:r,source:async a=>!a||a.length===0?t:n.search({name:a}).map(c=>c.item)}),i=t.find(a=>a.value===o);return{name:i.name,id:i.value}}async function Yd({prompt:r,inputtedReason:e}){return e||uj({message:r})}async function q_({test:r,reason:e,apiClient:t,project:n,logger:o,identity:i}){let a=(await K(n)).tests,l=Object.values(a).map(u=>({value:u.id,name:u.name})),c=await Kd({prompt:"Select a test to quarantine.",inputtedTest:r,testOptions:l}),s=await Yd({prompt:"Enter a reason for quarantining the test.",inputtedReason:e});await t.quarantineTest(c,s,i),E.success(`Test ${c.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 ${c.name}'.`)}async function K_({test:r,reason:e,apiClient:t,project:n,logger:o,identity:i}){let a=(await K(n)).tests,l=Object.values(a).map(m=>({value:m.id,name:m.name})),c=(await t.getQuarantinedTests()).quarantined,s=new Set(c.map(m=>m.testId)),u=l.filter(m=>s.has(m.value)),d=await Kd({prompt:"Select a test to unquarantine.",inputtedTest:r,testOptions:u}),p=await Yd({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await t.unquarantineTest(d,p,i),E.success(`Test ${d.name} has been successfully removed from quarantine.`)}function Y_(r){return r?Ie(r):"Unknown suite"}async function X_({client:r,orgId:e,suitePaths:t,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:l}=await r.queueSuiteRuns({paths:t,...i});re.info({orgId:e,suiteRunIds:a,runGroupIds:l,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 l)E.dimmed(`${st}- ${r.getAppUrl()}/run-groups/${f}`);let s=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(y=>y.status==="FAILED"&&(y.failureReason||y.finishedAt&&Date.now()-y.finishedAt.getTime()>30*1e3)||y.status==="PASSED"||y.status==="CANCELLED"),p=await Ac({name:"suites",getResults:async()=>{let f=l.filter(T=>!u.some(w=>w.id===T)),S=await r.bulkGetRunGroupStatus(f),y=[];for(let T of S)d(T)?u.push(T):y.push(T);return[...u,...y]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(s.has(S.id)||(s.add(S.id),E.log(`${s.size}/${l.length} ${Y_(S.suite?.name)}`)))}),f.every(d))}),m=r.getAppUrl(),g=Xi({results:p,startTime:c,onFailed:f=>{let S=Y_(f.suite?.name),y=f.runs.filter(w=>w.status==="FAILED").length,T=f.runs.length;E.error(`${S} (${y}/${T} tests failed):`);for(let w of f.runs)if(w.status==="FAILED"){let v=w.testName||w.test?.name;E.error(` ${v?Ie(v):"Unknown test"} (${m}/runs/${w.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Ie(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function J_({tests:r,client:e,orgId:t,...n}){!n.yes&&!await wt(`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(re.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,l=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",s=e.getAppUrl(),u=Date.now(),d=await Ac({name:"runs",getResults:async()=>{let m=i.filter(f=>!l.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)c(f)?l.push(f):g.push(f);return[...l,...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} ${Ie(g)}`)}}),m.every(c))}),p=Xi({results:d,startTime:u,onFailed:m=>{let h=m.testName||m.test?.name;Cc(m,h?Ie(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Ie(h):"Unknown test"}`;return m.id&&(g+=` (${s}/runs/${m.id})`),g},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as Zj}from"crypto";import eV from"fs";import{existsSync as Cj,mkdirSync as xj,statSync as _j}from"fs";import{randomUUID as Q_}from"crypto";import Gf from"fs";import{hostname as mj}from"os";import jf from"path";async function Xd(r,e,t,n){if(n){let o=await e.getScreenshot(r,n);if(o){let i=`${n}-screenshot.jpeg`,a=jf.join(t,i);return Gf.writeFileSync(a,o),i}}}async function hj(r,e,t,n){let o=n.runId??Q_(),i={uuid:o,historyId:o,testCaseId:n.test.id,fullName:n.test.name,name:Ie(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:mj()},{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[l,c]of Object.entries(n.parameters))c!=null&&i.parameters.push({name:l,value:JSON.stringify(c)});n.results&&await gj(r,e,t.folder,i.steps,n.results);let a=`${o}-result.json`;Gf.writeFileSync(jf.join(t.folder,a),JSON.stringify(i,void 0,2))}async function Ua(r,e,t,n){let o={name:oo(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 Xd(r,e,t,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Xd(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 l=`${Q_()}-attachment.json`,c=jf.join(t,l);Gf.writeFileSync(c,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:l,type:"text/plain"})}return o}async function gj(r,e,t,n,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{n.push(await Ua(r,e,t,i));break}case"CONDITIONAL":{let a=await Ua(r,e,t,i);a.steps=[],i.assertionResult&&a.steps.push(await Ua(r,e,t,i.assertionResult)),a.steps.push(...await Promise.all(i.results.map(l=>Ua(r,e,t,l)))),n.push(a);break}case"AI_ACTION":case"SECTION":case"MODULE":{let a=await Ua(r,e,t,i);if(a.steps=await Promise.all(i.results.map(l=>Ua(r,e,t,l))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[l,c]of Object.entries(i.inputs))a.parameters.push({name:l,value:c})}n.push(a)}}}async function Z_(r,e,t,n){for(let o of n.runs)await hj(r,e,{folder:t,suiteName:n.suiteName},o)}import fj from"junit-report-builder";import Jd from"path";function Sj(r,e){if(e.name(r.test.name).className(r.test.name).file(Jd.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=Hl[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Fi[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 yj(r,{suiteId:e,suiteName:t,startedAt:n,finishedAt:o,runs:i,testsToSkip:a,quarantinedTestsToSkip:l,quarantinedTestReasons:c}){let s=r.testSuite().name(t);e&&s.property("id",e),s.timestamp(n).property("startedAt",n.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-n.getTime())/1e3);for(let u of i){let d=s.testCase();Sj(u,d)}for(let u of a){let d=s.testCase();d.name(u.name).className(u.name).file(Jd.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 l){let d=s.testCase();d.name(u.name).className(u.name).file(Jd.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 s}function eI(r,e){let t=fj.newBuilder();yj(t,e),t.writeTo(Jd.join(r,`${e.suiteName}.xml`))}import Ej from"fs";import Tj from"path";function tI(r){return{title:oo(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(tI):[]}}async function bj(r,e,t,n){if(n.results?.length){let o=await Xd(r,e,t,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function vj(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||Fi[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(tI)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await bj(r,e,t,n)}}async function Rj(r,e,t,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await vj(r,e,t,n)]}}async function wj(r,e,t,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await Rj(r,e,t,n)],id:n.runId,file:n.filePath}}function Vf(r,e){return r.reduce((t,n)=>e(n)?t+1:t,0)}async function Aj(r,e,t,n){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(n.runs.map(o=>wj(r,e,t,o)))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:Vf(n.runs,o=>o.status==="PASSED"),unexpected:Vf(n.runs,o=>o.status!=="PASSED"),flaky:Vf(n.runs,o=>!!o.isFlake),skipped:0}}}async function rI(r,e,t,n){let o=await Aj(r,e,t,n);Ej.writeFileSync(Tj.join(t,`${n.suiteName}.json`),JSON.stringify(o,null,2))}async function nI(r,e,t,n,o){switch(Cj(o)?_j(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...`),xj(o,{recursive:!0})),t){case"junit":eI(o,n);return;case"allure":case"allure-json":await Z_(r,e,o,n);return;case"playwright-json":await rI(r,e,o,n);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import tV from"wait-on";import{execSync as Ij}from"child_process";import{platform as Mj}from"os";function $f(){return oI()?(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.
|
|
4310
|
-
`),2):(
|
|
4311
|
-
l.`),1)}function oI(){return Mj()==="darwin"&&Ij("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Wf(r){oI()&&r===1&&(
|
|
4308
|
+
`)}`)):T.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(T.success("No duplicates detected. All test, module, step and command IDs are unique."),process.exit(0))}async function R_({project:r}){let e=await K(r),t=Object.values(e.tests),n=await eu(e,re),o={},i={},a=new Set,l=new Set;for(let s of t)o[s.name]?i[s.name]?i[s.name].push(s.fullFilePath):i[s.name]=[o[s.name],s.fullFilePath]:o[s.name]=s.fullFilePath;for(let s of n)l.has(s.name)&&a.add(s.name),l.add(s.name);if(Object.entries(i).length>0||a.size>0){for(let[s,u]of Object.entries(i))for(let d of u)T.error(`Test Name ${s} is duplicated in ${d}`);for(let s of a)T.error(`Module name ${s} is duplicated in your project`);process.exit(1)}T.success("No duplicates detected. All test and module names are unique."),process.exit(0)}import{cloneDeep as ij}from"lodash-es";async function w_({client:r,skipPrompts:e,project:t}){let n=await r.getAllEnvironments(),o=ij(t.config);o.environments||(o.environments=[]);for(let i of n){let a=o.environments?.find(l=>l.name===i.name);if(a)!e&&!await wt(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),a.baseUrl=i.variables[St],delete i.variables[St],a.envVariables=i.variables;else{let l=i.variables[St];delete i.variables[St],o.environments.push({name:i.name,baseUrl:l,envVariables:i.variables})}}ua(o,t.configFilePath),T.success(`Pulled ${n.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as A_}from"crypto";import C_ from"fs";async function If({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,s]of Object.entries(o)){let u=x_(c,pe.TEST);!n&&!await Fm(u)||(a+=1,C_.writeFileSync(u,s,"utf-8"),re.info({checksum:A_("md5").update(s).digest("hex")},`Wrote '${u}'`))}let l=0;for(let[c,s]of Object.entries(i)){let u=x_(c,pe.MODULE);!n&&!await Fm(u)||(l+=1,C_.writeFileSync(u,s,"utf-8"),re.info({checksum:A_("md5").update(s).digest("hex")},`Wrote '${u}'`))}a===0?T.success("Pulled 0 tests."):T.success(`Pulled ${a} test${a>1?"s":""}${l?` and ${l} module${l>1?"s":""}`:""}!`)}function x_(r,e){switch(e){case pe.TEST:return`${Me(r)}.test.yaml`;case pe.MODULE:return`${Me(r)}.module.yaml`;default:throw new Error(`Unknown entity type ${e}`)}}async function __(r){let{project:e,client:t,skipPrompts:n}=r;T.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),T.info("Importing environments from Momentic Cloud."),T.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await wt("Are you sure you want to proceed?")||(T.info("Aborting..."),process.exit(1)),await w_({client:t,project:e,skipPrompts:n}),T.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.`),T.info("Importing tests and modules from Momentic Cloud."),await If({testsToFetch:[],client:t,all:!0,yes:n}),T.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 I_(r){let{client:e,skipPrompts:t,paths:n}=r;await If({testsToFetch:n,client:e,all:void 0,yes:t}),T.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 Ai,InvalidArgumentError as vl,Option as De}from"@commander-js/extra-typings";import{validateHeaderValue as aj}from"http";import{z as M_}from"zod";var jd=58888;function Ao(r){let e=parseInt(r,10);if(isNaN(e))throw new vl("Not a number.");return e}function Vd(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);aj(o,i),e[o]=i}return e}var Gr=new De("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new vl("API key is required.");return r}).makeOptionMandatory(),jr=new De("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return M_.string().url().parse(r),r}catch{throw new vl("Not a valid URL.")}}),Co=new De("-y, --yes","Skip all confirmation prompts.").env("CI"),Mf=new De("-w, --wait","Wait for tests to finish running before exiting."),Pf=new De("--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(Ao),$d=new De("--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."),P_=new De("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Ql)),O_=new De("--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"),Of=new De("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),L_=new De("--upload-results","Upload test results to Momentic Cloud.").default(!1),Lf=new De("--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."),Nf=new De("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Df=new De("--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(Ao),kf=new De("--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."),Wd=new De("--env <env>","Name of the environment to use when running tests."),qd=new De("--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 M_.string().url().parse(r),r}catch{throw new vl("Not a valid URL.")}}),N_=new De("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=Ao(r);if(e<1)throw new vl("Shard index must be greater than 0.");return e}),D_=new De("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Ao),cr=new De("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Fa=new De("-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."),k_=new De("--fix","Attempt to fix any issues found."),Ff=new De("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),Uf=new De("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes."),F_=new De("--skip-quarantined","Skip quarantined tests entirely.").implies({onlyQuarantined:!1,ignoreQuarantine:!1}),U_=new De("--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}),B_=new De("--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}),z_=new Ai("<tests...>","One or more test paths to queue on Momentic Cloud."),H_=new Ai("<tests...>","One or more test paths to import from Momentic Cloud.").argOptional(),Bf=new Ai("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional(),G_=new Ai("<suites...>","One or more suite paths that exist on Momentic Cloud."),j_=new Ai("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),V_=new Ai("<results>","Path to the results archive.").argRequired(),zf=new De("--reason <reason>","The reason for quarantining the test. This will be used to generate a report on the test run."),Hf=new Ai("<test>","Name of the test to quarantine.").argOptional();async function $_(r){let e=await K(r),t=Object.values(e.tests);for(let n of t)try{let o=oi(n.fullFilePath,T,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){T.debug(`Test ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=Dt.parse(o),l=await Zo(a,i,T);T.dimmed(`Updating ${n.relativePath}`),Ft({relativeTestPath:n.relativePath,steps:{beforeSteps:o.beforeSteps,steps:l.steps,afterSteps:o.afterSteps},schemaVersion:le,project:r,forceSaveOnNoDiffs:!0})}catch(o){T.error({err:o},`Failed to read or migrate test ${n.name} (${n.relativePath}), continuing...`)}for(let n of Object.values(e.modules)){T.dimmed(`Updating ${n.relativePath}`);try{let o=wn(n.fullFilePath,T),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){T.debug(`Module ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=await Zo({id:o.moduleId,schemaVersion:o.schemaVersion},i,T);Wt({content:{...o,steps:a.steps},schemaVersion:le,momenticFiles:e,project:r,forceSaveOnNoDiffs:!0})}catch(o){T.error({err:o},`Failed to read or migrate module ${n.name} (${n.relativePath}), continuing...`)}}}import{spawnSync as lj}from"child_process";function cj(){try{let e=lj("git remote show origin",{encoding:"utf8",maxBuffer:5242880}).stdout.match(/HEAD branch: (.*)$/m);if(e&&e[1])return e[1].trim();T.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);T.warn(`Could not determine Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field. Error:
|
|
4309
|
+
${e}`)}}async function W_({project:r,orgId:e,apiClient:t}){T.info("Pulling browser and AI configuration options from Cloud");let n=await rd.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},T.info(`Updated ${r.configFilePath} to include V2 browser and AI configuration options`),T.info("Determining main Git branch"),r.config.gitMainBranch=cj(),ua(r.config,r.configFilePath),T.success("Migration complete!")}import{input as uj,search as dj}from"@inquirer/prompts";import pj from"fuse.js";async function Kd({prompt:r,inputtedTest:e,testOptions:t}){if(e){let a=t.find(l=>l.name===e);if(!a)T.error(`${e} is not a valid test option.`);else return{name:a.name,id:a.value}}let n=new pj(t,{keys:[{name:"name",weight:1}],threshold:.4,includeScore:!0,findAllMatches:!0,ignoreLocation:!0,useExtendedSearch:!0,shouldSort:!0,includeMatches:!0,distance:100,ignoreFieldNorm:!1}),o=await dj({message:r,source:async a=>!a||a.length===0?t:n.search({name:a}).map(c=>c.item)}),i=t.find(a=>a.value===o);return{name:i.name,id:i.value}}async function Yd({prompt:r,inputtedReason:e}){return e||uj({message:r})}async function q_({test:r,reason:e,apiClient:t,project:n,logger:o,identity:i}){let a=(await K(n)).tests,l=Object.values(a).map(u=>({value:u.id,name:u.name})),c=await Kd({prompt:"Select a test to quarantine.",inputtedTest:r,testOptions:l}),s=await Yd({prompt:"Enter a reason for quarantining the test.",inputtedReason:e});await t.quarantineTest(c,s,i),T.success(`Test ${c.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 ${c.name}'.`)}async function K_({test:r,reason:e,apiClient:t,project:n,logger:o,identity:i}){let a=(await K(n)).tests,l=Object.values(a).map(m=>({value:m.id,name:m.name})),c=(await t.getQuarantinedTests()).quarantined,s=new Set(c.map(m=>m.testId)),u=l.filter(m=>s.has(m.value)),d=await Kd({prompt:"Select a test to unquarantine.",inputtedTest:r,testOptions:u}),p=await Yd({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await t.unquarantineTest(d,p,i),T.success(`Test ${d.name} has been successfully removed from quarantine.`)}function Y_(r){return r?Me(r):"Unknown suite"}async function X_({client:r,orgId:e,suitePaths:t,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:l}=await r.queueSuiteRuns({paths:t,...i});re.info({orgId:e,suiteRunIds:a,runGroupIds:l,suitePaths:t},"Queued suites remotely"),T.dimmed(`Queued ${t.length} suites.`),n||process.exit(0);let c=Date.now();T.dimmed(`Waiting for ${t.length} suites to finish. You can view results upon completion at:`);for(let f of l)T.dimmed(`${st}- ${r.getAppUrl()}/run-groups/${f}`);let s=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(y=>y.status==="FAILED"&&(y.failureReason||y.finishedAt&&Date.now()-y.finishedAt.getTime()>30*1e3)||y.status==="PASSED"||y.status==="CANCELLED"),p=await Ac({name:"suites",getResults:async()=>{let f=l.filter(E=>!u.some(w=>w.id===E)),S=await r.bulkGetRunGroupStatus(f),y=[];for(let E of S)d(E)?u.push(E):y.push(E);return[...u,...y]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(s.has(S.id)||(s.add(S.id),T.log(`${s.size}/${l.length} ${Y_(S.suite?.name)}`)))}),f.every(d))}),m=r.getAppUrl(),g=Xi({results:p,startTime:c,onFailed:f=>{let S=Y_(f.suite?.name),y=f.runs.filter(w=>w.status==="FAILED").length,E=f.runs.length;T.error(`${S} (${y}/${E} tests failed):`);for(let w of f.runs)if(w.status==="FAILED"){let v=w.testName||w.test?.name;T.error(` ${v?Me(v):"Unknown test"} (${m}/runs/${w.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Me(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function J_({tests:r,client:e,orgId:t,...n}){!n.yes&&!await wt(`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(re.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),T.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;T.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,l=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",s=e.getAppUrl(),u=Date.now(),d=await Ac({name:"runs",getResults:async()=>{let m=i.filter(f=>!l.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)c(f)?l.push(f):g.push(f);return[...l,...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&&T.log(`${a.size}/${o.length} ${Me(g)}`)}}),m.every(c))}),p=Xi({results:d,startTime:u,onFailed:m=>{let h=m.testName||m.test?.name;Cc(m,h?Me(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Me(h):"Unknown test"}`;return m.id&&(g+=` (${s}/runs/${m.id})`),g},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as Zj}from"crypto";import eV from"fs";import{existsSync as Cj,mkdirSync as xj,statSync as _j}from"fs";import{randomUUID as Q_}from"crypto";import Gf from"fs";import{hostname as mj}from"os";import jf from"path";async function Xd(r,e,t,n){if(n){let o=await e.getScreenshot(r,n);if(o){let i=`${n}-screenshot.jpeg`,a=jf.join(t,i);return Gf.writeFileSync(a,o),i}}}async function hj(r,e,t,n){let o=n.runId??Q_(),i={uuid:o,historyId:o,testCaseId:n.test.id,fullName:n.test.name,name:Me(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:mj()},{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[l,c]of Object.entries(n.parameters))c!=null&&i.parameters.push({name:l,value:JSON.stringify(c)});n.results&&await gj(r,e,t.folder,i.steps,n.results);let a=`${o}-result.json`;Gf.writeFileSync(jf.join(t.folder,a),JSON.stringify(i,void 0,2))}async function Ua(r,e,t,n){let o={name:io(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 Xd(r,e,t,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Xd(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 l=`${Q_()}-attachment.json`,c=jf.join(t,l);Gf.writeFileSync(c,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:l,type:"text/plain"})}return o}async function gj(r,e,t,n,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{n.push(await Ua(r,e,t,i));break}case"CONDITIONAL":{let a=await Ua(r,e,t,i);a.steps=[],i.assertionResult&&a.steps.push(await Ua(r,e,t,i.assertionResult)),a.steps.push(...await Promise.all(i.results.map(l=>Ua(r,e,t,l)))),n.push(a);break}case"AI_ACTION":case"SECTION":case"MODULE":{let a=await Ua(r,e,t,i);if(a.steps=await Promise.all(i.results.map(l=>Ua(r,e,t,l))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[l,c]of Object.entries(i.inputs))a.parameters.push({name:l,value:c})}n.push(a)}}}async function Z_(r,e,t,n){for(let o of n.runs)await hj(r,e,{folder:t,suiteName:n.suiteName},o)}import fj from"junit-report-builder";import Jd from"path";function Sj(r,e){if(e.name(r.test.name).className(r.test.name).file(Jd.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=Hl[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Fi[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 yj(r,{suiteId:e,suiteName:t,startedAt:n,finishedAt:o,runs:i,testsToSkip:a,quarantinedTestsToSkip:l,quarantinedTestReasons:c}){let s=r.testSuite().name(t);e&&s.property("id",e),s.timestamp(n).property("startedAt",n.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-n.getTime())/1e3);for(let u of i){let d=s.testCase();Sj(u,d)}for(let u of a){let d=s.testCase();d.name(u.name).className(u.name).file(Jd.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 l){let d=s.testCase();d.name(u.name).className(u.name).file(Jd.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 s}function eI(r,e){let t=fj.newBuilder();yj(t,e),t.writeTo(Jd.join(r,`${e.suiteName}.xml`))}import Ej from"fs";import Tj from"path";function tI(r){return{title:io(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(tI):[]}}async function bj(r,e,t,n){if(n.results?.length){let o=await Xd(r,e,t,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function vj(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||Fi[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(tI)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await bj(r,e,t,n)}}async function Rj(r,e,t,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await vj(r,e,t,n)]}}async function wj(r,e,t,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await Rj(r,e,t,n)],id:n.runId,file:n.filePath}}function Vf(r,e){return r.reduce((t,n)=>e(n)?t+1:t,0)}async function Aj(r,e,t,n){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(n.runs.map(o=>wj(r,e,t,o)))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:Vf(n.runs,o=>o.status==="PASSED"),unexpected:Vf(n.runs,o=>o.status!=="PASSED"),flaky:Vf(n.runs,o=>!!o.isFlake),skipped:0}}}async function rI(r,e,t,n){let o=await Aj(r,e,t,n);Ej.writeFileSync(Tj.join(t,`${n.suiteName}.json`),JSON.stringify(o,null,2))}async function nI(r,e,t,n,o){switch(Cj(o)?_j(o).isDirectory()||(T.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)):(T.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),xj(o,{recursive:!0})),t){case"junit":eI(o,n);return;case"allure":case"allure-json":await Z_(r,e,o,n);return;case"playwright-json":await rI(r,e,o,n);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import tV from"wait-on";import{execSync as Ij}from"child_process";import{platform as Mj}from"os";function $f(){return oI()?(T.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),T.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.
|
|
4310
|
+
`),2):(T.dimmed("Setting device pixel ratio to 1."),T.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.
|
|
4311
|
+
l.`),1)}function oI(){return Mj()==="darwin"&&Ij("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Wf(r){oI()&&r===1&&(T.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),T.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import Pj from"@actions/exec";import Oj from"@actions/io";import Lj from"quote";import Nj from"string-argv";async function iI(r,e=!0){let t=Nj(r),n=await Oj.which(t[0],!0),o=t.slice(1),i=Pj.exec(Lj(n),o,{delay:100});if(e)return i}import Dj from"csv-parser";import{createReadStream as kj}from"fs";function qf(r){return new Promise((e,t)=>{let n=[];kj(r).pipe(Dj()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import Qd from"semver";import{z as Zd}from"zod";var Nn="2.18.0",Fj="https://registry.npmjs.org/momentic",Uj=Zd.object({versions:Zd.record(Zd.string(),Zd.unknown()).optional()});async function aI(r){try{await Bj(r)}catch(e){T.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Bj(r){if(!Nn){r.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let n=0;n<2;n++)try{let o=await j(fetch(Fj),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=Uj.parse(i).versions;break}catch(o){r.warn({err:o},"Failed to fetch npm registry data")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let n of Object.keys(e))Qd.valid(n)&&(!t||Qd.gt(n,t))&&Qd.gt(n,Nn)&&Qd.lt(n,"2.0.0")&&!n.includes("alpha")&&(t=n);t&&(T.warn(`Update available: v${Nn} -> v${t}`),T.warn("This version may be missing critical fixes, features, and security updates."),T.warn(`Run "npx momentic@${t} -V" to update`))}import Kf from"fs";import{compact as zj,partition as ep}from"lodash-es";import Yf from"path";import{cwd as Hj}from"process";import Gj from"semver";async function tp({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,labels:a,logger:l}){let c=new Set;if(r&&r.length>0){let u=r.some(p=>Kf.existsSync(p)),d=Hj();u?(d!==t.rootDir&&l.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.`),l.info(`Reading tests from the following local file paths:
|
|
4312
4312
|
${r.map(p=>`${st}- ${p}`).join(`
|
|
4313
4313
|
`)}
|
|
4314
4314
|
`),r.forEach(p=>{if(!Kf.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let m,h;try{m=Kf.statSync(p),h=m.isDirectory()}catch(f){l.warn({err:f},`Skipping path ${p} because it cannot be read`);return}let g=Yf.resolve(p);Object.values(e.tests).filter(f=>h?f.fullFilePath.startsWith(g):f.fullFilePath===g).forEach(f=>{c.add(f.fullFilePath)})})):(l.info(`Reading all tests from the project and running those matching the following substring filters:
|
|
4315
4315
|
${r.map(p=>`${st}- ${p}`).join(`
|
|
4316
|
-
`)}`),Object.values(e.tests).forEach(p=>{r.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await wt("No test paths or substrings were provided. Do you want to run all tests?")&&(l.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);l.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=Yf.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 s=Array.from(c).map(async u=>{try{let d=await qe(u,re,e);if(Gj.gt(d.schemaVersion,le)&&l.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:Yf.relative(t.rootDir,u)}}catch(d){l.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(s).then(zj)}function sI({testDefinitions:r,quarantinedTestReasons:e,onlyQuarantined:t=!1,skipQuarantined:n=!1}){if(t){let[u,d]=ep(r,h=>h.id in e),[p,m]=ep(u,h=>h.disabled||n);return{testsToSkip:p,quarantinedTestsToSkip:[],testsToRun:m,quarantinedTestsToRun:[]}}let[o,i]=ep(r,u=>u.disabled),[a,l]=ep(i,u=>u.id in e);return{testsToSkip:o,testsToRun:l,quarantinedTestsToRun:n?[]:a,quarantinedTestsToSkip:n?a:[]}}function lI({testsToRun:r,quarantinedTestsToRun:e,quarantinedTestReasons:t,testInputMatrix:n}){let o=[],i=(a,l,c)=>{n?n.forEach((s,u)=>{o.push({inputs:s,inputIndex:u,testDefinition:a,quarantined:l,quarantinedReason:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:l,quarantinedReason:c})};return r.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,t[a.id])),o}import{partition as jj}from"lodash-es";function rp(r){return r.length===1?"test":"tests"}function cI(r){return r===1?"1 worker":`${r} workers`}function uI(r){r.length!==0&&(E.info(`Skipping ${r.length} disabled ${rp(r)}:`),r.forEach(e=>{E.info(`${st}- ${[e.relativeFilePath]}`)}),E.log(""))}function dI(r,e){r.length!==0&&(E.info(`Skipping ${r.length} quarantined ${rp(r)}:`),r.forEach(t=>{E.info(`${st}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),E.log(""))}function Vj(r,e){r.length!==0&&(E.info(`Running ${r.length} quarantined ${rp(r)} with ${cI(e)}:`),r.forEach(t=>{E.info(`${st}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),E.log(""))}function $j(r,e,t){e.length===0&&r.length>0||(E.info(`Running ${e.length} ${rp(e)} with ${cI(t)}:`),e.forEach(n=>{E.info(`${st}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),E.log(""))}function pI({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]=jj(e,l=>l.quarantined);Vj(i,t),$j(i,a,t)}import{cloneDeep as Ba}from"lodash-es";async function mI({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:l,value:c}=a;i[l]=await ir({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function hI({baseUrl:r,envName:e,testName:t,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:l,generator:c,orgId:s,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:h,aiSettings:g,visualDiffScreenshotStorage:f}){let S=await id({settings:h,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:l,orgId:s}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:re},T=S.browserType??"Chromium";if(!AT(T)){let A=`Browser ${T} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;E.warn(A),re.warn(A)}let w=await xr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new no(y,c),contextArgs:{viewport:i.advanced.viewport??Lt,locale:i.advanced.locale??Wn,geolocation:i.advanced.geolocation??Kn,timezoneId:i.advanced.timezone??qn,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},iconKnowledgeBase:null}),v=new yo({browser:w,generator:c,logger:d,orgId:s,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:l,visualDiffScreenshotStorage:f}),x=new Yt({baseUrl:r,currentUrl:v.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async A=>{let{name:_,defaultValue:M,required:Y}=A,W=m?.[_];Y&&W===void 0&&(E.error(`Required parameter '${_}' is required by test '${i.name}' but not provided`),process.exit(1));let D=await ir({orgId:s,s:W??M,localTools:l,logger:d,context:Yt.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(_,D)})),{controller:v,context:x}}async function gI({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!ja){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 fI({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:l,storageClient:c,logger:s,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;s.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:s,codeEvalTools:l},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 gI({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:s})};return await od({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function SI(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await Wj(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 Wj(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:l,logger:c,gitMetadata:s,alwaysSaveCache:u,noCache:d,runId:p,testInputs:m,quarantined:h,quarantinedReason:g,usageTracker:f}=r,S=new Ji(n,o),y=oa({orgId:o,client:n,gitMetadata:s,alwaysSaveCache:u,noCache:d}),T=Ba(e.steps),w=Ba(e.beforeSteps)??void 0,v=Ba(e.afterSteps)??void 0;try{await y.resolveStepCacheEntries({testId:e.id,stepLists:{steps:T,beforeSteps:w,afterSteps:v},schemaVersion:e.schemaVersion,logger:c})}catch(D){throw c.error({err:D},"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: ${D}`)}let x=r.envName??Kj(e),A,_={};if(x){try{A=Fs(x,t,c)}catch(D){let Q=`Failed to resolve environment ${x} for test ${e.name}: ${D}`;throw new Error(Q)}_=A.variables}let M=e.baseUrl;if(i)M=i;else if(!M){let D=_[St];typeof D=="string"&&(M=D)}if(!M){let D=`Cannot run test with no base URL and no ${St} variable defined in its environment`;throw new Error(D)}let Y=await l.startRun({logger:c,runId:p,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:M,environmentName:x,schemaVersion:e.schemaVersion,resolvedInputs:m,quarantined:h,quarantinedReason:g}),W=c.child(Y.loggerBindings||{});Object.entries(Y.envVarBindings||{}).forEach(([D,Q])=>{_[D]=Q});try{let D=await qj({...r,variables:_,envName:x,resolvedEnv:A,baseUrl:M,storageClient:S,tracer:Y,logger:W,cacheStorage:y,stepsWithCaches:T,beforeStepsWithCaches:w,afterStepsWithCaches:v,usageTracker:f});return await Y.finish({logger:c,status:D.status,finishedAt:D.finishedAt,failureDetails:D.failureDetails,failureReason:D.failureReason,isFlake:D.isFlake,failureRecoveryDetails:D.failureRecoveryDetails}),{runId:Y.runId,...D}}finally{a?.pop()}}async function qj(r){let{testDefinition:e,stepsWithCaches:t,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:l,generator:c,baseUrl:s,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:h,testInputs:g,variables:f,resolvedEnv:S,retriesOverride:y,devicePixelRatio:T,logUpdate:w,tracer:v,logger:x,cacheStorage:A,gitMetadata:_,quarantined:M,quarantinedReason:Y,usageTracker:W}=r,D=i.config.ai?.aiFailureAnalysis??!1,Q=new Date,B=new pa(i,a),H={...i.config},de={envName:p,urlOverride:m,customHeaders:h,testInputs:g},V,Ke=Math.abs(y??i.config.retries??e.retries??0),_e=[];x.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let nt=0;nt<=Ke;nt++){let _t=await v.startAttempt(),X=x.child(_t.loggerBindings||{}),Te={...e,steps:Ba(t),beforeSteps:Ba(n),afterSteps:Ba(o)};nt!==0&&w("RETRY",`attempt ${nt+1}/${Ke+1}`);let ur=new Date,kn=H.advanced?.fakerConstantSeed,Fn=new en({httpClient:new At({baseUrl:l.baseUrl,apiKey:l.apiKey,logger:X}),fakerSeed:kn?$i:void 0}),ap=_t;try{let{controller:zt,context:_r}=await hI({baseUrl:s,envName:p,testName:Te.name,apiClient:l,devicePixelRatio:T,logger:X,storageClient:u,codeEvalTools:Fn,test:Te,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Te.advanced},aiSettings:{...i.config.ai||{},...Te.advanced||{}},visualDiffScreenshotStorage:B});V=await fI({attemptMetadata:{attemptNumber:nt+1,orgId:d,runId:v.runId},attemptFixtures:{logger:X,storageClient:u,usageTracker:W,codeEvalTools:Fn,apiClient:l,context:_r,controller:zt,tracer:_t},attemptInputs:{test:Te,orgSettings:H}});let Co=new Date,Vr={logger:x,cacheStorage:A,orgId:d,testId:e.id,originalSteps:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},updatedSteps:{steps:Te.steps,beforeSteps:Te.beforeSteps,afterSteps:Te.afterSteps}};V?.status==="PASSED"?await Vc(Vr):V?.status==="FAILED"&&await $c(Vr),await _t.finish({logger:X,result:V}),_e.unshift(V.status);let xo=await mI({orgId:d,codeEvalTools:Fn,logger:X,outputDefinitions:e.outputs??[],testContext:_r}),$=qS(_e),Ai=nt+1;if(V.status!=="FAILED")return{...V,parameters:de,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:Co,attempts:Ai,baseUrl:s,outputs:xo,isFlake:$,quarantined:M,quarantinedReason:Y};let Ci=V.failedStepResult,fn=Ci?.message||"Unknown failure",Ir=Ci?.failureReason??Wy(fn)??"UnknownError",sp=X.child({errResult:Ci,failureReason:Ir,errorMessage:fn,numAttempts:Ke+1,name:Te.name});if(nt<Ke){sp.warn(`Retrying failed execution attempt for run: ${fn}`);continue}sp.error(`Test failed after all exhausting attempts: ${fn}`);let Rl=new Error(fn),It={errorMessage:fn,errorStack:Rl.stack},_o;if(D){let Un;try{if(V.results&&V.results.length>0){let{classification:vt,aiFailureReason:Sn}=await Ab({logger:X,browserStateStorage:ap,generator:c,fullResults:V,failureReason:Ir,error:Rl,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Un=vt,_o=Sn}}catch(vt){X.warn({err:vt},"Failed to classify test results")}Un&&(It.classification=Un,Ir=_o??Ir)}return{...V,parameters:de,failureDetails:It,failureReason:Ir,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:Co,attempts:nt+1,baseUrl:s,outputs:xo,quarantined:M,quarantinedReason:Y}}catch(zt){Ga(zt);let _r=`Encountered fatal platform error while running test '${Te.name}': ${zt}`,Co=new Date,Vr=nt+1;X.error({err:zt},_r),E.error(_r);let xo={errorMessage:zt.message,errStack:zt.stack},$={status:"FAILED",failureDetails:xo,failureReason:"InternalPlatformError",finishedAt:Co};return await _t.finish({logger:X,result:{status:"FAILED",results:[]}}),{...$,results:[],parameters:de,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:new Date,attempts:Vr,baseUrl:s,outputs:{},quarantined:M,quarantinedReason:Y}}}throw new Error("This code should not be reachable")}function Kj(r){for(let e of r.envs??[])if(e.default)return e.name}import Yj from"adm-zip";import{randomUUID as Xj}from"crypto";var Dn="assets";function Jj(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function Qj(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Xf=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:`${Dn}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";qt.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;qt.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:Qj(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},za=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(`${Dn}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${Dn}/${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))qt.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 Xf(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:Jj(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}},Jf=class{constructor(e,t,n,o,i,a){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.diskStorage.mkdir("assets")}finished=!1;children=[];get loggerBindings(){return{runAttemptId:this.runAttemptId}}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:t,logger:n}=e,o=t();if(!o)return;let i=new Yj;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Dn}/${Om}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Om},"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:zc(n.results,t),beforeResults:n.beforeResults?zc(n.beforeResults,t):void 0,afterResults:n.afterResults?zc(n.afterResults,t):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${Dn}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${Dn}/${t}.html`)?.toString()}},Qf=class{constructor(e,t,n,o,i,a){this.orgId=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[FA]: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=Xj(),n={id:t,schemaVersion:le,runAttemptSchemaVersion:cT,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Jf(this.orgId,this.testId,this.testName,t,n,e);return this.children.push(o),o}},np=class r{constructor(e,t,n,o){this.orgId=e;this.runGroupId=t;this.metadata=n;this.diskStorage=o}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,n,o,i){let a={...o,id:t,trigger:gr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Nn,labels:i??[]},l=new zs(n);return l.storeFile({name:"metadata.json",contents:JSON.stringify(a,null,2)}),new r(e,t,a,l)}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:Nn,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 Qf(this.orgId,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function yI(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 EI(r){let{logger:e,tests:t,yes:n,start:o,waitOn:i,client:a,debugDataStorage:l,project:c,retriesOverride:s,urlOverride:u,envName:d,orgId:p,devicePixelRatio:m,customHeaders:h,testInputMatrix:g,reporter:f,include:S,exclude:y,labels:T,reporterDir:w=jb,outputDir:v=Vb,uploadResults:x=!1,waitOnTimeout:A=60,parallel:_,shardIndex:M=1,shardCount:Y=1,regenerateGoldenFiles:W,gitMetadata:D,alwaysSaveCache:Q,noCache:B,ignoreQuarantine:H,skipQuarantined:de,onlyQuarantined:V,runGroupId:Ke}=r;o&&(e.info({orgId:p},`Executing start command: ${o}`),await iI(o,!1)),i&&(e.info({orgId:p},`Waiting for url: ${i} with timeout: ${A} seconds.`),await tV({resources:[i],interval:2500,timeout:A*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let _e=new vn(c.config.ai?.agentConfig,{baseUrl:a.baseUrl,apiKey:a.apiKey,logger:e}),nt=await K(c),_t=await tp({tests:t,momenticFiles:nt,yes:n,project:c,include:S,exclude:y,labels:T,logger:E}),X=await yI(e,a,H),{testsToSkip:Te,quarantinedTestsToSkip:ur,testsToRun:kn,quarantinedTestsToRun:Fn}=sI({testDefinitions:_t,quarantinedTestReasons:X,onlyQuarantined:V,skipQuarantined:de});uI(Te),dI(ur,X);let ap=lI({testsToRun:kn,quarantinedTestsToRun:Fn,quarantinedTestReasons:X,testInputMatrix:g}),zt=nV({globalTestsToRunWithInputs:ap,shardIndex:M,shardCount:Y});pI({logger:e,localTestsToRunWithInputs:zt,parallel:_,shardCount:Y,shardIndex:M});let _r=[],Co=new Date,Vr=new Set,xo=async()=>{let It=a.getAppUrl(),_o=Xi({results:_r,startTime:Co.getTime(),onFailed:vt=>{Cc(vt,vt.filePath)},getDisplayLine:vt=>{let Sn=`${st}- ${vt.filePath}${vt.failureRecoveryDetails?" [recovered] ":""}`;return vt.runId&&(Sn+=` ( link when uploaded: ${It}/runs/${vt.runId} )`),Sn},entity:"test"}),Un=_r.filter(vt=>!!vt.failureRecoveryDetails?.attempts);return Un.length>0&&E.warn(`Our AI agent automatically prevented ${Un.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.`),E.log(""),x?(E.success(`Test results have been saved to the folder ${v}. Uploading to Momentic Cloud...`),await ou({client:a,consoleLogger:E,resultsPath:v})):E.success(`Test results have been saved to the folder ${v}. Upload them to Momentic Cloud by running 'npx momentic results upload ${v}'.`),_o};eV.existsSync(v)&&E.warn(`Output directory ${v} already exists, removing before test execution...`);let $=await np.start(p,Ke,v,D,T),Ai=e.child($.loggerBindings||{}),Ci=[],fn=async()=>{E.warn("SIGINT received. Stopping tests and printing latest results..."),await $.finish({logger:Ai,status:"CANCELLED"}),await xo(),await Promise.allSettled(Ci.map(It=>It())),process.exit(1)};process.once("SIGINT",fn);let Ir={};for(let It=0;It<zt.length;It++){let _o=Object.values(Ir);_o.length===_&&await Promise.race(_o.map(Sn=>Sn.promise));let Un=zt[It],vt=`test-${It}`;Ir[vt]={done:!1,promise:(async({inputs:Sn,quarantined:AI,quarantinedReason:CI,testDefinition:Io})=>{Vr.add({inputs:Sn});let wl=Io.relativeFilePath.includes("..")?Io.fullFilePath:Io.relativeFilePath;ws({status:"START",testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length});let xI=setInterval(()=>ws({status:"RUN",testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length}),5*60*1e3),lp=Zj(),cp=Ai.child({testId:Io.id,runId:lp}),tS=new Xc({logger:cp,reporter:new Ic(a),runType:"test-run",runId:lp,testMetadata:Io,suiteMetadata:void 0});try{let Al=await SI({testDefinition:Io,project:c,testInputs:Sn,quarantined:AI,quarantinedReason:CI,orgId:p,runId:lp,devicePixelRatio:m,apiClient:a,runGroupTracer:$,generator:_e,retriesOverride:s,urlOverride:u,envName:d,customHeaders:h,regenerateGoldenFiles:W,logUpdate:(Cl,_I)=>ws({status:Cl,testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length,additionalText:_I}),runSigIntHandlers:Ci,logger:cp,gitMetadata:D,alwaysSaveCache:Q,noCache:B,usageTracker:tS});ws({status:Al.status,testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length}),_r.push(Al)}catch(Al){let Cl=`Encountered unexpected fatal error when running test '${Io.name}': ${Al.message}`;E.error(Cl),cp.error(Cl)}finally{clearInterval(xI),Ir[vt].done=!0,delete Ir[vt]}await tS.flush(e)})(Un)}}await Promise.allSettled(Object.values(Ir).map(It=>It.promise));let Rl=_r.some(It=>!It.quarantined&&It.status==="FAILED")?"FAILED":"PASSED";return await $.finish({logger:Ai,status:Rl}),process.off("SIGINT",fn),f&&await nI(Ai,l,f,{projectConfigPath:c.configFilePath,suiteName:c.config.name,startedAt:Co,finishedAt:new Date,runs:_r,testsToSkip:Te,quarantinedTestsToSkip:ur,quarantinedTestReasons:X},w),xo()}function rV(r,e,t){if(t>r.length&&(E.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let n=Math.floor((e-1)*(r.length/t)),o=Math.floor(e*(r.length/t));return r.sort().filter((a,l)=>l>=n&&l<o)}function nV({globalTestsToRunWithInputs:r,shardIndex:e,shardCount:t}){return t&&t>1?rV(r,e,t):r}up||re.warn("Sentry is not enabled in this environment due to unsupported node version");CA({serviceName:"cli"});var uV=process.argv.some(r=>r.includes("--log-level"))&&process.argv.some(r=>r.includes("debug")),Zf=r=>{uV&&E.dimmed(r)},Bt=new oV;Bt.name("momentic").description("Momentic CLI").version(Nn);Bt.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Um.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(E.error("No browsers specified"),process.exit(1)),await CT({rawBrowsers:r,force:e.force,all:e.all})});Bt.addOption(new tr("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",r=>{r==="debug"&&E.info("Enabling debug logging"),E.setMinLevel(r.toLowerCase())});Bt.addOption(new tr("--verbose","enable verbose logging")).on("option:verbose",()=>{re.enableConsoleLogs(),E.setMinLevel(20)});var eS=Bt.command("checks").alias("check").description("Perform various project checks");eS.command("config").addOption(cr).action(async r=>{await bt({configFilePath:r.config})});eS.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(cr).addOption(k_).action(async r=>{let e=await bt({configFilePath:r.config});await v_({project:e,fix:r.fix})});eS.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(cr).action(async r=>{let e=await bt({configFilePath:r.config});await R_({project:e})});var bI=Bt.command("migrate").description("Migrate and upgrade tooling");bI.command("steps").description("Migrate steps in all tests and modules to the latest schema version. Note that this is always done when a test is loaded through the interactive editor, so is generally not needed.").addOption(cr).action(async r=>{let e=await bt({configFilePath:r.config});await $_(e)});bI.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(jr).addOption(cr).addOption(Gr).addOption(Ao).action(async r=>{!r.yes&&!await wt("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?")&&process.exit(1);let e=await bt({configFilePath:r.config}),t=new Qe({baseUrl:r.server,apiKey:r.apiKey,logger:re}),{orgId:n}=await t.getAuthInfo();await W_({project:e,orgId:n,apiClient:t}),process.exit(0)});Bt.command("import").addOption(Gr).addOption(jr).addOption(cr).addOption(Ao).addArgument(H_).action(async(r,e)=>{let{apiKey:t,server:n,config:o,yes:i}=e,a=await bt({configFilePath:o}),l=new Qe({baseUrl:n,apiKey:t,logger:re});!r||r.length===0?await __({client:l,project:a,skipPrompts:i}):await I_({client:l,project:a,paths:r,skipPrompts:i}),process.exit(0)});Bt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new tr("--name <name>","Name of the project")).action(async r=>{E.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
4317
|
-
`),
|
|
4318
|
-
`)),process.exit(0)});var pV=Bt.command("run").alias("test").description("Run tests on the local machine");pV.addOption(Gr).addOption(jr).addOption(cr).addOption(Fa).addOption(
|
|
4316
|
+
`)}`),Object.values(e.tests).forEach(p=>{r.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await wt("No test paths or substrings were provided. Do you want to run all tests?")&&(l.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);l.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=Yf.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 s=Array.from(c).map(async u=>{try{let d=await qe(u,re,e);if(Gj.gt(d.schemaVersion,le)&&l.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:Yf.relative(t.rootDir,u)}}catch(d){l.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(s).then(zj)}function sI({testDefinitions:r,quarantinedTestReasons:e,onlyQuarantined:t=!1,skipQuarantined:n=!1}){if(t){let[u,d]=ep(r,h=>h.id in e),[p,m]=ep(u,h=>h.disabled||n);return{testsToSkip:p,quarantinedTestsToSkip:[],testsToRun:m,quarantinedTestsToRun:[]}}let[o,i]=ep(r,u=>u.disabled),[a,l]=ep(i,u=>u.id in e);return{testsToSkip:o,testsToRun:l,quarantinedTestsToRun:n?[]:a,quarantinedTestsToSkip:n?a:[]}}function lI({testsToRun:r,quarantinedTestsToRun:e,quarantinedTestReasons:t,testInputMatrix:n}){let o=[],i=(a,l,c)=>{n?n.forEach((s,u)=>{o.push({inputs:s,inputIndex:u,testDefinition:a,quarantined:l,quarantinedReason:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:l,quarantinedReason:c})};return r.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,t[a.id])),o}import{partition as jj}from"lodash-es";function rp(r){return r.length===1?"test":"tests"}function cI(r){return r===1?"1 worker":`${r} workers`}function uI(r){r.length!==0&&(T.info(`Skipping ${r.length} disabled ${rp(r)}:`),r.forEach(e=>{T.info(`${st}- ${[e.relativeFilePath]}`)}),T.log(""))}function dI(r,e){r.length!==0&&(T.info(`Skipping ${r.length} quarantined ${rp(r)}:`),r.forEach(t=>{T.info(`${st}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),T.log(""))}function Vj(r,e){r.length!==0&&(T.info(`Running ${r.length} quarantined ${rp(r)} with ${cI(e)}:`),r.forEach(t=>{T.info(`${st}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),T.log(""))}function $j(r,e,t){e.length===0&&r.length>0||(T.info(`Running ${e.length} ${rp(e)} with ${cI(t)}:`),e.forEach(n=>{T.info(`${st}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),T.log(""))}function pI({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]=jj(e,l=>l.quarantined);Vj(i,t),$j(i,a,t)}import{cloneDeep as Ba}from"lodash-es";async function mI({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:l,value:c}=a;i[l]=await ir({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function hI({baseUrl:r,envName:e,testName:t,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:l,generator:c,orgId:s,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:h,aiSettings:g,visualDiffScreenshotStorage:f}){let S=await id({settings:h,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:l,orgId:s}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:re},E=S.browserType??"Chromium";if(!AT(E)){let A=`Browser ${E} 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...`;T.warn(A),re.warn(A)}let w=await xr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new oo(y,c),contextArgs:{viewport:i.advanced.viewport??Lt,locale:i.advanced.locale??qn,geolocation:i.advanced.geolocation??Yn,timezoneId:i.advanced.timezone??Kn,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},iconKnowledgeBase:null}),v=new Eo({browser:w,generator:c,logger:d,orgId:s,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:l,visualDiffScreenshotStorage:f}),x=new Yt({baseUrl:r,currentUrl:v.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async A=>{let{name:_,defaultValue:M,required:Y}=A,W=m?.[_];Y&&W===void 0&&(T.error(`Required parameter '${_}' is required by test '${i.name}' but not provided`),process.exit(1));let D=await ir({orgId:s,s:W??M,localTools:l,logger:d,context:Yt.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(_,D)})),{controller:v,context:x}}async function gI({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!ja){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return t.warn(n),T.warn(n),!1}return!0}async function fI({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:l,storageClient:c,logger:s,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;s.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:s,codeEvalTools:l},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 gI({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:s})};return await od({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function SI(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await Wj(r)}catch(o){let i="Fatal error running test";return T.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 Wj(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:l,logger:c,gitMetadata:s,alwaysSaveCache:u,noCache:d,runId:p,testInputs:m,quarantined:h,quarantinedReason:g,usageTracker:f}=r,S=new Ji(n,o),y=oa({orgId:o,client:n,gitMetadata:s,alwaysSaveCache:u,noCache:d}),E=Ba(e.steps),w=Ba(e.beforeSteps)??void 0,v=Ba(e.afterSteps)??void 0;try{await y.resolveStepCacheEntries({testId:e.id,stepLists:{steps:E,beforeSteps:w,afterSteps:v},schemaVersion:e.schemaVersion,logger:c})}catch(D){throw c.error({err:D},"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: ${D}`)}let x=r.envName??Kj(e),A,_={};if(x){try{A=Fs(x,t,c)}catch(D){let Q=`Failed to resolve environment ${x} for test ${e.name}: ${D}`;throw new Error(Q)}_=A.variables}let M=e.baseUrl;if(i)M=i;else if(!M){let D=_[St];typeof D=="string"&&(M=D)}if(!M){let D=`Cannot run test with no base URL and no ${St} variable defined in its environment`;throw new Error(D)}let Y=await l.startRun({logger:c,runId:p,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:M,environmentName:x,schemaVersion:e.schemaVersion,resolvedInputs:m,quarantined:h,quarantinedReason:g}),W=c.child(Y.loggerBindings||{});Object.entries(Y.envVarBindings||{}).forEach(([D,Q])=>{_[D]=Q});try{let D=await qj({...r,variables:_,envName:x,resolvedEnv:A,baseUrl:M,storageClient:S,tracer:Y,logger:W,cacheStorage:y,stepsWithCaches:E,beforeStepsWithCaches:w,afterStepsWithCaches:v,usageTracker:f});return await Y.finish({logger:c,status:D.status,finishedAt:D.finishedAt,failureDetails:D.failureDetails,failureReason:D.failureReason,isFlake:D.isFlake,failureRecoveryDetails:D.failureRecoveryDetails}),{runId:Y.runId,...D}}finally{a?.pop()}}async function qj(r){let{testDefinition:e,stepsWithCaches:t,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:l,generator:c,baseUrl:s,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:h,testInputs:g,variables:f,resolvedEnv:S,retriesOverride:y,devicePixelRatio:E,logUpdate:w,tracer:v,logger:x,cacheStorage:A,gitMetadata:_,quarantined:M,quarantinedReason:Y,usageTracker:W}=r,D=i.config.ai?.aiFailureAnalysis??!1,Q=new Date,B=new pa(i,a),H={...i.config},de={envName:p,urlOverride:m,customHeaders:h,testInputs:g},V,Ke=Math.abs(y??i.config.retries??e.retries??0),Ie=[];x.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let nt=0;nt<=Ke;nt++){let _t=await v.startAttempt(),X=x.child(_t.loggerBindings||{}),Te={...e,steps:Ba(t),beforeSteps:Ba(n),afterSteps:Ba(o)};nt!==0&&w("RETRY",`attempt ${nt+1}/${Ke+1}`);let ur=new Date,kn=H.advanced?.fakerConstantSeed,Fn=new en({httpClient:new At({baseUrl:l.baseUrl,apiKey:l.apiKey,logger:X}),fakerSeed:kn?$i:void 0}),ap=_t;try{let{controller:zt,context:_r}=await hI({baseUrl:s,envName:p,testName:Te.name,apiClient:l,devicePixelRatio:E,logger:X,storageClient:u,codeEvalTools:Fn,test:Te,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Te.advanced},aiSettings:{...i.config.ai||{},...Te.advanced||{}},visualDiffScreenshotStorage:B});V=await fI({attemptMetadata:{attemptNumber:nt+1,orgId:d,runId:v.runId},attemptFixtures:{logger:X,storageClient:u,usageTracker:W,codeEvalTools:Fn,apiClient:l,context:_r,controller:zt,tracer:_t},attemptInputs:{test:Te,orgSettings:H}});let xo=new Date,Vr={logger:x,cacheStorage:A,orgId:d,testId:e.id,originalSteps:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},updatedSteps:{steps:Te.steps,beforeSteps:Te.beforeSteps,afterSteps:Te.afterSteps}};V?.status==="PASSED"?await Vc(Vr):V?.status==="FAILED"&&await $c(Vr),await _t.finish({logger:X,result:V}),Ie.unshift(V.status);let _o=await mI({orgId:d,codeEvalTools:Fn,logger:X,outputDefinitions:e.outputs??[],testContext:_r}),$=qS(Ie),Ci=nt+1;if(V.status!=="FAILED")return{...V,parameters:de,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:xo,attempts:Ci,baseUrl:s,outputs:_o,isFlake:$,quarantined:M,quarantinedReason:Y};let xi=V.failedStepResult,fn=xi?.message||"Unknown failure",Ir=xi?.failureReason??Wy(fn)??"UnknownError",sp=X.child({errResult:xi,failureReason:Ir,errorMessage:fn,numAttempts:Ke+1,name:Te.name});if(nt<Ke){sp.warn(`Retrying failed execution attempt for run: ${fn}`);continue}sp.error(`Test failed after all exhausting attempts: ${fn}`);let Rl=new Error(fn),It={errorMessage:fn,errorStack:Rl.stack},Io;if(D){let Un;try{if(V.results&&V.results.length>0){let{classification:vt,aiFailureReason:Sn}=await Ab({logger:X,browserStateStorage:ap,generator:c,fullResults:V,failureReason:Ir,error:Rl,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Un=vt,Io=Sn}}catch(vt){X.warn({err:vt},"Failed to classify test results")}Un&&(It.classification=Un,Ir=Io??Ir)}return{...V,parameters:de,failureDetails:It,failureReason:Ir,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:xo,attempts:nt+1,baseUrl:s,outputs:_o,quarantined:M,quarantinedReason:Y}}catch(zt){Ga(zt);let _r=`Encountered fatal platform error while running test '${Te.name}': ${zt}`,xo=new Date,Vr=nt+1;X.error({err:zt},_r),T.error(_r);let _o={errorMessage:zt.message,errStack:zt.stack},$={status:"FAILED",failureDetails:_o,failureReason:"InternalPlatformError",finishedAt:xo};return await _t.finish({logger:X,result:{status:"FAILED",results:[]}}),{...$,results:[],parameters:de,test:Te,filePath:Te.relativeFilePath,startedAt:Q,lastAttemptStartedAt:ur,finishedAt:new Date,attempts:Vr,baseUrl:s,outputs:{},quarantined:M,quarantinedReason:Y}}}throw new Error("This code should not be reachable")}function Kj(r){for(let e of r.envs??[])if(e.default)return e.name}import Yj from"adm-zip";import{randomUUID as Xj}from"crypto";var Dn="assets";function Jj(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function Qj(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Xf=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:`${Dn}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${Dn}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";qt.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;qt.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:Qj(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},za=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(`${Dn}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${Dn}/${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))qt.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 Xf(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:Jj(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}},Jf=class{constructor(e,t,n,o,i,a){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.diskStorage.mkdir("assets")}finished=!1;children=[];get loggerBindings(){return{runAttemptId:this.runAttemptId}}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:t,logger:n}=e,o=t();if(!o)return;let i=new Yj;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Dn}/${Om}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Om},"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:zc(n.results,t),beforeResults:n.beforeResults?zc(n.beforeResults,t):void 0,afterResults:n.afterResults?zc(n.afterResults,t):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new za(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${Dn}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${Dn}/${t}.html`)?.toString()}},Qf=class{constructor(e,t,n,o,i,a){this.orgId=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[FA]: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=Xj(),n={id:t,schemaVersion:le,runAttemptSchemaVersion:cT,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Jf(this.orgId,this.testId,this.testName,t,n,e);return this.children.push(o),o}},np=class r{constructor(e,t,n,o){this.orgId=e;this.runGroupId=t;this.metadata=n;this.diskStorage=o}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,n,o,i){let a={...o,id:t,trigger:gr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Nn,labels:i??[]},l=new zs(n);return l.storeFile({name:"metadata.json",contents:JSON.stringify(a,null,2)}),new r(e,t,a,l)}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:Nn,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 Qf(this.orgId,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function yI(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 EI(r){let{logger:e,tests:t,yes:n,start:o,waitOn:i,client:a,debugDataStorage:l,project:c,retriesOverride:s,urlOverride:u,envName:d,orgId:p,devicePixelRatio:m,customHeaders:h,testInputMatrix:g,reporter:f,include:S,exclude:y,labels:E,reporterDir:w=jb,outputDir:v=Vb,uploadResults:x=!1,waitOnTimeout:A=60,parallel:_,shardIndex:M=1,shardCount:Y=1,regenerateGoldenFiles:W,gitMetadata:D,alwaysSaveCache:Q,noCache:B,ignoreQuarantine:H,skipQuarantined:de,onlyQuarantined:V,runGroupId:Ke}=r;o&&(e.info({orgId:p},`Executing start command: ${o}`),await iI(o,!1)),i&&(e.info({orgId:p},`Waiting for url: ${i} with timeout: ${A} seconds.`),await tV({resources:[i],interval:2500,timeout:A*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let Ie=new vn(c.config.ai?.agentConfig,{baseUrl:a.baseUrl,apiKey:a.apiKey,logger:e}),nt=await K(c),_t=await tp({tests:t,momenticFiles:nt,yes:n,project:c,include:S,exclude:y,labels:E,logger:T}),X=await yI(e,a,H),{testsToSkip:Te,quarantinedTestsToSkip:ur,testsToRun:kn,quarantinedTestsToRun:Fn}=sI({testDefinitions:_t,quarantinedTestReasons:X,onlyQuarantined:V,skipQuarantined:de});uI(Te),dI(ur,X);let ap=lI({testsToRun:kn,quarantinedTestsToRun:Fn,quarantinedTestReasons:X,testInputMatrix:g}),zt=nV({globalTestsToRunWithInputs:ap,shardIndex:M,shardCount:Y});pI({logger:e,localTestsToRunWithInputs:zt,parallel:_,shardCount:Y,shardIndex:M});let _r=[],xo=new Date,Vr=new Set,_o=async()=>{let It=a.getAppUrl(),Io=Xi({results:_r,startTime:xo.getTime(),onFailed:vt=>{Cc(vt,vt.filePath)},getDisplayLine:vt=>{let Sn=`${st}- ${vt.filePath}${vt.failureRecoveryDetails?" [recovered] ":""}`;return vt.runId&&(Sn+=` ( link when uploaded: ${It}/runs/${vt.runId} )`),Sn},entity:"test"}),Un=_r.filter(vt=>!!vt.failureRecoveryDetails?.attempts);return Un.length>0&&T.warn(`Our AI agent automatically prevented ${Un.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.`),T.log(""),x?(T.success(`Test results have been saved to the folder ${v}. Uploading to Momentic Cloud...`),await ou({client:a,consoleLogger:T,resultsPath:v})):T.success(`Test results have been saved to the folder ${v}. Upload them to Momentic Cloud by running 'npx momentic results upload ${v}'.`),Io};eV.existsSync(v)&&T.warn(`Output directory ${v} already exists, removing before test execution...`);let $=await np.start(p,Ke,v,D,E),Ci=e.child($.loggerBindings||{}),xi=[],fn=async()=>{T.warn("SIGINT received. Stopping tests and printing latest results..."),await $.finish({logger:Ci,status:"CANCELLED"}),await _o(),await Promise.allSettled(xi.map(It=>It())),process.exit(1)};process.once("SIGINT",fn);let Ir={};for(let It=0;It<zt.length;It++){let Io=Object.values(Ir);Io.length===_&&await Promise.race(Io.map(Sn=>Sn.promise));let Un=zt[It],vt=`test-${It}`;Ir[vt]={done:!1,promise:(async({inputs:Sn,quarantined:AI,quarantinedReason:CI,testDefinition:Mo})=>{Vr.add({inputs:Sn});let wl=Mo.relativeFilePath.includes("..")?Mo.fullFilePath:Mo.relativeFilePath;ws({status:"START",testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length});let xI=setInterval(()=>ws({status:"RUN",testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length}),5*60*1e3),lp=Zj(),cp=Ci.child({testId:Mo.id,runId:lp}),tS=new Xc({logger:cp,reporter:new Ic(a),runType:"test-run",runId:lp,testMetadata:Mo,suiteMetadata:void 0});try{let Al=await SI({testDefinition:Mo,project:c,testInputs:Sn,quarantined:AI,quarantinedReason:CI,orgId:p,runId:lp,devicePixelRatio:m,apiClient:a,runGroupTracer:$,generator:Ie,retriesOverride:s,urlOverride:u,envName:d,customHeaders:h,regenerateGoldenFiles:W,logUpdate:(Cl,_I)=>ws({status:Cl,testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length,additionalText:_I}),runSigIntHandlers:xi,logger:cp,gitMetadata:D,alwaysSaveCache:Q,noCache:B,usageTracker:tS});ws({status:Al.status,testLogRef:wl,getRunningTestsCount:()=>Vr.size,getTotalTestsCount:()=>zt.length}),_r.push(Al)}catch(Al){let Cl=`Encountered unexpected fatal error when running test '${Mo.name}': ${Al.message}`;T.error(Cl),cp.error(Cl)}finally{clearInterval(xI),Ir[vt].done=!0,delete Ir[vt]}await tS.flush(e)})(Un)}}await Promise.allSettled(Object.values(Ir).map(It=>It.promise));let Rl=_r.some(It=>!It.quarantined&&It.status==="FAILED")?"FAILED":"PASSED";return await $.finish({logger:Ci,status:Rl}),process.off("SIGINT",fn),f&&await nI(Ci,l,f,{projectConfigPath:c.configFilePath,suiteName:c.config.name,startedAt:xo,finishedAt:new Date,runs:_r,testsToSkip:Te,quarantinedTestsToSkip:ur,quarantinedTestReasons:X},w),_o()}function rV(r,e,t){if(t>r.length&&(T.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let n=Math.floor((e-1)*(r.length/t)),o=Math.floor(e*(r.length/t));return r.sort().filter((a,l)=>l>=n&&l<o)}function nV({globalTestsToRunWithInputs:r,shardIndex:e,shardCount:t}){return t&&t>1?rV(r,e,t):r}up||re.warn("Sentry is not enabled in this environment due to unsupported node version");CA({serviceName:"cli"});var uV=process.argv.some(r=>r.includes("--log-level"))&&process.argv.some(r=>r.includes("debug")),Zf=r=>{uV&&T.dimmed(r)},Bt=new oV;Bt.name("momentic").description("Momentic CLI").version(Nn);Bt.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Um.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(T.error("No browsers specified"),process.exit(1)),await CT({rawBrowsers:r,force:e.force,all:e.all})});Bt.addOption(new tr("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",r=>{r==="debug"&&T.info("Enabling debug logging"),T.setMinLevel(r.toLowerCase())});Bt.addOption(new tr("--verbose","enable verbose logging")).on("option:verbose",()=>{re.enableConsoleLogs(),T.setMinLevel(20)});var eS=Bt.command("checks").alias("check").description("Perform various project checks");eS.command("config").addOption(cr).action(async r=>{await bt({configFilePath:r.config})});eS.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(cr).addOption(k_).action(async r=>{let e=await bt({configFilePath:r.config});await v_({project:e,fix:r.fix})});eS.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(cr).action(async r=>{let e=await bt({configFilePath:r.config});await R_({project:e})});var bI=Bt.command("migrate").description("Migrate and upgrade tooling");bI.command("steps").description("Migrate steps in all tests and modules to the latest schema version. Note that this is always done when a test is loaded through the interactive editor, so is generally not needed.").addOption(cr).action(async r=>{let e=await bt({configFilePath:r.config});await $_(e)});bI.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(jr).addOption(cr).addOption(Gr).addOption(Co).action(async r=>{!r.yes&&!await wt("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?")&&process.exit(1);let e=await bt({configFilePath:r.config}),t=new Qe({baseUrl:r.server,apiKey:r.apiKey,logger:re}),{orgId:n}=await t.getAuthInfo();await W_({project:e,orgId:n,apiClient:t}),process.exit(0)});Bt.command("import").addOption(Gr).addOption(jr).addOption(cr).addOption(Co).addArgument(H_).action(async(r,e)=>{let{apiKey:t,server:n,config:o,yes:i}=e,a=await bt({configFilePath:o}),l=new Qe({baseUrl:n,apiKey:t,logger:re});!r||r.length===0?await __({client:l,project:a,skipPrompts:i}):await I_({client:l,project:a,paths:r,skipPrompts:i}),process.exit(0)});Bt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new tr("--name <name>","Name of the project")).action(async r=>{T.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
4317
|
+
`),T.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."),ip.existsSync(ca)&&(T.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 bT("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await Wb()||await wt("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),ua({name:e,include:lh},ca),T.success(`Initialized Momentic project file at ${op.resolve(ca)}`)});Bt.command("app").addOption(Gr).addOption(jr).addOption(Co).addOption(Df).addOption(cr).addOption(Ff).addOption(Uf).action(async r=>{let{apiKey:e,yes:t,server:n,pixelRatio:o,disableCache:i,saveCache:a}=r,l=await bt({configFilePath:r.config,nameFilter:void 0}),{errors:c}=await Gd({project:l,fix:!1});c>0&&(T.error(`Found ${c} errors`),T.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let s=new Qe({baseUrl:n,apiKey:e,logger:re});await jm({client:s,skipPrompts:t});let u=cV(import.meta.url),d=op.dirname(u),p=op.resolve(d,"..","static"),m=op.resolve(d,"..","assets"),h=o??$f();Wf(h),await y_({momenticServerUrl:n,apiKey:e,serverPort:jd,appPort:jd,staticDir:p,assetsDir:m,devicePixelRatio:h,noCache:i,alwaysSaveCache:a,initialProject:l});let g=`http://localhost:${jd}`;await lV(g)});var vI=Bt.command("queue").description("Queue tests or suites to run on Momentic Cloud");vI.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Gr).addOption(jr).addOption(Mf).addOption(Pf).addOption(Co).addArgument(G_).addOption(qd).addOption(Wd).addOption($d).action(async(r,e)=>{let{apiKey:t,server:n,wait:o,waitTimeout:i,env:a,urlOverride:l}=e,c=Vd(e.customHeaders),s=new Qe({baseUrl:n,apiKey:t,logger:re});(!r||!Array.isArray(r)||!r.length)&&(T.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await s.getAuthInfo();await X_({client:s,orgId:u,wait:o,suitePaths:r,waitTimeout:i,env:a,urlOverride:l,customHeaders:c}),Ha()});vI.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Gr).addOption(jr).addOption(Co).addOption($d).addOption(kf).addOption(qd).addOption(Wd).addOption(new tr("--all","Run all tests.").default(!1)).addOption(Mf).addOption(Pf).addArgument(z_).action(async(r,e)=>{let{all:t,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:l,wait:c,waitTimeout:s,yes:u}=e,d=Vd(e.customHeaders);for(let g of r)(g.endsWith(".yaml")||ip.existsSync(g))&&T.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 Qe({baseUrl:i,apiKey:n,logger:re}),{orgId:m}=await p.getAuthInfo(),h;a&&(h=await qf(a)),await J_({client:p,orgId:m,tests:r,all:t,customHeaders:d,env:o,urlOverride:l,wait:c,waitTimeout:s,testInputMatrix:h,yes:u}),Ha(),process.exit(0)});var dV=Bt.command("list").description("List test paths");dV.addOption(cr).addOption(Fa).addOption(Lf).addOption(Nf).addOption(new tr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(Bf).action(async(r,e)=>{let t=await bt({configFilePath:e.config,nameFilter:e.filter}),n=await K(t),o=await tp({tests:r,momenticFiles:n,yes:!0,project:t,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Es(40,{})});T.info(o.map(i=>i.relativeFilePath).join(`
|
|
4318
|
+
`)),process.exit(0)});var pV=Bt.command("run").alias("test").description("Run tests on the local machine");pV.addOption(Gr).addOption(jr).addOption(cr).addOption(Fa).addOption(Co).addOption($d).addOption(kf).addOption(Ff).addOption(Uf).addOption(F_).addOption(U_).addOption(B_).addOption(Wd).addOption(qd).addOption(Df).addOption(new tr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new tr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new tr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Ao)).addOption(new tr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Ao)).addOption(new tr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Ao)).addOption(new tr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new tr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(P_).addOption(O_).addOption(Of).addOption(L_).addOption(D_).addOption(N_).addOption(Lf).addOption(Nf).addArgument(Bf).action(async(r,e)=>{if(e.shardIndex>e.shardCount)throw new Error("Shard index cannot be greater than shard count");let t=Vd(e.customHeaders),n=await bt({configFilePath:e.config,nameFilter:e.filter}),o=e.parallel??n.config.parallel??1;TI().length<o*2&&T.warn(`You requested to run tests in parallel ${o} at a time on a machine with ${TI().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),T.debug({projectName:n.config.name},"Identified project config");let{errors:i}=await Gd({project:n,fix:!1});i>0&&(T.error(`Found ${i} errors`),T.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 Qe({baseUrl:e.server,apiKey:e.apiKey,logger:re});T.debug("Checking API key and dependencies");let{orgId:l,userId:c}=await jm({client:a,skipPrompts:e.yes});T.debug("API key check and browser installation complete");let s=new gs,u=e.outputDir??n.config.outputDir,d=e.reporterDir??n.config.reporterDir,p=aV(),m=re.child({cliVersion:Nn,orgId:l,userId:c,runGroupId:p}),h=await ao(re,a,n);m.info({gitMetadata:h,config:n.config},"Got local metadata");let g;e.inputCsv&&(g=await qf(e.inputCsv));let f=e.pixelRatio??$f();Wf(f);try{let S=await EI({...e,parallel:o,retriesOverride:e.retries,devicePixelRatio:f,tests:r,project:n,client:a,debugDataStorage:s,outputDir:u,uploadResults:e.uploadResults,reporterDir:d,customHeaders:t,envName:e.env,orgId:l,testInputMatrix:g,logger:m,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:h,alwaysSaveCache:e.saveCache,noCache:e.disableCache,runGroupId:p});Ha(),S.failed>0?process.exit(1):process.exit(0)}catch(S){T.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),T.error(S),Ha(),process.exit(1)}});var mV=Bt.command("apply").description("Apply an operation to local resources");mV.command("patch").addOption(Gr).addOption(jr).addOption(cr).addOption(Fa).addOption(Co).addOption(new tr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new tr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async r=>{let{apiKey:e,server:t,config:n,yes:o}=r,i=await bt({configFilePath:n}),a=re,l=new Qe({baseUrl:t,apiKey:e,logger:a}),c=await K(i),s=c.tests[r.to]??Object.values(c.tests).find(d=>Me(d.name)===r.to.trim());s||(T.error(`No test matching '${r.to}' could be found in the current project.`),process.exit(1));let u=await l.fetchTestFragment(r.from);await T_({client:l,test:s,fragment:u,yes:o,entities:c,logger:re}),process.exit(0)});var RI=Bt.command("results").description("Merge and upload test results.");RI.command("merge").description("Merge test results files.").addOption(Of).addArgument(j_).action(async(r,e)=>{let{outputDir:t}=e;t||(T.error("Output directory is required."),process.exit(1)),ip.existsSync(r)||(T.warn("Results path does not exist, skipping merge."),process.exit(0)),ip.existsSync(t)&&T.warn(`Output directory ${t} already exists, removing before merging...`),Yb(re,t,r)});RI.command("upload").description("Upload test results to Momentic cloud.").addOption(Gr).addOption(jr).addArgument(V_).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=re,i=new Qe({baseUrl:n,apiKey:t,logger:o});await ou({consoleLogger:T,resultsPath:r,client:i}),process.exit(0)});var wI=Bt.command("quarantine").description("Manage test quarantines");wI.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(Gr).addOption(jr).addOption(cr).addOption(Fa).addOption(zf).addArgument(Hf).action(async(r,e)=>{let{apiKey:t,server:n,config:o,reason:i}=e,a=re,l=await bt({configFilePath:o}),c=new Qe({baseUrl:n,apiKey:t,logger:a}),s=await ao(re,c,l);await q_({test:r,reason:i,apiClient:c,project:l,logger:a,identity:s})});wI.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(Gr).addOption(jr).addOption(cr).addOption(Fa).addOption(zf).addArgument(Hf).action(async(r,e)=>{let{apiKey:t,server:n,config:o,reason:i}=e,a=re,l=await bt({configFilePath:o}),c=new Qe({baseUrl:n,apiKey:t,logger:a}),s=await ao(re,c,l);await K_({test:r,reason:i,apiClient:c,project:l,logger:a,identity:s})});async function Ha(){try{await qt.flush(),yT()}catch{}}async function hV(){Zf("Main program started"),await aI(re),Zf("CLI version check complete");try{await Bt.parseAsync(process.argv),Ha()}catch(r){let e={};try{e.playwrightVersion=iV("npx playwright --version").toString()}catch(t){re.error({err:t},"Error fetching debug information")}re.error({err:r,debugInfo:e},"Uncaught error in CLI"),Ga(r,e),T.error(r),Ha(),process.exit(1)}}sV.setMaxListeners(20);process.on("warning",r=>{re.warn({err:r},`Node warning received on CLI: ${r.message}`)});Zf("CLI parsing setup complete");hV();
|
|
4319
4319
|
//# sourceMappingURL=cli.js.map
|
|
4320
|
-
//# debugId=
|
|
4320
|
+
//# debugId=d5908d08-f40c-5cad-a0ac-6a84aa86535a
|