momentic 2.48.2 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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]="
|
|
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]="f216725f-a41e-5a6f-86d8-1dd7732416a0")}catch(e){}}();
|
|
4
4
|
var HB=Object.defineProperty;var Ot=(t,e)=>()=>(t&&(e=t(t=0)),e);var GB=(t,e)=>{for(var r in e)HB(t,r,{get:e[r],enumerable:!0})};var H_,G_=Ot(()=>{"use strict";H_=typeof globalThis=="object"?globalThis:global});var j_=Ot(()=>{"use strict";G_()});var V_=Ot(()=>{"use strict";j_()});var ri,eb=Ot(()=>{"use strict";ri="1.9.0"});function e$(t){var e=new Set([t]),r=new Set,n=t.match($_);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===t};function i(s){return r.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(r.has(c))return!1;var l=c.match($_);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var $_,W_,q_=Ot(()=>{"use strict";eb();$_=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;W_=e$(ri)});function Rl(t,e,r,n){var o;n===void 0&&(n=!1);var i=Nu[Lu]=(o=Nu[Lu])!==null&&o!==void 0?o:{version:ri};if(!n&&i[t]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+t);return r.error(a.stack||a.message),!1}if(i.version!==ri){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+ri);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+ri+"."),!0}function ni(t){var e,r,n=(e=Nu[Lu])===null||e===void 0?void 0:e.version;if(!(!n||!W_(n)))return(r=Nu[Lu])===null||r===void 0?void 0:r[t]}function Cl(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+ri+".");var r=Nu[Lu];r&&delete r[t]}var t$,Lu,Nu,Du=Ot(()=>{"use strict";V_();eb();q_();t$=ri.split(".")[0],Lu=Symbol.for("opentelemetry.js.api."+t$),Nu=H_});function ku(t,e,r){var n=ni("diag");if(n)return r.unshift(e),n[t].apply(n,n$([],r$(r),!1))}var r$,n$,K_,Y_=Ot(()=>{"use strict";Du();r$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},n$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},K_=function(){function t(e){this._namespace=e.namespace||"DiagComponentLogger"}return t.prototype.debug=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return ku("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return ku("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return ku("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return ku("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return ku("verbose",this._namespace,e)},t}()});var Rt,Lm=Ot(()=>{"use strict";(function(t){t[t.NONE=0]="NONE",t[t.ERROR=30]="ERROR",t[t.WARN=50]="WARN",t[t.INFO=60]="INFO",t[t.DEBUG=70]="DEBUG",t[t.VERBOSE=80]="VERBOSE",t[t.ALL=9999]="ALL"})(Rt||(Rt={}))});function X_(t,e){t<Rt.NONE?t=Rt.NONE:t>Rt.ALL&&(t=Rt.ALL),e=e||{};function r(n,o){var i=e[n];return typeof i=="function"&&t>=o?i.bind(e):function(){}}return{error:r("error",Rt.ERROR),warn:r("warn",Rt.WARN),info:r("info",Rt.INFO),debug:r("debug",Rt.DEBUG),verbose:r("verbose",Rt.VERBOSE)}}var J_=Ot(()=>{"use strict";Lm()});var o$,i$,a$,_o,Fu=Ot(()=>{"use strict";Y_();J_();Lm();Du();o$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},i$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},a$="diag",_o=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=ni("diag");if(s)return s[o].apply(s,i$([],o$(i),!1))}}var r=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Rt.INFO}),o===r){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return r.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=ni("diag"),d=X_((s=i.logLevel)!==null&&s!==void 0?s:Rt.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return Rl("diag",d,r,!0)};r.setLogger=n,r.disable=function(){Cl(a$,r)},r.createComponentLogger=function(o){return new K_(o)},r.verbose=e("verbose"),r.debug=e("debug"),r.info=e("info"),r.warn=e("warn"),r.error=e("error")}return t.instance=function(){return this._instance||(this._instance=new t),this._instance},t}()});var Z_,Q_=Ot(()=>{"use strict";Z_=Symbol("BaggageEntryMetadata")});function tb(t){return typeof t!="string"&&(s$.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:Z_,toString:function(){return t}}}var s$,eI=Ot(()=>{"use strict";Fu();Q_();s$=_o.instance()});function rb(t){return Symbol.for(t)}var l$,nb,ob=Ot(()=>{"use strict";l$=function(){function t(e){var r=this;r._currentContext=e?new Map(e):new Map,r.getValue=function(n){return r._currentContext.get(n)},r.setValue=function(n,o){var i=new t(r._currentContext);return i._currentContext.set(n,o),i},r.deleteValue=function(n){var o=new t(r._currentContext);return o._currentContext.delete(n),o}}return t}(),nb=new l$});function sb(){return ab}var Za,c$,Nm,u$,d$,p$,m$,ib,g$,h$,f$,ab,S$,y$,b$,E$,T$,v$,A$,lb=Ot(()=>{"use strict";Za=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),c$=function(){function t(){}return t.prototype.createGauge=function(e,r){return y$},t.prototype.createHistogram=function(e,r){return b$},t.prototype.createCounter=function(e,r){return S$},t.prototype.createUpDownCounter=function(e,r){return E$},t.prototype.createObservableGauge=function(e,r){return v$},t.prototype.createObservableCounter=function(e,r){return T$},t.prototype.createObservableUpDownCounter=function(e,r){return A$},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),Nm=function(){function t(){}return t}(),u$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Nm),d$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Nm),p$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Nm),m$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Nm),ib=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),g$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(ib),h$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(ib),f$=function(t){Za(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(ib),ab=new c$,S$=new u$,y$=new p$,b$=new m$,E$=new d$,T$=new g$,v$=new h$,A$=new f$});var dn,tI=Ot(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(dn||(dn={}))});var R$,C$,rI,nI=Ot(()=>{"use strict";ob();R$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},C$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},rI=function(){function t(){}return t.prototype.active=function(){return nb},t.prototype.with=function(e,r,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return r.call.apply(r,C$([n],R$(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var w$,x$,cb,_$,oI,iI=Ot(()=>{"use strict";nI();Du();Fu();w$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},x$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},cb="context",_$=new rI,oI=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return Rl(cb,e,_o.instance())},t.prototype.active=function(){return this._getContextManager().active()},t.prototype.with=function(e,r,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,x$([e,r,n],w$(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return ni(cb)||_$},t.prototype.disable=function(){this._getContextManager().disable(),Cl(cb,_o.instance())},t}()});var wl,aI=Ot(()=>{"use strict";iI();wl=oI.getInstance()});var J,sI=Ot(()=>{"use strict";Fu();J=_o.instance()});var I$,lI,cI=Ot(()=>{"use strict";lb();I$=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return ab},t}(),lI=new I$});var ub,uI,dI=Ot(()=>{"use strict";cI();Du();Fu();ub="metrics",uI=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return Rl(ub,e,_o.instance())},t.prototype.getMeterProvider=function(){return ni(ub)||lI},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){Cl(ub,_o.instance())},t}()});var Dm,pI=Ot(()=>{"use strict";dI();Dm=uI.getInstance()});var ft=Ot(()=>{"use strict";eI();ob();Lm();lb();tI();aI();sI();pI()});import sve,{multistream as cve}from"pino";import dve from"pino-pretty";import{z as Gf}from"zod";var N7=Gf.object({input:Gf.string(),agentConfigVersion:Gf.string().optional()}),dp="finish";import{z as Jt}from"zod";var F7=Jt.object({srcs:Jt.array(Jt.string()),urls:Jt.array(Jt.string()),desiredSrc:Jt.string().optional(),desiredUrl:Jt.string().optional()}),fA=Jt.object({srcRegex:Jt.string().optional(),urlRegex:Jt.string().optional()}),SA=Jt.object({x:Jt.number(),y:Jt.number(),correlation:Jt.number()}),U7=Jt.object({searchImageBase64String:Jt.string(),pageImageBase64String:Jt.string(),id:Jt.string().uuid(),timeoutMs:Jt.number().max(1e4).min(0).optional()});import{z as k}from"zod";import*as G from"zod";import{extendZodWithOpenApi as jB}from"zod-openapi";import Pc from"zod";var Mc=Pc.object({updatedAt:Pc.coerce.date().optional()}),va=Pc.object({contentType:Pc.enum(["image/jpeg","image/png"]),id:Pc.string()});jB(G);var qo=(s=>(s.AI="AI",s.AI_HEALED="AI_HEALED",s.CLICK_TO_FIND="CLICK_TO_FIND",s.XY_PERCENT="XY_PERCENT",s.RECORDING="RECORDING",s.USER_CSS_SELECTOR="USER_CSS_SELECTOR",s.HEURISTIC_HEALED="HEURISTIC_HEALED",s))(qo||{}),VB=G.object({mPathSelectorTokens:G.string().array(),frameSrcRegex:G.string().optional(),frameUrlRegex:G.string().optional(),indices:G.number().array()}),Oc=G.object({result:G.number(),traceId:G.string()}).array(),Ko=G.object({type:G.literal("GCS_TRACES"),traces:Oc}),Yr=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(Yr||{}),yA=G.object({attributes:G.record(G.string(),G.string()).optional(),text:G.string().optional(),position:G.object({x1:G.number(),y1:G.number(),x2:G.number(),y2:G.number(),tolerance:G.nativeEnum(Yr)}).optional(),shape:G.object({width:G.number(),height:G.number(),tolerance:G.nativeEnum(Yr)}).optional(),boundingBox:G.object({x:G.number(),y:G.number(),width:G.number(),height:G.number()}).optional()}),$B=G.object({selectors:G.string().array(),requirements:yA.optional(),relativeAngleRadians:G.number().min(0).max(2*Math.PI).optional(),relativeDistance:G.number().optional()}),Ai=G.object({id:G.number().int(),dataMomenticId:G.number().int().optional(),selector:G.string().optional(),hybridSelector:G.object({textContent:G.string().nullish(),attributes:G.record(G.string(),G.string().optional()),tagName:G.string(),expandShadowRoot:G.boolean().optional(),classNames:G.string().array(),nthChild:G.number()}).array().optional(),generatedSelectors:G.string().array().optional(),requirements:yA.optional(),additionalElements:$B.array().optional(),role:G.string().optional(),name:G.string().optional(),numChildren:G.number().optional(),content:G.string().optional(),pathFromRoot:G.string().optional(),serializedHtml:G.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:G.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:G.string().url().optional().or(va.optional()),boundingBox:G.object({x:G.number().optional(),y:G.number().optional(),width:G.number(),height:G.number()}).describe("css pixel bounding box").optional(),frameCache:VB.optional(),inputDescription:G.string().optional().describe("the description that generated this cache"),targetSource:G.nativeEnum(qo).optional(),targetUpdateTime:G.string().optional(),targetUpdateLoggerTags:G.record(G.string(),G.string()).optional(),cacheResolutionUpdateSource:G.string().optional(),cacheResolutionUpdateTime:G.string().optional(),cacheResolutionUpdateLoggerTags:G.record(G.string(),G.string()).optional(),memory:Ko.optional()}).openapi({ref:"ElementTargetCache"});function Us(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var WB=G.object({type:G.literal("description"),elementDescriptor:G.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),qB=G.object({x:G.number(),y:G.number()}),KB=G.object({type:G.literal("coordinates"),pixels:qB}).openapi({ref:"CoordinatesTarget"});function Ri(t){return t.type==="description"}function So(t){return t.type==="coordinates"}var Ar=G.discriminatedUnion("type",[WB,KB]).openapi({ref:"ElementTarget"});function jf(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function Rr(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function pp(t){return Ko.safeParse(t).success}import{v4 as nt}from"uuid";import*as w from"zod";import{extendZodWithOpenApi as iz}from"zod-openapi";import{z as Fe}from"zod";import{extendZodWithOpenApi as YB}from"zod-openapi";import{z as Lc}from"zod";var Nc=Lc.object({result:Lc.boolean(),traceId:Lc.string()}).array(),Aa=Lc.object({type:Lc.literal("GCS_TRACES"),traces:Nc}),Vf=Mc.extend({memory:Aa.optional()});YB(Fe);var bA=Fe.object({thoughts:Fe.string(),result:Fe.boolean(),relevantElements:Fe.array(Fe.number()).optional(),updatedMemory:Nc.optional()}),Yn=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Yn||{});var XB=Fe.object({type:Fe.literal("ELEMENT_NAME"),negated:Fe.boolean().optional(),operation:Fe.nativeEnum(Yn),value:Fe.string()}).openapi({ref:"ElementNameAssertion"}),JB=Fe.object({type:Fe.literal("ELEMENT_STYLE"),negated:Fe.boolean().optional(),operation:Fe.nativeEnum(Yn),property:Fe.string(),value:Fe.string()}).openapi({ref:"ElementStyleAssertion"}),ZB=Fe.object({type:Fe.literal("ELEMENT_CONTENT"),negated:Fe.boolean().optional(),operation:Fe.nativeEnum(Yn),value:Fe.string()}).openapi({ref:"ElementContentAssertion"}),QB=Fe.object({type:Fe.literal("ELEMENT_ATTRIBUTE"),negated:Fe.boolean().optional(),operation:Fe.nativeEnum(Yn),attr:Fe.string(),value:Fe.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Yo=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Yo||{});var ez=Fe.object({type:Fe.literal("ELEMENT_EXISTENCE"),negated:Fe.boolean().optional(),condition:Fe.nativeEnum(Yo).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),mp=Fe.discriminatedUnion("type",[ZB,QB,ez,XB,JB]).openapi({ref:"ManualElementAssertion"});var tz=Fe.object({type:Fe.literal("CONTENT"),negated:Fe.boolean().optional(),value:Fe.string()}).openapi({ref:"PageContentAssertion"}),EA=Fe.discriminatedUnion("type",[tz]).openapi({ref:"ManualPageAssertion"});import Fr from"zod";var $f=Fr.discriminatedUnion("type",[Fr.object({type:Fr.literal("SUBSTRING"),url:Fr.string()}),Fr.object({type:Fr.literal("GLOB"),glob:Fr.string()}),Fr.object({type:Fr.literal("REGEX"),regex:Fr.string()}),Fr.object({type:Fr.literal("DOMAIN"),domain:Fr.string()})]),yo=Fr.object({urlMatcher:$f,method:Fr.string().optional()});import{z as Me}from"zod";var rz=Me.object({type:Me.literal("json"),content:Me.string().describe("The JSON content to send in the request body")}),nz=Me.object({type:Me.literal("form-urlencoded"),content:Me.record(Me.string(),Me.string()).describe("The form fields to send in the request body")}),oz=Me.discriminatedUnion("type",[rz,nz]),Ra=Me.object({url:Me.string(),method:Me.union([Me.literal("GET"),Me.literal("POST"),Me.literal("PUT"),Me.literal("DELETE"),Me.literal("PATCH")]),headers:Me.record(Me.string(),Me.string()).optional(),params:Me.record(Me.string(),Me.string()).optional(),body:oz.optional(),timeout:Me.number().int().optional().describe("Max seconds to wait for the request to complete")}),TA=Me.object({url:Me.string(),headers:Me.record(Me.string(),Me.string()).optional(),query:Me.string(),variables:Me.string().optional(),timeout:Me.number().int().optional().describe("Max seconds to wait for the request to complete")}),gp=Me.object({code:Me.string(),fragment:Me.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:Me.union([Me.literal("NODE"),Me.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:Me.number().int().max(60).optional().describe("Max seconds for the code to complete")});var dt=(Q=>(Q.AI_EXTRACT="AI_EXTRACT",Q.AI_ASSERTION="AI_ASSERTION",Q.AUTH_LOAD="AUTH_LOAD",Q.AUTH_SAVE="AUTH_SAVE",Q.BLUR="BLUR",Q.CAPTCHA="CAPTCHA",Q.CLICK="CLICK",Q.COOKIE="COOKIE",Q.COPY="COPY",Q.DIALOG="DIALOG",Q.DRAG="DRAG",Q.ELEMENT_CHECK="ELEMENT_CHECK",Q.FILE_UPLOAD="FILE_UPLOAD",Q.FOCUS="FOCUS",Q.GO_BACK="GO_BACK",Q.GO_FORWARD="GO_FORWARD",Q.HOVER="HOVER",Q.JAVASCRIPT="JAVASCRIPT",Q.LOCAL_STORAGE="LOCAL_STORAGE",Q.MOUSE_DRAG="MOUSE_DRAG",Q.NAVIGATE="NAVIGATE",Q.NEW_TAB="NEW_TAB",Q.PAGE_CHECK="PAGE_CHECK",Q.PASTE="PASTE",Q.PRESS="PRESS",Q.KEY_DOWN="KEY_DOWN",Q.KEY_UP="KEY_UP",Q.REFRESH="REFRESH",Q.REQUEST="REQUEST",Q.GRAPHQL_REQUEST="GRAPHQL_REQUEST",Q.SCROLL_DOWN="SCROLL_DOWN",Q.SCROLL_UP="SCROLL_UP",Q.SCROLL_LEFT="SCROLL_LEFT",Q.SCROLL_RIGHT="SCROLL_RIGHT",Q.SELECT_OPTION="SELECT_OPTION",Q.SWITCH_TAB="TAB",Q.TYPE="TYPE",Q.VISUAL_DIFF="VISUAL_DIFF",Q.WAIT="WAIT",Q.WAIT_FOR_URL="WAIT_FOR_URL",Q.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",Q.AWAIT_LISTENER="AWAIT_LISTENER",Q.RECORD_REQUESTS="RECORD_REQUESTS",Q.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",Q.SET_HEADER="SET_HEADER",Q.MOCK_ROUTE="MOCK_ROUTE",Q.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",Q.OFFLINE_MODE="OFFLINE_MODE",Q.SUCCESS="SUCCESS",Q))(dt||{});iz(w);var de=w.object({thoughts:w.string().optional(),id:w.string().uuid().describe("unique identifier to this step, used for step cache")}),An=w.object({useSelector:w.boolean().optional(),force:w.boolean().optional(),disableCache:w.boolean().optional().describe("disable element caching for this step"),iframeUrl:w.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),sn=Mc.extend({target:Ai}).optional().openapi({ref:"SingleTargetCache"});function fp(t){return!!t&&sn.safeParse(t).success}var Sp=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),vA=de.merge(Sp).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),yp=An.merge(w.object({cache:sn})),Ca=de.merge(yp.merge(w.object({target:Ar.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),wa=de.merge(yp.merge(w.object({target:Ar.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Bs=de.merge(yp.merge(w.object({target:Ar.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),zs=de.merge(yp.merge(w.object({target:Ar.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),bee=w.discriminatedUnion("type",[Ca,wa,Bs,zs]).openapi({ref:"AllScrollCommands"}),az=de.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),AA=de.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),sz=w.object({caseInsensitive:w.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:w.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:w.number().int().optional().describe("Max seconds to wait for the URL to match")}),RA=de.extend({type:w.literal("WAIT_FOR_URL"),matcher:$f}).merge(sz).openapi({ref:"WaitUrlCommand"}),CA=de.merge(Sp).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),wA=de.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),xA=de.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),lz=de.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),cz=de.extend({type:w.literal("AUTH_LOAD"),storageState:w.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Wf=de.merge(An).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),_A=de.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),IA=de.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),PA=de.merge(gp).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Hs=de.merge(An).extend({type:w.literal("CLICK"),target:Ar,doubleClick:w.boolean().optional(),rightClick:w.boolean().optional(),waitForDownload:w.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:w.number().optional(),downloadTimeoutMs:w.number().optional(),cache:sn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()}).openapi({ref:"ClickCommand"}),qf=Mc.extend({fromTarget:Ai.optional(),toTarget:Ai.optional()}),Gs=de.merge(An).merge(w.object({type:w.literal("DRAG"),fromTarget:Ar,toTarget:Ar,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:qf.optional()})).openapi({ref:"DragCommand"}),js=de.merge(An).merge(w.object({type:w.literal("MOUSE_DRAG"),target:Ar.optional(),deltaX:w.string().describe("pixels to move horizontally, can be template"),deltaY:w.string().describe("pixels to move vertically, can be template"),steps:w.number().optional(),cache:sn})).openapi({ref:"MouseDragCommand"}),Vs=de.merge(An).merge(w.object({type:w.literal("HOVER"),target:Ar,cache:sn})).openapi({ref:"HoverCommand"}),Dc=de.merge(An).merge(w.object({type:w.literal("FOCUS"),target:Ar,cache:sn})).openapi({ref:"FocusCommand"}),kc=de.merge(An).extend({type:w.literal("BLUR"),target:Ar.optional(),cache:sn}).openapi({ref:"BlurCommand"}),uz=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),dz=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),pz=de.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[uz,dz]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),Kf=w.discriminatedUnion("type",[w.object({type:w.literal("VALUE"),value:w.string()}),w.object({type:w.literal("LABEL"),label:w.string()}),w.object({type:w.literal("INDEX"),index:w.coerce.string()})]),$s=de.merge(An).extend({type:w.literal("SELECT_OPTION"),target:Ar,cache:sn,choice:Kf.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Yf=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),Fc=de.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:Yf.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:Vf.optional(),source:w.string().optional()})).openapi({ref:"AIAssertionCommand"}),bo=5,xa=600,Ws=de.merge(An).extend({type:w.literal("ELEMENT_CHECK"),target:Ar,assertion:mp,cache:sn.or(Vf).optional(),timeout:w.number().int().min(0).max(xa).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),MA=de.extend({type:w.literal("PAGE_CHECK"),assertion:EA,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(xa).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),OA=de.merge(w.object({type:w.literal("AI_EXTRACT"),goal:w.string(),schema:w.string().optional(),envKey:w.string().optional(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional()})).openapi({ref:"AIExtractCommand"}),mz=w.object({clearContent:w.boolean().optional(),forceClearContent:w.boolean().optional(),delay:w.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:w.boolean().optional(),pressEnter:w.boolean().optional(),relativePosition:w.object({x:w.number(),y:w.number()}).optional()}),LA=25,qs=de.merge(An).merge(mz).extend({type:w.literal("TYPE"),target:Ar.optional(),value:w.string(),cache:sn}).openapi({ref:"TypeCommand"}),NA=de.merge(w.object({type:w.literal("PRESS"),value:w.string(),repeat:w.number().optional(),convertMeta:w.boolean().optional(),delayMs:w.number().optional()})).openapi({ref:"PressCommand"}),DA=de.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),kA=de.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),gz=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),hz=w.object({type:w.literal("REGEX"),pattern:w.string()}),fz=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),Sz=w.discriminatedUnion("type",[gz,hz,fz]),yz=de.merge(Sp).merge(w.object({type:w.literal("TAB"),action:Sz})).openapi({ref:"TabCommand"}),FA=de.merge(Sp).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),bz=de.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),UA=de.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),BA=de.extend({type:w.literal("REQUEST")}).merge(Ra).openapi({ref:"RequestCommand"}),Uc=w.object({status:w.number().optional(),headers:w.record(w.string(),w.string()),json:w.unknown().optional(),text:w.string().optional(),cookies:w.record(w.string(),w.unknown()).array().optional(),request:w.object({url:w.string(),method:w.string(),headers:w.record(w.string(),w.string()),json:w.unknown().optional()})}),zA=de.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(TA).openapi({ref:"GraphQLRequestCommand"}),HA=de.merge(w.object({type:w.literal("SUCCESS"),condition:Fc.optional()})).openapi({ref:"SuccessCommand"}),GA=de.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),Ez=w.object({data:w.union([w.string().describe("location at which to find a jpg - public URL or local"),va]),width:w.number(),height:w.number()});function jA(t){return t?va.safeParse(t).success:!1}var Bc=de.merge(An).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:Ar.optional(),screenshot:Ez.optional(),cache:sn})).openapi({ref:"VisualDiffCommand"}),VA=de.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:yo,key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),Tz=de.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),$A=de.merge(w.object({type:w.literal("RECORD_REQUESTS"),requestMatcher:yo,key:w.string()})).openapi({ref:"RecordRequestsCommand"}),vz=de.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),WA=de.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),requestMatcher:yo.optional()})).openapi({ref:"SetHeaderCommand"}),qA=de.merge(w.object({type:w.literal("MOCK_ROUTE"),requestMatcher:yo,responseGenerator:w.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:w.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:w.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"})),Az=de.merge(w.object({type:w.literal("REMOVE_ROUTE_MOCK"),key:w.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),Rz=de.merge(w.object({type:w.literal("OFFLINE_MODE"),enable:w.boolean()})).openapi({ref:"OfflineModeCommand"}),Cz=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],Eee=[...Cz,"DRAG"],wz=w.discriminatedUnion("type",[Hs,qs,NA,DA,kA,$s,vA,wa,Ca,Fc,wA,Vs,AA]),xz=w.discriminatedUnion("type",[...wz.options,Gs]),_z=w.discriminatedUnion("type",[...xz.options]),KA=w.discriminatedUnion("type",[..._z.options,HA]),Xf=w.discriminatedUnion("type",[HA,Hs,qs,NA,DA,kA,$s,vA,wa,Ca,Fc,wA,Vs,AA,PA,Ws,MA,FA,RA,OA,_A,xA,UA,Gs,js,IA,CA,BA,zA,WA,VA,$A,qA]),Iz=w.discriminatedUnion("type",[OA,cz,lz,Wf,bz,_A,az,Ws,pz,xA,PA,UA,js,FA,MA,IA,CA,BA,zA,Bs,zs,yz,Bc,Dc,kc,RA,VA,Tz,$A,vz,WA,qA,Az,Rz]),Ks=w.discriminatedUnion("type",[...KA.options,...Iz.options]).openapi({ref:"Command"}),bp=w.discriminatedUnion("type",[...KA.options,GA]),Tee=w.discriminatedUnion("type",[...Xf.options,GA]);function Xo(t){let e;switch(t){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:nt(),type:t};break;case"AUTH_LOAD":{e={id:nt(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:nt(),type:t,goal:""};break;case"DIALOG":e={id:nt(),type:t,action:"DISMISS"};break;case"DRAG":e={id:nt(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:nt(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:nt(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:nt(),type:t,delay:1};break;case"BLUR":e={id:nt(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:nt(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:nt(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:nt(),type:t,value:""};break;case"SELECT_OPTION":e={id:nt(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:nt(),type:t,url:""};case"TAB":e={id:nt(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:nt(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:nt(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:nt(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:nt(),type:t,code:""};break;case"AI_ASSERTION":e={id:nt(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:nt(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:nt(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:nt(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:nt(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:nt(),type:t,key:""};break}case"SET_HEADER":{e={id:nt(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:nt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:nt(),type:t};break}case"OFFLINE_MODE":{e={id:nt(),type:t,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}var Ree={AI_ASSERTION:"AI Check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page Check"};import{z as Pz}from"zod";var Iee=Pz.discriminatedUnion("type",[kc,Wf,Hs,Gs,Dc,Vs,js,Ca,wa,Bs,zs,$s,qs,Bc,Ws]);function YA(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as Mz}from"zod";import{z as wi}from"zod";function zc(t){return wi.object({key:wi.string(),testId:wi.string().optional(),moduleId:wi.string().optional(),organizationId:wi.string(),value:t})}function Hc(t){return zc(t).extend({uniqueKey:wi.string()})}function Ep(t){return wi.record(wi.string(),Hc(t))}var Ur={type:!0,cache:!0},Xn=Mz.discriminatedUnion("type",[Fc.pick(Ur),kc.pick(Ur),Hs.pick(Ur),Gs.pick(Ur),Ws.pick(Ur),Dc.pick(Ur),Vs.pick(Ur),js.pick(Ur),Ca.pick(Ur),wa.pick(Ur),Bs.pick(Ur),zs.pick(Ur),$s.pick(Ur),qs.pick(Ur),Bc.pick(Ur)]),Tp=Object.values(dt).filter(t=>Xn.options.some(e=>e.shape.type.safeParse(t).success));Ks.options.forEach(t=>{if("target"in t.shape&&!Tp.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function xi(t){return Tp.includes(t.type)}var XA=zc(Xn),JA=Hc(Xn),Fee=Ep(Xn);import{v4 as ot}from"uuid";import{z as _}from"zod";var QA=Symbol("Let zodToJsonSchema decide on which parser to use");var ZA={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},eR=t=>typeof t=="string"?{...ZA,name:t}:{...ZA,...t};var tR=t=>{let e=eR(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function Jf(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function Ge(t,e,r,n,o){t[e]=r,Jf(t,e,n,o)}var vp=(t,e)=>{let r=0;for(;r<t.length&&r<e.length&&t[r]===e[r];r++);return[(t.length-r).toString(),...e.slice(r)].join("/")};import{ZodFirstPartyTypeKind as Be}from"zod";function xt(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?vp(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as Oz}from"zod";function rR(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==Oz.ZodAny&&(r.items=pe(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&Ge(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&Ge(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(Ge(r,"minItems",t.exactLength.value,t.exactLength.message,e),Ge(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function nR(t,e){let r={type:"integer",format:"int64"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?Ge(r,"minimum",n.value,n.message,e):Ge(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),Ge(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?Ge(r,"maximum",n.value,n.message,e):Ge(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),Ge(r,"maximum",n.value,n.message,e));break;case"multipleOf":Ge(r,"multipleOf",n.value,n.message,e);break}return r}function oR(){return{type:"boolean"}}function Ap(t,e){return pe(t.type._def,e)}var iR=(t,e)=>pe(t.innerType._def,e);function Zf(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Zf(t,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return Lz(t,e)}}var Lz=(t,e)=>{let r={type:"integer",format:"unix-time"};if(e.target==="openApi3")return r;for(let n of t.checks)switch(n.kind){case"min":Ge(r,"minimum",n.value,n.message,e);break;case"max":Ge(r,"maximum",n.value,n.message,e);break}return r};function aR(t,e){return{...pe(t.innerType._def,e),default:t.defaultValue()}}function sR(t,e){return e.effectStrategy==="input"?pe(t.schema._def,e):xt(e)}function lR(t){return{type:"string",enum:Array.from(t.values)}}var Nz=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function cR(t,e){let r=[pe(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),pe(t.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach(i=>{if(Nz(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function uR(t,e){let r=typeof t.value;return r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string"?{type:Array.isArray(t.value)?"array":"object"}:e.target==="openApi3"?{type:r==="bigint"?"integer":r,enum:[t.value]}:{type:r==="bigint"?"integer":r,const:t.value}}import{ZodFirstPartyTypeKind as Gc}from"zod";var Qf,Jn={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Qf===void 0&&(Qf=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Qf),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function Rp(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":Ge(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":Ge(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Zn(r,"email",n.message,e);break;case"format:idn-email":Zn(r,"idn-email",n.message,e);break;case"pattern:zod":Br(r,Jn.email,n.message,e);break}break;case"url":Zn(r,"uri",n.message,e);break;case"uuid":Zn(r,"uuid",n.message,e);break;case"regex":Br(r,n.regex,n.message,e);break;case"cuid":Br(r,Jn.cuid,n.message,e);break;case"cuid2":Br(r,Jn.cuid2,n.message,e);break;case"startsWith":Br(r,RegExp(`^${eS(n.value,e)}`),n.message,e);break;case"endsWith":Br(r,RegExp(`${eS(n.value,e)}$`),n.message,e);break;case"datetime":Zn(r,"date-time",n.message,e);break;case"date":Zn(r,"date",n.message,e);break;case"time":Zn(r,"time",n.message,e);break;case"duration":Zn(r,"duration",n.message,e);break;case"length":Ge(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),Ge(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{Br(r,RegExp(eS(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Zn(r,"ipv4",n.message,e),n.version!=="v4"&&Zn(r,"ipv6",n.message,e);break}case"base64url":Br(r,Jn.base64url,n.message,e);break;case"jwt":Br(r,Jn.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Br(r,Jn.ipv4Cidr,n.message,e),n.version!=="v4"&&Br(r,Jn.ipv6Cidr,n.message,e);break}case"emoji":Br(r,Jn.emoji(),n.message,e);break;case"ulid":{Br(r,Jn.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Zn(r,"binary",n.message,e);break}case"contentEncoding:base64":{Ge(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Br(r,Jn.base64,n.message,e);break}}break}case"nanoid":Br(r,Jn.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function eS(t,e){return e.patternStrategy==="escape"?kz(t):t}var Dz=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function kz(t){let e="";for(let r=0;r<t.length;r++)Dz.has(t[r])||(e+="\\"),e+=t[r];return e}function Zn(t,e,r,n){t.format||t.anyOf?.some(o=>o.format)?(t.anyOf||(t.anyOf=[]),t.format&&(t.anyOf.push({format:t.format,...t.errorMessage&&n.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage&&(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.anyOf.push({format:e,...r&&n.errorMessages&&{errorMessage:{format:r}}})):Ge(t,"format",e,r,n)}function Br(t,e,r,n){t.pattern||t.allOf?.some(o=>o.pattern)?(t.allOf||(t.allOf=[]),t.pattern&&(t.allOf.push({pattern:t.pattern,...t.errorMessage&&n.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage&&(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.allOf.push({pattern:dR(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):Ge(t,"pattern",dR(e,n),r,n)}function dR(t,e){if(!e.applyRegexFlags||!t.flags)return t.source;let r={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},n=r.i?t.source.toLowerCase():t.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(r.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
5
5
|
]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
|
|
6
6
|
]))`;continue}}if(r.s&&n[c]==="."){o+=a?`${n[c]}\r
|
|
@@ -34,13 +34,13 @@ ${this.decisions.map(e=>e.toString()).join(`
|
|
|
34
34
|
To resolve the conflict:`,Zb(l,e))),i=c):J.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
|
|
35
35
|
`,`Details:
|
|
36
36
|
`,Jb(l,e),`To resolve the conflict:
|
|
37
|
-
`,Zb(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},t}();var CM=function(){function t(e){this._backingStorages=e}return t.prototype.record=function(e,r,n,o){this._backingStorages.forEach(function(i){i.record(e,r,n,o)})},t}();ft();ft();var wM=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new ro}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){J.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===dn.INT&&!Number.isInteger(e)&&(J.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(r,e)},t}();var xM=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!td(e)){var o=this._buffer.get(e);if(o==null&&(o=new ro,this._buffer.set(e,o)),typeof r!="number"){J.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===dn.INT&&!Number.isInteger(r)&&(J.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),r=Math.trunc(r),!Number.isInteger(r))||o.set(n,r)}},t}();var eE=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},tE=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},_M=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},IM=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},PM=function(){function t(){this._callbacks=[],this._batchCallbacks=[]}return t.prototype.addCallback=function(e,r){var n=this._findCallback(e,r);n>=0||this._callbacks.push({callback:e,instrument:r})},t.prototype.removeCallback=function(e,r){var n=this._findCallback(e,r);n<0||this._callbacks.splice(n,1)},t.prototype.addBatchCallback=function(e,r){var n=new Set(r.filter(td));if(n.size===0){J.error("BatchObservableCallback is not associated with valid instruments",r);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},t.prototype.removeBatchCallback=function(e,r){var n=new Set(r.filter(td)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return eE(this,void 0,void 0,function(){var n,o,i,a;return tE(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,_P(IM(IM([],_M(n),!1),_M(o),!1))];case 1:return i=s.sent(),a=i.filter(IP).map(function(c){return c.reason}),[2,a]}})})},t.prototype._observeCallbacks=function(e,r){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return eE(n,void 0,void 0,function(){var s,c;return tE(this,function(l){switch(l.label){case 0:return s=new wM(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=Ki(c,r)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},t.prototype._observeBatchCallbacks=function(e,r){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return eE(n,void 0,void 0,function(){var s,c;return tE(this,function(l){switch(l.label){case 0:return s=new xM,c=Promise.resolve(i(s)),r!=null&&(c=Ki(c,r)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},t.prototype._findCallback=function(e,r){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===r})},t.prototype._findBatchCallback=function(e,r){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&PP(n.instruments,r)})},t}();var e2=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),MM=function(t){e2(e,t);function e(r,n,o,i,a){var s=t.call(this,r)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new hg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new fg(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(gg);var OM=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),kl=function(){function t(){}return t.Noop=function(){return r2},t}();var t2=function(t){OM(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(kl);var LM=function(t){OM(e,t);function e(r){var n=t.call(this)||this;return n._allowedAttributeNames=r,n}return e.prototype.process=function(r,n){var o=this,i={};return Object.keys(r).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=r[a]}),i},e}(kl);var r2=new t2;var n2=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},o2=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},i2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},NM=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new RM,this.observableRegistry=new PM,this.meter=new EM(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,MM);return r.length===1?r[0]:new CM(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,AM);return r},t.prototype.collect=function(e,r,n){return n2(this,void 0,void 0,function(){var o,i,a;return o2(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(r,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,r)}).filter(wP),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},t.prototype._registerMetricStorage=function(e,r){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=LP(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new r(l,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),s=a.map(function(c){var l=i2(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new r(e,m,kl.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var a2=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},DM=function(){function t(e){this.resource=e,this.viewRegistry=new pM,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=xP(e),n=this.meterSharedStates.get(r);return n==null&&(n=new NM(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=a2(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){r={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var Sg=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},yg=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},s2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},l2=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},kM=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return Sg(this,void 0,void 0,function(){var r,n,o,i,a=this;return yg(this,function(s){switch(s.label){case 0:return r=ns(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Sg(a,void 0,void 0,function(){var l;return yg(this,function(u){switch(u.label){case 0:return[4,c.collect(this,r,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,l2([],s2(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},t.prototype.forceFlush=function(e){return Sg(this,void 0,void 0,function(){return yg(this,function(r){switch(r.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return r.sent(),[2]}})})},t.prototype.shutdown=function(e){return Sg(this,void 0,void 0,function(){return yg(this,function(r){switch(r.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return r.sent(),[2]}})})},t.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},t.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},t.prototype.selectCardinalityLimit=function(e){var r,n,o;return(o=(n=(r=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(r,e))!==null&&o!==void 0?o:2e3},t}();var FM=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},UM=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},BM=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function c2(t,e){var r=e??dg.empty();return t?dg.default().merge(r):r}var rE=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new DM(c2((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=BM(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){r={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=BM(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 t.prototype.getMeter=function(e,r,n){return r===void 0&&(r=""),n===void 0&&(n={}),this._shutdown?(J.warn("A shutdown MeterProvider cannot provide a Meter"),sb()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new kM(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return FM(this,void 0,void 0,function(){return UM(this,function(r){switch(r.label){case 0:return this._shutdown?(J.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 r.sent(),[2]}})})},t.prototype.forceFlush=function(e){return FM(this,void 0,void 0,function(){return UM(this,function(r){switch(r.label){case 0:return this._shutdown?(J.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 r.sent(),[2]}})})},t}();var u2=/[\^$\\.+?()[\]{}|]/g,bg=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(u2,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var Fl=function(){function t(e){this._matchAll=e===void 0,this._pattern=e}return t.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},t}();var zM=function(){function t(e){var r;this._nameFilter=new bg((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new Fl(e?.unit)}return t.prototype.getType=function(){return this._type},t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getUnitFilter=function(){return this._unitFilter},t}();var HM=function(){function t(e){this._nameFilter=new Fl(e?.name),this._versionFilter=new Fl(e?.version),this._schemaUrlFilter=new Fl(e?.schemaUrl)}return t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getVersionFilter=function(){return this._versionFilter},t.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},t}();function d2(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var Eg=function(){function t(e){var r;if(d2(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||bg.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 LM(e.attributeKeys):this.attributesProcessor=kl.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Un.Default(),this.instrumentSelector=new zM({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new HM({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var rMe=process.env.APP||"unknown";ft();import{v4 as p2}from"uuid";function m2(){return new AP({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:ts.DELTA})}var g2=[new Eg({instrumentName:"test_event_duration",instrumentType:$e.HISTOGRAM,aggregation:new ed([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Eg({instrumentName:"test_step_duration",instrumentType:$e.HISTOGRAM,aggregation:new ed([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],Tg=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let r=this.counterCache.get(e);if(r)return r;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let r=this.histogramCache.get(e);if(r)return r;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let r=this.observableGaugeCache.get(e);if(r)return r;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 r=typeof process<"u"?"production":"unknown",n=new Cb({[Bm]:e.serviceName,[bI]:r,[TI]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:p2()}),o=m2(),i=new Yb({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new rE({resource:n,readers:[i],views:g2}),Dm.setGlobalMeterProvider(this.provider),this.meter=Dm.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Om(n,this.globalAttributes);this.getCounter(e).add(typeof r=="number"?r:1,o)}catch{}}gauge(e,r){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,r)}catch{}}distribution(e,r,n){try{let o=Om(n,this.globalAttributes);this.getHistogram(e).record(r,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:r,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(r,Date.now()-o,n)}}};var ar=new Mm;function GM(t){t.disabled||(ar=new Tg(t))}var nE=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:"407bec1616af9a39938c133ee419688af60eb3e8",tracesSampleRate:0,sendDefaultPii:!0}),x_(t.captureException),nE=!0}catch{}import{Argument as T7,Command as v7,Option as kr}from"@commander-js/extra-typings";import{execSync as A7}from"child_process";import{existsSync as h2,statSync as f2}from"fs";function jM(t){try{return h2(t)&&f2(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as S2,input as y2}from"@inquirer/prompts";import{existsSync as b2,mkdirSync as E2,statSync as T2}from"fs";import{dirname as v2}from"path";var A2=!1,$M=(()=>{try{return T2("/.dockerenv"),!0}catch{return!1}})();async function hr(t){return Xa||A2||$M?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await S2({message:t}))}async function oE(t){let e=v2(t);return jM(e)?b2(t)?hr(`File '${VM(t)}' already exists. Overwrite existing content?`):!0:await hr(`Directory '${VM(e)}' doesn't exist. Create it now?`)?(E2(e,{recursive:!0}),!0):!1}function VM(t){return t.replace(/(\s+)/g,"\\$1")}async function WM(t,e){return Xa||$M?e:(await y2({message:t,default:e})).trim()||e}import Oo,{supportsColor as C2}from"chalk";import{Console as qM}from"console";import{format as nd}from"util";var iE=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},vg=class t extends qM{_buffer=[];_groupDepth=0;Console=qM;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new iE(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
37
|
+
`,Zb(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},t}();var CM=function(){function t(e){this._backingStorages=e}return t.prototype.record=function(e,r,n,o){this._backingStorages.forEach(function(i){i.record(e,r,n,o)})},t}();ft();ft();var wM=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new ro}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){J.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===dn.INT&&!Number.isInteger(e)&&(J.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(r,e)},t}();var xM=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!td(e)){var o=this._buffer.get(e);if(o==null&&(o=new ro,this._buffer.set(e,o)),typeof r!="number"){J.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===dn.INT&&!Number.isInteger(r)&&(J.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),r=Math.trunc(r),!Number.isInteger(r))||o.set(n,r)}},t}();var eE=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},tE=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},_M=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},IM=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},PM=function(){function t(){this._callbacks=[],this._batchCallbacks=[]}return t.prototype.addCallback=function(e,r){var n=this._findCallback(e,r);n>=0||this._callbacks.push({callback:e,instrument:r})},t.prototype.removeCallback=function(e,r){var n=this._findCallback(e,r);n<0||this._callbacks.splice(n,1)},t.prototype.addBatchCallback=function(e,r){var n=new Set(r.filter(td));if(n.size===0){J.error("BatchObservableCallback is not associated with valid instruments",r);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},t.prototype.removeBatchCallback=function(e,r){var n=new Set(r.filter(td)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return eE(this,void 0,void 0,function(){var n,o,i,a;return tE(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,_P(IM(IM([],_M(n),!1),_M(o),!1))];case 1:return i=s.sent(),a=i.filter(IP).map(function(c){return c.reason}),[2,a]}})})},t.prototype._observeCallbacks=function(e,r){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return eE(n,void 0,void 0,function(){var s,c;return tE(this,function(l){switch(l.label){case 0:return s=new wM(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=Ki(c,r)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},t.prototype._observeBatchCallbacks=function(e,r){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return eE(n,void 0,void 0,function(){var s,c;return tE(this,function(l){switch(l.label){case 0:return s=new xM,c=Promise.resolve(i(s)),r!=null&&(c=Ki(c,r)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,e)})}),[2]}})})})},t.prototype._findCallback=function(e,r){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===r})},t.prototype._findBatchCallback=function(e,r){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&PP(n.instruments,r)})},t}();var e2=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),MM=function(t){e2(e,t);function e(r,n,o,i,a){var s=t.call(this,r)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new hg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new fg(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(gg);var OM=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),kl=function(){function t(){}return t.Noop=function(){return r2},t}();var t2=function(t){OM(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(kl);var LM=function(t){OM(e,t);function e(r){var n=t.call(this)||this;return n._allowedAttributeNames=r,n}return e.prototype.process=function(r,n){var o=this,i={};return Object.keys(r).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=r[a]}),i},e}(kl);var r2=new t2;var n2=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},o2=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},i2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},NM=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new RM,this.observableRegistry=new PM,this.meter=new EM(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,MM);return r.length===1?r[0]:new CM(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,AM);return r},t.prototype.collect=function(e,r,n){return n2(this,void 0,void 0,function(){var o,i,a;return o2(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(r,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,r)}).filter(wP),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},t.prototype._registerMetricStorage=function(e,r){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=LP(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new r(l,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),s=a.map(function(c){var l=i2(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new r(e,m,kl.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var a2=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},DM=function(){function t(e){this.resource=e,this.viewRegistry=new pM,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=xP(e),n=this.meterSharedStates.get(r);return n==null&&(n=new NM(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=a2(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){r={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var Sg=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},yg=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},s2=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},l2=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},kM=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return Sg(this,void 0,void 0,function(){var r,n,o,i,a=this;return yg(this,function(s){switch(s.label){case 0:return r=ns(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Sg(a,void 0,void 0,function(){var l;return yg(this,function(u){switch(u.label){case 0:return[4,c.collect(this,r,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,l2([],s2(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},t.prototype.forceFlush=function(e){return Sg(this,void 0,void 0,function(){return yg(this,function(r){switch(r.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return r.sent(),[2]}})})},t.prototype.shutdown=function(e){return Sg(this,void 0,void 0,function(){return yg(this,function(r){switch(r.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return r.sent(),[2]}})})},t.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},t.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},t.prototype.selectCardinalityLimit=function(e){var r,n,o;return(o=(n=(r=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(r,e))!==null&&o!==void 0?o:2e3},t}();var FM=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},UM=function(t,e){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return r.label++,{value:l[1],done:!1};case 5:r.label++,o=l[1],l=[0];continue;case 7:l=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){r=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){r.label=l[1];break}if(l[0]===6&&r.label<i[1]){r.label=i[1],i=l;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(l);break}i[2]&&r.ops.pop(),r.trys.pop();continue}l=e.call(t,r)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},BM=function(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function c2(t,e){var r=e??dg.empty();return t?dg.default().merge(r):r}var rE=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new DM(c2((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=BM(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){r={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=BM(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 t.prototype.getMeter=function(e,r,n){return r===void 0&&(r=""),n===void 0&&(n={}),this._shutdown?(J.warn("A shutdown MeterProvider cannot provide a Meter"),sb()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new kM(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return FM(this,void 0,void 0,function(){return UM(this,function(r){switch(r.label){case 0:return this._shutdown?(J.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 r.sent(),[2]}})})},t.prototype.forceFlush=function(e){return FM(this,void 0,void 0,function(){return UM(this,function(r){switch(r.label){case 0:return this._shutdown?(J.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 r.sent(),[2]}})})},t}();var u2=/[\^$\\.+?()[\]{}|]/g,bg=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(u2,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var Fl=function(){function t(e){this._matchAll=e===void 0,this._pattern=e}return t.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},t}();var zM=function(){function t(e){var r;this._nameFilter=new bg((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new Fl(e?.unit)}return t.prototype.getType=function(){return this._type},t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getUnitFilter=function(){return this._unitFilter},t}();var HM=function(){function t(e){this._nameFilter=new Fl(e?.name),this._versionFilter=new Fl(e?.version),this._schemaUrlFilter=new Fl(e?.schemaUrl)}return t.prototype.getNameFilter=function(){return this._nameFilter},t.prototype.getVersionFilter=function(){return this._versionFilter},t.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},t}();function d2(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var Eg=function(){function t(e){var r;if(d2(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||bg.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 LM(e.attributeKeys):this.attributesProcessor=kl.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Un.Default(),this.instrumentSelector=new zM({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new HM({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var rMe=process.env.APP||"unknown";ft();import{v4 as p2}from"uuid";function m2(){return new AP({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:ts.DELTA})}var g2=[new Eg({instrumentName:"test_event_duration",instrumentType:$e.HISTOGRAM,aggregation:new ed([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Eg({instrumentName:"test_step_duration",instrumentType:$e.HISTOGRAM,aggregation:new ed([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],Tg=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let r=this.counterCache.get(e);if(r)return r;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let r=this.histogramCache.get(e);if(r)return r;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let r=this.observableGaugeCache.get(e);if(r)return r;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 r=typeof process<"u"?"production":"unknown",n=new Cb({[Bm]:e.serviceName,[bI]:r,[TI]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:p2()}),o=m2(),i=new Yb({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new rE({resource:n,readers:[i],views:g2}),Dm.setGlobalMeterProvider(this.provider),this.meter=Dm.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Om(n,this.globalAttributes);this.getCounter(e).add(typeof r=="number"?r:1,o)}catch{}}gauge(e,r){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,r)}catch{}}distribution(e,r,n){try{let o=Om(n,this.globalAttributes);this.getHistogram(e).record(r,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:r,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(r,Date.now()-o,n)}}};var ar=new Mm;function GM(t){t.disabled||(ar=new Tg(t))}var nE=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:"52af28ec511f58a5f8d9e11a48265b7776b523e9",tracesSampleRate:0,sendDefaultPii:!0}),x_(t.captureException),nE=!0}catch{}import{Argument as T7,Command as v7,Option as kr}from"@commander-js/extra-typings";import{execSync as A7}from"child_process";import{existsSync as h2,statSync as f2}from"fs";function jM(t){try{return h2(t)&&f2(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as S2,input as y2}from"@inquirer/prompts";import{existsSync as b2,mkdirSync as E2,statSync as T2}from"fs";import{dirname as v2}from"path";var A2=!1,$M=(()=>{try{return T2("/.dockerenv"),!0}catch{return!1}})();async function hr(t){return Xa||A2||$M?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await S2({message:t}))}async function oE(t){let e=v2(t);return jM(e)?b2(t)?hr(`File '${VM(t)}' already exists. Overwrite existing content?`):!0:await hr(`Directory '${VM(e)}' doesn't exist. Create it now?`)?(E2(e,{recursive:!0}),!0):!1}function VM(t){return t.replace(/(\s+)/g,"\\$1")}async function WM(t,e){return Xa||$M?e:(await y2({message:t,default:e})).trim()||e}import Oo,{supportsColor as C2}from"chalk";import{Console as qM}from"console";import{format as nd}from"util";var iE=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},vg=class t extends qM{_buffer=[];_groupDepth=0;Console=qM;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new iE(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
38
38
|
`).slice(o).filter(Boolean).join(`
|
|
39
39
|
`);return e.push({message:n,origin:a,type:r}),e}_log(e,r){t.write(this._buffer,e," ".repeat(this._groupDepth)+r,3)}debug(e,...r){this._log("debug",nd(e,...r))}error(e,...r){this._log("error",nd(e,...r))}info(e,...r){this._log("info",nd(e,...r))}log(e,...r){this._log("log",nd(e,...r))}warn(e,...r){this._log("warn",nd(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function KM(t){let e=globalThis.console,r=new vg;globalThis.console=r;try{t()}finally{let o=r.getBuffer()?.map(i=>i.message).join(`
|
|
40
40
|
`);process.stderr.write(`${o}
|
|
41
41
|
`),globalThis.console=e}}var Pt=" ".repeat(6);function YM(t,e="",r=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=t.split(`
|
|
42
42
|
`),a=[];for(let s of i)if(r){let c=s;for(;c.length>o;){let u=c.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(e+c.slice(0,d)),c=c.slice(d).trimStart()}a.push(e+c)}else{let c=s.split(" "),l="";for(let u of c){if(!l.length){l=u;continue}let d=`${l} ${u}`;d.length<=o?l=d:(a.push(e+l),l=u)}a.push(e+l)}return a.join(`
|
|
43
|
-
`)}import{hostname as R2}from"os";var te=Al({app:"cli",hostname:R2(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.
|
|
43
|
+
`)}import{hostname as R2}from"os";var te=Al({app:"cli",hostname:R2(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.49.0"});var w2=5;async function Rg({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>w2&&(v.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(l){i++,te.warn({err:l},"Failed to fetch run status, retrying..."),v.warn({err:l},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let c=Math.max(1e4,Math.floor(n/100));await new Promise(l=>setTimeout(l,c))}v.error(`Timeout elapsed waiting for ${r} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Ul({results:t,startTime:e,entity:r,getDisplayLine:n,onFailed:o}){let i=t.filter(u=>u.status==="PASSED"&&u.quarantined),a=t.filter(u=>u.status==="PASSED"&&!u.quarantined),s=t.filter(u=>u.status==="FAILED"&&u.quarantined),c=t.filter(u=>u.status==="FAILED"&&!u.quarantined),l=t.filter(u=>u.status==="CANCELLED");return KM(()=>{if(c.forEach(u=>{v.log(""),o(u)}),c.length){v.log("");let u=c.length===1?"":"s";v.error(`${c.length} ${r}${u} failed:`),c.forEach(d=>{v.dimmed(n(d))})}if(l.length){v.log("");let u=l.length===1?"":"s";v.warn(`${l.length} ${r}${u} cancelled:`),l.forEach(d=>{v.dimmed(n(d))})}if(a.length){v.log("");let u=a.length===1?"":"s";v.success(`${a.length} ${r}${u} passed:`),a.forEach(d=>{v.dimmed(n(d))})}if(s.length){v.log("");let u=s.length===1?"":"s";v.warn(`${s.length} quarantined ${r}${u} failed:`),s.forEach(d=>{v.dimmed(n(d))})}if(i.length){v.log("");let u=i.length===1?"":"s";v.warn(`${i.length} quarantined ${r}${u} passed:`),i.forEach(d=>{v.dimmed(n(d))})}v.log(""),v.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var Cg=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=wp[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Ys[t.failureReason],o=t.failureDetails.classification?.rootCause;if(v.error(e),o){v.log(`${Pt}- Error type: ${Oo.dim(r)}`);let i="- Root cause analysis:",a=YM(`${i} ${o}`,`${Pt} `,!1),s=a.indexOf(":");v.log(`${Pt}${i} ${Oo.dim(a.slice(s+1))}`)}else v.log(`${Pt}Reason: ${Oo.red(r)}`),v.log(`${Pt}Description: ${Oo.red(n)}`)},od=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Oo.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Oo.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Oo.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Oo.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Oo.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Oo.bgMagenta.white("RUNNING"),a=0):(v.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),C2||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import x2 from"fs";import{platform as _2,tmpdir as I2}from"os";import P2 from"path";import{program as M2}from"playwright-core/lib/cli/program";import{registry as id}from"playwright-core/lib/server";import XM from"proper-lockfile";var JM=P2.join(I2(),"momenticBrowserInstallation");var aE=["chrome","chromium","chrome-for-testing","ffmpeg"],O2={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},ZM={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function QM(t){if(t==="Org Default")return!1;let e=ZM[O2[t]??""]??"",r=id.findExecutable(e);return!r||r.installType==="none"?!1:sE(r)}function sE(t){let e=t.executablePath();return x2.existsSync(e)}function L2(t,e){let r=ZM[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=id.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&sE(n)))return n}async function N2({browser:t,force:e}){let r=L2(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await id.installDeps([r],!1),await id.install([r],!1)}catch(n){if(n.message.includes("Lock file is already being held")){v.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=id.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!sE(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function D2(){if(_2()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await M2.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function eO({rawBrowsers:t,force:e=!1,all:r=!1}){await D2();let n=r?aE:Array.from(new Set(t));try{await XM.lock(JM,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){v.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 N2({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await XM.unlock(JM,{realpath:!1})}if(o)throw o}import{createServer as k2}from"http";async function tO(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await F2(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function F2(t){return new Promise((e,r)=>{let n=k2();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(v.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(t)})}import U2 from"blocked-at";import B2 from"why-is-node-running";function rO(t){z2(t),H2()}function z2(t){U2((e,r)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=r.join(`
|
|
44
44
|
`);console.warn(n),t.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function H2(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}B2(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function nO(t){let e=t?.shardIndex??1,r=t?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(r<1)throw new Error("Shard count must be greater than 0.");if(e>r)throw new Error("Shard index cannot be greater than shard count")}function G2(t,e,r,n){if(r>t.length&&(v.warn(`Shard count ${r} is greater than the number of tests ${t.length}! Some workers won't have any tests to run.`),r=Math.max(r,t.length),e>r))return[];let o=Math.floor((e-1)*(t.length/r)),i=Math.floor(e*(t.length/r));return(n?[...t].sort((s,c)=>n(s).localeCompare(n(c))):[...t].sort()).filter((s,c)=>c>=o&&c<i)}function oO(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?G2(e,r,n,o):e}function lE({regenerateCache:t,saveCache:e,disableCache:r}){if(r){if(t)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(e)throw new Error("--disable-cache and --save-cache cannot be used together.")}}function cE(t,e,r){return t instanceof _a?(t.zodIssues.forEach(n=>{r.push({file:e,stepIndex:typeof n.path[0]=="number"?n.path[0]:void 0,field:n.path.slice(1).join(".")||n.path.join("."),issue:n.message})}),!0):!1}function Bl({parsingErrors:t,parsingErrorDetails:e,failedTestFilePaths:r,failedModuleFilePaths:n}){if(v.error(`
|
|
45
45
|
Found ${t} file(s) with validation errors that must be fixed manually:
|
|
46
46
|
`),e.length>0){let o=new Map;e.forEach(i=>{let a=o.get(i.file)||[];a.push(i),o.set(i.file,a)}),o.forEach((i,a)=>{v.error(` ${a}`),i.forEach(({stepIndex:s,field:c,issue:l})=>{let u=s!==void 0?`Step ${s}`:"File",d=c?`, field "${c}"`:"";v.error(` ${u}${d}:`),v.error(` \u2192 ${l}`)})})}else r.size>0&&v.error(`Failed test files:
|
|
@@ -68,7 +68,7 @@ ${o}`:o)(bE(t))}function SK(t,{unflattenedIndex:e,parentStep:r}){if(!(e===void 0
|
|
|
68
68
|
${n}`}function _K(t){let e=xK(t);return en({steps:e,earlyStop:!1,onPresetAction:(r,n)=>{let o=r;o.parentStepIdChain=n.parentChain.map(s=>s.id),AE(r);let i;if(xi(r.command)&&r.command.cache!==void 0){let s=PK(r.command.cache);s&&"target"in s&&(i=s.target)}let a=r.command;return i!==void 0?a.cache=i:delete a.cache,a.thoughts&&delete a.thoughts,delete a.id,"index"in r&&delete r.index,!1},onConditional:(r,n)=>{let o=r;return o.parentStepIdChain=n.parentChain.map(i=>i.id),AE(r),!1},onSimpleStepContainer:(r,n)=>{let o=n.parentChain.map(a=>a.id);if(r.type==="AI_ACTION"){let a=r,s=r.text,c=r.id;return Object.keys(a).forEach(l=>{delete a[l]}),a.type="AI_ACTION_DYNAMIC",a.text=s,a.id=c,a.parentStepIdChain=o,!1}let i=r;if(i.parentStepIdChain=o,AE(r),r.type==="RESOLVED_MODULE"){let a=r;delete a.cacheConfig,delete a.enabled,delete a.defaultCacheKey,delete a.defaultCacheTtl,delete a.defaultCacheAllInvocations,delete a.autoAuth,delete a.advanced}return!1}}),e}function AE(t){let e=t;delete e.aiSuggested,delete e.retries,delete e.skipped}function IK(t){return t.selector?t.selector:t.generatedSelectors?.[0]}function RE(t){let e=IK(t),r=t.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),r&&(n.nodeOnlySerializedHtml=r),Object.keys(n).length?n:void 0}function PK(t){if(!t)return;let e={};if("target"in t)return{target:RE(t.target)};if("fromTarget"in t||"toTarget"in t){let r=t.fromTarget?RE(t.fromTarget):void 0,n=t.toTarget?RE(t.toTarget):void 0;return r&&(e.fromTarget=r),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}import Yl from"yaml";import{z as EL}from"zod";import{execSync as MK}from"child_process";function li(t,e){let r=e.hooks?.postSave;if(!r)return;let n;r.includes("$1")?n=r.replaceAll("$1",t):n=`${r} ${t}`,v.debug({postSaveCommand:n},"Executing post-save hook command");try{MK(n,{encoding:"utf-8"})}catch(o){v.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as yL}from"deep-object-diff";import Lo from"fs";import{cloneDeep as OK}from"lodash-es";import hd from"path";import{v4 as LK}from"uuid";import fd from"yaml";function zn({content:t,schemaVersion:e,momenticFiles:r,project:n,forceSaveOnNoDiffs:o}){let i=r.modules[t.moduleId]?.fullFilePath;if(!i||!Lo.existsSync(i))throw new Error(`Tried to update module ${t.moduleId} that could not be found on disk`);let a=Lo.readFileSync(i,"utf-8"),s=fd.parse(a),c;if(t.name&&t.name!==s.name){let m=`${st(t.name)}.module.yaml`;if(c=hd.join(hd.dirname(i),m),Lo.existsSync(c))throw new Error(`A conflicting file '${t.name}' already exists at path '${c}'`)}let l={...t,schemaVersion:e},u=no({fileType:De.MODULE,...Fy.parse(l),steps:Et.array().parse(t.steps)}),d=yL(u,s);if(d&&Object.keys(d).length===0&&!o){v.debug(`Skipping save for module ${t.moduleId} since there are no changes`);return}let p=fd.stringify(u);Lo.writeFileSync(i,p,"utf-8"),c&&Lo.renameSync(i,c),li(c||i,n.config)}function bL({moduleId:t,content:e,momenticFiles:r,project:n,logger:o}){let i=r.modules[t]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${t} that could not be found on disk`);let a=ci(i,o),s={...a,...e},c=no({fileType:De.MODULE,...Fy.parse(s),steps:a.steps}),l=yL(c,a);if(l&&Object.keys(l).length===0){v.debug(`Skipping save for module ${t} since there are no changes`);return}let u=fd.stringify(c);Lo.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${st(e.name)}.module.yaml`;if(d=hd.join(hd.dirname(i),p),Lo.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);Lo.renameSync(i,d)}li(d||i,n.config)}async function qg({name:t,description:e,enabled:r,steps:n,folder:o,project:i}){let a=st(t),s=hd.join(o,`${a}.module.yaml`),c=LK(),{stepsToSave:l}=await Mt({stepLists:{steps:n}}),u={fileType:De.MODULE,schemaVersion:Ze,moduleId:c,name:t,description:e,enabled:r,steps:l.steps},d=fd.stringify(u);return Lo.writeFileSync(s,d,"utf-8"),li(s,i.config),{moduleId:c,name:t,description:e,enabled:r,steps:n}}function ci(t,e){let r=Lo.readFileSync(t,"utf-8"),n=fd.parse(r);try{return Ey.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:t,moduleContents:r},`${t} does not parse as a valid Momentic module`),o}}async function oo(t,e,r,n){let o=ci(t.fullFilePath,r),{resolvedSteps:i}=await zg({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:r,callbacks:{onFetchModule:async({id:s})=>{let c=e.modules[s]?.fullFilePath;if(c)return ci(c,r)}}}),a={...o,steps:i};return n&&(n[t.id]=OK(a)),a}async function Kg(t,e){let r={};return await Promise.all(Object.values(t.modules).map(async n=>{await oo(n,t,e,r)})),Array.from(Object.values(r))}async function TL({test:t,name:e,folder:r}){let n=await pL({test:t});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${st(e)}.test.yaml`,a=us.join(r,i);return io.writeFileSync(a,n.test,"utf-8"),a}function CE(t,e,r){let n=us.join(r.rootDir,t);if(!io.existsSync(n))throw new Error(`Test not found at path '${t}' in project '${r.rootDir}'`);let o=io.readFileSync(n,"utf-8"),i=Yl.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${st(e.name)}.test.yaml`;if(a=us.join(us.dirname(t),p),s=us.join(r.rootDir,a),io.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=On.parse(c),u=no({fileType:De.TEST,...On.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0,retries:l.retries??void 0}),d=Yl.stringify(u);return io.writeFileSync(n,d,"utf-8"),s&&io.renameSync(n,s),li(n,r.config),{newRelativeTestPath:a}}function pn({relativeTestPath:t,steps:e,schemaVersion:r,project:n,forceSaveOnNoDiffs:o}){let i=us.join(n.rootDir,t);if(!io.existsSync(i))throw new Error(`Test not found at path '${t}' in project '${n.rootDir}'`);let a=io.readFileSync(i,"utf-8"),s=Yl.parse(a),c=On.parse({...s,schemaVersion:r}),l=Et.array().or(EL.undefined()).parse(e.beforeSteps),u=Et.array().parse(e.steps),d=Et.array().or(EL.undefined()).parse(e.afterSteps),p=no({fileType:De.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=NK(p,s);if(m&&Object.keys(m).length===0&&!o){v.debug(`Skipping save for test ${c.name} since there are no changes`);return}let g=Yl.stringify(p);io.writeFileSync(i,g,"utf-8"),v.debug(`Saving test ${c.name} to ${i}`),li(i,n.config)}function Sd(t,e){let r=us.join(e.rootDir,t);if(!r)throw new Error(`Could not find test with path ${t} in Momentic project (${e.rootDir})`);let n;try{n=io.readFileSync(r,"utf8"),n=n.replace(/\r\n|\r/g,`
|
|
69
69
|
`)}catch(i){throw new Error(`Could not read test file ${r}: ${i}`)}let o;try{o=Yl.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return _r.parse(o)}function ds(t,e,r){let n=r.project.rootDir,o;try{o=io.readFileSync(t,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Yl.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${t} is missing steps`);return i}async function St(t,e,r){let n=ds(t,e,r),o;try{o=On.parse(n)}catch(a){throw new Error(`Test ${t} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await uL({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=r.modules[a]?.fullFilePath;if(c)return ci(c,s)}}});return i}import DK from"@dotenvx/dotenvx";import kK from"fs";import vL from"path";function Yg(t,e){return(t.config.environments??[]).map(r=>ps(r.name,t,e))}function AL(t){return t.includes("${")?t.replace(/\$\{([^}]+)\}/g,(e,r)=>{let n=r.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[r]||"";let o=n[1];if(!o)return"";let i=n[2],a=n[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):t}function FK(t){let{envVariables:e,project:r}=t;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=AL(i);s&&(n[o]=s);continue}let a;try{a=kK.readFileSync(vL.resolve(r.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&v.debug(n,"Set environment variables with interpolation from project configuration"),n}function UK(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=DK.config({path:vL.resolve(e.rootDir,r),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug("Set environment variables from .env file"),o}function ps(t,e,r){let n=(e.config.environments??[]).find(c=>c.name===t);if(!n)throw new Error(`Environment ${t} not found in local project configuration file`);if(!n.baseUrl)throw new Error(`Browser environment ${t} does not have a baseUrl configured`);let o={[nr]:AL(n.baseUrl)},i=FK({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=UK({project:e,envFile:n.envFile,logger:r});return Object.assign(o,a),n.inheritFromShell&&(r.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:t,variables:o,browser:n.browser}}import{existsSync as zK,readFileSync as HK,readdirSync as GK,writeFileSync as jK}from"fs";import{glob as VK}from"glob";import ms,{dirname as RL}from"path";import{cwd as xE}from"process";import CL from"yaml";import{z as gt}from"zod";import BK from"zod";var Xg=["**/*.test.yaml","**/*.module.yaml"],wE=BK.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),Jg=15;var Xl="momentic.config.yaml",_E="momentic.workspace.yaml",$K=gt.object({projects:gt.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),WK=gt.union([gt.string(),gt.object({fromFile:gt.string(),json:gt.boolean().optional()})]),qK=gt.object({name:wE,baseUrl:gt.string().optional().describe("Optional for mobile tests"),envFile:gt.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:gt.record(gt.string(),WK).optional(),inheritFromShell:gt.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:ka.optional().describe("NB: most things should use project-level configuration only")}),KK=gt.object({postSave:gt.string().optional()}),YK=gt.object({name:wE,include:gt.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:gt.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:gt.string().optional(),reporterDir:gt.string().optional(),outputDir:gt.string().optional(),recordVideo:gt.boolean().optional(),retries:gt.number().optional().describe("number of retries per test"),parallel:gt.number().optional().describe("degree of parallelism"),environments:gt.array(qK).optional(),gitMainBranch:gt.string().optional().readonly(),gitProtectedBranches:gt.string().array().optional().readonly(),ai:Qo.optional(),browser:ka.optional(),emulator:Cy.optional(),advanced:OS.optional(),displayRoot:gt.string().optional().describe("relative path from project root to use as the Repository root"),hooks:KK.optional()});function wL(t,e){let r;try{r=HK(t,"utf-8")}catch(o){v.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=CL.parse(r),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){v.warn(`Possible Momentic ${e} file at ${t} does not parse as valid YAML: ${o}`);return}return n}function IE(t){let e=wL(t,"project configuration");if(e!==void 0)try{return YK.parse(e)}catch(r){v.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function XK(t){let e=wL(t,"workspace configuration");if(e!==void 0)try{return $K.parse(e)}catch(r){v.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function JK(){let t=[],e=xE(),r=ms.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=ms.basename(e);if(bm.includes(i))return v.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),t;for(let a of GK(e))if(a.endsWith(Xl)){let s=ms.join(e,a),c=IE(s);c&&t.push({configFilePath:s,config:c,rootDir:RL(s)})}if(t.length)return t;if(e=ms.dirname(e),e===r)break}return t}async function Ct(t={}){let{configFilePath:e,nameFilter:r}=t,n=await PE(e);if(r&&(n=n.filter(o=>o.config.name===r)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
70
70
|
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return v.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function ZK(t){let e=XK(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${Xl}`)),n=AbortSignal.timeout(2e3),o;try{o=await VK(r,{absolute:!1,cwd:xE(),dotRelative:!1,maxDepth:Jg,nodir:!0,signal:n})}catch(a){throw v.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${_E} is misconfigured.`),a}let i=[];for(let a of o){let s=ms.join(xE(),a),c=IE(s);c&&i.push({configFilePath:s,config:c,rootDir:RL(s)})}return i}async function PE(t){if(t){t=ms.resolve(t);let r=IE(t);return r||(console.error(`No valid Momentic project file found at ${t}.`),process.exit(1)),[{config:r,configFilePath:t,rootDir:ms.dirname(t)}]}if(zK(_E)){let r=await ZK(_E);if(r)return r}return JK()}function ea(t,e){let r=CL.stringify(t);jK(e,r)}import _L from"fs";import{glob as QK}from"glob";import yd from"path";import eY from"yaml";import{z as xL}from"zod";var IL=!1,tY=xL.object({fileType:xL.nativeEnum(De)});async function ce(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??Xg,o=Array.from(t.config.exclude??[]).concat(Em),i=AbortSignal.timeout(5e3),a;try{a=await QK(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:Jg,nodir:!0,signal:i})}catch(s){throw v.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=rY(t.rootDir,s,r,e?xo:v);c&&(r.duplicateEntities[c.id]=c.paths)}return IL=!0,r}function rY(t,e,r,n){let o=yd.join(t,e),i=nY(o,n);if(!i)return;let a=oY(i,o,n);if(!a)return;let s=tY.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let c=s.data.fileType,l=iY(o,n);if(!l)return;let u=aY(e,o,l);switch(c){case De.TEST:try{return sY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case De.MODULE:try{return lY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case De.MOBILE_TEST:try{return uY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case De.MOBILE_MODULE:try{return cY(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{let d=c;return}}}function nY(t,e){try{return _L.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function oY(t,e,r){try{let n=eY.parse(t);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return n}catch(n){r.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function iY(t,e){try{return _L.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function aY(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:yd.sep,fullPathSegments:e.split(yd.sep),relativePathSegments:t.split(yd.sep),fileName:yd.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function sY(t,e,r,n,o){let i=On.parse(t),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:De.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}function lY(t,e,r,n,o){let i=Xr.parse(t),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:De.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...r};let s=r.fileName.replace(".module.yaml","");return!IL&&st(i.name)!==s&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${s}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function cY(t,e,r,n,o){let i=fm.parse(t),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=r.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:De.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function uY(t,e,r,n,o){let i=wy.parse(t),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=r.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:De.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import Jl from"fs";import ME from"path";import{z as OE}from"zod";var PL="golden/visual-diff",ML="reports",OL="test-results";var dY=OE.object({width:OE.number(),height:OE.number()}),Zl=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=ME.join(e.rootDir,e.config.goldenFileDir??PL);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(jA(r.screenshot?.data))return{buffer:(await this.apiClient.fetchOnDemandScreenshot(r.screenshot.data.id)).data,width:r.screenshot.width,height:r.screenshot.height};if(r.screenshot?.data?.startsWith("https://")){let a=await fetch(r.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:r.screenshot.width,height:r.screenshot.height}}let o=r.screenshot?.data;o||(o=ME.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Jl.mkdirSync(ME.dirname(o),{recursive:!0}),Jl.writeFileSync(o,n.buffer),Jl.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Jl.existsSync(o)){let a=Jl.readFileSync(o),s=dY.parse(JSON.parse(Jl.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new M("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as pY}from"node:child_process";import{promisify as mY}from"node:util";import gY from"simple-git";var yt=gY(),LL=mY(pY);function ui(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function hY(t){let e=await vt(t,yt.raw(["config","--list"])),r={};if(!e)return r;for(let n of e.split(`
|
|
71
|
-
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();r[i]=a}return r}async function fY(t,e,r){try{let o=r["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await LL("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await LL("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function SY(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return fY(t,e,r);if(o)return}catch{}}function Zg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let r=e[1].replace(".git","").split("/");if(r.length===2){let n=r[0],o=r[1];return`${n}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let r=new URL(t).pathname.split("/").filter(Boolean);if(r.length>=2){let n=r[0],o=r[1].replace(".git","");return`${n}/${o}`}}}function yY(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function vt(t,e){try{return(await e).trim()}catch(r){if(yY(r))return;t.error({err:r},"Failed to run git command");return}}function bY(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild";if(process.env.MOMENTIC_GIT_OVERRIDE)return"Custom"}async function EY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function TY(t){let[e,r,n]=await Promise.all([vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?ui(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:r,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function vY(t){let[e,r,n,o]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Zg(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function AY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zg(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function RY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zg(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function CY(t,e){let[r,n,o,i,a,s,c,l,u]=await Promise.all([vt(t,yt.revparse(["HEAD"])),vt(t,yt.revparse(["--short","HEAD"])),vt(t,yt.revparse(["--abbrev-ref","HEAD"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"])),e?vt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),hY(t)]),d=l?await vt(t,yt.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Zg(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,b=await SY(t,i,u)??S??void 0;return{ciProvider:"none",gitCommitSha:r,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?ui(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?ui(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function wY(){let t=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function xY(){return{ciProvider:"Custom",gitCommitSha:process.env.GIT_COMMIT_SHA,gitCommitShaShort:process.env.GIT_COMMIT_SHA_SHORT??process.env.GIT_COMMIT_SHA?.slice(0,6),gitCommitTimestamp:ui(process.env.GIT_COMMIT_TIMESTAMP),gitBranchName:process.env.GIT_BRANCH_NAME,gitOriginUrl:process.env.GIT_ORIGIN_URL,gitCommitAuthorName:process.env.GIT_COMMIT_AUTHOR_NAME,gitCommitMessage:process.env.GIT_COMMIT_MESSAGE,lastCommitOnMainSha:process.env.LAST_COMMIT_ON_MAIN_SHA,lastCommitOnMainTimestamp:ui(process.env.LAST_COMMIT_ON_MAIN_TIMESTAMP),mergedGitBranchName:process.env.MERGED_GIT_BRANCH_NAME,githubRepository:process.env.GITHUB_REPOSITORY,gitlabProjectPath:process.env.GITLAB_PROJECT_PATH,gitLocalUsername:process.env.GIT_USERNAME,gitLocalEmail:process.env.GIT_EMAIL,gitLocalName:process.env.GIT_NAME}}async function _Y(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function di(t,e){let r=bY();if(!r)return CY(t,e);switch(r){case"GithubActions":return EY(t);case"GitlabCI":return TY(t);case"CircleCI":return vY(t);case"Buildkite":return AY(t);case"AzureDevOps":return RY(t);case"GCPCloudBuild":return wY();case"Custom":return xY()}}async function IY(t,e,r,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(r,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){t.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(r,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){t.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(r,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){t.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function PY(t,e,r,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(r,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){t.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(r,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){t.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(r,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){t.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function MY(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await PY(t,e,n,o,r)}else if(r.gitlabProjectPath)return await IY(t,e,r.gitlabProjectPath,r)}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function fr(t,e,r){let n=await _Y(r),o=await di(t,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await MY(t,e,i);return{...n,...o,...a}}async function NL(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as w1e}from"deep-object-diff";import{cloneDeep as _1e}from"lodash-es";import{v4 as z1e}from"uuid";import G1e from"yaml";import aHe from"yaml";import lHe from"zod";import{randomUUID as OY}from"crypto";import ta from"fs";import Ql from"path";var kL=new Set([".DS_Store","__MACOSX"]),FL={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return"FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let r=new Set([...t.labels??[],...e.labels??[]]);return Array.from(r)}};function LY(t,e,r){if(FL[r]){let i=FL[r];return i(t,e)}let n=t[r],o=e[r];if(n!==o)throw new Error(`Metadata values for key "${r}" do not match: "${n}" vs "${o}"`);return n}var LE=class extends Error{constructor(e,r){let n=`${e} contains invalid Momentic results: ${r}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function UL(t,e){try{let r=Ql.join(e,"metadata.json");return Tl.parse(JSON.parse(ta.readFileSync(r,"utf-8")))}catch{throw new LE(t,e)}}function BL(t,e,r){let n=OY(),o=t.child({runGroupId:n});ta.rmSync(e,{recursive:!0,force:!0});let i=ta.readdirSync(r).filter(c=>!kL.has(c)).map(c=>Ql.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ta.mkdirSync(e,{recursive:!0});let a={...UL(r,i[0]),id:n};for(let c of i){let l=Ql.join(c,"runs");if(!ta.existsSync(l))continue;let u=UL(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=LY(a,u,m)}let d=ta.readdirSync(l);for(let p of d){if(kL.has(p))continue;let m=Ql.join(l,p),g=Ql.join(e,"runs",p);ta.cpSync(m,g,{recursive:!0})}}let s=Ql.join(e,"metadata.json");ta.writeFileSync(s,JSON.stringify(a,null,2))}import AN from"adm-zip";import rT from"fs";import{z as E3}from"zod";var W="v1",NE="cli",gs="2.48.2";var NY=9e4,DY=3,kY=1500,FY=15e3,ao=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function UY(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var DE=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return gs&&(e[Cm]=gs),NE&&(e[Ax]=NE),e}async sendRequest(e,r){let{retries:n=DY,requestTimeoutMs:o=NY,initialRetryDelayMs:i=kY,maxRetryDelayMs:a=FY,onFailedRequest:s}=r,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof ao&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Vi),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,r,n){let o={path:e,baseUrl:this.baseUrl,method:r.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();r.signal&&r.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...r.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:r.method,body:r.body?JSON.stringify(r.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await UY(u);throw new ao(u.status,m,`Request to ${r.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(r.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&r.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=r.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},Sr=class extends DE{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vx]:this.mode??""}}};import{createAnthropic as b3}from"@ai-sdk/anthropic";import{InvalidArgumentError as zY}from"@ai-sdk/provider";import{APICallError as LHe}from"@ai-sdk/provider";import{APICallError as GY}from"@ai-sdk/provider";import{LoadAPIKeyError as th}from"@ai-sdk/provider";import{LoadSettingError as FHe}from"@ai-sdk/provider";import{JSONParseError as ih,TypeValidationError as KY}from"@ai-sdk/provider";import{TypeValidationError as zE}from"@ai-sdk/provider";import{TypeValidationError as ZY}from"@ai-sdk/provider";var Qg=class extends Error{constructor(e,r){super(e),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function kE(t){}function zL(t){if(typeof t=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=kE,onError:r=kE,onRetry:n=kE,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let f=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,b]=BY(`${i}${f}`);for(let y of S)d(y);i=b,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let f=h.indexOf(":");if(f!==-1){let S=h.slice(0,f),b=h[f+1]===" "?2:1,y=h.slice(f+b);p(S,y,h);return}p(h,"",h)}function p(h,f,S){switch(h){case"event":l=f;break;case"data":c=`${c}${f}
|
|
71
|
+
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();r[i]=a}return r}async function fY(t,e,r){try{let o=r["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await LL("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await LL("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function SY(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return fY(t,e,r);if(o)return}catch{}}function Zg(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let r=e[1].replace(".git","").split("/");if(r.length===2){let n=r[0],o=r[1];return`${n}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let r=new URL(t).pathname.split("/").filter(Boolean);if(r.length>=2){let n=r[0],o=r[1].replace(".git","");return`${n}/${o}`}}}function yY(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function vt(t,e){try{return(await e).trim()}catch(r){if(yY(r))return;t.error({err:r},"Failed to run git command");return}}function bY(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild";if(process.env.MOMENTIC_GIT_OVERRIDE)return"Custom"}async function EY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function TY(t){let[e,r,n]=await Promise.all([vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?ui(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:r,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function vY(t){let[e,r,n,o]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Zg(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function AY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zg(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function RY(t){let[e,r,n]=await Promise.all([vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zg(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?ui(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function CY(t,e){let[r,n,o,i,a,s,c,l,u]=await Promise.all([vt(t,yt.revparse(["HEAD"])),vt(t,yt.revparse(["--short","HEAD"])),vt(t,yt.revparse(["--abbrev-ref","HEAD"])),vt(t,yt.listRemote(["--get-url","origin"])),vt(t,yt.show(["--no-patch","--format=%ci"])),vt(t,yt.show(["-s","--pretty=%B"])),vt(t,yt.show(["-s","--pretty=%an"])),e?vt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),hY(t)]),d=l?await vt(t,yt.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Zg(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,b=await SY(t,i,u)??S??void 0;return{ciProvider:"none",gitCommitSha:r,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?ui(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?ui(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function wY(){let t=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function xY(){return{ciProvider:"Custom",gitCommitSha:process.env.GIT_COMMIT_SHA,gitCommitShaShort:process.env.GIT_COMMIT_SHA_SHORT??process.env.GIT_COMMIT_SHA?.slice(0,6),gitCommitTimestamp:ui(process.env.GIT_COMMIT_TIMESTAMP),gitBranchName:process.env.GIT_BRANCH_NAME,gitOriginUrl:process.env.GIT_ORIGIN_URL,gitCommitAuthorName:process.env.GIT_COMMIT_AUTHOR_NAME,gitCommitMessage:process.env.GIT_COMMIT_MESSAGE,lastCommitOnMainSha:process.env.LAST_COMMIT_ON_MAIN_SHA,lastCommitOnMainTimestamp:ui(process.env.LAST_COMMIT_ON_MAIN_TIMESTAMP),mergedGitBranchName:process.env.MERGED_GIT_BRANCH_NAME,githubRepository:process.env.GITHUB_REPOSITORY,gitlabProjectPath:process.env.GITLAB_PROJECT_PATH,gitLocalUsername:process.env.GIT_USERNAME,gitLocalEmail:process.env.GIT_EMAIL,gitLocalName:process.env.GIT_NAME}}async function _Y(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function di(t,e){let r=bY();if(!r)return CY(t,e);switch(r){case"GithubActions":return EY(t);case"GitlabCI":return TY(t);case"CircleCI":return vY(t);case"Buildkite":return AY(t);case"AzureDevOps":return RY(t);case"GCPCloudBuild":return wY();case"Custom":return xY()}}async function IY(t,e,r,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(r,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){t.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(r,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){t.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(r,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){t.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function PY(t,e,r,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(r,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){t.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(r,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){t.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(r,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){t.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function MY(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await PY(t,e,n,o,r)}else if(r.gitlabProjectPath)return await IY(t,e,r.gitlabProjectPath,r)}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function fr(t,e,r){let n=await _Y(r),o=await di(t,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await MY(t,e,i);return{...n,...o,...a}}async function NL(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as w1e}from"deep-object-diff";import{cloneDeep as _1e}from"lodash-es";import{v4 as z1e}from"uuid";import G1e from"yaml";import aHe from"yaml";import lHe from"zod";import{randomUUID as OY}from"crypto";import ta from"fs";import Ql from"path";var kL=new Set([".DS_Store","__MACOSX"]),FL={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return"FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let r=new Set([...t.labels??[],...e.labels??[]]);return Array.from(r)}};function LY(t,e,r){if(FL[r]){let i=FL[r];return i(t,e)}let n=t[r],o=e[r];if(n!==o)throw new Error(`Metadata values for key "${r}" do not match: "${n}" vs "${o}"`);return n}var LE=class extends Error{constructor(e,r){let n=`${e} contains invalid Momentic results: ${r}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function UL(t,e){try{let r=Ql.join(e,"metadata.json");return Tl.parse(JSON.parse(ta.readFileSync(r,"utf-8")))}catch{throw new LE(t,e)}}function BL(t,e,r){let n=OY(),o=t.child({runGroupId:n});ta.rmSync(e,{recursive:!0,force:!0});let i=ta.readdirSync(r).filter(c=>!kL.has(c)).map(c=>Ql.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ta.mkdirSync(e,{recursive:!0});let a={...UL(r,i[0]),id:n};for(let c of i){let l=Ql.join(c,"runs");if(!ta.existsSync(l))continue;let u=UL(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=LY(a,u,m)}let d=ta.readdirSync(l);for(let p of d){if(kL.has(p))continue;let m=Ql.join(l,p),g=Ql.join(e,"runs",p);ta.cpSync(m,g,{recursive:!0})}}let s=Ql.join(e,"metadata.json");ta.writeFileSync(s,JSON.stringify(a,null,2))}import AN from"adm-zip";import rT from"fs";import{z as E3}from"zod";var W="v1",NE="cli",gs="2.49.0";var NY=9e4,DY=3,kY=1500,FY=15e3,ao=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function UY(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var DE=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return gs&&(e[Cm]=gs),NE&&(e[Ax]=NE),e}async sendRequest(e,r){let{retries:n=DY,requestTimeoutMs:o=NY,initialRetryDelayMs:i=kY,maxRetryDelayMs:a=FY,onFailedRequest:s}=r,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof ao&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Vi),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,r,n){let o={path:e,baseUrl:this.baseUrl,method:r.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();r.signal&&r.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...r.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:r.method,body:r.body?JSON.stringify(r.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await UY(u);throw new ao(u.status,m,`Request to ${r.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(r.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&r.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=r.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},Sr=class extends DE{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vx]:this.mode??""}}};import{createAnthropic as b3}from"@ai-sdk/anthropic";import{InvalidArgumentError as zY}from"@ai-sdk/provider";import{APICallError as LHe}from"@ai-sdk/provider";import{APICallError as GY}from"@ai-sdk/provider";import{LoadAPIKeyError as th}from"@ai-sdk/provider";import{LoadSettingError as FHe}from"@ai-sdk/provider";import{JSONParseError as ih,TypeValidationError as KY}from"@ai-sdk/provider";import{TypeValidationError as zE}from"@ai-sdk/provider";import{TypeValidationError as ZY}from"@ai-sdk/provider";var Qg=class extends Error{constructor(e,r){super(e),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function kE(t){}function zL(t){if(typeof t=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:e=kE,onError:r=kE,onRetry:n=kE,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let f=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,b]=BY(`${i}${f}`);for(let y of S)d(y);i=b,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let f=h.indexOf(":");if(f!==-1){let S=h.slice(0,f),b=h[f+1]===" "?2:1,y=h.slice(f+b);p(S,y,h);return}p(h,"",h)}function p(h,f,S){switch(h){case"event":l=f;break;case"data":c=`${c}${f}
|
|
72
72
|
`;break;case"id":s=f.includes("\0")?void 0:f;break;case"retry":/^\d+$/.test(f)?n(parseInt(f,10)):r(new Qg(`Invalid \`retry\` value: "${f}"`,{type:"invalid-retry",value:f,line:S}));break;default:r(new Qg(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:f,line:S}));break}}function m(){c.length>0&&e({id:s,event:l||void 0,data:c.endsWith(`
|
|
73
73
|
`)?c.slice(0,-1):c}),s=void 0,c="",l=""}function g(h={}){i&&h.consume&&d(i),a=!0,s=void 0,c="",l="",i=""}return{feed:u,reset:g}}function BY(t){let e=[],r="",n=0;for(;n<t.length;){let o=t.indexOf("\r",n),i=t.indexOf(`
|
|
74
74
|
`,n),a=-1;if(o!==-1&&i!==-1?a=Math.min(o,i):o!==-1?a=o:i!==-1&&(a=i),a===-1){r=t.slice(n);break}else{let s=t.slice(n,a);e.push(s),n=a+1,t[n-1]==="\r"&&t[n]===`
|
|
@@ -87,7 +87,7 @@ ${a}
|
|
|
87
87
|
`;break}case"tool":throw new aN({functionality:"tool messages"});default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return n+=`${r}:
|
|
88
88
|
`,{prompt:n,stopSequences:[`
|
|
89
89
|
${e}:`]}}function sN({id:t,model:e,created:r}){return{id:t??void 0,modelId:e??void 0,timestamp:r!=null?new Date(r*1e3):void 0}}function lN(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"unknown"}}var p5=bt(()=>me(Te.object({id:Te.string().nullish(),created:Te.number().nullish(),model:Te.string().nullish(),choices:Te.array(Te.object({text:Te.string(),finish_reason:Te.string(),logprobs:Te.object({tokens:Te.array(Te.string()),token_logprobs:Te.array(Te.number()),top_logprobs:Te.array(Te.record(Te.string(),Te.number())).nullish()}).nullish()})),usage:Te.object({prompt_tokens:Te.number(),completion_tokens:Te.number(),total_tokens:Te.number()}).nullish()}))),m5=bt(()=>me(Te.union([Te.object({id:Te.string().nullish(),created:Te.number().nullish(),model:Te.string().nullish(),choices:Te.array(Te.object({text:Te.string(),finish_reason:Te.string().nullish(),index:Te.number(),logprobs:Te.object({tokens:Te.array(Te.string()),token_logprobs:Te.array(Te.number()),top_logprobs:Te.array(Te.record(Te.string(),Te.number())).nullish()}).nullish()})),usage:Te.object({prompt_tokens:Te.number(),completion_tokens:Te.number(),total_tokens:Te.number()}).nullish()}),JE]))),cN=bt(()=>me(Do.object({echo:Do.boolean().optional(),logitBias:Do.record(Do.string(),Do.number()).optional(),suffix:Do.string().optional(),user:Do.string().optional(),logprobs:Do.union([Do.boolean(),Do.number()]).optional()}))),g5=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={},this.modelId=t,this.config=e}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get provider(){return this.config.provider}async getArgs({prompt:t,maxOutputTokens:e,temperature:r,topP:n,topK:o,frequencyPenalty:i,presencePenalty:a,stopSequences:s,responseFormat:c,tools:l,toolChoice:u,seed:d,providerOptions:p}){let m=[],g={...await Vr({provider:"openai",providerOptions:p,schema:cN}),...await Vr({provider:this.providerOptionsName,providerOptions:p,schema:cN})};o!=null&&m.push({type:"unsupported-setting",setting:"topK"}),l?.length&&m.push({type:"unsupported-setting",setting:"tools"}),u!=null&&m.push({type:"unsupported-setting",setting:"toolChoice"}),c!=null&&c.type!=="text"&&m.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format is not supported."});let{prompt:h,stopSequences:f}=d5({prompt:t}),S=[...f??[],...s??[]];return{args:{model:this.modelId,echo:g.echo,logit_bias:g.logitBias,logprobs:g?.logprobs===!0?0:g?.logprobs===!1?void 0:g?.logprobs,suffix:g.suffix,user:g.user,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,seed:d,prompt:h,stop:S.length>0?S:void 0},warnings:m}}async doGenerate(t){var e,r,n;let{args:o,warnings:i}=await this.getArgs(t),{responseHeaders:a,value:s,rawValue:c}=await $r({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:yr(this.config.headers(),t.headers),body:o,failedResponseHandler:ko,successfulResponseHandler:Gn(p5),abortSignal:t.abortSignal,fetch:this.config.fetch}),l=s.choices[0],u={openai:{}};return l.logprobs!=null&&(u.openai.logprobs=l.logprobs),{content:[{type:"text",text:l.text}],usage:{inputTokens:(e=s.usage)==null?void 0:e.prompt_tokens,outputTokens:(r=s.usage)==null?void 0:r.completion_tokens,totalTokens:(n=s.usage)==null?void 0:n.total_tokens},finishReason:lN(l.finish_reason),request:{body:o},response:{...sN(s),headers:a,body:c},providerMetadata:u,warnings:i}}async doStream(t){let{args:e,warnings:r}=await this.getArgs(t),n={...e,stream:!0,stream_options:{include_usage:!0}},{responseHeaders:o,value:i}=await $r({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:yr(this.config.headers(),t.headers),body:n,failedResponseHandler:ko,successfulResponseHandler:tc(m5),abortSignal:t.abortSignal,fetch:this.config.fetch}),a="unknown",s={openai:{}},c={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},l=!0;return{stream:i.pipeThrough(new TransformStream({start(u){u.enqueue({type:"stream-start",warnings:r})},transform(u,d){if(t.includeRawChunks&&d.enqueue({type:"raw",rawValue:u.rawValue}),!u.success){a="error",d.enqueue({type:"error",error:u.error});return}let p=u.value;if("error"in p){a="error",d.enqueue({type:"error",error:p.error});return}l&&(l=!1,d.enqueue({type:"response-metadata",...sN(p)}),d.enqueue({type:"text-start",id:"0"})),p.usage!=null&&(c.inputTokens=p.usage.prompt_tokens,c.outputTokens=p.usage.completion_tokens,c.totalTokens=p.usage.total_tokens);let m=p.choices[0];m?.finish_reason!=null&&(a=lN(m.finish_reason)),m?.logprobs!=null&&(s.openai.logprobs=m.logprobs),m?.text!=null&&m.text.length>0&&d.enqueue({type:"text-delta",id:"0",delta:m.text})},flush(u){l||u.enqueue({type:"text-end",id:"0"}),u.enqueue({type:"finish",finishReason:a,providerMetadata:s,usage:c})}})),request:{body:n},response:{headers:o}}}},f5=bt(()=>me(KE.object({dimensions:KE.number().optional(),user:KE.string().optional()}))),S5=bt(()=>me(hs.object({data:hs.array(hs.object({embedding:hs.array(hs.number())})),usage:hs.object({prompt_tokens:hs.number()}).nullish()}))),y5=class{constructor(t,e){this.specificationVersion="v2",this.maxEmbeddingsPerCall=2048,this.supportsParallelCalls=!0,this.modelId=t,this.config=e}get provider(){return this.config.provider}async doEmbed({values:t,headers:e,abortSignal:r,providerOptions:n}){var o;if(t.length>this.maxEmbeddingsPerCall)throw new h5({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Vr({provider:"openai",providerOptions:n,schema:f5}))!=null?o:{},{responseHeaders:a,value:s,rawValue:c}=await $r({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:yr(this.config.headers(),e),body:{model:this.modelId,input:t,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:ko,successfulResponseHandler:Gn(S5),abortSignal:r,fetch:this.config.fetch});return{embeddings:s.data.map(l=>l.embedding),usage:s.usage?{tokens:s.usage.prompt_tokens}:void 0,response:{headers:a,body:c}}}},b5=bt(()=>me(br.object({created:br.number().nullish(),data:br.array(br.object({b64_json:br.string(),revised_prompt:br.string().nullish()})),background:br.string().nullish(),output_format:br.string().nullish(),size:br.string().nullish(),quality:br.string().nullish(),usage:br.object({input_tokens:br.number().nullish(),output_tokens:br.number().nullish(),total_tokens:br.number().nullish(),input_tokens_details:br.object({image_tokens:br.number().nullish(),text_tokens:br.number().nullish()}).nullish()}).nullish()}))),E5={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},T5=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),v5=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=E5[this.modelId])!=null?t:1}get provider(){return this.config.provider}async doGenerate({prompt:t,n:e,size:r,aspectRatio:n,seed:o,providerOptions:i,headers:a,abortSignal:s}){var c,l,u,d;let p=[];n!=null&&p.push({type:"unsupported-setting",setting:"aspectRatio",details:"This model does not support aspect ratio. Use `size` instead."}),o!=null&&p.push({type:"unsupported-setting",setting:"seed"});let m=(u=(l=(c=this.config._internal)==null?void 0:c.currentDate)==null?void 0:l.call(c))!=null?u:new Date,{value:g,responseHeaders:h}=await $r({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:yr(this.config.headers(),a),body:{model:this.modelId,prompt:t,n:e,size:r,...(d=i.openai)!=null?d:{},...T5.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:ko,successfulResponseHandler:Gn(b5),abortSignal:s,fetch:this.config.fetch});return{images:g.data.map(f=>f.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:h},providerMetadata:{openai:{images:g.data.map(f=>({...f.revised_prompt?{revisedPrompt:f.revised_prompt}:{},...g.created!=null?{created:g.created}:{},...g.size!=null?{size:g.size}:{},...g.quality!=null?{quality:g.quality}:{},...g.background!=null?{background:g.background}:{},...g.output_format!=null?{outputFormat:g.output_format}:{}}))}}}}},A5=Ut(()=>me(sr.object({code:sr.string().nullish(),containerId:sr.string()}))),R5=Ut(()=>me(sr.object({outputs:sr.array(sr.discriminatedUnion("type",[sr.object({type:sr.literal("logs"),logs:sr.string()}),sr.object({type:sr.literal("image"),url:sr.string()})])).nullish()}))),C5=Ut(()=>me(sr.object({container:sr.union([sr.string(),sr.object({fileIds:sr.array(sr.string()).optional()})]).optional()}))),w5=Hn({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:A5,outputSchema:R5}),x5=(t={})=>w5(t),fN=qe.object({key:qe.string(),type:qe.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:qe.union([qe.string(),qe.number(),qe.boolean(),qe.array(qe.string())])}),SN=qe.object({type:qe.enum(["and","or"]),filters:qe.array(qe.union([fN,qe.lazy(()=>SN)]))}),_5=Ut(()=>me(qe.object({vectorStoreIds:qe.array(qe.string()),maxNumResults:qe.number().optional(),ranking:qe.object({ranker:qe.string().optional(),scoreThreshold:qe.number().optional()}).optional(),filters:qe.union([fN,SN]).optional()}))),I5=Ut(()=>me(qe.object({queries:qe.array(qe.string()),results:qe.array(qe.object({attributes:qe.record(qe.string(),qe.unknown()),fileId:qe.string(),filename:qe.string(),score:qe.number(),text:qe.string()})).nullable()}))),P5=Hn({id:"openai.file_search",name:"file_search",inputSchema:qe.object({}),outputSchema:I5}),M5=Ut(()=>me(Or.object({background:Or.enum(["auto","opaque","transparent"]).optional(),inputFidelity:Or.enum(["low","high"]).optional(),inputImageMask:Or.object({fileId:Or.string().optional(),imageUrl:Or.string().optional()}).optional(),model:Or.string().optional(),moderation:Or.enum(["auto"]).optional(),outputCompression:Or.number().int().min(0).max(100).optional(),outputFormat:Or.enum(["png","jpeg","webp"]).optional(),partialImages:Or.number().int().min(0).max(3).optional(),quality:Or.enum(["auto","low","medium","high"]).optional(),size:Or.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),O5=Ut(()=>me(Or.object({}))),L5=Ut(()=>me(Or.object({result:Or.string()}))),N5=Hn({id:"openai.image_generation",name:"image_generation",inputSchema:O5,outputSchema:L5}),D5=(t={})=>N5(t),yN=Ut(()=>me(hn.object({action:hn.object({type:hn.literal("exec"),command:hn.array(hn.string()),timeoutMs:hn.number().optional(),user:hn.string().optional(),workingDirectory:hn.string().optional(),env:hn.record(hn.string(),hn.string()).optional()})}))),bN=Ut(()=>me(hn.object({output:hn.string()}))),k5=Hn({id:"openai.local_shell",name:"local_shell",inputSchema:yN,outputSchema:bN}),F5=Ut(()=>me(et.object({externalWebAccess:et.boolean().optional(),filters:et.object({allowedDomains:et.array(et.string()).optional()}).optional(),searchContextSize:et.enum(["low","medium","high"]).optional(),userLocation:et.object({type:et.literal("approximate"),country:et.string().optional(),city:et.string().optional(),region:et.string().optional(),timezone:et.string().optional()}).optional()}))),U5=Ut(()=>me(et.object({}))),B5=Ut(()=>me(et.object({action:et.discriminatedUnion("type",[et.object({type:et.literal("search"),query:et.string().optional()}),et.object({type:et.literal("openPage"),url:et.string().nullish()}),et.object({type:et.literal("findInPage"),url:et.string().nullish(),pattern:et.string().nullish()})]),sources:et.array(et.discriminatedUnion("type",[et.object({type:et.literal("url"),url:et.string()}),et.object({type:et.literal("api"),name:et.string()})])).optional()}))),z5=Hn({id:"openai.web_search",name:"web_search",inputSchema:U5,outputSchema:B5}),H5=(t={})=>z5(t),G5=Ut(()=>me($t.object({searchContextSize:$t.enum(["low","medium","high"]).optional(),userLocation:$t.object({type:$t.literal("approximate"),country:$t.string().optional(),city:$t.string().optional(),region:$t.string().optional(),timezone:$t.string().optional()}).optional()}))),j5=Ut(()=>me($t.object({}))),V5=Ut(()=>me($t.object({action:$t.discriminatedUnion("type",[$t.object({type:$t.literal("search"),query:$t.string().optional()}),$t.object({type:$t.literal("openPage"),url:$t.string().nullish()}),$t.object({type:$t.literal("findInPage"),url:$t.string().nullish(),pattern:$t.string().nullish()})])}))),$5=Hn({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:j5,outputSchema:V5}),W5={codeInterpreter:x5,fileSearch:P5,imageGeneration:D5,localShell:k5,webSearchPreview:$5,webSearch:H5};function uN(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function Y5({prompt:t,systemMessageMode:e,fileIdPrefixes:r,store:n,hasLocalShellTool:o=!1}){var i,a,s,c;let l=[],u=[];for(let{role:d,content:p}of t)switch(d){case"system":{switch(e){case"system":{l.push({role:"system",content:p});break}case"developer":{l.push({role:"developer",content:p});break}case"remove":{u.push({type:"other",message:"system messages are removed for this model"});break}default:{let m=e;throw new Error(`Unsupported system message mode: ${m}`)}}break}case"user":{l.push({role:"user",content:p.map((m,g)=>{var h,f,S;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let b=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&uN(m.data,r)?{file_id:m.data}:{image_url:`data:${b};base64,${ra(m.data)}`},detail:(f=(h=m.providerOptions)==null?void 0:h.openai)==null?void 0:f.imageDetail}}else{if(m.mediaType==="application/pdf")return m.data instanceof URL?{type:"input_file",file_url:m.data.toString()}:{type:"input_file",...typeof m.data=="string"&&uN(m.data,r)?{file_id:m.data}:{filename:(S=m.filename)!=null?S:`part-${g}.pdf`,file_data:`data:application/pdf;base64,${ra(m.data)}`}};throw new K5({functionality:`file part media type ${m.mediaType}`})}}})});break}case"assistant":{let m={},g={};for(let h of p)switch(h.type){case"text":{let f=(a=(i=h.providerOptions)==null?void 0:i.openai)==null?void 0:a.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}l.push({role:"assistant",content:[{type:"output_text",text:h.text}],id:f});break}case"tool-call":{if(g[h.toolCallId]=h,h.providerExecuted)break;let f=(c=(s=h.providerOptions)==null?void 0:s.openai)==null?void 0:c.itemId;if(n&&f!=null){l.push({type:"item_reference",id:f});break}if(o&&h.toolName==="local_shell"){let S=await No({value:h.input,schema:yN});l.push({type:"local_shell_call",call_id:h.toolCallId,id:f,action:{type:"exec",command:S.action.command,timeout_ms:S.action.timeoutMs,user:S.action.user,working_directory:S.action.workingDirectory,env:S.action.env}});break}l.push({type:"function_call",call_id:h.toolCallId,name:h.toolName,arguments:JSON.stringify(h.input),id:f});break}case"tool-result":{n?l.push({type:"item_reference",id:h.toolCallId}):u.push({type:"other",message:`Results for OpenAI tool ${h.toolName} are not sent to the API when store is false`});break}case"reasoning":{let f=await Vr({provider:"openai",providerOptions:h.providerOptions,schema:X5}),S=f?.itemId;if(S!=null){let b=m[S];if(n)b===void 0&&(l.push({type:"item_reference",id:S}),m[S]={type:"reasoning",id:S,summary:[]});else{let y=[];h.text.length>0?y.push({type:"summary_text",text:h.text}):b!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),b===void 0?(m[S]={type:"reasoning",id:S,encrypted_content:f?.reasoningEncryptedContent,summary:y},l.push(m[S])):(b.summary.push(...y),f?.reasoningEncryptedContent!=null&&(b.encrypted_content=f.reasoningEncryptedContent))}}else u.push({type:"other",message:`Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(h)}.`});break}}break}case"tool":{for(let m of p){let g=m.output;if(o&&m.toolName==="local_shell"&&g.type==="json"){let f=await No({value:g.value,schema:bN});l.push({type:"local_shell_call_output",call_id:m.toolCallId,output:f.output});break}let h;switch(g.type){case"text":case"error-text":h=g.value;break;case"json":case"error-json":h=JSON.stringify(g.value);break;case"content":h=g.value.map(f=>{switch(f.type){case"text":return{type:"input_text",text:f.text};case"media":return f.mediaType.startsWith("image/")?{type:"input_image",image_url:`data:${f.mediaType};base64,${f.data}`}:{type:"input_file",filename:"data",file_data:`data:${f.mediaType};base64,${f.data}`}}});break}l.push({type:"function_call_output",call_id:m.toolCallId,output:h})}break}default:{let m=d;throw new Error(`Unsupported role: ${m}`)}}return{input:l,warnings:u}}var X5=YE.object({itemId:YE.string().nullish(),reasoningEncryptedContent:YE.string().nullish()});function dN({finishReason:t,hasFunctionCall:e}){switch(t){case void 0:case null:return e?"tool-calls":"stop";case"max_output_tokens":return"length";case"content_filter":return"content-filter";default:return e?"tool-calls":"unknown"}}var J5=bt(()=>me(E.union([E.object({type:E.literal("response.output_text.delta"),item_id:E.string(),delta:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish()}),E.object({type:E.enum(["response.completed","response.incomplete"]),response:E.object({incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.created"),response:E.object({id:E.string(),created_at:E.number(),model:E.string(),service_tier:E.string().nullish()})}),E.object({type:E.literal("response.output_item.added"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string()}),E.object({type:E.literal("file_search_call"),id:E.string()}),E.object({type:E.literal("image_generation_call"),id:E.string()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),container_id:E.string(),code:E.string().nullable(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable(),status:E.string()})])}),E.object({type:E.literal("response.output_item.done"),output_index:E.number(),item:E.discriminatedUnion("type",[E.object({type:E.literal("message"),id:E.string()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish()}),E.object({type:E.literal("function_call"),id:E.string(),call_id:E.string(),name:E.string(),arguments:E.string(),status:E.literal("completed")}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.unknown()),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.literal("completed")})])}),E.object({type:E.literal("response.function_call_arguments.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.image_generation_call.partial_image"),item_id:E.string(),output_index:E.number(),partial_image_b64:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.delta"),item_id:E.string(),output_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.code_interpreter_call_code.done"),item_id:E.string(),output_index:E.number(),code:E.string()}),E.object({type:E.literal("response.output_text.annotation.added"),annotation:E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()})])}),E.object({type:E.literal("response.reasoning_summary_part.added"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("response.reasoning_summary_text.delta"),item_id:E.string(),summary_index:E.number(),delta:E.string()}),E.object({type:E.literal("response.reasoning_summary_part.done"),item_id:E.string(),summary_index:E.number()}),E.object({type:E.literal("error"),sequence_number:E.number(),error:E.object({type:E.string(),code:E.string(),message:E.string(),param:E.string().nullish()})}),E.object({type:E.string()}).loose().transform(t=>({type:"unknown_chunk",message:t.type}))]))),Z5=bt(()=>me(E.object({id:E.string().optional(),created_at:E.number().optional(),error:E.object({message:E.string(),type:E.string(),param:E.string().nullish(),code:E.string()}).nullish(),model:E.string().optional(),output:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("message"),role:E.literal("assistant"),id:E.string(),content:E.array(E.object({type:E.literal("output_text"),text:E.string(),logprobs:E.array(E.object({token:E.string(),logprob:E.number(),top_logprobs:E.array(E.object({token:E.string(),logprob:E.number()}))})).nullish(),annotations:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url_citation"),start_index:E.number(),end_index:E.number(),url:E.string(),title:E.string()}),E.object({type:E.literal("file_citation"),file_id:E.string(),filename:E.string().nullish(),index:E.number().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),quote:E.string().nullish()}),E.object({type:E.literal("container_file_citation"),container_id:E.string(),file_id:E.string(),filename:E.string().nullish(),start_index:E.number().nullish(),end_index:E.number().nullish(),index:E.number().nullish()}),E.object({type:E.literal("file_path"),file_id:E.string(),index:E.number().nullish()})]))}))}),E.object({type:E.literal("web_search_call"),id:E.string(),status:E.string(),action:E.discriminatedUnion("type",[E.object({type:E.literal("search"),query:E.string().nullish(),sources:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("url"),url:E.string()}),E.object({type:E.literal("api"),name:E.string()})])).nullish()}),E.object({type:E.literal("open_page"),url:E.string().nullish()}),E.object({type:E.literal("find_in_page"),url:E.string().nullish(),pattern:E.string().nullish()})])}),E.object({type:E.literal("file_search_call"),id:E.string(),queries:E.array(E.string()),results:E.array(E.object({attributes:E.record(E.string(),E.union([E.string(),E.number(),E.boolean()])),file_id:E.string(),filename:E.string(),score:E.number(),text:E.string()})).nullish()}),E.object({type:E.literal("code_interpreter_call"),id:E.string(),code:E.string().nullable(),container_id:E.string(),outputs:E.array(E.discriminatedUnion("type",[E.object({type:E.literal("logs"),logs:E.string()}),E.object({type:E.literal("image"),url:E.string()})])).nullable()}),E.object({type:E.literal("image_generation_call"),id:E.string(),result:E.string()}),E.object({type:E.literal("local_shell_call"),id:E.string(),call_id:E.string(),action:E.object({type:E.literal("exec"),command:E.array(E.string()),timeout_ms:E.number().optional(),user:E.string().optional(),working_directory:E.string().optional(),env:E.record(E.string(),E.string()).optional()})}),E.object({type:E.literal("function_call"),call_id:E.string(),name:E.string(),arguments:E.string(),id:E.string()}),E.object({type:E.literal("computer_call"),id:E.string(),status:E.string().optional()}),E.object({type:E.literal("reasoning"),id:E.string(),encrypted_content:E.string().nullish(),summary:E.array(E.object({type:E.literal("summary_text"),text:E.string()}))})])).optional(),service_tier:E.string().nullish(),incomplete_details:E.object({reason:E.string()}).nullish(),usage:E.object({input_tokens:E.number(),input_tokens_details:E.object({cached_tokens:E.number().nullish()}).nullish(),output_tokens:E.number(),output_tokens_details:E.object({reasoning_tokens:E.number().nullish()}).nullish()}).optional()}))),EN=20,Q5=["o1","o1-2024-12-17","o3","o3-2025-04-16","o3-deep-research","o3-deep-research-2025-06-26","o3-mini","o3-mini-2025-01-31","o4-mini","o4-mini-2025-04-16","o4-mini-deep-research","o4-mini-deep-research-2025-06-26","codex-mini-latest","computer-use-preview","gpt-5","gpt-5-2025-08-07","gpt-5-codex","gpt-5-mini","gpt-5-mini-2025-08-07","gpt-5-nano","gpt-5-nano-2025-08-07","gpt-5-pro","gpt-5-pro-2025-10-06","gpt-5.1","gpt-5.1-chat-latest","gpt-5.1-codex-mini","gpt-5.1-codex","gpt-5.1-codex-max","gpt-5.2","gpt-5.2-chat-latest","gpt-5.2-pro"],VGe=["gpt-4.1","gpt-4.1-2025-04-14","gpt-4.1-mini","gpt-4.1-mini-2025-04-14","gpt-4.1-nano","gpt-4.1-nano-2025-04-14","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4o-audio-preview","gpt-4o-audio-preview-2024-10-01","gpt-4o-audio-preview-2024-12-17","gpt-4o-search-preview","gpt-4o-search-preview-2025-03-11","gpt-4o-mini-search-preview","gpt-4o-mini-search-preview-2025-03-11","gpt-4o-mini","gpt-4o-mini-2024-07-18","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-4.5-preview","gpt-4.5-preview-2025-02-27","gpt-3.5-turbo-0125","gpt-3.5-turbo","gpt-3.5-turbo-1106","chatgpt-4o-latest","gpt-5-chat-latest",...Q5],e3=bt(()=>me(Dt.object({conversation:Dt.string().nullish(),include:Dt.array(Dt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Dt.string().nullish(),logprobs:Dt.union([Dt.boolean(),Dt.number().min(1).max(EN)]).optional(),maxToolCalls:Dt.number().nullish(),metadata:Dt.any().nullish(),parallelToolCalls:Dt.boolean().nullish(),previousResponseId:Dt.string().nullish(),promptCacheKey:Dt.string().nullish(),promptCacheRetention:Dt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Dt.string().nullish(),reasoningSummary:Dt.string().nullish(),safetyIdentifier:Dt.string().nullish(),serviceTier:Dt.enum(["auto","flex","priority","default"]).nullish(),store:Dt.boolean().nullish(),strictJsonSchema:Dt.boolean().nullish(),textVerbosity:Dt.enum(["low","medium","high"]).nullish(),truncation:Dt.enum(["auto","disabled"]).nullish(),user:Dt.string().nullish()})));async function r3({tools:t,toolChoice:e,strictJsonSchema:r}){t=t?.length?t:void 0;let n=[];if(t==null)return{tools:void 0,toolChoice:void 0,toolWarnings:n};let o=[];for(let a of t)switch(a.type){case"function":o.push({type:"function",name:a.name,description:a.description,parameters:a.inputSchema,strict:r});break;case"provider-defined":{switch(a.id){case"openai.file_search":{let s=await No({value:a.args,schema:_5});o.push({type:"file_search",vector_store_ids:s.vectorStoreIds,max_num_results:s.maxNumResults,ranking_options:s.ranking?{ranker:s.ranking.ranker,score_threshold:s.ranking.scoreThreshold}:void 0,filters:s.filters});break}case"openai.local_shell":{o.push({type:"local_shell"});break}case"openai.web_search_preview":{let s=await No({value:a.args,schema:G5});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await No({value:a.args,schema:F5});o.push({type:"web_search",filters:s.filters!=null?{allowed_domains:s.filters.allowedDomains}:void 0,external_web_access:s.externalWebAccess,search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.code_interpreter":{let s=await No({value:a.args,schema:C5});o.push({type:"code_interpreter",container:s.container==null?{type:"auto",file_ids:void 0}:typeof s.container=="string"?s.container:{type:"auto",file_ids:s.container.fileIds}});break}case"openai.image_generation":{let s=await No({value:a.args,schema:M5});o.push({type:"image_generation",background:s.background,input_fidelity:s.inputFidelity,input_image_mask:s.inputImageMask?{file_id:s.inputImageMask.fileId,image_url:s.inputImageMask.imageUrl}:void 0,model:s.model,size:s.size,quality:s.quality,moderation:s.moderation,output_format:s.outputFormat,output_compression:s.outputCompression});break}}break}default:n.push({type:"unsupported-tool",tool:a});break}if(e==null)return{tools:o,toolChoice:void 0,toolWarnings:n};let i=e.type;switch(i){case"auto":case"none":case"required":return{tools:o,toolChoice:i,toolWarnings:n};case"tool":return{tools:o,toolChoice:e.toolName==="code_interpreter"||e.toolName==="file_search"||e.toolName==="image_generation"||e.toolName==="web_search_preview"||e.toolName==="web_search"?{type:e.toolName}:{type:"function",name:e.toolName},toolWarnings:n};default:{let a=i;throw new t3({functionality:`tool choice type: ${a}`})}}}var n3=class{constructor(t,e){this.specificationVersion="v2",this.supportedUrls={"image/*":[/^https?:\/\/.*$/],"application/pdf":[/^https?:\/\/.*$/]},this.modelId=t,this.config=e}get provider(){return this.config.provider}async getArgs({maxOutputTokens:t,temperature:e,stopSequences:r,topP:n,topK:o,presencePenalty:i,frequencyPenalty:a,seed:s,prompt:c,providerOptions:l,tools:u,toolChoice:d,responseFormat:p}){var m,g,h,f;let S=[],b=hN(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),s!=null&&S.push({type:"unsupported-setting",setting:"seed"}),i!=null&&S.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&S.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&S.push({type:"unsupported-setting",setting:"stopSequences"});let y=await Vr({provider:"openai",providerOptions:l,schema:e3});y?.conversation&&y?.previousResponseId&&S.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:T,warnings:C}=await Y5({prompt:c,systemMessageMode:b.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=y?.store)!=null?m:!0,hasLocalShellTool:O("openai.local_shell")});S.push(...C);let I=(g=y?.strictJsonSchema)!=null?g:!1,A=y?.include;function x(D){A==null?A=[D]:A.includes(D)||(A=[...A,D])}function O(D){return u?.find(oe=>oe.type==="provider-defined"&&oe.id===D)!=null}let L=typeof y?.logprobs=="number"?y?.logprobs:y?.logprobs===!0?EN:void 0;L&&x("message.output_text.logprobs");let N=(h=u?.find(D=>D.type==="provider-defined"&&(D.id==="openai.web_search"||D.id==="openai.web_search_preview")))==null?void 0:h.name;N&&x("web_search_call.action.sources"),O("openai.code_interpreter")&&x("code_interpreter_call.outputs");let V=y?.store;V===!1&&b.isReasoningModel&&x("reasoning.encrypted_content");let K={model:this.modelId,input:T,temperature:e,top_p:n,max_output_tokens:t,...(p?.type==="json"||y?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:I,name:(f=p.name)!=null?f:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...y?.textVerbosity&&{verbosity:y.textVerbosity}}},conversation:y?.conversation,max_tool_calls:y?.maxToolCalls,metadata:y?.metadata,parallel_tool_calls:y?.parallelToolCalls,previous_response_id:y?.previousResponseId,store:V,user:y?.user,instructions:y?.instructions,service_tier:y?.serviceTier,include:A,prompt_cache_key:y?.promptCacheKey,prompt_cache_retention:y?.promptCacheRetention,safety_identifier:y?.safetyIdentifier,top_logprobs:L,truncation:y?.truncation,...b.isReasoningModel&&(y?.reasoningEffort!=null||y?.reasoningSummary!=null)&&{reasoning:{...y?.reasoningEffort!=null&&{effort:y.reasoningEffort},...y?.reasoningSummary!=null&&{summary:y.reasoningSummary}}}};b.isReasoningModel?y?.reasoningEffort==="none"&&b.supportsNonReasoningParameters||(K.temperature!=null&&(K.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),K.top_p!=null&&(K.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(y?.reasoningEffort!=null&&S.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),y?.reasoningSummary!=null&&S.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),y?.serviceTier==="flex"&&!b.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete K.service_tier),y?.serviceTier==="priority"&&!b.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),delete K.service_tier);let{tools:B,toolChoice:fe,toolWarnings:H}=await r3({tools:u,toolChoice:d,strictJsonSchema:I});return{webSearchToolName:N,args:{...K,tools:B,tool_choice:fe},warnings:[...S,...H],store:V}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,g,h,f,S,b,y,T,C,I,A,x,O,L,N,V;let{args:K,warnings:B,webSearchToolName:fe}=await this.getArgs(t),H=this.config.url({path:"/responses",modelId:this.modelId}),D=this.config.provider.replace(".responses",""),{responseHeaders:oe,value:ue,rawValue:_e}=await $r({url:H,headers:yr(this.config.headers(),t.headers),body:K,failedResponseHandler:ko,successfulResponseHandler:Gn(Z5),abortSignal:t.abortSignal,fetch:this.config.fetch});if(ue.error)throw new q5({message:ue.error.message,url:H,requestBodyValues:K,statusCode:400,responseHeaders:oe,responseBody:_e,isRetryable:!1});let be=[],le=[],Z=!1;for(let P of ue.output)switch(P.type){case"reasoning":{P.summary.length===0&&P.summary.push({type:"summary_text",text:""});for(let ie of P.summary)be.push({type:"reasoning",text:ie.text,providerMetadata:{[D]:{itemId:P.id,reasoningEncryptedContent:(e=P.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{be.push({type:"tool-call",toolCallId:P.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),be.push({type:"tool-result",toolCallId:P.id,toolName:"image_generation",result:{result:P.result},providerExecuted:!0});break}case"local_shell_call":{be.push({type:"tool-call",toolCallId:P.call_id,toolName:"local_shell",input:JSON.stringify({action:P.action}),providerMetadata:{[D]:{itemId:P.id}}});break}case"message":{for(let ie of P.content){(n=(r=t.providerOptions)==null?void 0:r.openai)!=null&&n.logprobs&&ie.logprobs&&le.push(ie.logprobs),be.push({type:"text",text:ie.text,providerMetadata:{[D]:{itemId:P.id}}});for(let ge of ie.annotations)ge.type==="url_citation"?be.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:gn(),url:ge.url,title:ge.title}):ge.type==="file_citation"?be.push({type:"source",sourceType:"document",id:(l=(c=(s=this.config).generateId)==null?void 0:c.call(s))!=null?l:gn(),mediaType:"text/plain",title:(d=(u=ge.quote)!=null?u:ge.filename)!=null?d:"Document",filename:(p=ge.filename)!=null?p:ge.file_id,...ge.file_id?{providerMetadata:{[D]:{fileId:ge.file_id}}}:{}}):ge.type==="container_file_citation"?be.push({type:"source",sourceType:"document",id:(h=(g=(m=this.config).generateId)==null?void 0:g.call(m))!=null?h:gn(),mediaType:"text/plain",title:(S=(f=ge.filename)!=null?f:ge.file_id)!=null?S:"Document",filename:(b=ge.filename)!=null?b:ge.file_id,providerMetadata:{[D]:{fileId:ge.file_id,containerId:ge.container_id,...ge.index!=null?{index:ge.index}:{}}}}):ge.type==="file_path"&&be.push({type:"source",sourceType:"document",id:(C=(T=(y=this.config).generateId)==null?void 0:T.call(y))!=null?C:gn(),mediaType:"application/octet-stream",title:ge.file_id,filename:ge.file_id,providerMetadata:{[D]:{fileId:ge.file_id,...ge.index!=null?{index:ge.index}:{}}}})}break}case"function_call":{Z=!0,be.push({type:"tool-call",toolCallId:P.call_id,toolName:P.name,input:P.arguments,providerMetadata:{[D]:{itemId:P.id}}});break}case"web_search_call":{be.push({type:"tool-call",toolCallId:P.id,toolName:fe??"web_search",input:JSON.stringify({}),providerExecuted:!0}),be.push({type:"tool-result",toolCallId:P.id,toolName:fe??"web_search",result:mN(P.action),providerExecuted:!0});break}case"computer_call":{be.push({type:"tool-call",toolCallId:P.id,toolName:"computer_use",input:"",providerExecuted:!0}),be.push({type:"tool-result",toolCallId:P.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:P.status||"completed"},providerExecuted:!0});break}case"file_search_call":{be.push({type:"tool-call",toolCallId:P.id,toolName:"file_search",input:"{}",providerExecuted:!0}),be.push({type:"tool-result",toolCallId:P.id,toolName:"file_search",result:{queries:P.queries,results:(A=(I=P.results)==null?void 0:I.map(ie=>({attributes:ie.attributes,fileId:ie.file_id,filename:ie.filename,score:ie.score,text:ie.text})))!=null?A:null},providerExecuted:!0});break}case"code_interpreter_call":{be.push({type:"tool-call",toolCallId:P.id,toolName:"code_interpreter",input:JSON.stringify({code:P.code,containerId:P.container_id}),providerExecuted:!0}),be.push({type:"tool-result",toolCallId:P.id,toolName:"code_interpreter",result:{outputs:P.outputs},providerExecuted:!0});break}}let ve={[D]:{...ue.id!=null?{responseId:ue.id}:{}}};le.length>0&&(ve[D].logprobs=le),typeof ue.service_tier=="string"&&(ve[D].serviceTier=ue.service_tier);let Ce=ue.usage;return{content:be,finishReason:dN({finishReason:(x=ue.incomplete_details)==null?void 0:x.reason,hasFunctionCall:Z}),usage:{inputTokens:Ce.input_tokens,outputTokens:Ce.output_tokens,totalTokens:Ce.input_tokens+Ce.output_tokens,reasoningTokens:(L=(O=Ce.output_tokens_details)==null?void 0:O.reasoning_tokens)!=null?L:void 0,cachedInputTokens:(V=(N=Ce.input_tokens_details)==null?void 0:N.cached_tokens)!=null?V:void 0},request:{body:K},response:{id:ue.id,timestamp:new Date(ue.created_at*1e3),modelId:ue.model,headers:oe,body:_e},providerMetadata:ve,warnings:B}}async doStream(t){let{args:e,warnings:r,webSearchToolName:n,store:o}=await this.getArgs(t),{responseHeaders:i,value:a}=await $r({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:yr(this.config.headers(),t.headers),body:{...e,stream:!0},failedResponseHandler:ko,successfulResponseHandler:tc(J5),abortSignal:t.abortSignal,fetch:this.config.fetch}),s=this,c=this.config.provider.replace(".responses",""),l="unknown",u={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},d=[],p=null,m={},g=[],h=!1,f={},S;return{stream:a.pipeThrough(new TransformStream({start(b){b.enqueue({type:"stream-start",warnings:r})},transform(b,y){var T,C,I,A,x,O,L,N,V,K,B,fe,H,D,oe,ue,_e,be,le,Z,ve,Ce;if(t.includeRawChunks&&y.enqueue({type:"raw",rawValue:b.rawValue}),!b.success){l="error",y.enqueue({type:"error",error:b.error});return}let P=b.value;if(pN(P))P.item.type==="function_call"?(m[P.output_index]={toolName:P.item.name,toolCallId:P.item.call_id},y.enqueue({type:"tool-input-start",id:P.item.call_id,toolName:P.item.name})):P.item.type==="web_search_call"?(m[P.output_index]={toolName:n??"web_search",toolCallId:P.item.id},y.enqueue({type:"tool-input-start",id:P.item.id,toolName:n??"web_search",providerExecuted:!0}),y.enqueue({type:"tool-input-end",id:P.item.id}),y.enqueue({type:"tool-call",toolCallId:P.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):P.item.type==="computer_call"?(m[P.output_index]={toolName:"computer_use",toolCallId:P.item.id},y.enqueue({type:"tool-input-start",id:P.item.id,toolName:"computer_use",providerExecuted:!0})):P.item.type==="code_interpreter_call"?(m[P.output_index]={toolName:"code_interpreter",toolCallId:P.item.id,codeInterpreter:{containerId:P.item.container_id}},y.enqueue({type:"tool-input-start",id:P.item.id,toolName:"code_interpreter",providerExecuted:!0}),y.enqueue({type:"tool-input-delta",id:P.item.id,delta:`{"containerId":"${P.item.container_id}","code":"`})):P.item.type==="file_search_call"?y.enqueue({type:"tool-call",toolCallId:P.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):P.item.type==="image_generation_call"?y.enqueue({type:"tool-call",toolCallId:P.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):P.item.type==="message"?(g.splice(0,g.length),y.enqueue({type:"text-start",id:P.item.id,providerMetadata:{[c]:{itemId:P.item.id}}})):pN(P)&&P.item.type==="reasoning"&&(f[P.item.id]={encryptedContent:P.item.encrypted_content,summaryParts:{0:"active"}},y.enqueue({type:"reasoning-start",id:`${P.item.id}:0`,providerMetadata:{[c]:{itemId:P.item.id,reasoningEncryptedContent:(T=P.item.encrypted_content)!=null?T:null}}}));else if(i3(P)){if(P.item.type==="message")y.enqueue({type:"text-end",id:P.item.id,providerMetadata:{[c]:{itemId:P.item.id,...g.length>0&&{annotations:g}}}});else if(P.item.type==="function_call")m[P.output_index]=void 0,h=!0,y.enqueue({type:"tool-input-end",id:P.item.call_id}),y.enqueue({type:"tool-call",toolCallId:P.item.call_id,toolName:P.item.name,input:P.item.arguments,providerMetadata:{[c]:{itemId:P.item.id}}});else if(P.item.type==="web_search_call")m[P.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:P.item.id,toolName:n??"web_search",result:mN(P.item.action),providerExecuted:!0});else if(P.item.type==="computer_call")m[P.output_index]=void 0,y.enqueue({type:"tool-input-end",id:P.item.id}),y.enqueue({type:"tool-call",toolCallId:P.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),y.enqueue({type:"tool-result",toolCallId:P.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:P.item.status||"completed"},providerExecuted:!0});else if(P.item.type==="file_search_call")m[P.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:P.item.id,toolName:"file_search",result:{queries:P.item.queries,results:(I=(C=P.item.results)==null?void 0:C.map(ie=>({attributes:ie.attributes,fileId:ie.file_id,filename:ie.filename,score:ie.score,text:ie.text})))!=null?I:null},providerExecuted:!0});else if(P.item.type==="code_interpreter_call")m[P.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:P.item.id,toolName:"code_interpreter",result:{outputs:P.item.outputs},providerExecuted:!0});else if(P.item.type==="image_generation_call")y.enqueue({type:"tool-result",toolCallId:P.item.id,toolName:"image_generation",result:{result:P.item.result},providerExecuted:!0});else if(P.item.type==="local_shell_call")m[P.output_index]=void 0,y.enqueue({type:"tool-call",toolCallId:P.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:P.item.action.command,timeoutMs:P.item.action.timeout_ms,user:P.item.action.user,workingDirectory:P.item.action.working_directory,env:P.item.action.env}}),providerMetadata:{[c]:{itemId:P.item.id}}});else if(P.item.type==="reasoning"){let ie=f[P.item.id],ge=Object.entries(ie.summaryParts).filter(([on,vr])=>vr==="active"||vr==="can-conclude").map(([on])=>on);for(let on of ge)y.enqueue({type:"reasoning-end",id:`${P.item.id}:${on}`,providerMetadata:{[c]:{itemId:P.item.id,reasoningEncryptedContent:(A=P.item.encrypted_content)!=null?A:null}}});delete f[P.item.id]}}else if(l3(P)){let ie=m[P.output_index];ie!=null&&y.enqueue({type:"tool-input-delta",id:ie.toolCallId,delta:P.delta})}else if(c3(P)){let ie=m[P.output_index];ie!=null&&y.enqueue({type:"tool-input-delta",id:ie.toolCallId,delta:JSON.stringify(P.delta).slice(1,-1)})}else if(u3(P)){let ie=m[P.output_index];ie!=null&&(y.enqueue({type:"tool-input-delta",id:ie.toolCallId,delta:'"}'}),y.enqueue({type:"tool-input-end",id:ie.toolCallId}),y.enqueue({type:"tool-call",toolCallId:ie.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:P.code,containerId:ie.codeInterpreter.containerId}),providerExecuted:!0}))}else if(s3(P))p=P.response.id,y.enqueue({type:"response-metadata",id:P.response.id,timestamp:new Date(P.response.created_at*1e3),modelId:P.response.model});else if(o3(P))y.enqueue({type:"text-delta",id:P.item_id,delta:P.delta}),(O=(x=t.providerOptions)==null?void 0:x.openai)!=null&&O.logprobs&&P.logprobs&&d.push(P.logprobs);else if(P.type==="response.reasoning_summary_part.added"){if(P.summary_index>0){let ie=f[P.item_id];ie.summaryParts[P.summary_index]="active";for(let ge of Object.keys(ie.summaryParts))ie.summaryParts[ge]==="can-conclude"&&(y.enqueue({type:"reasoning-end",id:`${P.item_id}:${ge}`,providerMetadata:{[c]:{itemId:P.item_id}}}),ie.summaryParts[ge]="concluded");y.enqueue({type:"reasoning-start",id:`${P.item_id}:${P.summary_index}`,providerMetadata:{[c]:{itemId:P.item_id,reasoningEncryptedContent:(N=(L=f[P.item_id])==null?void 0:L.encryptedContent)!=null?N:null}}})}}else P.type==="response.reasoning_summary_text.delta"?y.enqueue({type:"reasoning-delta",id:`${P.item_id}:${P.summary_index}`,delta:P.delta,providerMetadata:{[c]:{itemId:P.item_id}}}):P.type==="response.reasoning_summary_part.done"?o?(y.enqueue({type:"reasoning-end",id:`${P.item_id}:${P.summary_index}`,providerMetadata:{[c]:{itemId:P.item_id}}}),f[P.item_id].summaryParts[P.summary_index]="concluded"):f[P.item_id].summaryParts[P.summary_index]="can-conclude":a3(P)?(l=dN({finishReason:(V=P.response.incomplete_details)==null?void 0:V.reason,hasFunctionCall:h}),u.inputTokens=P.response.usage.input_tokens,u.outputTokens=P.response.usage.output_tokens,u.totalTokens=P.response.usage.input_tokens+P.response.usage.output_tokens,u.reasoningTokens=(B=(K=P.response.usage.output_tokens_details)==null?void 0:K.reasoning_tokens)!=null?B:void 0,u.cachedInputTokens=(H=(fe=P.response.usage.input_tokens_details)==null?void 0:fe.cached_tokens)!=null?H:void 0,typeof P.response.service_tier=="string"&&(S=P.response.service_tier)):d3(P)?(g.push(P.annotation),P.annotation.type==="url_citation"?y.enqueue({type:"source",sourceType:"url",id:(ue=(oe=(D=s.config).generateId)==null?void 0:oe.call(D))!=null?ue:gn(),url:P.annotation.url,title:P.annotation.title}):P.annotation.type==="file_citation"&&y.enqueue({type:"source",sourceType:"document",id:(le=(be=(_e=s.config).generateId)==null?void 0:be.call(_e))!=null?le:gn(),mediaType:"text/plain",title:(ve=(Z=P.annotation.quote)!=null?Z:P.annotation.filename)!=null?ve:"Document",filename:(Ce=P.annotation.filename)!=null?Ce:P.annotation.file_id,...P.annotation.file_id?{providerMetadata:{[c]:{fileId:P.annotation.file_id}}}:{}})):p3(P)&&y.enqueue({type:"error",error:P})},flush(b){let y={[c]:{responseId:p}};d.length>0&&(y[c].logprobs=d),S!==void 0&&(y[c].serviceTier=S),b.enqueue({type:"finish",finishReason:l,usage:u,providerMetadata:y})}})),request:{body:e},response:{headers:i}}}};function o3(t){return t.type==="response.output_text.delta"}function i3(t){return t.type==="response.output_item.done"}function a3(t){return t.type==="response.completed"||t.type==="response.incomplete"}function s3(t){return t.type==="response.created"}function l3(t){return t.type==="response.function_call_arguments.delta"}function c3(t){return t.type==="response.code_interpreter_call_code.delta"}function u3(t){return t.type==="response.code_interpreter_call_code.done"}function pN(t){return t.type==="response.output_item.added"}function d3(t){return t.type==="response.output_text.annotation.added"}function p3(t){return t.type==="error"}function mN(t){var e;switch(t.type){case"search":return{action:{type:"search",query:(e=t.query)!=null?e:void 0},...t.sources!=null&&{sources:t.sources}};case"open_page":return{action:{type:"openPage",url:t.url}};case"find_in_page":return{action:{type:"findInPage",url:t.url,pattern:t.pattern}}}}var m3=bt(()=>me(XE.object({instructions:XE.string().nullish(),speed:XE.number().min(.25).max(4).default(1).nullish()}))),g3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({text:t,voice:e="alloy",outputFormat:r="mp3",speed:n,instructions:o,language:i,providerOptions:a}){let s=[],c=await Vr({provider:"openai",providerOptions:a,schema:m3}),l={model:this.modelId,input:t,voice:e,response_format:"mp3",speed:n,instructions:o};if(r&&(["mp3","opus","aac","flac","wav","pcm"].includes(r)?l.response_format=r:s.push({type:"unsupported-setting",setting:"outputFormat",details:`Unsupported output format: ${r}. Using mp3 instead.`})),c){let u={};for(let d in u){let p=u[d];p!==void 0&&(l[d]=p)}}return i&&s.push({type:"unsupported-setting",setting:"language",details:`OpenAI speech models do not support language selection. Language parameter "${i}" was ignored.`}),{requestBody:l,warnings:s}}async doGenerate(t){var e,r,n;let o=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{requestBody:i,warnings:a}=await this.getArgs(t),{value:s,responseHeaders:c,rawValue:l}=await $r({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:yr(this.config.headers(),t.headers),body:i,failedResponseHandler:ko,successfulResponseHandler:JL(),abortSignal:t.abortSignal,fetch:this.config.fetch});return{audio:s,warnings:a,request:{body:JSON.stringify(i)},response:{timestamp:o,modelId:this.modelId,headers:c,body:l}}}},h3=bt(()=>me(Bt.object({text:Bt.string(),language:Bt.string().nullish(),duration:Bt.number().nullish(),words:Bt.array(Bt.object({word:Bt.string(),start:Bt.number(),end:Bt.number()})).nullish(),segments:Bt.array(Bt.object({id:Bt.number(),seek:Bt.number(),start:Bt.number(),end:Bt.number(),text:Bt.string(),tokens:Bt.array(Bt.number()),temperature:Bt.number(),avg_logprob:Bt.number(),compression_ratio:Bt.number(),no_speech_prob:Bt.number()})).nullish()}))),f3=bt(()=>me(oa.object({include:oa.array(oa.string()).optional(),language:oa.string().optional(),prompt:oa.string().optional(),temperature:oa.number().min(0).max(1).default(0).optional(),timestampGranularities:oa.array(oa.enum(["word","segment"])).default(["segment"]).optional()}))),gN={afrikaans:"af",arabic:"ar",armenian:"hy",azerbaijani:"az",belarusian:"be",bosnian:"bs",bulgarian:"bg",catalan:"ca",chinese:"zh",croatian:"hr",czech:"cs",danish:"da",dutch:"nl",english:"en",estonian:"et",finnish:"fi",french:"fr",galician:"gl",german:"de",greek:"el",hebrew:"he",hindi:"hi",hungarian:"hu",icelandic:"is",indonesian:"id",italian:"it",japanese:"ja",kannada:"kn",kazakh:"kk",korean:"ko",latvian:"lv",lithuanian:"lt",macedonian:"mk",malay:"ms",marathi:"mr",maori:"mi",nepali:"ne",norwegian:"no",persian:"fa",polish:"pl",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"sr",slovak:"sk",slovenian:"sl",spanish:"es",swahili:"sw",swedish:"sv",tagalog:"tl",tamil:"ta",thai:"th",turkish:"tr",ukrainian:"uk",urdu:"ur",vietnamese:"vi",welsh:"cy"},S3=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get provider(){return this.config.provider}async getArgs({audio:t,mediaType:e,providerOptions:r}){let n=[],o=await Vr({provider:"openai",providerOptions:r,schema:f3}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([nN(t)]);i.append("model",this.modelId);let s=WL(e);if(i.append("file",new File([a],"audio",{type:e}),`audio.${s}`),o){let c={include:o.include,language:o.language,prompt:o.prompt,response_format:["gpt-4o-transcribe","gpt-4o-mini-transcribe"].includes(this.modelId)?"json":"verbose_json",temperature:o.temperature,timestamp_granularities:o.timestampGranularities};for(let[l,u]of Object.entries(c))if(u!=null)if(Array.isArray(u))for(let d of u)i.append(`${l}[]`,String(d));else i.append(l,String(u))}return{formData:i,warnings:n}}async doGenerate(t){var e,r,n,o,i,a,s,c;let l=(n=(r=(e=this.config._internal)==null?void 0:e.currentDate)==null?void 0:r.call(e))!=null?n:new Date,{formData:u,warnings:d}=await this.getArgs(t),{value:p,responseHeaders:m,rawValue:g}=await KL({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:yr(this.config.headers(),t.headers),formData:u,failedResponseHandler:ko,successfulResponseHandler:Gn(h3),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in gN?gN[p.language]:void 0;return{text:p.text,segments:(s=(a=(o=p.segments)==null?void 0:o.map(f=>({text:f.text,startSecond:f.start,endSecond:f.end})))!=null?a:(i=p.words)==null?void 0:i.map(f=>({text:f.word,startSecond:f.start,endSecond:f.end})))!=null?s:[],language:h,durationInSeconds:(c=p.duration)!=null?c:void 0,warnings:d,response:{timestamp:l,modelId:this.modelId,headers:m,body:g}}}},y3="2.0.89";function ZE(t={}){var e,r;let n=(e=oN($L({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>GE({Authorization:`Bearer ${VL({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${y3}`),a=h=>new c5(h,{provider:`${o}.chat`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),s=h=>new g5(h,{provider:`${o}.completion`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),c=h=>new y5(h,{provider:`${o}.embedding`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),l=h=>new v5(h,{provider:`${o}.image`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),u=h=>new S3(h,{provider:`${o}.transcription`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),d=h=>new g3(h,{provider:`${o}.speech`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch}),p=h=>{if(new.target)throw new Error("The OpenAI model function cannot be called with the new keyword.");return m(h)},m=h=>new n3(h,{provider:`${o}.responses`,url:({path:f})=>`${n}${f}`,headers:i,fetch:t.fetch,fileIdPrefixes:["file-"]}),g=function(h){return p(h)};return g.languageModel=p,g.chat=a,g.completion=s,g.responses=m,g.embedding=c,g.textEmbedding=c,g.textEmbeddingModel=c,g.image=l,g.imageModel=l,g.transcription=u,g.transcriptionModel=u,g.speech=d,g.speechModel=d,g.tools=W5,g}var tje=ZE();function TN(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[Cm]:gs??"",...r&&{[Cx]:r},...n||{}};return o&&(i[Rx]=JSON.stringify(o)),i}var ch=t=>e=>{let r=TN(t);return b3({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},QE=t=>e=>{let r=TN(t);return ZE({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var tn=class extends Sr{agentConfig;constructor(e,r){let n={...rm,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return GC.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${W}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:gs,...e},signal:r.abortSignal});return HC.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${W}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return E3.string().parse(r)}async getElementLocation(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.[ir.LOCATOR]},o=await this.sendRequest(`/${W}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return Mx.parse(o)}async getAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.[ir.ASSERTION]},o=await this.sendRequest(`/${W}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return By.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return Px.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return xx.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return _x.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return Ix.parse(o)}async getVisualAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.[ir.VISUAL_ASSERTION]},o=await this.sendRequest(`/${W}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return By.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${W}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return wx.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${W}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal})}async getMultiturnAiActionEvaluation(e,r){let n=await this.sendRequest(`/${W}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return AS.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${W}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return Ox.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.[ir.TEXT_EXTRACTION]},o=await this.sendRequest(`/${W}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return ES.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return fC.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${W}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return SC.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${W}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return tS.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${W}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return rw.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${W}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return pC.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${W}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return gC.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${W}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return mC.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${W}/web-agent/iframe-regex`,{method:"POST",body:e,signal:r.abortSignal});return fA.parse(n)}getAnthropicModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return ch({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Qe(n),promptType:o},sessionId:r})}getOpenAIModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return QE({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Qe(n),promptType:o},sessionId:r})}};import{z as eT}from"zod";var ct=class extends Sr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return El(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${W}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return $x.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${W}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Hx.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${W}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return Nx.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${W}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${W}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return kx.parse(n)}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${W}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Hy.parse(r)}async getMobileStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${W}/mobile-cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Hy.parse(r)}async updateMobileStepCaches(e,r){await this.sendRequest(`/${W}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,r){let n=await this.sendRequest(`/${W}/mobile-cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Fx.parse(n)}async queueTests(e){let r=await this.sendRequest(`/${W}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Lx.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${W}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return Vx.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${W}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${W}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${W}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:r}),contentType:r["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${W}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Wx.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${W}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return u_.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${W}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${W}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${W}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${W}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(r){if(r instanceof Error&&r.message.includes("404"))return null;throw r}}async queueSuiteRuns(e){let r=await this.sendRequest(`/${W}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return qx.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${W}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return kC.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${W}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){r.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,r){try{await this.sendRequest(`/${W}/billing/events`,{method:"POST",body:r,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let r=await this.sendRequest(`/${W}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Kx.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${W}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${W}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Yx.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${W}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return Xx.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${W}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return Jx.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${W}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return h_.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${W}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){r.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,r,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${W}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Pu.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${W}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Pu.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${W}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vy.parse(a)}async getMergeBaseCommitFromGitlab(e,r,n){let o=new URLSearchParams;o.set("base",r),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${W}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Pu.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${W}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Pu.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${W}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vy.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${W}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return eT.record(eT.string(),eT.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${W}/quarantine`,{method:"GET"});return Zx.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${W}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,r,n){await this.sendRequest(`/${W}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let r=await this.sendRequest(`/${W}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Qx.parse(r)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${W}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:r,md5:n}){let o={channel:e,tag:r,md5:n},i=await this.sendRequest(`/${W}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return t_.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${W}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${W}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return r_.parse(e)}async getLimbarAssetDownloadUrl(e,r){let n=await this.sendRequest(`/${W}/limbar/assets/${e}/${r}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return n_.parse(n)}async deleteAndroidAsset(e,r){await this.sendRequest(`/${W}/limbar/assets/${e}/${r}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${W}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return e_.parse(r)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${W}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${W}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${W}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return $w.parse(r)}};async function uh(t){let e=process.versions.node,r=parseInt(e.split(".")[0]);(isNaN(r)||r<18)&&(v.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),v.debug(`Identified node version ${e}`);let n=await t.client.getAuthInfo();return v.debug("Got auth info from API"),n}var dh=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var ia=class extends Sr{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${W}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return SA.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal})}};var rc=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return El(e)}async acquireCacheLock(e,r){return this.client.acquireCacheLock(e,r)}async createOnDemandScreenshot(e,r,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:r.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,r){return this.client.saveNewIcons(e,r)}};import{Faker as T3,en as v3}from"@faker-js/faker";var nc="v1",Fo=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 T3({locale:v3}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${nc}/tools/ai/generate`,{method:"POST",body:r}).catch(n=>{throw n instanceof ao?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${nc}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof ao?new Error(r.rawError):new Error(`Failed to send sms: ${r.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${nc}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof ao?new Error(r.rawError):r})}async sendEmail(e){return this.httpClient.sendRequest(`/${nc}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof ao?new Error(r.rawError):new Error(`Failed to send email: ${r.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${nc}/tools/email/fetchAll`,{method:"POST",body:e}).catch(r=>{throw r instanceof ao?new Error(r.rawError):new Error(`Failed to fetch all emails: ${r.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${nc}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof ao?new Error(r.rawError):new Error(`Failed to fetch latest emails: ${r.message}`)})}};function vN(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var ph=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await vN(n,"application/zip",r);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function co({logger:t,orgId:e,client:r,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a,bustOldestCachePercentage:s}){return a?new wm:new tT(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:s})}var tT=class{constructor(e,r,n,o,i){this.orgId=r;this.client=n;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:c}=i,{gitBranchName:l,gitProtectedBranches:u}=o;e.info({options:i,gitBranchName:l,gitProtectedBranches:u},"Cache storage initialization options"),this.cacheHeaders=zy(o),this.readCaches=!a;let d=l&&u.includes(l);s||!d?this.writeCaches=!0:this.writeCaches=!1,d||(this.bustOldestCachePercentage=c)}cacheHeaders;readCaches;writeCaches;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,testId:r,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:r},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:r,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(this.bustOldestCachePercentage!==void 0){let s=Object.entries(i).map(([u,d])=>({key:u,time:d.value.cache?.updatedAt?.getTime()??0}));s.sort((u,d)=>u.time-d.time);let c=s.length,l=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));s.slice(0,l).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:l,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches")}for(let s of[r,n,o])s&&Gl({steps:s,stepCacheEntries:i,logger:e.logger});if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}let{cachesToSave:a}=await Mt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import mh from"path";function A3(t){let e=new AN,r=mh.join(t,"metadata.json"),n=Tl.parse(JSON.parse(rT.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of rT.readdirSync(mh.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new AN(mh.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(mh.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function gh(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!rT.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new ph(e);try{let{runGroupId:i,buffer:a}=A3(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;r.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",r.error(`Failed to upload test results: ${a}.`);return}}import R3 from"adm-zip";import Lr from"fs";import jn from"path";var Ed=class t{constructor(e){this.filePath=e;Lr.rmSync(this.filePath,{recursive:!0,force:!0}),Lr.mkdirSync(this.filePath,{recursive:!0})}children=[];streams=[];close(){for(let e of this.children)e.close();for(let e of this.streams)e.end()}cd(e){let r=new t(jn.join(this.filePath,e));return this.children.push(r),r}cwd(){return this.filePath}mkdir(e){Lr.mkdirSync(jn.join(this.filePath,e),{recursive:!0})}readFile(e){let r=jn.join(this.filePath,e);if(Lr.existsSync(r))return Lr.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=jn.join(this.filePath,r);try{Lr.writeFileSync(o,n)}catch{}}createFileStream(e){let r=jn.join(this.filePath,e),n=Lr.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new nT(jn.join(this.filePath,"runs"),e);return this.children.push(r),r}},nT=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=jn.join(e,`temp-storage-${r}`),this.finalPath=jn.join(e,`${r}.zip`),Lr.rmSync(this.tempPath,{recursive:!0,force:!0}),Lr.rmSync(this.finalPath,{recursive:!0,force:!0}),Lr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=jn.join(this.tempPath,e);if(Lr.existsSync(r))return Lr.readFileSync(r)}mkdir(e){Lr.mkdirSync(jn.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new Ed(jn.join(this.tempPath,e));return this.children.push(r),r}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=jn.join(this.tempPath,r);Lr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new R3;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Lr.writeFileSync(this.finalPath,r),Lr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import C3 from"adm-zip";import{randomUUID as w3}from"crypto";import rr from"fs";import Er from"path";function xN(t){try{return rr.existsSync(t)?JSON.parse(rr.readFileSync(t,"utf-8")):void 0}catch{return}}function RN(t){return rr.existsSync(t)?rr.readFileSync(t,"utf-8").split(`
|
|
90
|
-
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function x3(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Er.join(t.inflatedPath,"attempts",r);let n=Er.join(t.inflatedPath,"attempts");if(!rr.existsSync(n))return;let o=rr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Er.join(n,i,"metadata.json"),s=xN(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),Er.join(n,i)}}function CN(t,e,r){let n=Er.join(t,"attempts");if(!rr.existsSync(n))return;let o=rr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Er.join(n,i,"assets",`${e}.${r}`);if(rr.existsSync(a))return a}}var hh=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Er.join(e,"runs"),this.zipPath=Er.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!rr.existsSync(this.zipPath))return;let n=Er.join(this.runsDir,`temp-unzipped-${e}-${w3()}`);rr.mkdirSync(n,{recursive:!0}),new C3(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())rr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return x3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Er.join(e,"assets");return rr.existsSync(r)?rr.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Er.join(r,o.name)).filter(o=>{let i=Er.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Er.join(n,"assets",`${e}.${r}`);if(rr.existsSync(o))try{return rr.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=xN(Er.join(o,"console.json")),a=Iy.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=Er.join(o,"assets","har-pages.log"),a=Er.join(o,"assets","har-entries.log"),s={};for(let u of RN(i)){let d=Cu.safeParse(wN(u));d.success&&(s[d.data.id]=d.data)}let c={},l=RN(a);for(let u=0;u<l.length;u++){let d=l[u],p=wu.safeParse(wN(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return My(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=CN(o.inflatedPath,r,"html");if(i)try{return rr.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=CN(o.inflatedPath,r,"xml");if(i)try{return rr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Er.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return rr.readFileSync(i)}catch{return}}};function wN(t){try{return JSON.parse(t)}catch{return}}function fh({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??_3(t),i,a={};if(o){try{i=n(o)}catch(c){throw new Error(`Failed to resolve environment ${o} for test ${t.name}: ${String(c)}`)}a=i.variables}let s=t.baseUrl;if(r)s=r;else if(!s){let c=a[nr];typeof c=="string"&&(s=c)}if(!s)throw new Error(`Cannot run test with no base URL and no ${nr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function _3(t){for(let e of t.envs??[])if(e.default)return e.name}import Sh from"fs";import I3 from"path";var P3=new Dg(30,60*1e3),bh="https://api.momentic.ai",iT,_N,Eh=t=>{bh=t},Wt=()=>bh,IN=()=>El(bh),PN=t=>{_N=t},MN=()=>_N,ic=()=>iT;var oc,aT,yh,Th=async t=>{if(iT&&oc&&yh)return oc;let e=new ct({baseUrl:bh,apiKey:t,logger:v});iT=e;try{let r=await e.getAuthInfo();return oc=r.orgId,aT=r.userId,yh=t,oc}catch(r){throw new Error(`Error checking API key against server: ${r}`)}},zt=()=>{if(!oc)throw new Error("Your organization ID is invalid.");return oc},Uo=()=>{if(!aT)throw new Error("Your user ID is invalid.");return aT},Tr=()=>{if(!yh)throw new Error("Your API key is invalid.");return yh},sT,oT,ac=(t,e)=>{sT=t,oT?.abort(),oT=new AbortController;let r=oT.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=I3.resolve(t.rootDir,o.envFile);try{if(Sh.lstatSync(i).isSymbolicLink())return;Sh.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{M3({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Se=()=>sT;function M3({filesToWatch:t,revalidator:e,signal:r,project:n}){v.debug("Starting watch on the following files:"),t.forEach(o=>{v.debug(`- ${o}`)}),t.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(P3.increment("setLocalProject")&&v.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.`),sT=await Promise.resolve(e(n.configFilePath)))};Sh.watchFile(o,{persistent:!1},i);let a=()=>{Sh.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ue(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as O3}from"os";var L3="2.48.2",fs=Al({app:"desktop-server",hostname:O3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:L3});(async()=>{try{let t=await di(fs);t.gitBranchName&&fs.addBinding("branch",t.gitBranchName)}catch{}})();var ON=N3();ON.get("/",async(t,e)=>{let r=Se(),n=ic();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await fr(fs,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=MN(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var lT=ON;import{Router as D3}from"express";import Wr from"fs";import{globSync as k3}from"glob";import lr from"path";var vd=D3();function Td(t){let e=Se(),r=lr.dirname(e.configFilePath);return lr.join(r,...t)}function F3(t){let e=Se(),r=lr.dirname(e.configFilePath),n=lr.relative(r,t);return n?n.split(lr.sep):[]}function U3(t,e){let r=Wr.statSync(t),n=F3(t);return Ny.parse({name:e,absolutePath:t,relativePath:n.join(lr.sep),pathSegments:n,isDirectory:r.isDirectory(),size:r.size,createdAt:r.birthtime,modifiedAt:r.mtime,accessedAt:r.atime})}vd.post("/",Ue(async(t,e,r)=>{let n;try{n=dx.parse(t.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Td(n);if(!Wr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(lr.sep)}`});return}if(!Wr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(lr.sep)}`});return}let a=Se(),s=Array.from(a.config.exclude??[]).concat(Em),l=k3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=lr.join(o,d);return U3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));vd.put("/",Ue(async(t,e,r)=>{let n;try{n=px.parse(t.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Td(n);if(Wr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(lr.sep)}`,pathSegments:n});return}Wr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(lr.sep)}`,pathSegments:n};e.status(201).json(i)}));vd.patch("/",Ue(async(t,e,r)=>{let n,o;try{let l=mx.parse(t.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Td(n),a=Td(o);if(!Wr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(lr.sep)}`});return}if(Wr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(lr.sep)}`});return}let s=lr.dirname(a);Wr.existsSync(s)||Wr.mkdirSync(s,{recursive:!0}),Wr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(lr.sep)} to ${o.join(lr.sep)}`,pathSegments:o};e.status(200).json(c)}));vd.delete("/",Ue(async(t,e,r)=>{let n,o=!0;try{let c=gx.parse(t.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=Td(n);if(!Wr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(lr.sep)}`,pathSegments:n});return}if(!Wr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(lr.sep)}`});return}if(o)Wr.rmSync(i,{recursive:!0,force:!0});else{if(Wr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Wr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var cT=vd;import{Router as B3}from"express";var LN=B3();LN.get("/",async(t,e)=>{let r=Se(),n=ic();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await fr(fs,n,r);e.status(200).json(o)});var uT=LN;import oQ from"events";import mU,{Router as iQ}from"express";import aQ from"http";import sQ from"path";import{Server as Y8}from"socket.io";var z3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},NN={event:"cancel",createHandler:z3};var H3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},DN={event:"fetchA11yTree",createHandler:H3};var G3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},kN={event:"fetchDom",createHandler:G3};var j3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},FN={event:"disconnect",createHandler:j3};function Vn(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=V3(r);$3(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await W3(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function V3(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function $3(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function W3(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as nX}from"crypto";import{faker as q3}from"@faker-js/faker";import K3 from"assert";import Y3 from"axios";import*as X3 from"child_process";import J3 from"moment";import*as Z3 from"otpauth";import Q3 from"pg";async function UN(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=pm(n,e);r.push(...o)}),r}function eX(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function tX(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var rX=Object.getPrototypeOf(async function(){}).constructor;async function BN(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(y,T)=>{o[y]=T,l[y]=T},d={},p=(y,T)=>{o[y]=T,d[y]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new rX("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Y3,J3,c.fakerInstance??q3,K3,Q3,m,g,Z3,X3,UN,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,eX(a,s),...Object.values(i??{}))),f=!0,S,b;try{let y=await X(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await tX(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),f=!1,y instanceof Vi?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function zN({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Hi,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=nX(),p=await BN(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as oX,randomUUID as iX}from"crypto";import aX from"fetch-retry";var sX=aX(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),HN=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,GN=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function jN({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Hi,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!HN)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!GN)throw new Error("Missing lambda auth secret.");let h=oX("sha256",GN).update(t).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let S={id:iX(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await X(sX(HN,{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(b){m=b}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=qw.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 aa(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await jN(t);else if(t.localTools)e=await zN({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
90
|
+
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function x3(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Er.join(t.inflatedPath,"attempts",r);let n=Er.join(t.inflatedPath,"attempts");if(!rr.existsSync(n))return;let o=rr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Er.join(n,i,"metadata.json"),s=xN(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),Er.join(n,i)}}function CN(t,e,r){let n=Er.join(t,"attempts");if(!rr.existsSync(n))return;let o=rr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Er.join(n,i,"assets",`${e}.${r}`);if(rr.existsSync(a))return a}}var hh=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Er.join(e,"runs"),this.zipPath=Er.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!rr.existsSync(this.zipPath))return;let n=Er.join(this.runsDir,`temp-unzipped-${e}-${w3()}`);rr.mkdirSync(n,{recursive:!0}),new C3(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())rr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return x3(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Er.join(e,"assets");return rr.existsSync(r)?rr.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Er.join(r,o.name)).filter(o=>{let i=Er.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Er.join(n,"assets",`${e}.${r}`);if(rr.existsSync(o))try{return rr.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=xN(Er.join(o,"console.json")),a=Iy.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=Er.join(o,"assets","har-pages.log"),a=Er.join(o,"assets","har-entries.log"),s={};for(let u of RN(i)){let d=Cu.safeParse(wN(u));d.success&&(s[d.data.id]=d.data)}let c={},l=RN(a);for(let u=0;u<l.length;u++){let d=l[u],p=wu.safeParse(wN(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return My(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=CN(o.inflatedPath,r,"html");if(i)try{return rr.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=CN(o.inflatedPath,r,"xml");if(i)try{return rr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Er.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return rr.readFileSync(i)}catch{return}}};function wN(t){try{return JSON.parse(t)}catch{return}}function fh({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??_3(t),i,a={};if(o){try{i=n(o)}catch(c){throw new Error(`Failed to resolve environment ${o} for test ${t.name}: ${String(c)}`)}a=i.variables}let s=t.baseUrl;if(r)s=r;else if(!s){let c=a[nr];typeof c=="string"&&(s=c)}if(!s)throw new Error(`Cannot run test with no base URL and no ${nr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function _3(t){for(let e of t.envs??[])if(e.default)return e.name}import Sh from"fs";import I3 from"path";var P3=new Dg(30,60*1e3),bh="https://api.momentic.ai",iT,_N,Eh=t=>{bh=t},Wt=()=>bh,IN=()=>El(bh),PN=t=>{_N=t},MN=()=>_N,ic=()=>iT;var oc,aT,yh,Th=async t=>{if(iT&&oc&&yh)return oc;let e=new ct({baseUrl:bh,apiKey:t,logger:v});iT=e;try{let r=await e.getAuthInfo();return oc=r.orgId,aT=r.userId,yh=t,oc}catch(r){throw new Error(`Error checking API key against server: ${r}`)}},zt=()=>{if(!oc)throw new Error("Your organization ID is invalid.");return oc},Uo=()=>{if(!aT)throw new Error("Your user ID is invalid.");return aT},Tr=()=>{if(!yh)throw new Error("Your API key is invalid.");return yh},sT,oT,ac=(t,e)=>{sT=t,oT?.abort(),oT=new AbortController;let r=oT.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=I3.resolve(t.rootDir,o.envFile);try{if(Sh.lstatSync(i).isSymbolicLink())return;Sh.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{M3({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Se=()=>sT;function M3({filesToWatch:t,revalidator:e,signal:r,project:n}){v.debug("Starting watch on the following files:"),t.forEach(o=>{v.debug(`- ${o}`)}),t.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(P3.increment("setLocalProject")&&v.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.`),sT=await Promise.resolve(e(n.configFilePath)))};Sh.watchFile(o,{persistent:!1},i);let a=()=>{Sh.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ue(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as O3}from"os";var L3="2.49.0",fs=Al({app:"desktop-server",hostname:O3(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:L3});(async()=>{try{let t=await di(fs);t.gitBranchName&&fs.addBinding("branch",t.gitBranchName)}catch{}})();var ON=N3();ON.get("/",async(t,e)=>{let r=Se(),n=ic();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await fr(fs,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=MN(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var lT=ON;import{Router as D3}from"express";import Wr from"fs";import{globSync as k3}from"glob";import lr from"path";var vd=D3();function Td(t){let e=Se(),r=lr.dirname(e.configFilePath);return lr.join(r,...t)}function F3(t){let e=Se(),r=lr.dirname(e.configFilePath),n=lr.relative(r,t);return n?n.split(lr.sep):[]}function U3(t,e){let r=Wr.statSync(t),n=F3(t);return Ny.parse({name:e,absolutePath:t,relativePath:n.join(lr.sep),pathSegments:n,isDirectory:r.isDirectory(),size:r.size,createdAt:r.birthtime,modifiedAt:r.mtime,accessedAt:r.atime})}vd.post("/",Ue(async(t,e,r)=>{let n;try{n=dx.parse(t.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Td(n);if(!Wr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(lr.sep)}`});return}if(!Wr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(lr.sep)}`});return}let a=Se(),s=Array.from(a.config.exclude??[]).concat(Em),l=k3("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=lr.join(o,d);return U3(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));vd.put("/",Ue(async(t,e,r)=>{let n;try{n=px.parse(t.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Td(n);if(Wr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(lr.sep)}`,pathSegments:n});return}Wr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(lr.sep)}`,pathSegments:n};e.status(201).json(i)}));vd.patch("/",Ue(async(t,e,r)=>{let n,o;try{let l=mx.parse(t.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Td(n),a=Td(o);if(!Wr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(lr.sep)}`});return}if(Wr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(lr.sep)}`});return}let s=lr.dirname(a);Wr.existsSync(s)||Wr.mkdirSync(s,{recursive:!0}),Wr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(lr.sep)} to ${o.join(lr.sep)}`,pathSegments:o};e.status(200).json(c)}));vd.delete("/",Ue(async(t,e,r)=>{let n,o=!0;try{let c=gx.parse(t.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=Td(n);if(!Wr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(lr.sep)}`,pathSegments:n});return}if(!Wr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(lr.sep)}`});return}if(o)Wr.rmSync(i,{recursive:!0,force:!0});else{if(Wr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Wr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var cT=vd;import{Router as B3}from"express";var LN=B3();LN.get("/",async(t,e)=>{let r=Se(),n=ic();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await fr(fs,n,r);e.status(200).json(o)});var uT=LN;import oQ from"events";import mU,{Router as iQ}from"express";import aQ from"http";import sQ from"path";import{Server as Y8}from"socket.io";var z3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},NN={event:"cancel",createHandler:z3};var H3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},DN={event:"fetchA11yTree",createHandler:H3};var G3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},kN={event:"fetchDom",createHandler:G3};var j3=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},FN={event:"disconnect",createHandler:j3};function Vn(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=V3(r);$3(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await W3(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function V3(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function $3(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function W3(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as nX}from"crypto";import{faker as q3}from"@faker-js/faker";import K3 from"assert";import Y3 from"axios";import*as X3 from"child_process";import J3 from"moment";import*as Z3 from"otpauth";import Q3 from"pg";async function UN(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=pm(n,e);r.push(...o)}),r}function eX(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function tX(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var rX=Object.getPrototypeOf(async function(){}).constructor;async function BN(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(y,T)=>{o[y]=T,l[y]=T},d={},p=(y,T)=>{o[y]=T,d[y]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new rX("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Y3,J3,c.fakerInstance??q3,K3,Q3,m,g,Z3,X3,UN,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,eX(a,s),...Object.values(i??{}))),f=!0,S,b;try{let y=await X(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await tX(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),f=!1,y instanceof Vi?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function zN({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Hi,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=nX(),p=await BN(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as oX,randomUUID as iX}from"crypto";import aX from"fetch-retry";var sX=aX(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),HN=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,GN=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function jN({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Hi,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!HN)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!GN)throw new Error("Missing lambda auth secret.");let h=oX("sha256",GN).update(t).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let S={id:iX(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await X(sX(HN,{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(b){m=b}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=qw.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 aa(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await jN(t);else if(t.localTools)e=await zN({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
91
91
|
${e.error}
|
|
92
92
|
Code received:
|
|
93
93
|
${t.code}`;throw t.logger.error({err:e.error,code:t.code,env:t.context.toObjectCopy()},r),new Error(r)}if(e.variableUpdates)for(let[r,n]of Object.entries(e.variableUpdates))t.context.setVariable(r,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await t.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[r,n]of Object.entries(e.persistentVariableUpdates))t.context.setVariable(r,n)}return e.result}import{set as lX}from"lodash-es";async function qr(t){let{orgId:e,s:r,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Hi,allowUndefined:c=!1}=t,l=/{{(.*?)}}/g,u=r.matchAll(l),d=r;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),g;try{g=await aa({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:t.localTools,signal:i})}catch(f){throw o.error({err:f,value:r},"Error evaluating template string"),f}if(g===void 0&&!c)throw new M("UserConfigurationError",`Template fragment '${m}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let h=typeof g=="string"?g:`${g}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(p[0],h)}return d}async function vh(t){return VN(t)}async function VN({obj:t,bannedKeys:e,allowList:r,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in t){if(e.includes(s))continue;let c=!1;if(r)if(r.includes(s))c=!0;else continue;let l=t[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await qr({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),t[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await VN({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:r,...a})}return i}function $N(t,e){for(let{path:r,original:n}of e)lX(t,r,n)}import cX from"fetch-retry";var VKe=process.env.MAILINATOR_API_KEY,$Ke=cX(global.fetch,{retryOn:function(t,e,r){return t>3?!1:!!(e!==null||r&&r.status>=400)},retryDelay:function(t){return 500}});import{hostname as q6}from"os";var dT={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
|
|
@@ -4607,7 +4607,7 @@ ${t}`;case"ELEMENT_CHECK":return`${Ok}
|
|
|
4607
4607
|
${t}`;default:return t}}async function qn({frameConfig:t,action:e,browser:r}){let n=r.getActiveFrameConfig();t?r.setActiveFrameConfig(t):n?.type==="auto"&&r.setActiveFrameConfig(void 0);try{return await e()}finally{r.setActiveFrameConfig(n)}}var b6=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Dk({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(b6.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await ye(250),l++;let u=(await r.getOpenPages()).map(p=>p.url),d=r.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(cs(m,o)&&m!==t&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:t},"Auto-following new tab after preset action"),await r.switchToPage({type:"INDEX",index:String(p)});break}}}}async function Go(t,e={}){let r=await t.getBrowserState(e);return{serializedTree:r.serialize(e.serializationOpts),tree:r}}var kk=t=>!!t&&Us(t),Fk=t=>{let{cache:e,description:r,disableSecondaryCacheResolution:n,logger:o}=t,i=e,a=!1;return i&&n&&i.targetSource==="HEURISTIC_HEALED"&&(a=!0,i=void 0),i?.inputDescription&&!Lk(r,i.inputDescription)&&(o.warn({old:i.inputDescription,new:r},"Target cache was generated with a different description, clearing it automatically"),a=!0,i=void 0),{cache:i,cacheBustedBeforeAction:a}};import{randomUUID as C6}from"crypto";var Bk={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},zk={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},Uk=/<(\S+) id="(\d+)".*?>/g,E6=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,Hk=["h1","h2","section","footer","nav","aside","form","label","dialog"],T6=[...Hk,"span","div","h3"],v6=["table","select","form","ul","ol","menu","pre","code","dialog"],A6=["table","form","dialog","nav","section","ul","select"];function Fh(t){return R6(t)}function R6({logger:t,serializedTree:e,options:r}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=r,s=[],c=e.split(`
|
|
4608
4608
|
`),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
|
|
4609
4609
|
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=We(h);d+=f,h.length>a&&(h=h.slice(0,a));let y=Array.from(h.matchAll(Uk)).map(B=>B&&B.length>=3?{tagName:B[1],id:B[2]}:void 0).filter(B=>!!B),C=Array.from(h.matchAll(E6)).map(B=>B&&(B[2]||B[4])).filter(B=>!!B);C.reverse();let I=h.replace(/ id="[0-9]+"/g,"");u.push(I);for(let B of y)p.push(B.id),m.push(B);for(let B of C){let fe=m[m.length-1];fe&&fe.tagName===B&&m.pop()}let A=m.some(B=>v6.includes(B.tagName)),x=c[l+1]??"",O=We(x),N=Array.from(x.matchAll(Uk)).map(B=>B&&B.length>2?B[1]:void 0).filter(B=>!!B),V=N.some(B=>Hk.includes(B)),K=N.some(B=>T6.includes(B));d+O>=i&&(g=!0),d>=n&&(V&&!A||C.some(B=>A6.includes(B)))&&(g=!0),d>=o&&K&&!A&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
|
|
4610
|
-
`),tokenLength:d}),s.forEach((h,f)=>{let S=h.ids[0],b=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var w6=75e4,Uh=3e5;async function vs(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=r,l=t.tree,u=t.serializedTree,d=We(u);if(d>w6)try{let p=Fh({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await _6({...t,tokenLimit:Uh-1e4,chunks:p.chunks}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Uh*Ji),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Uh)try{if(o){let p=Fh({serializedTree:u,options:zk,logger:i}),m=C6();l=await X(x6({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=We(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Fh({serializedTree:u,options:Bk,logger:i});l=await X(I6({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Uh*Ji),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function x6({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:Qe(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function _6(t){let{description:e,fixtures:r,tree:n}=t,{generator:o,logger:i,signal:a}=r;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:Qe(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=t.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>t.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function I6(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:c}=r,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:Qe(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function QT(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return qn({action:async()=>P6(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function P6(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=t,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,S=t.description,b=Ts(),y=t.useMemory&&!r;n&&(S=await qr({orgId:p,s:S,context:n,localTools:g,signal:f,logger:l})),a&&(S=Nk(S,a));let{serializedTree:T,tree:C}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Go(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),I=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let H,D=Date.now(),oe;for(;!H&&Date.now()-D<3e3;){f.throwIfAborted();try{H=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ue){oe=ue}}if(!H)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${oe?.message}`);return H}),A=T,x=!1,L=`data:image/jpeg;base64,${I.toString("base64")}`;A=await vs({type:"locator",description:S,screenshot:L,serializedTree:T,options:{aiPageFiltering:c},tree:C,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),A!==T&&(x=!0);let N=await b.startAsyncSpan("AI_LOCATOR_CALL",async H=>{let D=await h.getElementLocation({browserState:A,goal:S,screenshot:L,source:a,memory:y?s:void 0},{disableCache:r,abortSignal:f,loggerTags:Qe(l),useMemory:y});return H.result=D,D});if(l.debug({usedRag:x,result:N},"Got locator result"),!(N.id>0))throw new Xs(`Could not find any relevant element: ${N.thoughts}`,N.updatedMemory?{type:"GCS_TRACES",traces:N.updatedMemory}:void 0);let{resolution:K,target:B,frameConfig:fe}=await b.startAsyncSpan("TARGET_RESOLUTION",async H=>{let D=await m.createTargetFromA11yId({id:N.id,requirements:N.requirements,additionalElements:N.additionalElements,description:S,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return H.result={serializedElement:D.target.nodeOnlySerializedHtml??"Unknown HTML element"},D});if(K.a11yNode?.properties?.hidden&&K.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${K.displayString}`);return y&&(N.updatedMemory?B.memory={type:"GCS_TRACES",traces:N.updatedMemory}:s&&(B.memory=s)),{thoughts:N.thoughts,target:B,resolution:K,frameConfig:fe,screenshot:L}}var M6=15;async function Bh({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=M6}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=DS.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=mL(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await qn({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,C=m-S,I=Math.min(C,T);I>0&&await ye(I,n.abortSignal)}let b=Date.now();if(u>0&&b>=p)break;let y=!1;try{if(g=await qn({action:async()=>{let C=await Gk(s,r,n.abortSignal);return h&&h.serializedTree===C.serializedTree&&h.screenshotBuff.equals(C.screenshotBuff)?(y=!0,g):(h=C,jk({command:t,state:C,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),g?.success){g?.updatedMemory&&cd(t,g.updatedMemory,r);break}else throw g?.thoughts?new M("AssertionFailureError",g.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),y?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=b+l}}if(!g?.success){let S=p-Date.now();S>0&&await ye(S,n.abortSignal)}if(!g?.success)try{g=await qn({action:async()=>jk({command:t,state:await Gk(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(g?.updatedMemory&&cd(t,g.updatedMemory,r),!g?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function Gk(t,e,r){let[n,o]=await Promise.all([Go(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function jk({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,S=f.toString("base64"),b=u.url(),y=t.contextChoice??"MULTIMODAL",T=g;y!=="VISION_ONLY"&&(T=await vs({type:"assertion",serializedTree:g,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==g&&(m.ragUsed=!0),m.pageState=T);let C={goal:t.assertion,url:b,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:y,source:c},A=await(y==="VISION_ONLY"?(x,O)=>d.getVisualAssertionResult(x,O):(x,O)=>d.getAssertionResult(x,O))(C,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:Qe(l)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(x=>u.getSerializedFormFromA11yId(x)).filter(x=>!!x),await O6(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function O6(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await X(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var L6=1e5,zh=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Vk(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await N6(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof zh?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ye(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function N6(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await ye(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await X(D6(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function D6(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await qn({action:async()=>k6(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function k6(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await qr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Go(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(We(p)>L6)throw new zh;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:Qe(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Wk}from"lodash-es";async function qk(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>fp(e.cache)?e.cache:void 0,a=i(),s=Wk(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=mE(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await ye(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await $k({cacheToUse:a,params:t});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Us(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await $k({cacheToUse:h,params:t});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=ld(g.target),g.updatedAt=new Date),d}async function $k({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!Ri(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=aO(r.assertion),l,u=!1,d=Wk(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async h=>F6(h.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Da(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function F6(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await U6(t,e.assertion)}async function U6(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:Tt(a,500,!0)},!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Tt(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new M("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},bo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:bo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:bo*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=zl(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=zl(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function Kk(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as B6}from"jimp";async function xd(t,e){let r=await t.screenshot(e),n=await B6.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Yk}from"jimp";import ev from"jpeg-js";import z6 from"pixelmatch";async function Xk({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!Ri(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async N=>xd(o,{locator:N.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await xd(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let L=`${l.width}x${l.height}`,N=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${L}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await Yk.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await Yk.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,S=g.width*g.height,b=Math.abs(p.height-g.height),y=Math.abs(p.width-g.width);if(f>S){let L=d.cover({w:g.width,h:g.height});l.buffer=await L.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(S>f){let L=m.cover({w:p.width,h:p.height});u.buffer=await L.getBuffer("image/jpeg"),h="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},C=r.threshold??.1,A=z6(ev.decode(u.buffer).data,ev.decode(l.buffer).data,T.data,l.width,l.height,{threshold:C,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,x=A>C*100,O=`Visual diff of ${A.toFixed(2)}% detected, which is ${x?"over":"under"} the threshold of ${C*100}%.`;if(h&&(O+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${y} pixels.`),x)throw new M("ActionFailureError",O);return{fail:x,thoughts:O,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:ev.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var H6=3e4;function G6(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function Jk({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??H6/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(ql(t.url)&&(c=t.url),r&&Kl(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await X((async()=>{let g=s?`${l}?${s}`:l;try{let h=G6(t),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var j6=5e3;async function Hh({timeout:t=bo,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await Zk(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await ye(s,e.signal),s=Math.min(Math.floor(s*1.5),j6);else return i}return i=await Zk(e),i}async function Zk({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(Qk,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(Qk,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?oi.CONTAINS:ii.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function Qk({value:t,negated:e,returnHtml:r}){let n=document.body.innerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var V6=3e4;async function e0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??V6/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(ql(t.url)&&(s=t.url),r&&Kl(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await X((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var pa=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Go(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await vs({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Qe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([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 vs({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Qe(a)},langfuseSessionId:s})}catch(g){throw new M("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Go(this.browser,e)}async locateElement(e){return await QT({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return qn({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await ye(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Ts(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(r.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(r,o))),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ae}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:r,cache:n,options:o,logger:i}=e,s=await Ts().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(r,n,{allowNotActionableNodesOverride:o.allowNotActionableNodesOverride,logger:i,signal:this.executeAbortController.signal,...o.resolveTargetOptions});return l.attributes.targetDisplayString=u.displayString,u}),c=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:s,disableGlobalLocatorRedirect:o.disableGlobalLocatorRedirect,logger:i});return await s.revalidator?.(),{resolutionResult:s,finalTarget:c}}async wrapElementTargetingCommand(e){return await qn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,action:i,options:a,command:s,finalAttempt:c=!1,originalCache:l=e.cache}=e,{retriesWithAI:u=1}=e,{disableCache:d,useSelector:p,targetName:m}=a,g=Ts(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),S=t0(e.cache);if((!S||d)&&!jf(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=!1;d&&(h.info("Cache explicitly disabled for this step"),b=!0,S=void 0);let y=Fk({cache:S,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});S=y.cache,b=b||y.cacheBustedBeforeAction;let T=!0;if(!kk(S))return u--,T=!1,this.executeTargetingCommandWithAI({ctx:r,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:b});try{let{resolutionResult:C,finalTarget:I}=await this.resolveCachedTargetForAction({ctx:r,cache:S,options:a,logger:h}),A=await i(I);if(ar.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.48.2"]),Og({cmd:s,key:m,newTarget:S,logger:h,updatedWithAI:!1}),T){let x=C.decisions.filter(O=>O.matched);if(x.length!==1)h.warn({decisions:C.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=x[0].type;n.recordTargetAutoHeal({healType:O})}}return{result:A,elementInteractedDisplayString:C.displayString}}catch(C){this.throwIfClosed();let I=nS(C);if(I&&!c)return h.warn({err:C},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(C instanceof M&&!I)throw h.warn({err:C},"Failed to execute command with target (fatal)"),C;if(u>0&&o){h.info({err:C},"Failed to execute action with cached target, retrying with AI"),ar.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.48.2",`missReason:${C instanceof Rn?C.cacheMissReason:"unknown"}`]);let A;return S.memory&&pp(S.memory)&&(A=S.memory),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:A,targetHealingInProgress:!0}})}throw new M("ActionFailureError",`Failed to execute interactive command: ${C instanceof Error?C.message:`${C}`}`,{errOptions:{cause:C}})}}async executeTargetingCommandWithAI(e){let{ctx:r,tracer:n,stepTracer:o,target:i,options:a,command:s,action:c,originalCache:l,logger:u,useMemory:d,cacheBustedBeforeAction:p}=e;u.info({description:i.elementDescriptor,targetHealingInProgress:a.targetHealingInProgress,cacheBustedBeforeAction:p,memory:a.memory,useMemory:d},"Prompting AI for an updated element location"),(p||!l)&&await n.startAsyncSpan("SMART_WAITING",async()=>await Vk({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(r)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let S;try{S=await QT({description:i.elementDescriptor,disableCache:!!a.disableCache,iframeUrl:a.iframeUrl,source:a.source,useMemory:d,memory:d?a.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride,logger:u},this.getControllerFixtures(r))}catch(T){if(T instanceof Xs&&T.updatedLocatorMemory){let C={id:-1,...l,memory:T.updatedLocatorMemory};Og({cmd:s,key:a.targetName,newTarget:C,logger:u,updatedWithAI:!0})}throw T}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),y=await c(b);return Og({cmd:s,key:a.targetName,newTarget:S.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=Qe(u)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&nS(S)){u.warn({err:S,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof M?S:new M("ActionFailureError",S.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return xd(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await ye(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.options?.autoFollowNewTabs&&await Dk({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{$N(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>vT(e)}}async resolveCommandTemplateStrings(e,r){return vh({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Bh({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Bh({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=E_(n.schema);if(h)throw new M("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Qe(a)});if(h.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!ql(n.url)&&!Kl(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,g;if(n.target&&So(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:y=>this.browser.hover(y),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,g=b}let h=this.browser.getViewport()?.height??wr.height,f=this.browser.getViewport()?.width??wr.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await ye(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(So(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Vg(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(So(n.fromTarget)&&So(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(So(n.fromTarget)||So(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h,f,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&So(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,g,h,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,S=y}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!Ri(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Da(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await aa({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 M("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new M("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&So(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),g,h,f=t0(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:y,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Da(n)}});g=y,h=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Vg(m,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(So(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"FOCUS":{if(!Ri(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"BLUR":{if(n.target&&!Ri(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Vg(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new W6,g=$6(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await Jk({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Uc.parse({...f,cookies:_w(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await e0({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Xk({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await iD({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await aa({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=mm.optional().parse(m)}catch(h){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??bo)*1e3,g=this.generator.getAgentConfig()?.[ir.ASSERTION];if(Kk(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Bh({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&cd(n,f.cache?.memory.traces,a)}}let h=await qk({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await qn({action:async()=>Hh({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new ca(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await xT(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await X(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ca(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=wh(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=wh(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new ca(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ca(n.requestMatcher),async(g,h)=>{let f=await aa({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=Ww.parse(f);return new Response(S.body,{status:S.status,headers:S.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:Qe(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new Oh({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Qe(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Qe(this.logger)})}};var tv=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(Zi({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,g,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await qr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[S,...Object.entries(r).map(([y,T])=>`${y}:${T}`)]},n.info({original:f,keyParams:h},"Module cache key params");let b=Date.now();for(;Date.now()-b<Ex;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:Tt(y,1e3,!0)},"Got result from module execution cache"),p=Gh(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:f,keyParams:h},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${q6()};runId:${u}`},d);if(T.acquired){g=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Failed to acquire cache lock, retrying...");await ye(2500+Math.random()*1e4,d)}}try{if(!p)p=await K6(t);else if(e.autoAuth){let f=mm.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,b=e.advanced?.cacheInvalidation;if(b&&b.type==="PAGE_CHECK"){let y={type:"CONTENT",value:b.substring},T=await Hh({timeout:bo,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),tv(t)}}finally{try{g!==void 0&&!m&&p?.status==="SUCCESS"&&await Y6({step:e,result:p,browser:s.browser,cacheKeyPrefix:g,logger:n,storage:i})}finally{g!==void 0&&await i.releaseCacheLock(g)}}return p},K6=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Gh(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Vn({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Gh(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function r0({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await aa({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function Y6({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===d_)&&(a=t.defaultCacheTtl??p_);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:Zi({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function As(t,e,r){return X6(t,e,r)}async function X6(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Gh(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Gg(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function uo(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as A8}from"lodash-es";import{randomUUID as n0}from"crypto";import{diff as J6}from"deep-object-diff";import{cloneDeep as o0}from"lodash-es";var jh=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?o0(e.command.cache):{},d=o.browser.url(),p=new Date,m,g=n0(),h=n0();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,b,y=tm();try{let T=await o.executePresetCommand(y,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),b=T.afterScreenshotOverride;let C=new Date,I=o.browser.url();S={beforeUrl:d,afterUrl:I,startedAt:p,finishedAt:C,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:I,finishedAt:C,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ai(e.command)}`);let C=o.browser.url(),I=new Date,A=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:C,startedAt:p,finishedAt:I,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A},f={...e,startedAt:p,finishedAt:I,beforeUrl:d,afterUrl:C,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?o0(e.command.cache):{},C=J6(u,T);C&&Object.keys(C).length>0&&l.info({diffs:hm(C)},"Updated cache")}if(a)try{if(b||(b=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=g,f.beforeSnapshot=g,S.afterSnapshot=h,f.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:g,screenshot:m}),b&&r.attachAfterScreenshot({snapshotId:h,screenshot:b}),f};async function Z6(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await uo(t.work,()=>jh({...t,presetParams:{tracer:n,step:e.assertion}}));switch(a.type){case"AI_ASSERTION":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`${a.type} condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function Q6(t,e,r,n){let o=n.slice(r.length);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=Hl(a.steps,e,o);if(s)return i}return-1}async function i0(t){let{step:e,tracer:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Gg(e),s=r.getParentStepIdChain().concat(e.id),c=!!o&&sd(s,o.parentStepIdChain),l=e.elseSteps,u=!0,d=[],p,m=tm(),g=!1;if(c&&o){let y=Q6(e,o.fromStepId,s,o.parentStepIdChain);y>=0&&(l=e.blocks[y].steps,u=!1,g=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${y}), running ${l.length} steps`))}if(!g)for(let y=0;y<e.blocks.length;y++){n.info(`Evaluating condition ${y} in conditional step`);let T=e.blocks[y],C=await Z6(t,T,y);if(d.push(C.conditionResult),p=C.conditionResult,C.type==="execution_error"){let I={...a,assertionResult:C.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:C.conditionResult.message,results:[],details:m.details};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:d,result:I,logger:n}),I}if(C.type==="passed"){n.info(`Condition ${y} resolved to true, executing the corresponding ${C.steps.length} steps`),u=!1,l=C.steps;break}}if(l)u&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let y={...a,assertionResult:p,status:"SUCCESS",startedAt:i,data:d[d.length-1]?.data,message:d[d.length-1]?.message,results:[],finishedAt:new Date,details:m.details};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:[...d],result:y,logger:n}),y}n.info(`Executing ${l.length} steps in the selected conditional block`);let h=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:h}}),b={...a,assertionResult:p,...f,startedAt:i,finishedAt:new Date};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:[...d,...f.results],result:b,logger:n}),b}import{randomUUID as a0}from"crypto";var s0=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await e8(t);o.finishedAt=new Date,Vn({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=a0();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=a0();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},e8=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as iv}from"crypto";var l0=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as d8}from"ai";var Vh=class{controller;logger;rootStep;subStepIndex=0;callbacks;results=[];constructor(e){this.controller=e.controller,this.logger=e.logger,this.rootStep=e.rootStep,this.callbacks=e.callbacks}finalState=void 0;async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let r=this.subStepIndex++,n=await this.callbacks.executeStep(e,r);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as c8,stepCountIs as u8}from"ai";import c0 from"dedent";var r8=c0`
|
|
4610
|
+
`),tokenLength:d}),s.forEach((h,f)=>{let S=h.ids[0],b=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var w6=75e4,Uh=3e5;async function vs(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=r,l=t.tree,u=t.serializedTree,d=We(u);if(d>w6)try{let p=Fh({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await _6({...t,tokenLimit:Uh-1e4,chunks:p.chunks}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Uh*Ji),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Uh)try{if(o){let p=Fh({serializedTree:u,options:zk,logger:i}),m=C6();l=await X(x6({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=We(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Fh({serializedTree:u,options:Bk,logger:i});l=await X(I6({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=We(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Uh*Ji),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function x6({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:Qe(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function _6(t){let{description:e,fixtures:r,tree:n}=t,{generator:o,logger:i,signal:a}=r;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:Qe(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=t.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>t.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function I6(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:c}=r,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:Qe(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function QT(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return qn({action:async()=>P6(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function P6(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=t,{orgId:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,S=t.description,b=Ts(),y=t.useMemory&&!r;n&&(S=await qr({orgId:p,s:S,context:n,localTools:g,signal:f,logger:l})),a&&(S=Nk(S,a));let{serializedTree:T,tree:C}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Go(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),{}),I=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let H,D=Date.now(),oe;for(;!H&&Date.now()-D<3e3;){f.throwIfAborted();try{H=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ue){oe=ue}}if(!H)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${oe?.message}`);return H}),A=T,x=!1,L=`data:image/jpeg;base64,${I.toString("base64")}`;A=await vs({type:"locator",description:S,screenshot:L,serializedTree:T,options:{aiPageFiltering:c},tree:C,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),A!==T&&(x=!0);let N=await b.startAsyncSpan("AI_LOCATOR_CALL",async H=>{let D=await h.getElementLocation({browserState:A,goal:S,screenshot:L,source:a,memory:y?s:void 0},{disableCache:r,abortSignal:f,loggerTags:Qe(l),useMemory:y});return H.result=D,D});if(l.debug({usedRag:x,result:N},"Got locator result"),!(N.id>0))throw new Xs(`Could not find any relevant element: ${N.thoughts}`,N.updatedMemory?{type:"GCS_TRACES",traces:N.updatedMemory}:void 0);let{resolution:K,target:B,frameConfig:fe}=await b.startAsyncSpan("TARGET_RESOLUTION",async H=>{let D=await m.createTargetFromA11yId({id:N.id,requirements:N.requirements,additionalElements:N.additionalElements,description:S,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});return H.result={serializedElement:D.target.nodeOnlySerializedHtml??"Unknown HTML element"},D});if(K.a11yNode?.properties?.hidden&&K.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${K.displayString}`);return y&&(N.updatedMemory?B.memory={type:"GCS_TRACES",traces:N.updatedMemory}:s&&(B.memory=s)),{thoughts:N.thoughts,target:B,resolution:K,frameConfig:fe,screenshot:L}}var M6=15;async function Bh({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=M6}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=DS.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=mL(c,i-1),u=0,d=Date.now(),p=d+c,m=d,g,h,f;try{await qn({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,C=m-S,I=Math.min(C,T);I>0&&await ye(I,n.abortSignal)}let b=Date.now();if(u>0&&b>=p)break;let y=!1;try{if(g=await qn({action:async()=>{let C=await Gk(s,r,n.abortSignal);return h&&h.serializedTree===C.serializedTree&&h.screenshotBuff.equals(C.screenshotBuff)?(y=!0,g):(h=C,jk({command:t,state:C,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),g?.success){g?.updatedMemory&&cd(t,g.updatedMemory,r);break}else throw g?.thoughts?new M("AssertionFailureError",g.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),y?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=b+l}}if(!g?.success){let S=p-Date.now();S>0&&await ye(S,n.abortSignal)}if(!g?.success)try{g=await qn({action:async()=>jk({command:t,state:await Gk(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(g?.updatedMemory&&cd(t,g.updatedMemory,r),!g?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...g,succeedImmediately:!1,urlAfterCommand:s.url()}}async function Gk(t,e,r){let[n,o]=await Promise.all([Go(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function jk({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,S=f.toString("base64"),b=u.url(),y=t.contextChoice??"MULTIMODAL",T=g;y!=="VISION_ONLY"&&(T=await vs({type:"assertion",serializedTree:g,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==g&&(m.ragUsed=!0),m.pageState=T);let C={goal:t.assertion,url:b,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:y,source:c},A=await(y==="VISION_ONLY"?(x,O)=>d.getVisualAssertionResult(x,O):(x,O)=>d.getAssertionResult(x,O))(C,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:Qe(l)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(x=>u.getSerializedFormFromA11yId(x)).filter(x=>!!x),await O6(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function O6(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await X(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var L6=1e5,zh=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Vk(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await N6(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof zh?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ye(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function N6(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await ye(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await X(D6(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function D6(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await qn({action:async()=>k6(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function k6(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await qr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await Go(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(We(p)>L6)throw new zh;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:Qe(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Wk}from"lodash-es";async function qk(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>fp(e.cache)?e.cache:void 0,a=i(),s=Wk(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=mE(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await ye(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await $k({cacheToUse:a,params:t});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Us(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await $k({cacheToUse:h,params:t});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=ld(g.target),g.updatedAt=new Date),d}async function $k({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!Ri(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=aO(r.assertion),l,u=!1,d=Wk(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async h=>F6(h.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Da(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function F6(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await U6(t,e.assertion)}async function U6(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:Tt(a,500,!0)},!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Tt(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await t.getAttribute(e.attr,{timeout:3e3})}catch(s){n=new M("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},bo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:bo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:bo*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=zl(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=zl(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!ad(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=zl(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function Kk(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as B6}from"jimp";async function xd(t,e){let r=await t.screenshot(e),n=await B6.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Yk}from"jimp";import ev from"jpeg-js";import z6 from"pixelmatch";async function Xk({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!Ri(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async N=>xd(o,{locator:N.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await xd(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let L=`${l.width}x${l.height}`,N=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${L}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await Yk.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await Yk.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,S=g.width*g.height,b=Math.abs(p.height-g.height),y=Math.abs(p.width-g.width);if(f>S){let L=d.cover({w:g.width,h:g.height});l.buffer=await L.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(S>f){let L=m.cover({w:p.width,h:p.height});u.buffer=await L.getBuffer("image/jpeg"),h="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},C=r.threshold??.1,A=z6(ev.decode(u.buffer).data,ev.decode(l.buffer).data,T.data,l.width,l.height,{threshold:C,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,x=A>C*100,O=`Visual diff of ${A.toFixed(2)}% detected, which is ${x?"over":"under"} the threshold of ${C*100}%.`;if(h&&(O+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${y} pixels.`),x)throw new M("ActionFailureError",O);return{fail:x,thoughts:O,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:ev.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var H6=3e4;function G6(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function Jk({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??H6/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(ql(t.url)&&(c=t.url),r&&Kl(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await X((async()=>{let g=s?`${l}?${s}`:l;try{let h=G6(t),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:t.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var j6=5e3;async function Hh({timeout:t=bo,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await Zk(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await ye(s,e.signal),s=Math.min(Math.floor(s*1.5),j6);else return i}return i=await Zk(e),i}async function Zk({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(Qk,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(Qk,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?oi.CONTAINS:ii.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function Qk({value:t,negated:e,returnHtml:r}){let n=document.body.innerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var V6=3e4;async function e0({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??V6/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(ql(t.url)&&(s=t.url),r&&Kl(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await X((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var pa=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Go(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await vs({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Qe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([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 vs({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Qe(a)},langfuseSessionId:s})}catch(g){throw new M("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Go(this.browser,e)}async locateElement(e){return await QT({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return qn({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await ye(500)}}throw c}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Ts(),a=!n&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(r.locator)});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async()=>this.browser.performTargetRedirection(r,o))),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ae}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{ctx:r,cache:n,options:o,logger:i}=e,s=await Ts().startAsyncSpan("CACHE_RESOLUTION",async l=>{let u=await this.browser.resolveTarget(r,n,{allowNotActionableNodesOverride:o.allowNotActionableNodesOverride,logger:i,signal:this.executeAbortController.signal,...o.resolveTargetOptions});return l.attributes.targetDisplayString=u.displayString,u}),c=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:s,disableGlobalLocatorRedirect:o.disableGlobalLocatorRedirect,logger:i});return await s.revalidator?.(),{resolutionResult:s,finalTarget:c}}async wrapElementTargetingCommand(e){return await qn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,action:i,options:a,command:s,finalAttempt:c=!1,originalCache:l=e.cache}=e,{retriesWithAI:u=1}=e,{disableCache:d,useSelector:p,targetName:m}=a,g=Ts(),h=this.logger.child({commandId:s.id}),f=this.shouldUseMemory(),S=t0(e.cache);if((!S||d)&&!jf(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(p)return this.wrapHardcodedCssTargetingCommandHelper(e);let b=!1;d&&(h.info("Cache explicitly disabled for this step"),b=!0,S=void 0);let y=Fk({cache:S,description:o.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:h});S=y.cache,b=b||y.cacheBustedBeforeAction;let T=!0;if(!kk(S))return u--,T=!1,this.executeTargetingCommandWithAI({ctx:r,tracer:g,stepTracer:n,target:o,options:a,command:s,action:i,originalCache:l,logger:h,useMemory:f,cacheBustedBeforeAction:b});try{let{resolutionResult:C,finalTarget:I}=await this.resolveCachedTargetForAction({ctx:r,cache:S,options:a,logger:h}),A=await i(I);if(ar.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.49.0"]),Og({cmd:s,key:m,newTarget:S,logger:h,updatedWithAI:!1}),T){let x=C.decisions.filter(O=>O.matched);if(x.length!==1)h.warn({decisions:C.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=x[0].type;n.recordTargetAutoHeal({healType:O})}}return{result:A,elementInteractedDisplayString:C.displayString}}catch(C){this.throwIfClosed();let I=nS(C);if(I&&!c)return h.warn({err:C},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,action:i,cache:l,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:a});if(C instanceof M&&!I)throw h.warn({err:C},"Failed to execute command with target (fatal)"),C;if(u>0&&o){h.info({err:C},"Failed to execute action with cached target, retrying with AI"),ar.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.49.0",`missReason:${C instanceof Rn?C.cacheMissReason:"unknown"}`]);let A;return S.memory&&pp(S.memory)&&(A=S.memory),this.wrapElementTargetingCommandHelper({ctx:r,tracer:n,command:s,target:o,cache:void 0,action:i,originalCache:l,retriesWithAI:u,finalAttempt:!0,options:{...a,memory:A,targetHealingInProgress:!0}})}throw new M("ActionFailureError",`Failed to execute interactive command: ${C instanceof Error?C.message:`${C}`}`,{errOptions:{cause:C}})}}async executeTargetingCommandWithAI(e){let{ctx:r,tracer:n,stepTracer:o,target:i,options:a,command:s,action:c,originalCache:l,logger:u,useMemory:d,cacheBustedBeforeAction:p}=e;u.info({description:i.elementDescriptor,targetHealingInProgress:a.targetHealingInProgress,cacheBustedBeforeAction:p,memory:a.memory,useMemory:d},"Prompting AI for an updated element location"),(p||!l)&&await n.startAsyncSpan("SMART_WAITING",async()=>await Vk({description:i.elementDescriptor,iframeUrl:a.iframeUrl,source:a.source,logger:u,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride},this.getControllerFixtures(r)));let m=2;for(let g=1;g<=m;g++){let h=!1,f=this.browser.getActiveFrameConfig();try{let S;try{S=await QT({description:i.elementDescriptor,disableCache:!!a.disableCache,iframeUrl:a.iframeUrl,source:a.source,useMemory:d,memory:d?a.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:a.allowNotActionableNodesOverride,logger:u},this.getControllerFixtures(r))}catch(T){if(T instanceof Xs&&T.updatedLocatorMemory){let C={id:-1,...l,memory:T.updatedLocatorMemory};Og({cmd:s,key:a.targetName,newTarget:C,logger:u,updatedWithAI:!0})}throw T}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:a.disableGlobalLocatorRedirect,logger:u}),y=await c(b);return Og({cmd:s,key:a.targetName,newTarget:S.target,logger:u,updatedWithAI:!0}),a.targetHealingInProgress&&(o.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=Qe(u)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(f),this.throwIfClosed(),g<m&&nS(S)){u.warn({err:S,aiAttempt:g},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof M?S:new M("ActionFailureError",S.message)}}throw new M("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return xd(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await ye(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.options?.autoFollowNewTabs&&await Dk({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{$N(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>vT(e)}}async resolveCommandTemplateStrings(e,r){return vh({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Bh({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Bh({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=E_(n.schema);if(h)throw new M("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Qe(a)});if(h.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!ql(n.url)&&!Kl(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,g;if(n.target&&So(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:y=>this.browser.hover(y),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,g=b}let h=this.browser.getViewport()?.height??wr.height,f=this.browser.getViewport()?.width??wr.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await ye(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(So(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Vg(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(So(n.fromTarget)&&So(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(So(n.fromTarget)||So(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h,f,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&So(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,g,h,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,S=y}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!Ri(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Da(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await aa({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 M("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new M("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&So(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),g,h,f=t0(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:y,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Da(n)}});g=y,h=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Vg(m,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(So(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"FOCUS":{if(!Ri(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"BLUR":{if(n.target&&!Ri(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:m,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Vg(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new W6,g=$6(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await Jk({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Uc.parse({...f,cookies:_w(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await e0({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Xk({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await iD({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await aa({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=mm.optional().parse(m)}catch(h){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??bo)*1e3,g=this.generator.getAgentConfig()?.[ir.ASSERTION];if(Kk(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Bh({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&cd(n,f.cache?.memory.traces,a)}}let h=await qk({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await qn({action:async()=>Hh({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new ca(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await xT(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await X(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new ca(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=wh(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=wh(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new ca(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ca(n.requestMatcher),async(g,h)=>{let f=await aa({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=Ww.parse(f);return new Response(S.body,{status:S.status,headers:S.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:Qe(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new Oh({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Qe(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Qe(r??this.logger)})}};var tv=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(Zi({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,g,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await qr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[S,...Object.entries(r).map(([y,T])=>`${y}:${T}`)]},n.info({original:f,keyParams:h},"Module cache key params");let b=Date.now();for(;Date.now()-b<Ex;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:Tt(y,1e3,!0)},"Got result from module execution cache"),p=Gh(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:f,keyParams:h},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${q6()};runId:${u}`},d);if(T.acquired){g=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Failed to acquire cache lock, retrying...");await ye(2500+Math.random()*1e4,d)}}try{if(!p)p=await K6(t);else if(e.autoAuth){let f=mm.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,b=e.advanced?.cacheInvalidation;if(b&&b.type==="PAGE_CHECK"){let y={type:"CONTENT",value:b.substring},T=await Hh({timeout:bo,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),tv(t)}}finally{try{g!==void 0&&!m&&p?.status==="SUCCESS"&&await Y6({step:e,result:p,browser:s.browser,cacheKeyPrefix:g,logger:n,storage:i})}finally{g!==void 0&&await i.releaseCacheLock(g)}}return p},K6=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Gh(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Vn({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Gh(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function r0({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await aa({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function Y6({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===d_)&&(a=t.defaultCacheTtl??p_);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:Zi({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function As(t,e,r){return X6(t,e,r)}async function X6(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Gh(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Gg(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function uo(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as A8}from"lodash-es";import{randomUUID as n0}from"crypto";import{diff as J6}from"deep-object-diff";import{cloneDeep as o0}from"lodash-es";var jh=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?o0(e.command.cache):{},d=o.browser.url(),p=new Date,m,g=n0(),h=n0();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,b,y=tm();try{let T=await o.executePresetCommand(y,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),b=T.afterScreenshotOverride;let C=new Date,I=o.browser.url();S={beforeUrl:d,afterUrl:I,startedAt:p,finishedAt:C,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:I,finishedAt:C,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ai(e.command)}`);let C=o.browser.url(),I=new Date,A=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:C,startedAt:p,finishedAt:I,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A},f={...e,startedAt:p,finishedAt:I,beforeUrl:d,afterUrl:C,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:A,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?o0(e.command.cache):{},C=J6(u,T);C&&Object.keys(C).length>0&&l.info({diffs:hm(C)},"Updated cache")}if(a)try{if(b||(b=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=g,f.beforeSnapshot=g,S.afterSnapshot=h,f.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:g,screenshot:m}),b&&r.attachAfterScreenshot({snapshotId:h,screenshot:b}),f};async function Z6(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await uo(t.work,()=>jh({...t,presetParams:{tracer:n,step:e.assertion}}));switch(a.type){case"AI_ASSERTION":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`${a.type} condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function Q6(t,e,r,n){let o=n.slice(r.length);for(let i=0;i<t.blocks.length;i++){let a=t.blocks[i],{result:s}=Hl(a.steps,e,o);if(s)return i}return-1}async function i0(t){let{step:e,tracer:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Gg(e),s=r.getParentStepIdChain().concat(e.id),c=!!o&&sd(s,o.parentStepIdChain),l=e.elseSteps,u=!0,d=[],p,m=tm(),g=!1;if(c&&o){let y=Q6(e,o.fromStepId,s,o.parentStepIdChain);y>=0&&(l=e.blocks[y].steps,u=!1,g=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${y}), running ${l.length} steps`))}if(!g)for(let y=0;y<e.blocks.length;y++){n.info(`Evaluating condition ${y} in conditional step`);let T=e.blocks[y],C=await Z6(t,T,y);if(d.push(C.conditionResult),p=C.conditionResult,C.type==="execution_error"){let I={...a,assertionResult:C.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:C.conditionResult.message,results:[],details:m.details};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:d,result:I,logger:n}),I}if(C.type==="passed"){n.info(`Condition ${y} resolved to true, executing the corresponding ${C.steps.length} steps`),u=!1,l=C.steps;break}}if(l)u&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let y={...a,assertionResult:p,status:"SUCCESS",startedAt:i,data:d[d.length-1]?.data,message:d[d.length-1]?.message,results:[],finishedAt:new Date,details:m.details};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:[...d],result:y,logger:n}),y}n.info(`Executing ${l.length} steps in the selected conditional block`);let h=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:h}}),b={...a,assertionResult:p,...f,startedAt:i,finishedAt:new Date};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:[...d,...f.results],result:b,logger:n}),b}import{randomUUID as a0}from"crypto";var s0=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await e8(t);o.finishedAt=new Date,Vn({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=a0();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=a0();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},e8=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as iv}from"crypto";var l0=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as d8}from"ai";var Vh=class{controller;logger;rootStep;subStepIndex=0;callbacks;results=[];constructor(e){this.controller=e.controller,this.logger=e.logger,this.rootStep=e.rootStep,this.callbacks=e.callbacks}finalState=void 0;async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let r=this.subStepIndex++,n=await this.callbacks.executeStep(e,r);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as c8,stepCountIs as u8}from"ai";import c0 from"dedent";var r8=c0`
|
|
4611
4611
|
You cannot interact with the user directly. If you feel like you need to ask the user for clarification, or you are stuck, call the "finish" tool with success=false. Never output text without calling a tool.
|
|
4612
4612
|
`,u0=t=>c0`
|
|
4613
4613
|
<background>
|
|
@@ -4644,7 +4644,7 @@ Momentic users value the following:
|
|
|
4644
4644
|
${A}`}),p;case"RIGHT_TRACK":{y=void 0,S===0?l.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"SUCCESS",message:A});break}case"WRONG_TRACK":{if(y=`${A}
|
|
4645
4645
|
${I.feedback}`,b++,b>=m8)return p.message=`Our AI agent requires additional information to achieve this goal:
|
|
4646
4646
|
${A}
|
|
4647
|
-
${I.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"FAILED",message:I.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:O??e.id,status:"FAILED",message:p.message}),p}let L=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:y},`Generating new sub-command ${S} within AI action`);let N,V;try{({command:N,reasoning:V}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:y,langfuseSessionId:u})),d.info({command:N,reasoning:V},"Got proposed command")}finally{clearTimeout(L)}if(N.type==="FAILURE")return clearTimeout(L),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${V}`,p;let K={id:iv(),type:"PRESET_ACTION",command:N},B={substepIndex:S+1,message:V||"Generated new command."};l.onDynamicCommandGenerated?.({...B,step:K,parentStepId:e.id}),d.info({commandId:N.id},`Executing sub-command ${S} within AI step: ${ai(N)}`);let fe=await r.startSubSteps(),D=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[K],tracer:fe}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForStability({logger:d});let oe=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(D),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${oe.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ai(N),elementInteracted:D.results[0]?.elementInteracted,thoughts:V});let ue={substepIndex:S,output:{...D,message:D.message??"Successfully executed preset action."},step:K,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ue),await r.finish({output:Kp.parse(D),step:D,message:D.message,attempt:1}),D.status==="FAILED")if(p.status="FAILED",p.message=D.message,b<3)b++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${D.message}`;else return p;else if(D.status==="CANCELLED")return p.status="CANCELLED",p.message=D.message,p;S++}};import{randomUUID as f8}from"crypto";var S8=3;async function E0(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=b8(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await y8(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function y8(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await $l(i,u,s,{numStepsWithScreenshots:5,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(x=>Bn(x)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:b,thoughts:y,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:S||void 0});if(b!=="RECOVERABLE")return i.info({scenario:b,thoughts:y,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${y}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let C={id:f8(),type:"AI_ACTION_DYNAMIC",text:T},I=await uo(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[C,c],containerName:"AI-recovered step list",tracer:u}})),A=I.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(Ig({results:I.results,onPresetAction:x=>{x.aiSuggested=!0},onSimpleStepContainer:x=>{x.aiSuggested=!0}}),I.status==="SUCCESS"){let x=`The following steps were automatically executed by the failure recovery agent. Analysis: ${y}`;return A.message=x,ar.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:y},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:I,message:x}}else{ar.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let x=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${y}`;return A.message=x,i.info({thoughts:y},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:I,message:x}}return null}function b8(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":PR.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>S8?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as $h}from"crypto";import E8 from"fast-json-patch";import{cloneDeep as T8}from"lodash-es";async function T0(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=T8(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await $l(d,c,e.results,{numStepsWithScreenshots:4}),b=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=E8.applyPatch(f,b.patches).newDocument;let y=Hr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await v8({logger:d,controller:u,tracer:c,context:y,restartConfig:m,startingUrl:a});let T=await uo(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:y},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:y},healingAttempts:r};e=T}return{healingAttempts:r}}async function v8({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:$h(),type:"PRESET_ACTION",command:{id:$h(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:$h(),type:"PRESET_ACTION",command:{id:$h(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function v0(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&YA(e.command.type))}}async function A0(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await uo(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&v0(e.autohealingConfig.trigger,d.terminalResult)){let h=await r.startSubSteps(),f=await T0({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var R8=60*60*1e3;async function po(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let b=JSON.stringify(a);if(p.id===s.fromStepId&&b===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!sO(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=Bn(p),g=0,h=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(h+=p.retries);let S;for(;g<h&&Date.now()-f<R8;){g++,i.info({step:KO(p),currentAttempt:g},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let b=Date.now(),{stepResult:y,status:T,failureRecoveryResults:C,shouldStopExecuting:I}=await C8({attempt:g,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:g===h});if(T==="FAILED"&&g<h){S=[...S??[],y],Date.now()-b<1e3&&await ye(1e3-(Date.now()-b));continue}else e.push(y),S&&(y.previousAttempts=S);if(C&&e.push(...C),I)return l=T,u=y,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function C8({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:g,usageTracker:h}=e.fixtures,{orgId:f}=e.inputs,S=new Date,b=!!s&&sd(a.concat(r.id),s.parentStepIdChain),y=await u.startStep({logger:d,step:r,attempt:t,skipStatusEvents:b}),T=A8(r),C=p.toRedactedDisplayCopy(),I=m.browser.url(),A=m.executeAbortController.signal;h.trackStepExecution(r);let x,O;switch(r.type){case"PRESET_ACTION":{x="Preset action",O=await As(r,async()=>await jh({...e,presetParams:{tracer:y,step:r}}),A);break}case"AI_ACTION":{x="AI action",O=await As(r,()=>uo(e.work,()=>s0({...e,aiStepParams:{step:r,tracer:y},executeStepList:po})),A);break}case"AI_ACTION_DYNAMIC":{x="AI action",O=await As(r,()=>uo(e.work,()=>y0({...e,aiStepParams:{step:r,tracer:y},executeStepList:po})),A);break}case"RESOLVED_MODULE":{x=`Module (${r.name})`,O=await As(r,async()=>{let B=await r0({orgId:f,step:r,context:p,logger:d,codeEvalTools:g,signal:A});return tv({...e,executeStepList:po,moduleParams:{step:r,resolvedInputs:B,tracer:y}})},A);break}case"CONDITIONAL":{x="Conditional step",O=await As(r,()=>i0({...e,conditionalParams:{step:r,tracer:y},executeStepList:po}),A);break}case"SECTION":{x="Section",O=await As(r,()=>A0({...e,sectionParams:{step:r,tracer:y},executeStepList:po}),A);break}default:return(fe=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}O.beforeUrl=O.beforeUrl??I,O.beforeTestContext=C,r.envKey&&p.setVariable(r.envKey,O.data);let L=m.browser.url();p.setCurrentUrl(L),O.afterUrl=O.afterUrl??L,O.afterTestContext=p.toRedactedDisplayCopy(),await w8({step:r,startedAt:S,stepTypeName:x,result:O,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let N,V;if(l&&O.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let B=await E0({...e,executeStepList:po,failureRecoveryParams:{failedStep:T,nextSteps:o.slice(n+1),results:i.concat(O),tracer:u}});B&&(B.type==="ATTEMPTED"?(N=B.result.results,V=B.status):B.type==="NOT_ELIGIBLE"&&(O.message=O.message?`${O.message} ${B.message}`:B.message),O.type==="PRESET_ACTION"&&(O.failureRecoveryStatus={type:B.type,message:B.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&sd(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),O.status!=="SUCCESS"&&V!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:O.status,stepResult:O,failureRecoveryResults:N}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}}async function w8({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Kp.parse(r),attempt:o})}var R0="MOMENTIC_RUN_ID",C0="FINAL_SCREENSHOT_URL";import{randomUUID as w0}from"crypto";async function x0({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:w0(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:w0(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Wh=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=B_(s);if(t.options.reinitializeBrowser){let g=await x0({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:OC.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await _8(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function x8({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var _8=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||r!==void 0||n!==void 0||void 0,S={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},b=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",b=!0);let y,T,C;if(b&&i&&i.length>0){let V=await _0(i,"beforeSteps",t);y=V.status,T=V.results,C=V.terminalResult?{...V.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(V.failureRecoveryAttempts??0)}let I,A;if(y===void 0||y==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let V=await e.startMainStepList(),K=await po({...t,work:S,listParams:{steps:g,containerName:m,results:h,tracer:V}});I=K.status,A=K.terminalResult}let x,O,L;if(b&&a&&a.length>0){let V=await _0(a,"afterSteps",t);x=V.status,O=V.results,L=V.terminalResult?{...V.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(V.failureRecoveryAttempts??0)}let N=x8({beforeStatus:y,mainStatus:I,afterStatus:x});if(d&&I8({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:N}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:T,afterResults:O}))),N==="FAILED"){let V=y==="FAILED"?C:void 0,K=x==="FAILED"?L:void 0;return{status:"FAILED",results:h,beforeResults:T,afterResults:O,failedStepResult:V??A??K}}else if(N==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:T,afterResults:O};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:T,afterResults:O}};async function _0(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await po({...r,work:i,callbacks:a,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l,failureRecoveryAttempts:i.state.failureRecoveryAttempts}}function I8({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=hO(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await _k({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await X(s.html(),{milliseconds:2e3});i.setVariable(C0,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}import{z as ma}from"zod";var qh=ma.object({fromStepId:ma.string(),parentStepIdChain:ma.array(ma.string())}),Kh=ma.object({toStepId:ma.string(),parentStepIdChain:ma.array(ma.string())});async function uc({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=nl.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new Hr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await vh({obj:l,context:u,bannedKeys:[],allowList:PC,localTools:s,logger:a,orgId:c});try{return nl.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function I0({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await qr({orgId:t,s:c.defaultValue,context:Hr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as N8}from"lodash-es";import{cloneDeep as P8}from"lodash-es";var M8={showOverlay:!1},Yh=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:P8(M8),socket:a}),i}removeSession(e,r){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function P0(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let S=c;c=void 0;let b=h.url(),y=f.toEditorDisplayCopy();JSON.stringify(y)===JSON.stringify(a)&&b===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:h.getViewport(),url:b,iframeSrcUrls:s??[],context:y,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=b,a=y}catch(S){if(!t.connected)return;let b=S instanceof Error?S.message:`${S}`;if(b.includes("Frame was detached")||b.includes("Not attached to an active page")||b.includes("browser has been closed")||b.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),b=f.retrieveAndClearDebugData();m(S,b)&&(s=S,c=b,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}async function dc({controller:t,context:e,baseUrl:r,envName:n,testName:o,environmentVariables:i}){await t.browser.reset({newUrl:r});let a=t.browser.baseUrl,s=t.browser.url();return e.reset({baseUrl:a,currentUrl:s,variablesFromEnvironment:i,envName:n,testName:o}),{baseUrl:a,currentUrl:s}}var O8=3;async function M0({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,g=t.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let S=await a(h,e),b=await s(h,e),y=await l(h,e),T=await r(h),{testMetadata:C,baseUrl:I,envName:A,browserConfig:x,aiSettings:O,environmentVariables:L,localCodeEvalTools:N}=await jo({testId:g,orgId:h,logger:e,storage:T,authorization:c,settings:y}),V=p.getSession(m);if(V)return e.info("Associating connection with existing session (likely reconnect)"),await V.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let K=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:K,event:"connect",args:t.handshake.query},"Websocket event (connect)"),K&&p.getCurrentConnectionsByIp(K)>=O8)throw e.error({clientIp:K,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(K);try{await L8({socket:t,baseUrl:I,envName:A,testMetadata:C,orgId:h,sessionId:m,logger:e,environmentVariables:L,clientIp:K,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(h),localCodeEvalTools:N,generator:S,enricher:b,browserConfig:x,aiSettings:O,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(K),B}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function L8({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:S,globalE2eStateManager:b}){let y={viewport:o.advanced?.viewport??wr,locale:o.advanced?.locale??Ni,timezoneId:o.advanced?.timezone??Di,geolocation:o.advanced?.geolocation??ki,colorScheme:o.advanced?.colorScheme};n&&(y.deviceScaleFactor=n);let T=o.id,C=await uc({settings:g,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let I=await Wn.init({baseUrl:e,userBrowserSettings:C,enricher:S,storage:c,logger:s,contextArgs:y,iconKnowledgeBase:null,callbacks:{onTabsChange:(N,V)=>{t.emit("tabs",{tabs:N,activeTab:V})},onScreencastFrame:(N,V)=>{let K=t;Nn&&(K=t.compress(!0)),K.emit("screenshot",{buffer:N},()=>{V()})},onSvgsCollected:N=>{t.emit("newIconDetected",{numIcons:N.newSvgs.length}),c.saveNewIcons(N,s)},onNetworkLogs:N=>{t.emit("networkLogs",{harEntries:N})}}});await I.navigate({url:e,initialNavigation:!0});let A=new pa({browser:I,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:C.slowMoMs,autoFollowNewTabs:C.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),x=P0(t,a,s,b),O=async()=>{x.timers.forEach(N=>clearInterval(N))},L=new Hr({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await I.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Wn.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),b.registerSession({controller:A,context:L,sessionId:a,cleanup:O,clientIp:f,socket:t})}async function jo({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not be found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Fo({httpClient:new Sr({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=jp({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[nr];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await I0({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var av=class{parentTracer=null;socket;step;orgId;interactionTracer;skipStatusEvents;constructor({step:e,socket:r,parentTracer:n,orgId:o,skipStatusEvents:i=!1}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o,this.skipStatusEvents=i,this.interactionTracer=new gi,mi.initializeRootTracerContext(this.interactionTracer)}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ar.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){if(this.interactionTracer.finish(),e.step.trace=this.interactionTracer.getRootSpan(),!this.skipStatusEvents)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 hi({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},hi=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ar.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),e.skipStatusEvents||this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new av({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,skipStatusEvents:e.skipStatusEvents})}async finish(){this.sendFinalizedStepStats()}},Xh=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var sv={currentlyExecutingRequests:{}},D8=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await jo({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=sv.currentlyExecutingRequests[l]??0;sv.currentlyExecutingRequests[l]=u+1,s=await k8({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),sv.currentlyExecutingRequests[l]--}},k8=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:S,globalE2eStateManager:b})=>{let{testId:y,sessionId:T,orgId:C}=u,I=T,A=b.getSession(T);if(!A)throw new Error("No active session found");let{controller:x,context:O}=A;x.setOpen(),d=d.child({testId:y,orgId:C,sessionId:T,runId:I}),d.info({steps:e.map(Z=>`${Z.type}${"command"in Z?` - ${Z.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,truncatedContext:Zi({json:O,maxJsonStringSize:1e3}),browserConfig:l,aiSettings:c},"Socket execution parameters");let L=g??{},N=async()=>{o&&await dc({controller:x,context:O,baseUrl:r,envName:p,testName:m,environmentVariables:L})},V=await s(C),K=await S(C),B=async()=>{let Z=Date.now();try{await K.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:y,stepLists:{steps:e},logger:d})}catch(ve){d.error({err:ve},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{ar.distribution("cache-resolution",Date.now()-Z,["executor:editor"])}};try{await md({promiseGenerator:async()=>Promise.all([N(),B()]),signal:x.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),x.setOpen()}catch(Z){if(t.emit("finished"),Z.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Z}`)}let fe=N8(e),H={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},D={orgId:C,runId:I,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},oe={controller:x,context:O,storage:V,codeEvalTools:h,usageTracker:new ml,logger:d},ue={test:{},step:{onDynamicAIActionStatusUpdateEvent:Z=>{t.emit("dynamicCommandStatusUpdate",Z)},onDynamicAIActionEvaluatingEvent:Z=>{t.emit("dynamicCommandEvaluating",Z)},onDynamicCommandGenerated:Z=>{t.emit("dynamicCommandGenerated",Z)},onDynamicCommandExecuted:Z=>{t.emit("dynamicCommandExecuted",Z)}}},_e=new Xh(t,V,C,y),be=await Wh({fixtures:oe,options:H,callbacks:ue,inputs:D,testParams:{tracer:_e}}),le={logger:d,cacheStorage:K,orgId:C,testId:y,originalStepsWithCaches:{steps:fe},updatedStepsWithCaches:{steps:e}};return be?.status==="PASSED"?await ss(le):be?.status==="FAILED"&&await Wl(le),await _e.finish(),f?.(be),be.status};var O0={event:"execute",createHandler:D8};import{randomUUID as F8}from"crypto";var U8=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await r(i),f=Ha.parse(u.advanced??{}),S={},b;if(c){if("useSelector"in l&&l.useSelector)try{let y=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);b=y.resolution.locator,S={target:y.target,thoughts:y.thoughts}}catch(y){e.warn({err:y},"Failed resolving target with selector"),s({err:`Failed locating element: ${y.message}`,decisions:y instanceof Rn?y.decisions:void 0});return}else try{let y=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:Da(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&pp(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:y.target,thoughts:y.thoughts},b=y.resolution.locator}catch(y){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:y,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${y.message}`});return}if(l.type==="SELECT_OPTION"&&b)try{S.options=await m.browser.getSelectOptions(b)}catch(y){e.warn({err:y},"Failed getting select options"),s({err:`Failed getting select options: ${y.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:y,width:T,height:C}=await m.screenshotWithDimensions({clearHighlights:!0,locator:b}),I=F8(),{universalHandle:A,appServerUrl:x}=await h.createOnDemandScreenshot(I,y,"image/jpeg");S.screenshot={data:A,width:T,height:C},e.info({width:T,height:C,appServerUrl:x,universalHandle:A},"Captured screenshot during locate")}catch(y){e.error({err:y},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${y.message}`});return}if(s({result:S}),b)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(b),m.browser.highlight(b)])}catch(y){e.warn({err:y},"Error highlighting element, continuing...")}}},L0={event:"locate",createHandler:U8};var B8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},N0={event:"mouseClickEvent",createHandler:B8};var z8=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(S,b)=>{b.type!=="PRESET_ACTION"||b.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:b.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},D0={event:"recordTargetClick",createHandler:z8};var H8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},k0={event:"keyDownEvent",createHandler:H8};var G8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},F0={event:"keyUpEvent",createHandler:G8};var j8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},U0={event:"mouseMoveEvent",createHandler:j8};var V8=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},B0={event:"recordingStart",createHandler:V8};var $8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},z0={event:"recordingStop",createHandler:$8};var W8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:g}=await jo({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:g,viewport:S},`Session refreshed for test ${l} at ${g}`),c()},H0={event:"refresh",createHandler:W8};var q8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await jo({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:b}=f,{baseUrl:y}=await dc({controller:S,context:b,baseUrl:p,envName:m,testName:g,environmentVariables:h}),T=S.browser.getViewport(),C=Wn.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${y}`),t.emit("session",{url:y,userAgent:C,viewport:T,sessionId:c})},G0={event:"reset",createHandler:q8};var K8=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},j0={event:"switchTab",createHandler:K8};async function V0(t){return M0(t)}var $0=[FN,O0,L0,G0,H0,NN,j0,D0,B0,z0,U0,N0,k0,F0,kN,DN];var W0=t=>{let{logger:e}=t,r=new Y8(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await V0({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}$0.forEach(i=>X8(i,{...t,socket:n,metadata:o,logger:e}))}),r},X8=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{McpServer as MZ}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as OZ}from"@modelcontextprotocol/sdk/server/stdio.js";import{randomUUID as LZ}from"crypto";import{existsSync as Y0,mkdirSync as J8}from"fs";import{readdir as Z8,stat as Q8,unlink as e9,writeFile as lv}from"fs/promises";import pc from"path";var q0=".momentic-mcp",t9=30*24*60*60*1e3;function cv(){try{return pc.join(Se().rootDir,q0)}catch{return pc.resolve(q0)}}function _d(){let t=cv();Y0(t)||J8(t,{recursive:!0})}function r9(){return`${Date.now()}`}function Id({entity:t,ext:e}){return pc.join(cv(),`${t}-${r9()}.${e}`)}async function X0({rootDir:t,cutoffTime:e}){let r=await Z8(t,{withFileTypes:!0});for(let n of r){let o=pc.join(t,n.name);if(n.isDirectory()){await X0({rootDir:o,cutoffTime:e});continue}if(!n.isFile())continue;(await Q8(o)).mtimeMs<e&&await e9(o)}}async function J0(){let t=cv();Y0(t)&&await X0({rootDir:t,cutoffTime:Date.now()-t9})}function n9(t){let e=pc.relative(process.cwd(),t);return e.startsWith(".")?e:`./${e}`}function Pd({filePath:t,title:e}){return`- [${e}](${n9(t)})`}function Z0(t){return t.map(e=>{switch(e.type){case"text":return e;case"media":return{type:"image",data:e.data,mimeType:e.mediaType};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}})}function se({text:t,section:e}){if(!e)return[{type:"text",text:t}];let r=`### ${e}`;return t.length===0?[{type:"text",text:r}]:[{type:"text",text:`${r}
|
|
4647
|
+
${I.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;O&&l.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"FAILED",message:I.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:O??e.id,status:"FAILED",message:p.message}),p}let L=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:y},`Generating new sub-command ${S} within AI action`);let N,V;try{({command:N,reasoning:V}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:y,langfuseSessionId:u})),d.info({command:N,reasoning:V},"Got proposed command")}finally{clearTimeout(L)}if(N.type==="FAILURE")return clearTimeout(L),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${V}`,p;let K={id:iv(),type:"PRESET_ACTION",command:N},B={substepIndex:S+1,message:V||"Generated new command."};l.onDynamicCommandGenerated?.({...B,step:K,parentStepId:e.id}),d.info({commandId:N.id},`Executing sub-command ${S} within AI step: ${ai(N)}`);let fe=await r.startSubSteps(),D=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[K],tracer:fe}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForStability({logger:d});let oe=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(D),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${oe.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ai(N),elementInteracted:D.results[0]?.elementInteracted,thoughts:V});let ue={substepIndex:S,output:{...D,message:D.message??"Successfully executed preset action."},step:K,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ue),await r.finish({output:Kp.parse(D),step:D,message:D.message,attempt:1}),D.status==="FAILED")if(p.status="FAILED",p.message=D.message,b<3)b++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${D.message}`;else return p;else if(D.status==="CANCELLED")return p.status="CANCELLED",p.message=D.message,p;S++}};import{randomUUID as f8}from"crypto";var S8=3;async function E0(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=b8(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await y8(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function y8(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await $l(i,u,s,{numStepsWithScreenshots:5,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(x=>Bn(x)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:b,thoughts:y,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:S||void 0},i);if(b!=="RECOVERABLE")return i.info({scenario:b,thoughts:y,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${y}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let C={id:f8(),type:"AI_ACTION_DYNAMIC",text:T},I=await uo(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[C,c],containerName:"AI-recovered step list",tracer:u}})),A=I.results[0];if(A&&A.type==="AI_ACTION_DYNAMIC")if(Ig({results:I.results,onPresetAction:x=>{x.aiSuggested=!0},onSimpleStepContainer:x=>{x.aiSuggested=!0}}),I.status==="SUCCESS"){let x=`The following steps were automatically executed by the failure recovery agent. Analysis: ${y}`;return A.message=x,ar.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:y},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:I,message:x}}else{ar.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let x=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${y}`;return A.message=x,i.info({thoughts:y},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:I,message:x}}return null}function b8(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":PR.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>S8?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as $h}from"crypto";import E8 from"fast-json-patch";import{cloneDeep as T8}from"lodash-es";async function T0(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=T8(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await $l(d,c,e.results,{numStepsWithScreenshots:4}),b=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=E8.applyPatch(f,b.patches).newDocument;let y=Hr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await v8({logger:d,controller:u,tracer:c,context:y,restartConfig:m,startingUrl:a});let T=await uo(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:y},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:y},healingAttempts:r};e=T}return{healingAttempts:r}}async function v8({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:$h(),type:"PRESET_ACTION",command:{id:$h(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:$h(),type:"PRESET_ACTION",command:{id:$h(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function v0(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&YA(e.command.type))}}async function A0(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await uo(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&v0(e.autohealingConfig.trigger,d.terminalResult)){let h=await r.startSubSteps(),f=await T0({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Vn({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var R8=60*60*1e3;async function po(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let b=JSON.stringify(a);if(p.id===s.fromStepId&&b===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!sO(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=Bn(p),g=0,h=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(h+=p.retries);let S;for(;g<h&&Date.now()-f<R8;){g++,i.info({step:KO(p),currentAttempt:g},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let b=Date.now(),{stepResult:y,status:T,failureRecoveryResults:C,shouldStopExecuting:I}=await C8({attempt:g,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:g===h});if(T==="FAILED"&&g<h){S=[...S??[],y],Date.now()-b<1e3&&await ye(1e3-(Date.now()-b));continue}else e.push(y),S&&(y.previousAttempts=S);if(C&&e.push(...C),I)return l=T,u=y,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function C8({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:g,usageTracker:h}=e.fixtures,{orgId:f}=e.inputs,S=new Date,b=!!s&&sd(a.concat(r.id),s.parentStepIdChain),y=await u.startStep({logger:d,step:r,attempt:t,skipStatusEvents:b}),T=A8(r),C=p.toRedactedDisplayCopy(),I=m.browser.url(),A=m.executeAbortController.signal;h.trackStepExecution(r);let x,O;switch(r.type){case"PRESET_ACTION":{x="Preset action",O=await As(r,async()=>await jh({...e,presetParams:{tracer:y,step:r}}),A);break}case"AI_ACTION":{x="AI action",O=await As(r,()=>uo(e.work,()=>s0({...e,aiStepParams:{step:r,tracer:y},executeStepList:po})),A);break}case"AI_ACTION_DYNAMIC":{x="AI action",O=await As(r,()=>uo(e.work,()=>y0({...e,aiStepParams:{step:r,tracer:y},executeStepList:po})),A);break}case"RESOLVED_MODULE":{x=`Module (${r.name})`,O=await As(r,async()=>{let B=await r0({orgId:f,step:r,context:p,logger:d,codeEvalTools:g,signal:A});return tv({...e,executeStepList:po,moduleParams:{step:r,resolvedInputs:B,tracer:y}})},A);break}case"CONDITIONAL":{x="Conditional step",O=await As(r,()=>i0({...e,conditionalParams:{step:r,tracer:y},executeStepList:po}),A);break}case"SECTION":{x="Section",O=await As(r,()=>A0({...e,sectionParams:{step:r,tracer:y},executeStepList:po}),A);break}default:return(fe=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}O.beforeUrl=O.beforeUrl??I,O.beforeTestContext=C,r.envKey&&p.setVariable(r.envKey,O.data);let L=m.browser.url();p.setCurrentUrl(L),O.afterUrl=O.afterUrl??L,O.afterTestContext=p.toRedactedDisplayCopy(),await w8({step:r,startedAt:S,stepTypeName:x,result:O,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let N,V;if(l&&O.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let B=await E0({...e,executeStepList:po,failureRecoveryParams:{failedStep:T,nextSteps:o.slice(n+1),results:i.concat(O),tracer:u}});B&&(B.type==="ATTEMPTED"?(N=B.result.results,V=B.status):B.type==="NOT_ELIGIBLE"&&(O.message=O.message?`${O.message} ${B.message}`:B.message),O.type==="PRESET_ACTION"&&(O.failureRecoveryStatus={type:B.type,message:B.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&sd(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),O.status!=="SUCCESS"&&V!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:O.status,stepResult:O,failureRecoveryResults:N}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:O,failureRecoveryResults:N}}async function w8({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Kp.parse(r),attempt:o})}var R0="MOMENTIC_RUN_ID",C0="FINAL_SCREENSHOT_URL";import{randomUUID as w0}from"crypto";async function x0({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:w0(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:w0(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Wh=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=B_(s);if(t.options.reinitializeBrowser){let g=await x0({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:OC.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await _8(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function x8({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var _8=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||r!==void 0||n!==void 0||void 0,S={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},b=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",b=!0);let y,T,C;if(b&&i&&i.length>0){let V=await _0(i,"beforeSteps",t);y=V.status,T=V.results,C=V.terminalResult?{...V.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(V.failureRecoveryAttempts??0)}let I,A;if(y===void 0||y==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let V=await e.startMainStepList(),K=await po({...t,work:S,listParams:{steps:g,containerName:m,results:h,tracer:V}});I=K.status,A=K.terminalResult}let x,O,L;if(b&&a&&a.length>0){let V=await _0(a,"afterSteps",t);x=V.status,O=V.results,L=V.terminalResult?{...V.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(V.failureRecoveryAttempts??0)}let N=x8({beforeStatus:y,mainStatus:I,afterStatus:x});if(d&&I8({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:N}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:T,afterResults:O}))),N==="FAILED"){let V=y==="FAILED"?C:void 0,K=x==="FAILED"?L:void 0;return{status:"FAILED",results:h,beforeResults:T,afterResults:O,failedStepResult:V??A??K}}else if(N==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:T,afterResults:O};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:T,afterResults:O}};async function _0(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i=r.options.disableHealing||r.inputs.fromStep!==void 0||r.inputs.toStep!==void 0||void 0,a={results:[],asyncTasks:[],state:{autoHealingDisabled:i,failureRecoveryDisabled:i,failureRecoveryAttempts:0}},s={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:c,results:l,terminalResult:u}=await po({...r,work:a,callbacks:s,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(a.asyncTasks);let d;return c==="SUCCESS"?d="PASSED":c==="CANCELLED"?d="CANCELLED":d="FAILED",{status:d,results:l,terminalResult:u,failureRecoveryAttempts:a.state.failureRecoveryAttempts}}function I8({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=hO(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await _k({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await X(s.html(),{milliseconds:2e3});i.setVariable(C0,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}import{z as ma}from"zod";var qh=ma.object({fromStepId:ma.string(),parentStepIdChain:ma.array(ma.string())}),Kh=ma.object({toStepId:ma.string(),parentStepIdChain:ma.array(ma.string())});async function uc({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=nl.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new Hr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await vh({obj:l,context:u,bannedKeys:[],allowList:PC,localTools:s,logger:a,orgId:c});try{return nl.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function I0({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await qr({orgId:t,s:c.defaultValue,context:Hr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as N8}from"lodash-es";import{cloneDeep as P8}from"lodash-es";var M8={showOverlay:!1},Yh=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:P8(M8),socket:a}),i}removeSession(e,r){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function P0(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let S=c;c=void 0;let b=h.url(),y=f.toEditorDisplayCopy();JSON.stringify(y)===JSON.stringify(a)&&b===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:h.getViewport(),url:b,iframeSrcUrls:s??[],context:y,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=b,a=y}catch(S){if(!t.connected)return;let b=S instanceof Error?S.message:`${S}`;if(b.includes("Frame was detached")||b.includes("Not attached to an active page")||b.includes("browser has been closed")||b.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),b=f.retrieveAndClearDebugData();m(S,b)&&(s=S,c=b,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}async function dc({controller:t,context:e,baseUrl:r,envName:n,testName:o,environmentVariables:i}){await t.browser.reset({newUrl:r});let a=t.browser.baseUrl,s=t.browser.url();return e.reset({baseUrl:a,currentUrl:s,variablesFromEnvironment:i,envName:n,testName:o}),{baseUrl:a,currentUrl:s}}var O8=3;async function M0({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,g=t.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let S=await a(h,e),b=await s(h,e),y=await l(h,e),T=await r(h),{testMetadata:C,baseUrl:I,envName:A,browserConfig:x,aiSettings:O,environmentVariables:L,localCodeEvalTools:N}=await jo({testId:g,orgId:h,logger:e,storage:T,authorization:c,settings:y}),V=p.getSession(m);if(V)return e.info("Associating connection with existing session (likely reconnect)"),await V.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let K=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:K,event:"connect",args:t.handshake.query},"Websocket event (connect)"),K&&p.getCurrentConnectionsByIp(K)>=O8)throw e.error({clientIp:K,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(K);try{await L8({socket:t,baseUrl:I,envName:A,testMetadata:C,orgId:h,sessionId:m,logger:e,environmentVariables:L,clientIp:K,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(h),localCodeEvalTools:N,generator:S,enricher:b,browserConfig:x,aiSettings:O,globalE2eStateManager:p})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(K),B}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function L8({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:S,globalE2eStateManager:b}){let y={viewport:o.advanced?.viewport??wr,locale:o.advanced?.locale??Ni,timezoneId:o.advanced?.timezone??Di,geolocation:o.advanced?.geolocation??ki,colorScheme:o.advanced?.colorScheme};n&&(y.deviceScaleFactor=n);let T=o.id,C=await uc({settings:g,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let I=await Wn.init({baseUrl:e,userBrowserSettings:C,enricher:S,storage:c,logger:s,contextArgs:y,iconKnowledgeBase:null,callbacks:{onTabsChange:(N,V)=>{t.emit("tabs",{tabs:N,activeTab:V})},onScreencastFrame:(N,V)=>{let K=t;Nn&&(K=t.compress(!0)),K.emit("screenshot",{buffer:N},()=>{V()})},onSvgsCollected:N=>{t.emit("newIconDetected",{numIcons:N.newSvgs.length}),c.saveNewIcons(N,s)},onNetworkLogs:N=>{t.emit("networkLogs",{harEntries:N})}}});await I.navigate({url:e,initialNavigation:!0});let A=new pa({browser:I,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:C.slowMoMs,autoFollowNewTabs:C.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),x=P0(t,a,s,b),O=async()=>{x.timers.forEach(N=>clearInterval(N))},L=new Hr({baseUrl:e,testName:o.name,currentUrl:A.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await I.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Wn.USER_AGENT,viewport:A.browser.getViewport(),sessionId:a}),b.registerSession({controller:A,context:L,sessionId:a,cleanup:O,clientIp:f,socket:t})}async function jo({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not be found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Fo({httpClient:new Sr({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=jp({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[nr];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await I0({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var av=class{parentTracer=null;socket;step;orgId;interactionTracer;skipStatusEvents;constructor({step:e,socket:r,parentTracer:n,orgId:o,skipStatusEvents:i=!1}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o,this.skipStatusEvents=i,this.interactionTracer=new gi,mi.initializeRootTracerContext(this.interactionTracer)}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ar.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){if(this.interactionTracer.finish(),e.step.trace=this.interactionTracer.getRootSpan(),!this.skipStatusEvents)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 hi({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},hi=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ar.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),e.skipStatusEvents||this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new av({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId,skipStatusEvents:e.skipStatusEvents})}async finish(){this.sendFinalizedStepStats()}},Xh=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new hi({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var sv={currentlyExecutingRequests:{}},D8=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await jo({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=sv.currentlyExecutingRequests[l]??0;sv.currentlyExecutingRequests[l]=u+1,s=await k8({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),sv.currentlyExecutingRequests[l]--}},k8=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:S,globalE2eStateManager:b})=>{let{testId:y,sessionId:T,orgId:C}=u,I=T,A=b.getSession(T);if(!A)throw new Error("No active session found");let{controller:x,context:O}=A;x.setOpen(),d=d.child({testId:y,orgId:C,sessionId:T,runId:I}),d.info({steps:e.map(Z=>`${Z.type}${"command"in Z?` - ${Z.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,truncatedContext:Zi({json:O,maxJsonStringSize:1e3}),browserConfig:l,aiSettings:c},"Socket execution parameters");let L=g??{},N=async()=>{o&&await dc({controller:x,context:O,baseUrl:r,envName:p,testName:m,environmentVariables:L})},V=await s(C),K=await S(C),B=async()=>{let Z=Date.now();try{await K.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:y,stepLists:{steps:e},logger:d})}catch(ve){d.error({err:ve},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{ar.distribution("cache-resolution",Date.now()-Z,["executor:editor"])}};try{await md({promiseGenerator:async()=>Promise.all([N(),B()]),signal:x.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),x.setOpen()}catch(Z){if(t.emit("finished"),Z.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Z}`)}let fe=N8(e),H={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},D={orgId:C,runId:I,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},oe={controller:x,context:O,storage:V,codeEvalTools:h,usageTracker:new ml,logger:d},ue={test:{},step:{onDynamicAIActionStatusUpdateEvent:Z=>{t.emit("dynamicCommandStatusUpdate",Z)},onDynamicAIActionEvaluatingEvent:Z=>{t.emit("dynamicCommandEvaluating",Z)},onDynamicCommandGenerated:Z=>{t.emit("dynamicCommandGenerated",Z)},onDynamicCommandExecuted:Z=>{t.emit("dynamicCommandExecuted",Z)}}},_e=new Xh(t,V,C,y),be=await Wh({fixtures:oe,options:H,callbacks:ue,inputs:D,testParams:{tracer:_e}}),le={logger:d,cacheStorage:K,orgId:C,testId:y,originalStepsWithCaches:{steps:fe},updatedStepsWithCaches:{steps:e}};return be?.status==="PASSED"?await ss(le):be?.status==="FAILED"&&await Wl(le),await _e.finish(),f?.(be),be.status};var O0={event:"execute",createHandler:D8};import{randomUUID as F8}from"crypto";var U8=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await r(i),f=Ha.parse(u.advanced??{}),S={},b;if(c){if("useSelector"in l&&l.useSelector)try{let y=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);b=y.resolution.locator,S={target:y.target,thoughts:y.thoughts}}catch(y){e.warn({err:y},"Failed resolving target with selector"),s({err:`Failed locating element: ${y.message}`,decisions:y instanceof Rn?y.decisions:void 0});return}else try{let y=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:Da(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&pp(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:y.target,thoughts:y.thoughts},b=y.resolution.locator}catch(y){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:y,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${y.message}`});return}if(l.type==="SELECT_OPTION"&&b)try{S.options=await m.browser.getSelectOptions(b)}catch(y){e.warn({err:y},"Failed getting select options"),s({err:`Failed getting select options: ${y.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:y,width:T,height:C}=await m.screenshotWithDimensions({clearHighlights:!0,locator:b}),I=F8(),{universalHandle:A,appServerUrl:x}=await h.createOnDemandScreenshot(I,y,"image/jpeg");S.screenshot={data:A,width:T,height:C},e.info({width:T,height:C,appServerUrl:x,universalHandle:A},"Captured screenshot during locate")}catch(y){e.error({err:y},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${y.message}`});return}if(s({result:S}),b)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(b),m.browser.highlight(b)])}catch(y){e.warn({err:y},"Error highlighting element, continuing...")}}},L0={event:"locate",createHandler:U8};var B8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},N0={event:"mouseClickEvent",createHandler:B8};var z8=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(S,b)=>{b.type!=="PRESET_ACTION"||b.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:b.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},D0={event:"recordTargetClick",createHandler:z8};var H8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},k0={event:"keyDownEvent",createHandler:H8};var G8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},F0={event:"keyUpEvent",createHandler:G8};var j8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},U0={event:"mouseMoveEvent",createHandler:j8};var V8=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{r.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},B0={event:"recordingStart",createHandler:V8};var $8=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},z0={event:"recordingStop",createHandler:$8};var W8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:g}=await jo({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:g,viewport:S},`Session refreshed for test ${l} at ${g}`),c()},H0={event:"refresh",createHandler:W8};var q8=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await jo({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:b}=f,{baseUrl:y}=await dc({controller:S,context:b,baseUrl:p,envName:m,testName:g,environmentVariables:h}),T=S.browser.getViewport(),C=Wn.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${y}`),t.emit("session",{url:y,userAgent:C,viewport:T,sessionId:c})},G0={event:"reset",createHandler:q8};var K8=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},j0={event:"switchTab",createHandler:K8};async function V0(t){return M0(t)}var $0=[FN,O0,L0,G0,H0,NN,j0,D0,B0,z0,U0,N0,k0,F0,kN,DN];var W0=t=>{let{logger:e}=t,r=new Y8(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await V0({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}$0.forEach(i=>X8(i,{...t,socket:n,metadata:o,logger:e}))}),r},X8=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{McpServer as MZ}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as OZ}from"@modelcontextprotocol/sdk/server/stdio.js";import{randomUUID as LZ}from"crypto";import{existsSync as Y0,mkdirSync as J8}from"fs";import{readdir as Z8,stat as Q8,unlink as e9,writeFile as lv}from"fs/promises";import pc from"path";var q0=".momentic-mcp",t9=30*24*60*60*1e3;function cv(){try{return pc.join(Se().rootDir,q0)}catch{return pc.resolve(q0)}}function _d(){let t=cv();Y0(t)||J8(t,{recursive:!0})}function r9(){return`${Date.now()}`}function Id({entity:t,ext:e}){return pc.join(cv(),`${t}-${r9()}.${e}`)}async function X0({rootDir:t,cutoffTime:e}){let r=await Z8(t,{withFileTypes:!0});for(let n of r){let o=pc.join(t,n.name);if(n.isDirectory()){await X0({rootDir:o,cutoffTime:e});continue}if(!n.isFile())continue;(await Q8(o)).mtimeMs<e&&await e9(o)}}async function J0(){let t=cv();Y0(t)&&await X0({rootDir:t,cutoffTime:Date.now()-t9})}function n9(t){let e=pc.relative(process.cwd(),t);return e.startsWith(".")?e:`./${e}`}function Pd({filePath:t,title:e}){return`- [${e}](${n9(t)})`}function Z0(t){return t.map(e=>{switch(e.type){case"text":return e;case"media":return{type:"image",data:e.data,mimeType:e.mediaType};default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}})}function se({text:t,section:e}){if(!e)return[{type:"text",text:t}];let r=`### ${e}`;return t.length===0?[{type:"text",text:r}]:[{type:"text",text:`${r}
|
|
4648
4648
|
${t}`}]}function K0({imageDataUri:t,mediaType:e,section:r}){return r?[{type:"text",text:`### ${r}`},{type:"media",data:t,mediaType:e}]:[{type:"media",data:t,mediaType:e}]}function at(t){if(t.length===0)throw new At("No content parts provided to construct the tool response content.");return{type:"content",value:t}}async function o9({browser:t,supportsFileOutput:e,returnSnapshot:r=!0,tokenLimit:n}){let o=t.getActivePage(),i=[];if(r){let s=await t.getBrowserState({skipWait:!1});i.push("- Page Snapshot:","```xml",s.serialize(),"```")}let a=[`- Page URL: ${o.url()}`,`- Page Title: ${await o.title()}`,...i].join(`
|
|
4649
4649
|
`);if(!e&&n!==void 0&&We(a)>n)return se({text:["### Page state",`- Page URL: ${o.url()}`,`- Page Title: ${await o.title()}`,"- Page Snapshot:","<WARNING>","The page state was too long and we had to truncate the page state.","</WARNING>"].join(`
|
|
4650
4650
|
`),section:"Page State"});if(e){_d();let s=Id({entity:"page-state",ext:"txt"});return await lv(s,a,"utf8"),se({text:Pd({filePath:s,title:"Page state"}),section:"Page State"})}return se({text:a,section:"Page State"})}async function Sn({browser:t,supportsFileOutput:e}){let r=await t.screenshot({retries:2}),n=r.toString("base64");if(e){let o=Id({entity:"screenshot",ext:"jpeg"});return _d(),await lv(o,r),[...K0({imageDataUri:n,mediaType:"image/jpeg",section:"Screenshot"}),...se({text:Pd({filePath:o,title:"Screenshot"}),section:"Screenshot Path"})]}return K0({imageDataUri:n,mediaType:"image/jpeg",section:"Screenshot"})}async function i9(t,e,r){let n=await ce(t),o=await St(pc.join(t.rootDir,e),r,n);try{let a=new ct({baseUrl:Wt(),apiKey:Tr(),logger:r}),s=await fr(r,a,t),c=co({logger:r,orgId:zt(),client:a,gitMetadata:s,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}),{steps:l,beforeSteps:u,afterSteps:d}=await Lg({cacheStorage:c,logger:r,schemaVersion:o.schemaVersion,stepLists:{steps:o.steps,beforeSteps:o.beforeSteps,afterSteps:o.afterSteps},testId:o.id});o.beforeSteps=u,o.steps=l,o.afterSteps=d}catch(a){r.error({err:a},"Failed to resolve step cache entries for agent test view")}let i=[];return i.push(`Name: ${o.name}`),o.description&&i.push(`Description: ${o.description}`),i.push(""),o.beforeSteps&&o.beforeSteps.length>0&&(i.push(Wg(o.beforeSteps,"Setup Steps")),i.push("")),i.push(Wg(o.steps,"Main Steps")),o.afterSteps&&o.afterSteps.length>0&&(i.push(""),i.push(Wg(o.afterSteps,"Teardown Steps"))),se({text:i.join(`
|
|
@@ -5081,7 +5081,7 @@ Running tool ${d.toolName} with input ${JSON.stringify(d.input)}
|
|
|
5081
5081
|
${l}`)];return e.getMcpCopilotConversationEvaluation({messagesAndToolCalls:c},{logger:r})}var IZ=ur({schema:{name:Jc,description:VF(),inputSchema:{selector:Li,message:Si.string().describe("A single block of natural-language instructions describing the desired edits to the test. The test can also be edited to add modules, edit modules, or create new modules inside of the test. Can only be used to modify steps (including module steps) inside of the passed in test.")}},handle:async(t,e,r,n)=>{let{project:o,logger:i,generator:a}=t,s=n?.signal;if(!s){r.addError(`No response handler available: client abort signal is required for ${Jc}`);return}let c={completed:0,total:Lv},{hooks:l,notificationAbortController:u,getAccumulatedText:d}=vZ(n,i,c,r);await Sc(n,c,"Validating if your edits requests are valid...",i,u,r);let p=await a.getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(p.category!=="NONE"){r.addError(`${p.thoughts}
|
|
5082
5082
|
|
|
5083
5083
|
Category: ${p.category}`);return}let m,g;try{({entity:m,momenticFiles:g}=await rn(o,e.selector,"test"))}catch(L){r.addError(String(L));return}let h=await St(m.fullFilePath,i,g),f=i.child({applicationName:"momentic-mcp-copilot",testId:m.id}),S=n?.sessionId??t.serverId;if(n?.sessionId||i.warn({serverId:t.serverId},"No MCP sessionId provided; using mcp serverId fallback for edit test"),!S){r.addError("No sessionId available for edit test. Please retry the request.");return}let b=Kd({testPath:m.relativePath,messages:[{role:"user",content:e.message}],logger:f,session:{...await Md({logger:f,project:o,entity:m,resolvedTest:h,customHeaders:t.customHeaders,devicePixelRatio:t.devicePixelRatio}),tempCaches:{},socket:void 0},generator:a,sessionId:S,hooks:l,saveChangesToDisk:t.saveChangesToDisk,supportsFileOutput:!1}),{signal:y,release:T}=await GF.startOrReplace(m.id,s),C=EZ(b);try{await C.text}catch(L){if(y.aborted)i.debug("AI stream was cancelled, returning partial output"),r.addPartFromText(JSON.stringify({aborted:String(L),partialOutput:d()},null,2));else throw L}finally{T()}let I=await St(m.fullFilePath,i,g),A=await sL(h,I),x=d().split(`
|
|
5084
|
-
`).map(L=>L.trim()).filter(L=>L.length>0);await Sc(n,{completed:c.total,total:c.total},"Evaluating edits and generating edit status...",i,u,r);let O=await _Z(x,a,i);r.addPartFromText(JSON.stringify({additions:A.additions,deletions:A.deletions,summarization:O},null,2))}}),PZ=Si.union([Kc,Pp]).describe("The momentic step type to preview. Must be a valid step object."),$F=ur({schema:{name:Up,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:Si.string(),step:PZ}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=Cs(r,o);if(!a)return;a.controller.setOpen();let s=await df({step:i,logger:t.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,supportsFileOutput:t.supportsFileOutput,tempCaches:a.tempCaches});r.addContentParts(s)}}),WF=ur({schema:{name:JR,description:"Splice steps in the test bound to an active session. Supports inserting, deleting, or replacing steps by index.",inputSchema:{sessionId:Si.string(),startIndex:Si.number(),deleteCount:Si.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:nC.array(),targetSection:Na.default("main"),returnTest:Si.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(t,e,r,n)=>{let o=Cs(r,e.sessionId);if(!o)return;let i;try{({entity:i}=await rn(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}let s=(await mf({project:t.project,orgId:o.orgId,logger:t.logger,testPath:i.relativePath,saveChangesToDisk:t.saveChangesToDisk,tempCaches:o.tempCaches,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,returnTest:e.returnTest}})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),qF=ur({schema:{name:ZR,description:"Run one or more steps from the test bound to an active session. Use stepId and parentStepIdChain when running to/from specific steps.",inputSchema:{sessionId:Si.string(),fromStep:qh,toStep:Kh.optional(),targetSection:Na.default("main"),resetSession:Si.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=Cs(r,e.sessionId);if(!o)return;o.controller.setOpen();let i;try{({entity:i}=await rn(t.project,{id:o.testId},"test"))}catch(l){r.addError(String(l));return}e.resetSession&&await ef({project:t.project,logger:t.logger,testPath:i.relativePath,orgId:o.orgId,storage:o.storage,apiKey:Tr(),baseUrl:Wt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let a=jF(n,t.logger,r),c=(await gf({project:t.project,logger:t.logger,testPath:i.relativePath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:a,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},supportsFileOutput:t.supportsFileOutput})).value.map(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);r.addContentParts(c)}}),KF=[RZ,AZ,CZ,IZ];var YF=[rF,nF,oF,iF,$F,qF,WF];var XF=[...KF,...rf,...YF];var ff,kv=new Set,NZ=async(t,e)=>{try{let{killed:r,failed:n}=await fi.killAllSessions(t);n.length>0?e.warn({failed:n,reason:t},"Some browser sessions failed to terminate on shutdown"):r.length>0&&e.info({killedCount:r.length,reason:t},"Terminated browser sessions on shutdown")}catch(r){e.warn({err:r,reason:t},"Failed to terminate browser sessions on shutdown")}},DZ=async(t,e)=>{if(ff)return ff;let r=(async()=>{for(let n of kv)try{await n(t,e)}catch(o){e.warn({err:o,reason:t},"MCP shutdown handler failed")}})();ff=r;try{await r}finally{ff=void 0}return r},Sf=(t,e,r)=>{e!=null&&(process.exitCode=e),DZ(t,r)},Fv=(t,{signalExitCode:e=0,errorExitCode:r=1}={})=>{process.once("SIGINT",()=>Sf("signal SIGINT",e,t)),process.once("SIGTERM",()=>Sf("signal SIGTERM",e,t)),process.once("uncaughtException",n=>{t?.error({err:n},"Uncaught exception in MCP server process"),Sf("uncaughtException",r,t)}),process.once("unhandledRejection",n=>{t.error({err:n},"Unhandled rejection in MCP server process"),Sf("unhandledRejection",r,t)}),kv.add(NZ)},kZ=t=>{kv.add(t)},JF=!1;function FZ(t){JF||(JF=!0,(async()=>{try{await J0()}catch(e){t.warn({err:e},"Failed to clean up old MCP artifacts")}})())}function Uv(t,e){FZ(t.logger);let r=new MZ({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of XF)n.addToolToMcpServer(t,r);return r}async function Bv({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",supportsFileOutput:a=!0,headfulBrowserDefault:s=!0,customHeaders:c,devicePixelRatio:l}){Eh(n),await Th(r),ac(t,S=>Ct({configFilePath:S}));let u={applicationName:i,cliVersion:o??"0.0.0"},d=e.child({orgId:zt(),userId:Uo(),...u}),p=LZ(),m=new tn(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:d,mode:"interactive"}),h=Uv({project:t,logger:d,generator:m,serverId:p,saveChangesToDisk:!0,supportsFileOutput:a,headfulBrowserDefault:s,customHeaders:c,devicePixelRatio:l},u),f=new OZ;return kZ(async()=>{try{await h.close()}catch{}}),Fv(d),await h.connect(f),{server:h,transport:f}}import{Router as GZ}from"express";import{Router as BZ}from"express";import Jd from"fs";import Xd from"path";import{v4 as zZ}from"uuid";import HZ from"yaml";import{hostname as UZ}from"os";var Yd="2.48.2",ut=Al({app:"desktop-server",hostname:UZ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Yd});(async()=>{try{let t=await di(ut);t.gitBranchName&&ut.addBinding("branch",t.gitBranchName)}catch{}})();var Ms=BZ();async function yf(t){return(await Kg(t,ut)).map(n=>{let o=t.modules[n.moduleId];if(!o){v.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)}Ms.get("/",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=await yf(n);e.status(200).json(o)}));Ms.get("/tests-join",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=await yf(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await St(s.fullFilePath,ut,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)en({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:g=>{pS(g)&&d.add(g.moduleId)}});for(let m of d){let g=i[m];g&&g.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));Ms.post("/",Ue(async(t,e)=>{let r;try{r=sx.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Mi(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Se(),o=(await ce(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Xd.join(n.rootDir,r.folderPath??"");if(!Jd.existsSync(i)||!Jd.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await qg({...r,folder:i,project:n});e.status(201).json(a)}));Ms.get("/:moduleId",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ce(Se()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await oo(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Ms.post("/:moduleId/duplicate",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=ax.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{Mi(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=Se(),o=await ce(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await oo(i,o,v),s=Xd.join(n.rootDir,Xd.dirname(i.relativePath));if(!Jd.existsSync(s)||!Jd.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=st(r.name),l=Xd.join(s,`${c}.module.yaml`),u=zZ(),{stepsToSave:d}=await Mt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:zt()}}),p={fileType:De.MODULE,schemaVersion:Ze,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=HZ.stringify(p);Jd.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Xd.relative(n.rootDir,l)};e.status(201).json(g)}));Ms.patch("/:moduleId/metadata",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=lx.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Se(),o=await ce(n);bL({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var ZF=Ms;var QF=GZ();QF.get("/",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await yf(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var eU=QF;import{Router as jZ}from"express";var zv=jZ();zv.get("/",Ue((t,e)=>{let r=Yg(Se(),ut);e.status(200).json(r)}));zv.get("/names",Ue((t,e)=>{let n=Se().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var tU=zv;import{Router as VZ}from"express";var rU=VZ();rU.get("/",Ue((t,e)=>{let r={userId:Uo(),orgId:zt(),cliVersion:Yd??"0.0.0"};e.status(200).json(r)}));var nU=rU;import{StreamableHTTPServerTransport as $Z}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as WZ}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as oU}from"crypto";import{Router as qZ}from"express";var Hv="mcp-session-id",bf=qZ();function KZ(t,e){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Yd??"0.0.0"},n=Se(),o=Tr(),i=Wt(),a=ut.child({orgId:zt(),userId:Uo(),...r}),s=Sl(process.env.MOMENTIC_HEADFUL_BROWSER),c=oU(),l=new tn(n.config.ai?.agentConfig,{baseUrl:i,apiKey:o,logger:a,mode:"interactive"});return{context:{project:n,logger:a,generator:l,serverId:c,saveChangesToDisk:!0,supportsFileOutput:e??!0,headfulBrowserDefault:t??s??!0},info:r}}var yi={};bf.post("/",async(t,e)=>{let r=String(t.headers[Hv]??"");try{if(r&&yi[r]){await yi[r].handleRequest(t,e,t.body);return}if(!r&&WZ(t.body)){let{context:n,info:o}=KZ(),i=Uv(n,o),a=new $Z({sessionIdGenerator:()=>oU(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{yi[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&yi[s]&&delete yi[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});bf.get("/",async(t,e)=>{let r=String(t.headers[Hv]??"");if(!r||!yi[r]){e.status(400).send("Invalid or missing session ID");return}await yi[r].handleRequest(t,e)});bf.delete("/",async(t,e)=>{let r=String(t.headers[Hv]??"");if(!r||!yi[r]){e.status(400).send("Invalid or missing session ID");return}let n=yi[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var iU=bf;import{Router as YZ}from"express";var aU=YZ();aU.get("/:id",Ue(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=ic();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){ut.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var sU=aU;import{Router as XZ}from"express";var Ef=XZ();Ef.get("/",Ue(async(t,e)=>{let r=(await PE()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Ef.get("/current",Ue((t,e)=>{let r=Se();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));Ef.post("/set",Ue(async(t,e)=>{let r;try{r=ux.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ut.info("Setting local project");try{let n=await Ct({configFilePath:r.configFilePath});ac(n,o=>Ct({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var lU=Ef;import{Router as JZ}from"express";var cU=JZ();cU.get("/",Ue((t,e)=>{let r=Se(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var uU=cU;import{streamText as ZZ}from"ai";import{Router as QZ}from"express";import Tf from"fs";import bc from"path";import{v4 as eQ}from"uuid";import tQ from"yaml";var Zd=new _m({platform:"local_app"},{flushAt:1,flushInterval:0});var bi=QZ();bi.post("/",Ue(async(t,e)=>{let r;try{r=ox.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=Se(),o=await Nd({project:n,input:r});Zd.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof At){e.status(400).json({error:n.message});return}throw n}}));bi.get("/:testPath",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Se(),o=await ce(n),i;try{i=await St(bc.join(n.rootDir,r),ut,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Mt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{zn({content:c,schemaVersion:Ze,momenticFiles:o,project:n})}),pn({relativeTestPath:r,steps:a,schemaVersion:Ze,project:n})}catch(a){ut.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));bi.get("/:testPath/metadata",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Se(),o=bc.join(n.rootDir,r);if(!Tf.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=Tf.statSync(o),a=await di(ut),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));bi.patch("/:testPath/metadata",Ue(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=nx.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:CE(t.params.testPath,r,Se()).newRelativeTestPath};e.status(200).json(o)}));bi.patch("/:testPath",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=rx.parse(t.body)}catch(m){ut.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}ut.info({testPath:r},"Save received");let o=Se(),i=await ce(o),a;try{a=Sd(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await Mt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:zt()}}),u=new ct({apiKey:Tr(),baseUrl:Wt(),logger:ut}),d=await fr(ut,u,o);await co({logger:ut,orgId:zt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:ut,testId:a.id,entries:l}),c.forEach(m=>{zn({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),pn({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));bi.patch("/:testPath/environments",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=cx.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}CE(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},Se()),e.status(201).json({message:"ok"})}));bi.post("/:testPath/duplicate",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=ix.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Mi(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=Se(),i=bc.join(o.rootDir,r);if(!Tf.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ce(o),s;try{s=await St(i,ut,a)}catch(f){e.status(400).send({error:f.message});return}let c=eQ(),l=On.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await Mt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:zt()}}),d=no({fileType:De.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=bc.dirname(i),m=bc.join(p,`${n.name}.test.yaml`),g=tQ.stringify(d);Tf.writeFileSync(m,g,"utf-8");let h={relativeFilePath:bc.relative(o.rootDir,m)};Zd.track({type:"test_editor:test_create"}),e.status(201).json(h)}));bi.post("/:testPath/chat",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Qh.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=Se(),s=Tr(),c=Wt(),l=Sd(r,a),u=ut.child({orgId:zt(),userId:Uo(),applicationName:"momentic-desktop-server-copilot",testId:l.id,sessionId:o});u.debug({sessionId:o},"Initializing copilot with sessionId");let d=new tn(a.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:u,mode:"interactive"}),p=Kd({testPath:r,messages:n,logger:u,session:{...i,tempCaches:{}},generator:d,sessionId:o,saveChangesToDisk:!1});ZZ(p).pipeUIMessageStreamToResponse(e,{onError:g=>{let h=g instanceof Error?g.message:String(g);return u.error({err:g,sessionId:o},"streamText session failed"),h}})}));var dU=bi;async function hU(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&Eh(e),PN({alwaysSaveCache:s,noCache:c}),await Th(r);let u=zt(),d=Uo();Zd.identify({user_id:d,org_id:u});let p=t.logger??ut;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=lQ(o,n,p),g=`http://localhost:${n}`;ac(l,T=>Ct({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${g}`),T()})}catch(C){C.message.includes("EADDRINUSE")?fU(n):v.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}}),v.info(`Desktop server is running at ${g}`);let f={type:"API_KEY",baseUrl:Wt(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=Se();return new tn(T.config.ai?.agentConfig,f)},b=async()=>new ia(f,await S()),y=new ct(f);W0({baseServer:m,getOrgId:async()=>zt(),generatorFactory:S,enricherFactory:b,cacheStorageFactory:async T=>{let C=Se(),I=await fr(p,y,C);return co({logger:p,orgId:T,client:y,gitMetadata:I,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await di(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=Se();return{ai:{},browser:{},...T.config}},storageFactory:async T=>{let C=Se();return new ga(y,T,C)},logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Qh,visualDiffStorageFactory:async T=>new Rs(y)}),Fv(p)}var gU="25mb";function lQ(t,e,r){let n=mU();n.use(rQ()),n.use(pU.json({limit:gU})),n.use(pU.urlencoded({extended:!1,limit:gU}));let o=iQ();if(o.use("/tests",dU),o.use("/modules",ZF),o.use("/environments",tU),o.use("/projects",lU),o.use("/folders",cT),o.use("/settings",uU),o.use("/identify",nU),o.use("/entities",eU),o.use("/on-demand-screenshots",sU),o.use("/mcp",iU),o.use("/git",uT),o.use("/cache-config",lT),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),v.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
5084
|
+
`).map(L=>L.trim()).filter(L=>L.length>0);await Sc(n,{completed:c.total,total:c.total},"Evaluating edits and generating edit status...",i,u,r);let O=await _Z(x,a,i);r.addPartFromText(JSON.stringify({additions:A.additions,deletions:A.deletions,summarization:O},null,2))}}),PZ=Si.union([Kc,Pp]).describe("The momentic step type to preview. Must be a valid step object."),$F=ur({schema:{name:Up,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:Si.string(),step:PZ}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=Cs(r,o);if(!a)return;a.controller.setOpen();let s=await df({step:i,logger:t.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,supportsFileOutput:t.supportsFileOutput,tempCaches:a.tempCaches});r.addContentParts(s)}}),WF=ur({schema:{name:JR,description:"Splice steps in the test bound to an active session. Supports inserting, deleting, or replacing steps by index.",inputSchema:{sessionId:Si.string(),startIndex:Si.number(),deleteCount:Si.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:nC.array(),targetSection:Na.default("main"),returnTest:Si.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(t,e,r,n)=>{let o=Cs(r,e.sessionId);if(!o)return;let i;try{({entity:i}=await rn(t.project,{id:o.testId},"test"))}catch(c){r.addError(String(c));return}let s=(await mf({project:t.project,orgId:o.orgId,logger:t.logger,testPath:i.relativePath,saveChangesToDisk:t.saveChangesToDisk,tempCaches:o.tempCaches,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,returnTest:e.returnTest}})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),qF=ur({schema:{name:ZR,description:"Run one or more steps from the test bound to an active session. Use stepId and parentStepIdChain when running to/from specific steps.",inputSchema:{sessionId:Si.string(),fromStep:qh,toStep:Kh.optional(),targetSection:Na.default("main"),resetSession:Si.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=Cs(r,e.sessionId);if(!o)return;o.controller.setOpen();let i;try{({entity:i}=await rn(t.project,{id:o.testId},"test"))}catch(l){r.addError(String(l));return}e.resetSession&&await ef({project:t.project,logger:t.logger,testPath:i.relativePath,orgId:o.orgId,storage:o.storage,apiKey:Tr(),baseUrl:Wt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let a=jF(n,t.logger,r),c=(await gf({project:t.project,logger:t.logger,testPath:i.relativePath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:a,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},supportsFileOutput:t.supportsFileOutput})).value.map(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);r.addContentParts(c)}}),KF=[RZ,AZ,CZ,IZ];var YF=[rF,nF,oF,iF,$F,qF,WF];var XF=[...KF,...rf,...YF];var ff,kv=new Set,NZ=async(t,e)=>{try{let{killed:r,failed:n}=await fi.killAllSessions(t);n.length>0?e.warn({failed:n,reason:t},"Some browser sessions failed to terminate on shutdown"):r.length>0&&e.info({killedCount:r.length,reason:t},"Terminated browser sessions on shutdown")}catch(r){e.warn({err:r,reason:t},"Failed to terminate browser sessions on shutdown")}},DZ=async(t,e)=>{if(ff)return ff;let r=(async()=>{for(let n of kv)try{await n(t,e)}catch(o){e.warn({err:o,reason:t},"MCP shutdown handler failed")}})();ff=r;try{await r}finally{ff=void 0}return r},Sf=(t,e,r)=>{e!=null&&(process.exitCode=e),DZ(t,r)},Fv=(t,{signalExitCode:e=0,errorExitCode:r=1}={})=>{process.once("SIGINT",()=>Sf("signal SIGINT",e,t)),process.once("SIGTERM",()=>Sf("signal SIGTERM",e,t)),process.once("uncaughtException",n=>{t?.error({err:n},"Uncaught exception in MCP server process"),Sf("uncaughtException",r,t)}),process.once("unhandledRejection",n=>{t.error({err:n},"Unhandled rejection in MCP server process"),Sf("unhandledRejection",r,t)}),kv.add(NZ)},kZ=t=>{kv.add(t)},JF=!1;function FZ(t){JF||(JF=!0,(async()=>{try{await J0()}catch(e){t.warn({err:e},"Failed to clean up old MCP artifacts")}})())}function Uv(t,e){FZ(t.logger);let r=new MZ({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of XF)n.addToolToMcpServer(t,r);return r}async function Bv({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",supportsFileOutput:a=!0,headfulBrowserDefault:s=!0,customHeaders:c,devicePixelRatio:l}){Eh(n),await Th(r),ac(t,S=>Ct({configFilePath:S}));let u={applicationName:i,cliVersion:o??"0.0.0"},d=e.child({orgId:zt(),userId:Uo(),...u}),p=LZ(),m=new tn(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:d,mode:"interactive"}),h=Uv({project:t,logger:d,generator:m,serverId:p,saveChangesToDisk:!0,supportsFileOutput:a,headfulBrowserDefault:s,customHeaders:c,devicePixelRatio:l},u),f=new OZ;return kZ(async()=>{try{await h.close()}catch{}}),Fv(d),await h.connect(f),{server:h,transport:f}}import{Router as GZ}from"express";import{Router as BZ}from"express";import Jd from"fs";import Xd from"path";import{v4 as zZ}from"uuid";import HZ from"yaml";import{hostname as UZ}from"os";var Yd="2.49.0",ut=Al({app:"desktop-server",hostname:UZ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Yd});(async()=>{try{let t=await di(ut);t.gitBranchName&&ut.addBinding("branch",t.gitBranchName)}catch{}})();var Ms=BZ();async function yf(t){return(await Kg(t,ut)).map(n=>{let o=t.modules[n.moduleId];if(!o){v.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)}Ms.get("/",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=await yf(n);e.status(200).json(o)}));Ms.get("/tests-join",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=await yf(n),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(n.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await St(s.fullFilePath,ut,n)})));for(let{id:s,name:c,relativePath:l,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)en({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:g=>{pS(g)&&d.add(g.moduleId)}});for(let m of d){let g=i[m];g&&g.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));Ms.post("/",Ue(async(t,e)=>{let r;try{r=sx.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Mi(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Se(),o=(await ce(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Xd.join(n.rootDir,r.folderPath??"");if(!Jd.existsSync(i)||!Jd.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await qg({...r,folder:i,project:n});e.status(201).json(a)}));Ms.get("/:moduleId",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ce(Se()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await oo(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Ms.post("/:moduleId/duplicate",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=ax.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{Mi(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=Se(),o=await ce(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await oo(i,o,v),s=Xd.join(n.rootDir,Xd.dirname(i.relativePath));if(!Jd.existsSync(s)||!Jd.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=st(r.name),l=Xd.join(s,`${c}.module.yaml`),u=zZ(),{stepsToSave:d}=await Mt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:zt()}}),p={fileType:De.MODULE,schemaVersion:Ze,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=HZ.stringify(p);Jd.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Xd.relative(n.rootDir,l)};e.status(201).json(g)}));Ms.patch("/:moduleId/metadata",Ue(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=lx.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Se(),o=await ce(n);bL({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var ZF=Ms;var QF=GZ();QF.get("/",Ue(async(t,e)=>{let r=Se(),n=await ce(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await yf(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var eU=QF;import{Router as jZ}from"express";var zv=jZ();zv.get("/",Ue((t,e)=>{let r=Yg(Se(),ut);e.status(200).json(r)}));zv.get("/names",Ue((t,e)=>{let n=Se().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var tU=zv;import{Router as VZ}from"express";var rU=VZ();rU.get("/",Ue((t,e)=>{let r={userId:Uo(),orgId:zt(),cliVersion:Yd??"0.0.0"};e.status(200).json(r)}));var nU=rU;import{StreamableHTTPServerTransport as $Z}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as WZ}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as oU}from"crypto";import{Router as qZ}from"express";var Hv="mcp-session-id",bf=qZ();function KZ(t,e){let r={applicationName:"momentic-mcp-desktop-server",cliVersion:Yd??"0.0.0"},n=Se(),o=Tr(),i=Wt(),a=ut.child({orgId:zt(),userId:Uo(),...r}),s=Sl(process.env.MOMENTIC_HEADFUL_BROWSER),c=oU(),l=new tn(n.config.ai?.agentConfig,{baseUrl:i,apiKey:o,logger:a,mode:"interactive"});return{context:{project:n,logger:a,generator:l,serverId:c,saveChangesToDisk:!0,supportsFileOutput:e??!0,headfulBrowserDefault:t??s??!0},info:r}}var yi={};bf.post("/",async(t,e)=>{let r=String(t.headers[Hv]??"");try{if(r&&yi[r]){await yi[r].handleRequest(t,e,t.body);return}if(!r&&WZ(t.body)){let{context:n,info:o}=KZ(),i=Uv(n,o),a=new $Z({sessionIdGenerator:()=>oU(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{yi[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&yi[s]&&delete yi[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});bf.get("/",async(t,e)=>{let r=String(t.headers[Hv]??"");if(!r||!yi[r]){e.status(400).send("Invalid or missing session ID");return}await yi[r].handleRequest(t,e)});bf.delete("/",async(t,e)=>{let r=String(t.headers[Hv]??"");if(!r||!yi[r]){e.status(400).send("Invalid or missing session ID");return}let n=yi[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var iU=bf;import{Router as YZ}from"express";var aU=YZ();aU.get("/:id",Ue(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=ic();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){ut.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var sU=aU;import{Router as XZ}from"express";var Ef=XZ();Ef.get("/",Ue(async(t,e)=>{let r=(await PE()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Ef.get("/current",Ue((t,e)=>{let r=Se();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));Ef.post("/set",Ue(async(t,e)=>{let r;try{r=ux.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ut.info("Setting local project");try{let n=await Ct({configFilePath:r.configFilePath});ac(n,o=>Ct({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var lU=Ef;import{Router as JZ}from"express";var cU=JZ();cU.get("/",Ue((t,e)=>{let r=Se(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var uU=cU;import{streamText as ZZ}from"ai";import{Router as QZ}from"express";import Tf from"fs";import bc from"path";import{v4 as eQ}from"uuid";import tQ from"yaml";var Zd=new _m({platform:"local_app"},{flushAt:1,flushInterval:0});var bi=QZ();bi.post("/",Ue(async(t,e)=>{let r;try{r=ox.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=Se(),o=await Nd({project:n,input:r});Zd.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof At){e.status(400).json({error:n.message});return}throw n}}));bi.get("/:testPath",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Se(),o=await ce(n),i;try{i=await St(bc.join(n.rootDir,r),ut,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Mt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{zn({content:c,schemaVersion:Ze,momenticFiles:o,project:n})}),pn({relativeTestPath:r,steps:a,schemaVersion:Ze,project:n})}catch(a){ut.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));bi.get("/:testPath/metadata",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=Se(),o=bc.join(n.rootDir,r);if(!Tf.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=Tf.statSync(o),a=await di(ut),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));bi.patch("/:testPath/metadata",Ue(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=nx.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:CE(t.params.testPath,r,Se()).newRelativeTestPath};e.status(200).json(o)}));bi.patch("/:testPath",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=rx.parse(t.body)}catch(m){ut.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}ut.info({testPath:r},"Save received");let o=Se(),i=await ce(o),a;try{a=Sd(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await Mt({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:zt()}}),u=new ct({apiKey:Tr(),baseUrl:Wt(),logger:ut}),d=await fr(ut,u,o);await co({logger:ut,orgId:zt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:ut,testId:a.id,entries:l}),c.forEach(m=>{zn({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),pn({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));bi.patch("/:testPath/environments",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=cx.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}CE(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},Se()),e.status(201).json({message:"ok"})}));bi.post("/:testPath/duplicate",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=ix.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Mi(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=Se(),i=bc.join(o.rootDir,r);if(!Tf.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ce(o),s;try{s=await St(i,ut,a)}catch(f){e.status(400).send({error:f.message});return}let c=eQ(),l=On.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await Mt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:zt()}}),d=no({fileType:De.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=bc.dirname(i),m=bc.join(p,`${n.name}.test.yaml`),g=tQ.stringify(d);Tf.writeFileSync(m,g,"utf-8");let h={relativeFilePath:bc.relative(o.rootDir,m)};Zd.track({type:"test_editor:test_create"}),e.status(201).json(h)}));bi.post("/:testPath/chat",Ue(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Qh.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=Se(),s=Tr(),c=Wt(),l=Sd(r,a),u=ut.child({orgId:zt(),userId:Uo(),applicationName:"momentic-desktop-server-copilot",testId:l.id,sessionId:o});u.debug({sessionId:o},"Initializing copilot with sessionId");let d=new tn(a.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:u,mode:"interactive"}),p=Kd({testPath:r,messages:n,logger:u,session:{...i,tempCaches:{}},generator:d,sessionId:o,saveChangesToDisk:!1});ZZ(p).pipeUIMessageStreamToResponse(e,{onError:g=>{let h=g instanceof Error?g.message:String(g);return u.error({err:g,sessionId:o},"streamText session failed"),h}})}));var dU=bi;async function hU(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&Eh(e),PN({alwaysSaveCache:s,noCache:c}),await Th(r);let u=zt(),d=Uo();Zd.identify({user_id:d,org_id:u});let p=t.logger??ut;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=lQ(o,n,p),g=`http://localhost:${n}`;ac(l,T=>Ct({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${g}`),T()})}catch(C){C.message.includes("EADDRINUSE")?fU(n):v.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}}),v.info(`Desktop server is running at ${g}`);let f={type:"API_KEY",baseUrl:Wt(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=Se();return new tn(T.config.ai?.agentConfig,f)},b=async()=>new ia(f,await S()),y=new ct(f);W0({baseServer:m,getOrgId:async()=>zt(),generatorFactory:S,enricherFactory:b,cacheStorageFactory:async T=>{let C=Se(),I=await fr(p,y,C);return co({logger:p,orgId:T,client:y,gitMetadata:I,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await di(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=Se();return{ai:{},browser:{},...T.config}},storageFactory:async T=>{let C=Se();return new ga(y,T,C)},logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Qh,visualDiffStorageFactory:async T=>new Rs(y)}),Fv(p)}var gU="25mb";function lQ(t,e,r){let n=mU();n.use(rQ()),n.use(pU.json({limit:gU})),n.use(pU.urlencoded({extended:!1,limit:gU}));let o=iQ();if(o.use("/tests",dU),o.use("/modules",ZF),o.use("/environments",tU),o.use("/projects",lU),o.use("/folders",cT),o.use("/settings",uU),o.use("/identify",nU),o.use("/entities",eU),o.use("/on-demand-screenshots",sU),o.use("/mcp",iU),o.use("/git",uT),o.use("/cache-config",lT),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),v.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
5085
5085
|
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),t){let a=mU.static(t,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,c)=>{c.sendFile(sQ.join(t,"index.html"))})}let i=aQ.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(fU(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}oQ.setMaxListeners(25);process.on("warning",t=>{ut.warn({err:t},`Node warning received on desktop-server: ${t.message}`)});process.on("uncaughtException",t=>{ut.error({err:t},"Uncaught exception on desktop-server"),v.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${t.message}`)});process.on("unhandledRejection",(t,e)=>{ut.error({reason:`${t}`,stack:t?.stack},"Uncaught exception on desktop-server (promise rejection)"),v.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${t}`)});function fU(t){v.error(nQ`Port ${t} is already in use by another process. Please close the other process and try again.
|
|
5086
5086
|
Using Bash on MacOS or Linux:
|
|
5087
5087
|
lsof -t -i :58888 | xargs kill -9
|
|
@@ -5101,7 +5101,7 @@ ${t.map(p=>`${Pt}- ${p}`).join(`
|
|
|
5101
5101
|
`)}`),Object.values(e.tests).forEach(p=>{t.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await hr("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);s.info(`Reading all ${u.length} tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of c){let d=aA.relative(r.rootDir,u);o&&!o.some(p=>new RegExp(p).test(d))&&c.delete(u),i&&i.some(p=>new RegExp(p).test(d))&&c.delete(u)}let l=Array.from(c).map(async u=>{try{let d=await St(u,te,e);if(IQ.gt(d.schemaVersion,Ze)&&s.warn(`Test ${u} has schema version ${d.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),a&&a.length>0){let p=d.labels||[];if(!a.some(g=>p.includes(g)))return null}return{...d,fullFilePath:u,relativeFilePath:aA.relative(r.rootDir,u)}}catch(d){s.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(l).then(xQ)}function tB({testDefinitions:t,quarantinedTestsMetadata:e,onlyQuarantined:r=!1,skipQuarantined:n=!1}){let[o,i]=eB(t,c=>c.disabled),[a,s]=eB(i,c=>c.id in e);return{testsToSkip:o,quarantinedTestsToSkip:n?a:[],testsToRun:r?[]:s,quarantinedTestsToRun:n?[]:a}}function rB({testsToRun:t,quarantinedTestsToRun:e,quarantinedTestsMetadata:r,testInputMatrix:n}){let o=[],i=(a,s,c)=>{n?n.forEach((l,u)=>{o.push({inputs:l,inputIndex:u,testDefinition:a,quarantined:s,quarantinedMetadata:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:s,quarantinedMetadata:c})};return t.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,r[a.id])),o}async function nB({project:t,apiClient:e}){let r=await ce(t),n=await vc({tests:[],momenticFiles:r,yes:!0,project:t,logger:new Ya(40,{})}),o=(await e.getQuarantinedTests()).quarantined,i=new Set(o.map(s=>s.testId)),a=n.filter(s=>i.has(s.id));v.info(a.map(s=>s.relativeFilePath).join(`
|
|
5102
5102
|
`))}async function oB({test:t,reason:e,apiClient:r,project:n,identity:o}){let i=(await ce(n)).tests,a=Object.values(i),s=(await r.getQuarantinedTests()).quarantined,c=new Set(s.map(p=>p.testId)),l=a.filter(p=>c.has(p.id)),u=await _f({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:l}),d=await If({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await r.unquarantineTest(u,d,o),v.success(`Test ${u.name} has been successfully removed from quarantine.`)}function iB(t){return t?st(t):"Unknown suite"}async function aB({client:t,orgId:e,suitePaths:r,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await t.queueSuiteRuns({paths:r,...i});te.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:r},"Queued suites remotely"),v.dimmed(`Queued ${r.length} suites.`),n||process.exit(0);let c=Date.now();v.dimmed(`Waiting for ${r.length} suites to finish. You can view results upon completion at:`);for(let f of s)v.dimmed(`${Pt}- ${t.getAppUrl()}/run-groups/${f}`);let l=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(b=>b.status==="FAILED"&&(b.failureReason||b.finishedAt&&Date.now()-b.finishedAt.getTime()>30*1e3)||b.status==="PASSED"||b.status==="CANCELLED"),p=await Rg({name:"suites",getResults:async()=>{let f=s.filter(y=>!u.some(T=>T.id===y)),S=await t.bulkGetRunGroupStatus(f),b=[];for(let y of S)d(y)?u.push(y):b.push(y);return[...u,...b]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(l.has(S.id)||(l.add(S.id),v.log(`${l.size}/${s.length} ${iB(S.suite?.name)}`)))}),f.every(d))}),m=t.getAppUrl(),h=Ul({results:p,startTime:c,onFailed:f=>{let S=iB(f.suite?.name),b=f.runs.filter(T=>T.status==="FAILED").length,y=f.runs.length;v.error(`${S} (${b}/${y} tests failed):`);for(let T of f.runs)if(T.status==="FAILED"){let C=T.testName||T.test?.name;v.error(` ${C?st(C):"Unknown test"} (${m}/runs/${T.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?st(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(h.failed>0?1:0)}async function sB({tests:t,client:e,orgId:r,...n}){!n.yes&&!await hr(`This command will queue ${t.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:t,...n});if(te.info({queuedTests:o,runIds:i,orgId:r},"Queued tests remotely"),v.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;v.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",l=e.getAppUrl(),u=Date.now(),d=await Rg({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(S=>S.id===f)),g=await e.bulkGetRunStatus(m),h=[];for(let f of g)c(f)?s.push(f):h.push(f);return[...s,...h]},timeoutMs:n.waitTimeout?n.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(g=>{if(g.status==="RUNNING"&&!a.has(g.id)){a.add(g.id);let h=g.testName||g.test?.name;h&&v.log(`${a.size}/${o.length} ${st(h)}`)}}),m.every(c))}),p=Ul({results:d,startTime:u,onFailed:m=>{let g=m.testName||m.test?.name;Cg(m,g?st(g):"Unknown test")},getDisplayLine:m=>{let g=m.testName||m.test?.name,h=` ${g?st(g):"Unknown test"}`;return m.id&&(h+=` (${l}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as h7}from"crypto";import f7 from"fs";import{existsSync as jQ,mkdirSync as VQ,statSync as $Q}from"fs";import{randomUUID as Ls}from"crypto";import Ac,{writeFileSync as lB}from"fs";import{hostname as PQ}from"os";import Vo from"path";import{z as Pf}from"zod";async function Of(t,e,r,n){if(n){let o=await e.getScreenshot(t,n);if(o){let i=`screenshot-${n}.jpeg`,a=Vo.join(r,i);return Ac.writeFileSync(a,o),i}}}async function MQ(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??Ls(),historyId:n.runId??Ls(),testCaseId:n.test.id,fullName:n.test.name,name:st(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:r.suiteName},{name:"host",value:PQ()},{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}`}),n.quarantined&&i.labels.push({name:"quarantined",value:"true"}),n.quarantinedMetadata?.quarantinedReason&&i.labels.push({name:"quarantinedReason",value:n.quarantinedMetadata.quarantinedReason}),n.quarantinedMetadata?.quarantinedAt&&i.labels.push({name:"quarantinedAt",value:n.quarantinedMetadata.quarantinedAt.toISOString()});for(let[c,l]of Object.entries(n.parameters))l!=null&&i.parameters.push({name:c,value:JSON.stringify(l)});n.results&&await sA(t,e,r.folder,i.steps,n.results);let a=OQ(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;Ac.writeFileSync(Vo.join(o,s),JSON.stringify(i,void 0,2))}async function Mf(t,e,r,n){let o={name:qO(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 Of(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Of(t,e,r,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data)if(Uc.safeParse(n.data).success){let s=Uc.parse(n.data),c=s.request,l={...s,request:void 0},u=`output-attachment-api-request-${Ls()}.json`,d=`output-attachment-api-response-${Ls()}.json`,p=Vo.join(r,u),m=Vo.join(r,d);Ac.writeFileSync(p,JSON.stringify(c,null,2)),Ac.writeFileSync(m,JSON.stringify(l,null,2)),o.attachments.push({name:"API request details",source:u,type:"application/json"}),o.attachments.push({name:"API response details",source:d,type:"application/json"})}else{let s=Pf.union([Pf.object({}).passthrough(),Pf.array(Pf.any())]).safeParse(n.data).success,c=`output-attachment-${Ls()}.json`,l=Vo.join(r,c);Ac.writeFileSync(l,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:c,type:s?"application/json":"text/plain"})}return o}async function sA(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await Mf(t,e,r,i);break}case"CONDITIONAL":{a=await Mf(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await Mf(t,e,r,i.assertionResult)),await sA(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await Mf(t,e,r,i),await sA(t,e,r,a.steps,i.results),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,c]of Object.entries(i.inputs))a.parameters.push({name:s,value:c})}break}default:{let s=i}}if(!a){t.warn({result:i},"Failed to convert Momentic result to Allure step");continue}if(a.attachments||(a.attachments=[]),i.beforeTestContext){let s=`before-context-${Ls()}.json`,c=Vo.join(r,s);lB(c,cB(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${Ls()}.json`,c=Vo.join(r,s);lB(c,cB(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function uB(t,e,r,n,o){for(let i of o){if(!i.runId||!i.runAttemptId)throw new Error(`Missing runId/runAttemptId for Allure report generation for test '${i.test.name}'`);let a=e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId);try{await MQ(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function cB(t){try{return JSON.stringify(t,void 0,2)??JSON.stringify({value:null},void 0,2)}catch(e){let r=e instanceof Error?e.message:"unknown error";return JSON.stringify({error:r},void 0,2)}}function OQ(t,e,r){let n=t.listVideoAssetPaths();if(n.length===0)return[];let o=[];for(let i of n){let a=Vo.basename(i),s=a,c=Vo.join(e,s);try{Ac.copyFileSync(i,c)}catch{continue}let l,u=Vo.extname(i).toLowerCase();u===".webm"?l="video/webm":u===".mp4"?l="video/mp4":l="application/octet-stream",o.push({name:a,source:s,type:l})}return o}import LQ from"junit-report-builder";import Lf from"path";function dB(t,e){t.property("quarantined","true"),t.property("dd_tags[quarantined]","true"),e.quarantinedReason&&(t.property("quarantined_reason",e.quarantinedReason),t.property("dd_tags[quarantined_reason]",e.quarantinedReason)),e.quarantinedAt&&(t.property("quarantined_at",e.quarantinedAt.toISOString()),t.property("dd_tags[quarantined_at]",e.quarantinedAt.toISOString()))}function NQ(t,e){if(e.name(t.testName).className(t.testName).file(Lf.relative(".",t.filePath)).property("id",t.testId).property("dd_tags[id]",t.testId),t.labels&&(e.property("labels",t.labels.join(",")),t.labels.forEach(r=>{e.property("dd_tags[label]",r)})),t.baseUrl&&(e.property("base_url",t.baseUrl),e.property("dd_tags[base_url]",t.baseUrl)),t.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${t.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${t.runId}`)),t.quarantinedMetadata&&dB(e,t.quarantinedMetadata),t.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),t.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),t.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),t.status==="FAILED"){if(t.failureReason){let r=wp[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Ys[t.failureReason];t.runId&&(n+=` Visit https://app.momentic.ai/runs/${t.runId} for more details.`),e.failure(n,r)}t.failureDetails?.errorStack&&e.stacktrace(t.failureDetails.errorStack)}else t.status==="CANCELLED"&&e.skipped();return e.time((t.finishedAt.getTime()-t.lastAttemptStartedAt.getTime())/1e3).property("started_at",t.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",t.lastAttemptStartedAt.toISOString()).property("finished_at",t.finishedAt.toISOString()).property("dd_tags[finished_at]",t.finishedAt.toISOString()),e.property("attempts",t.attempts.toString()).property("dd_tags[attempts]",t.attempts.toString()),t.parameters?.envName&&(e.property("environment",t.parameters.envName),e.property("dd_tags[environment]",t.parameters.envName)),t.parameters?.urlOverride&&e.property("url_override",t.parameters.urlOverride),e}function DQ(t,e,r){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestsMetadata:l}=e,u=t.testSuite().name(o);n&&u.property("id",n),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of r){let p=u.testCase();NQ(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(Lf.relative(".",d.relativeFilePath)).property("id",d.id),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(m=>{p.property("dd_tags[label]",m)})),p.skipped()}for(let d of c){let p=u.testCase();p.name(d.name).className(d.name).file(Lf.relative(".",d.relativeFilePath)).property("id",d.id);let m=l[d.id];m&&dB(p,m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(g=>{p.property("dd_tags[label]",g)})),p.skipped()}return u}function pB(t,e,r){let n=LQ.newBuilder();DQ(n,e,r),n.writeTo(Lf.join(t,`${e.suiteName}.xml`))}import kQ from"fs";import FQ from"path";function mB(t){return{title:Bn(t),duration:t.finishedAt.getTime()-t.startedAt.getTime(),error:t.status==="FAILED"?{value:t.failureReason}:void 0,steps:t.results&&t.type!=="PRESET_ACTION"?t.results.map(mB):[]}}async function UQ(t,e,r,n){if(n.results?.length){let o=await Of(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function BQ(t,e,r,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||Ys[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(mB)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await UQ(t,e,r,n)}}async function zQ(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await BQ(t,e,r,n)]}}async function HQ(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await zQ(t,e,r,n)],id:n.runId,file:n.filePath}}function lA(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function GQ(t,e,r,n,o){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(o.map(async i=>{let a=i.runId&&i.runAttemptId?e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId):new Ru;try{return await HQ(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:lA(o,i=>i.status==="PASSED"),unexpected:lA(o,i=>i.status!=="PASSED"),flaky:lA(o,i=>!!i.isFlake),skipped:0}}}async function gB(t,e,r,n,o){let i=await GQ(t,e,r,n,o);kQ.writeFileSync(FQ.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function WQ(t){return{testName:t.test.name,testId:t.test.id,filePath:t.filePath,labels:t.test.labels,baseUrl:t.baseUrl,runId:t.runId,quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata,status:t.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:t.failureDetails,failureReason:t.failureReason,finishedAt:t.finishedAt,lastAttemptStartedAt:t.lastAttemptStartedAt,attempts:t.attempts,parameters:t.parameters}}async function hB({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(jQ(i)?$Q(i).isDirectory()||(v.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(v.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),VQ(i,{recursive:!0})),r){case"junit":{let a=o.map(WQ);pB(i,n,a);return}case"allure":case"allure-json":await uB(t,e,i,n,o);return;case"playwright-json":await gB(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import S7 from"wait-on";import{execSync as qQ}from"child_process";import{platform as KQ}from"os";function Nf(){return fB()?(v.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),v.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.
|
|
5103
5103
|
`),2):(v.dimmed("Setting device pixel ratio to 1."),v.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.
|
|
5104
|
-
`),1)}function fB(){return KQ()==="darwin"&&qQ("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Df(t){fB()&&t===1&&(v.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),v.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import YQ from"@actions/exec";import XQ from"@actions/io";import JQ from"quote";import ZQ from"string-argv";async function SB(t,e=!0){let r=ZQ(t),n=await XQ.which(r[0],!0),o=r.slice(1),i=YQ.exec(JQ(n),o,{delay:100});if(e)return i}import QQ from"csv-parser";import{createReadStream as e7}from"fs";function cA(t){return new Promise((e,r)=>{let n=[];e7(t).pipe(QQ()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import Rc from"semver";import{z as kf}from"zod";var nn="2.48.2",t7="https://registry.npmjs.org/momentic",r7=kf.object({versions:kf.record(kf.string(),kf.unknown()).optional()});async function ho(t){try{await n7(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function uA(){let t=await X(fetch(t7),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=r7.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=nn;for(let o of Object.keys(r))Rc.valid(o)&&Rc.major(o)===Rc.major(nn)&&Rc.gt(o,n)&&Rc.prerelease(o)===null&&(n=o);return n}async function n7(t){let e;for(let r=0;r<2;r++)try{e=await uA()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}Rc.eq(nn,e)||(v.warn(`Update available: v${nn} -> v${e}`),v.warn("This version may be missing critical fixes, features, and security updates."),v.warn('Run "npx momentic@latest upgrade" to update'))}async function Ti(){try{await X(Promise.all([M_(),ar.flush()]),{milliseconds:5e3})}catch{}}import{partition as o7}from"lodash-es";function Ff(t){return t.length===1?"test":"tests"}function yB(t){return t===1?"1 worker":`${t} workers`}function bB(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${Ff(t)}:`),t.forEach(e=>{v.info(`${Pt}- ${[e.relativeFilePath]}`)}),v.log(""))}function EB(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${Ff(t)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function i7(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${Ff(t)} with ${yB(e)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function a7(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${Ff(e)} with ${yB(r)}:`),e.forEach(n=>{v.info(`${Pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function TB({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=o7(e,s=>s.quarantined);i7(i,r),a7(i,a,r)}import{randomUUID as s7}from"crypto";import{cloneDeep as Cc}from"lodash-es";import{dirname as l7}from"path";async function vB({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await qr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function AB({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:S}){let b=await uc({settings:g,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:te,mode:"runner"},T=jp({browserType:b.browserType,orgDefaultBrowserType:g.defaultBrowserType});if(!QM(T)){let x=`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...`;v.warn(x),te.warn(x)}let C=await Wn.init({baseUrl:t,logger:d,userBrowserSettings:b,storage:a,enricher:new ia(y,c),contextArgs:{viewport:i.advanced.viewport??wr,locale:i.advanced.locale??Ni,geolocation:i.advanced.geolocation??ki,timezoneId:i.advanced.timezone??Di,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:x=>S.onNetworkPage(x),onNetworkLogs:x=>S.onNetworkLogs(x)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:x})=>{S.setActiveVideo(x)}}:void 0}),I=new pa({browser:C,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:b.slowMoMs,autoFollowNewTabs:b.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),A=new Hr({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async x=>{let{name:O,defaultValue:L,required:N}=x,V=m?.[O];N&&V===void 0&&(v.error(`Required parameter '${O}' is required by test '${i.name}' but not provided`),process.exit(1));let K=await qr({orgId:l,s:V??L,localTools:s,logger:d,context:Hr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(O,K)})),{controller:I,context:A}}async function RB({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!Xa){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),v.warn(n),!1}return!0}async function CB({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await RB({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Wh({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function wB(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await c7(t)}catch(o){let i="Fatal error running test";return v.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{},quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata}}}async function c7(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:g}=t,h=new rc(n,o),f=co({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Lg({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),b=S.steps,y=S.beforeSteps??void 0,T=S.afterSteps??void 0,{envName:C,resolvedEnv:I,environmentVariables:A,baseUrl:x}=fh({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:V=>ps(V,r,s)}),O=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:l7(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:x,environmentName:C,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([V,K])=>{A[V]=K});let N=await u7({...t,variables:A,envName:C,resolvedEnv:I,baseUrl:x,storageClient:h,tracer:O,logger:L,cacheStorage:f,stepsWithCaches:b,beforeStepsWithCaches:y,afterStepsWithCaches:T,usageTracker:g});return await O.finish({logger:s,status:N.status,finishedAt:N.finishedAt,failureDetails:N.failureDetails,failureReason:N.failureReason,isFlake:N.isFlake,failureRecoveryDetails:N.failureRecoveryDetails}),{runId:O.runId,...N}}async function u7(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:S,retriesOverride:b,devicePixelRatio:y,logUpdate:T,tracer:C,logger:I,cacheStorage:A,gitMetadata:x,quarantined:O,quarantinedMetadata:L,usageTracker:N}=t,V=i.config.ai?.aiFailureAnalysis??!1,K=new Date,B=new Zl(i,s,a),fe={...i.config},H={envName:p,urlOverride:m,customHeaders:g,testInputs:h},D,oe=Math.abs(b??e.retries??i.config.retries??0),ue=[];I.info({...x,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let _e=0;_e<=oe;_e++){let be=s7(),le=await C.startAttempt(be),Z=I.child(le.loggerBindings||{}),ve={...e,steps:Cc(r),beforeSteps:Cc(n),afterSteps:Cc(o)};_e!==0&&T("RETRY",`attempt ${_e+1}/${oe+1}`);let Ce=new Date,P=fe.advanced?.fakerConstantSeed,ie=new Fo({httpClient:new Sr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Z,mode:"runner"}),fakerSeed:P?yl:void 0}),ge=le;try{let{controller:on,context:vr}=await AB({tracer:le,baseUrl:l,envName:p,testName:ve.name,apiClient:s,devicePixelRatio:y,logger:Z,storageClient:u,codeEvalTools:ie,test:ve,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...ve.advanced},aiSettings:{...i.config.ai||{},...ve.advanced||{}},visualDiffScreenshotStorage:B});D=await CB({attemptMetadata:{attemptNumber:_e+1,orgId:d,runId:C.runId},attemptFixtures:{logger:Z,storageClient:u,usageTracker:N,codeEvalTools:ie,apiClient:s,context:vr,controller:on,tracer:le},attemptInputs:{test:ve,orgSettings:fe}});let fo=new Date,ya={logger:I,cacheStorage:A,orgId:d,testId:e.id,originalStepsWithCaches:{steps:Cc(r),beforeSteps:Cc(n),afterSteps:Cc(o)},updatedStepsWithCaches:{steps:ve.steps,beforeSteps:ve.beforeSteps,afterSteps:ve.afterSteps}};D?.status==="PASSED"?await ss(ya):D?.status==="FAILED"&&_e===oe&&await Wl(ya),await le.finish({logger:Z,result:D}),ue.unshift(D.status);let Q=await vB({orgId:d,codeEvalTools:ie,logger:Z,outputDefinitions:e.outputs??[],testContext:vr}),Ds=NC(ue),ks=_e+1;if(D.status!=="FAILED")return{...D,runAttemptId:be,parameters:H,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:fo,attempts:ks,baseUrl:l,outputs:Q,isFlake:Ds,quarantined:O,quarantinedMetadata:L};let ba=D.failedStepResult,$o=ba?.message||"Unknown failure",Wo=ba?.failureReason??MR($o)??"UnknownError",xc=Z.child({failureReason:Wo,errorMessage:$o,numAttempts:(oe+1).toString(),name:ve.name});if(_e<oe){xc.warn(`Retrying failed execution attempt for run: ${$o}`);continue}xc.error(`Test failed after all exhausting attempts: ${$o}`);let Fs=new Error($o),vi={errorMessage:$o,errorStack:Fs.stack},Bf;if(V){let _c;try{if(D.results&&D.results.length>0){let{classification:He,aiFailureReason:Kn}=await hL({logger:Z,browserStateStorage:ge,generator:c,fullResults:D,failureReason:Wo,error:Fs,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});_c=He,Bf=Kn}}catch(He){Z.warn({err:He},"Failed to classify test results")}_c&&(vi.classification=_c,Wo=Bf??Wo)}return{...D,runAttemptId:be,parameters:H,failureDetails:vi,failureReason:Wo,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:fo,attempts:_e+1,baseUrl:l,outputs:Q,quarantined:O,quarantinedMetadata:L}}catch(on){let vr=`Encountered fatal platform error while running test '${ve.name}': ${on}`,fo=new Date,ya=_e+1;Z.error({err:on},vr),v.error(vr);let Q={errorMessage:on.message,errStack:on.stack},Ds={status:"FAILED",failureDetails:Q,failureReason:"InternalPlatformError",finishedAt:fo};return await le.finish({logger:Z,result:{status:"FAILED",results:[]}}),{...Ds,runAttemptId:be,results:[],parameters:H,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:new Date,attempts:ya,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import m7 from"adm-zip";import g7 from"path";function d7(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Ns=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ar.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new dA(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:d7(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function p7(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var dA=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i;this.interactionTracer=new gi,mi.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";ar.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ar.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:p7(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Ns(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var ip=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pr),this.harPagesStream=this.diskStorage.createFileStream(`${Pr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pr}/resource-usage.ndjson`),this.resourceUsageSampler=F_({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
|
|
5104
|
+
`),1)}function fB(){return KQ()==="darwin"&&qQ("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Df(t){fB()&&t===1&&(v.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),v.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import YQ from"@actions/exec";import XQ from"@actions/io";import JQ from"quote";import ZQ from"string-argv";async function SB(t,e=!0){let r=ZQ(t),n=await XQ.which(r[0],!0),o=r.slice(1),i=YQ.exec(JQ(n),o,{delay:100});if(e)return i}import QQ from"csv-parser";import{createReadStream as e7}from"fs";function cA(t){return new Promise((e,r)=>{let n=[];e7(t).pipe(QQ()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import Rc from"semver";import{z as kf}from"zod";var nn="2.49.0",t7="https://registry.npmjs.org/momentic",r7=kf.object({versions:kf.record(kf.string(),kf.unknown()).optional()});async function ho(t){try{await n7(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function uA(){let t=await X(fetch(t7),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=r7.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=nn;for(let o of Object.keys(r))Rc.valid(o)&&Rc.major(o)===Rc.major(nn)&&Rc.gt(o,n)&&Rc.prerelease(o)===null&&(n=o);return n}async function n7(t){let e;for(let r=0;r<2;r++)try{e=await uA()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}Rc.eq(nn,e)||(v.warn(`Update available: v${nn} -> v${e}`),v.warn("This version may be missing critical fixes, features, and security updates."),v.warn('Run "npx momentic@latest upgrade" to update'))}async function Ti(){try{await X(Promise.all([M_(),ar.flush()]),{milliseconds:5e3})}catch{}}import{partition as o7}from"lodash-es";function Ff(t){return t.length===1?"test":"tests"}function yB(t){return t===1?"1 worker":`${t} workers`}function bB(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${Ff(t)}:`),t.forEach(e=>{v.info(`${Pt}- ${[e.relativeFilePath]}`)}),v.log(""))}function EB(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${Ff(t)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function i7(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${Ff(t)} with ${yB(e)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function a7(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${Ff(e)} with ${yB(r)}:`),e.forEach(n=>{v.info(`${Pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function TB({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=o7(e,s=>s.quarantined);i7(i,r),a7(i,a,r)}import{randomUUID as s7}from"crypto";import{cloneDeep as Cc}from"lodash-es";import{dirname as l7}from"path";async function vB({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await qr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function AB({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:S}){let b=await uc({settings:g,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),y={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:te,mode:"runner"},T=jp({browserType:b.browserType,orgDefaultBrowserType:g.defaultBrowserType});if(!QM(T)){let x=`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...`;v.warn(x),te.warn(x)}let C=await Wn.init({baseUrl:t,logger:d,userBrowserSettings:b,storage:a,enricher:new ia(y,c),contextArgs:{viewport:i.advanced.viewport??wr,locale:i.advanced.locale??Ni,geolocation:i.advanced.geolocation??ki,timezoneId:i.advanced.timezone??Di,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:x=>S.onNetworkPage(x),onNetworkLogs:x=>S.onNetworkLogs(x)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:x})=>{S.setActiveVideo(x)}}:void 0}),I=new pa({browser:C,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:b.slowMoMs,autoFollowNewTabs:b.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),A=new Hr({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async x=>{let{name:O,defaultValue:L,required:N}=x,V=m?.[O];N&&V===void 0&&(v.error(`Required parameter '${O}' is required by test '${i.name}' but not provided`),process.exit(1));let K=await qr({orgId:l,s:V??L,localTools:s,logger:d,context:Hr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(O,K)})),{controller:I,context:A}}async function RB({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!Xa){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),v.warn(n),!1}return!0}async function CB({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await RB({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Wh({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function wB(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await c7(t)}catch(o){let i="Fatal error running test";return v.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{},quarantined:t.quarantined,quarantinedMetadata:t.quarantinedMetadata}}}async function c7(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:g}=t,h=new rc(n,o),f=co({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Lg({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),b=S.steps,y=S.beforeSteps??void 0,T=S.afterSteps??void 0,{envName:C,resolvedEnv:I,environmentVariables:A,baseUrl:x}=fh({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:V=>ps(V,r,s)}),O=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:l7(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:x,environmentName:C,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([V,K])=>{A[V]=K});let N=await u7({...t,variables:A,envName:C,resolvedEnv:I,baseUrl:x,storageClient:h,tracer:O,logger:L,cacheStorage:f,stepsWithCaches:b,beforeStepsWithCaches:y,afterStepsWithCaches:T,usageTracker:g});return await O.finish({logger:s,status:N.status,finishedAt:N.finishedAt,failureDetails:N.failureDetails,failureReason:N.failureReason,isFlake:N.isFlake,failureRecoveryDetails:N.failureRecoveryDetails}),{runId:O.runId,...N}}async function u7(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:S,retriesOverride:b,devicePixelRatio:y,logUpdate:T,tracer:C,logger:I,cacheStorage:A,gitMetadata:x,quarantined:O,quarantinedMetadata:L,usageTracker:N}=t,V=i.config.ai?.aiFailureAnalysis??!1,K=new Date,B=new Zl(i,s,a),fe={...i.config},H={envName:p,urlOverride:m,customHeaders:g,testInputs:h},D,oe=Math.abs(b??e.retries??i.config.retries??0),ue=[];I.info({...x,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let _e=0;_e<=oe;_e++){let be=s7(),le=await C.startAttempt(be),Z=I.child(le.loggerBindings||{}),ve={...e,steps:Cc(r),beforeSteps:Cc(n),afterSteps:Cc(o)};_e!==0&&T("RETRY",`attempt ${_e+1}/${oe+1}`);let Ce=new Date,P=fe.advanced?.fakerConstantSeed,ie=new Fo({httpClient:new Sr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Z,mode:"runner"}),fakerSeed:P?yl:void 0}),ge=le;try{let{controller:on,context:vr}=await AB({tracer:le,baseUrl:l,envName:p,testName:ve.name,apiClient:s,devicePixelRatio:y,logger:Z,storageClient:u,codeEvalTools:ie,test:ve,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...ve.advanced},aiSettings:{...i.config.ai||{},...ve.advanced||{}},visualDiffScreenshotStorage:B});D=await CB({attemptMetadata:{attemptNumber:_e+1,orgId:d,runId:C.runId},attemptFixtures:{logger:Z,storageClient:u,usageTracker:N,codeEvalTools:ie,apiClient:s,context:vr,controller:on,tracer:le},attemptInputs:{test:ve,orgSettings:fe}});let fo=new Date,ya={logger:I,cacheStorage:A,orgId:d,testId:e.id,originalStepsWithCaches:{steps:Cc(r),beforeSteps:Cc(n),afterSteps:Cc(o)},updatedStepsWithCaches:{steps:ve.steps,beforeSteps:ve.beforeSteps,afterSteps:ve.afterSteps}};D?.status==="PASSED"?await ss(ya):D?.status==="FAILED"&&_e===oe&&await Wl(ya),await le.finish({logger:Z,result:D}),ue.unshift(D.status);let Q=await vB({orgId:d,codeEvalTools:ie,logger:Z,outputDefinitions:e.outputs??[],testContext:vr}),Ds=NC(ue),ks=_e+1;if(D.status!=="FAILED")return{...D,runAttemptId:be,parameters:H,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:fo,attempts:ks,baseUrl:l,outputs:Q,isFlake:Ds,quarantined:O,quarantinedMetadata:L};let ba=D.failedStepResult,$o=ba?.message||"Unknown failure",Wo=ba?.failureReason??MR($o)??"UnknownError",xc=Z.child({failureReason:Wo,errorMessage:$o,numAttempts:(oe+1).toString(),name:ve.name});if(_e<oe){xc.warn(`Retrying failed execution attempt for run: ${$o}`);continue}xc.error(`Test failed after all exhausting attempts: ${$o}`);let Fs=new Error($o),vi={errorMessage:$o,errorStack:Fs.stack},Bf;if(V){let _c;try{if(D.results&&D.results.length>0){let{classification:He,aiFailureReason:Kn}=await hL({logger:Z,browserStateStorage:ge,generator:c,fullResults:D,failureReason:Wo,error:Fs,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});_c=He,Bf=Kn}}catch(He){Z.warn({err:He},"Failed to classify test results")}_c&&(vi.classification=_c,Wo=Bf??Wo)}return{...D,runAttemptId:be,parameters:H,failureDetails:vi,failureReason:Wo,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:fo,attempts:_e+1,baseUrl:l,outputs:Q,quarantined:O,quarantinedMetadata:L}}catch(on){let vr=`Encountered fatal platform error while running test '${ve.name}': ${on}`,fo=new Date,ya=_e+1;Z.error({err:on},vr),v.error(vr);let Q={errorMessage:on.message,errStack:on.stack},Ds={status:"FAILED",failureDetails:Q,failureReason:"InternalPlatformError",finishedAt:fo};return await le.finish({logger:Z,result:{status:"FAILED",results:[]}}),{...Ds,runAttemptId:be,results:[],parameters:H,test:ve,filePath:ve.relativeFilePath,startedAt:K,lastAttemptStartedAt:Ce,finishedAt:new Date,attempts:ya,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import m7 from"adm-zip";import g7 from"path";function d7(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var Ns=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))ar.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new dA(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:d7(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function p7(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var dA=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i;this.interactionTracer=new gi,mi.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";ar.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;ar.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:p7(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Ns(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var ip=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pr),this.harPagesStream=this.diskStorage.createFileStream(`${Pr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pr}/resource-usage.ndjson`),this.resourceUsageSampler=F_({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
|
|
5105
5105
|
`)}})}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;resourceUsageStream;resourceUsageSampler;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return g7.resolve(this.diskStorage.cwd(),Pr)}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}onNetworkPage(e){this.finished||this.harPagesStream.write(`${JSON.stringify(e)}
|
|
5106
5106
|
`)}onNetworkLogs(e){if(!this.finished)for(let[r,n]of Object.entries(e))n.response?(delete this.inProgressHarEntries[r],this.harEntriesStream.write(`${JSON.stringify(n)}
|
|
5107
5107
|
`)):this.inProgressHarEntries[r]=n}attachConsoleLogs(e){let{logs:r}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(r,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:r,logger:n}=e,o=r();if(!o)return;let i=new m7;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Pr}/${qy}`,contents:i.toBuffer()}),n.info({browserCrashZipName:qy},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:r,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:Bg(n.results,r),beforeResults:n.beforeResults?Bg(n.beforeResults,r):void 0,afterResults:n.afterResults?Bg(n.afterResults,r):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt})));for(let i of Object.values(this.inProgressHarEntries))this.harEntriesStream.write(`${JSON.stringify(i)}
|
|
@@ -5110,4 +5110,4 @@ ${t.map(p=>`${Pt}- ${p}`).join(`
|
|
|
5110
5110
|
`),v.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."),Uf.existsSync(Xl)&&(v.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let e=t.name??await WM("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await NL()||await hr("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),ea({name:e,include:Xg},Xl),v.success(`Initialized Momentic project file at ${wc.resolve(Xl)}`)});dr.command("app").addOption(Tn).addOption(vn).addOption(Ei).addOption(Cf).addOption(Dr).addOption(Zv).addOption(Qv).addOption(eA).action(async t=>{await ho(te),te.setApp("desktop-server");let{apiKey:e,yes:r,server:n,pixelRatio:o,disableCache:i,saveCache:a,regenerateCache:s}=t;lE({disableCache:i,saveCache:a,regenerateCache:s});let c=await Ct({configFilePath:t.config,nameFilter:void 0}),{errors:l,parsingErrors:u,failedTestFilePaths:d,failedModuleFilePaths:p,parsingErrorDetails:m}=await tp({project:c,fix:!1});u>0?(Bl({parsingErrors:u,parsingErrorDetails:m,failedTestFilePaths:d,failedModuleFilePaths:p}),process.exit(1)):l>0&&(v.error(`Found ${l} errors`),v.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1)),U_(te);let g=new ct({baseUrl:n,apiKey:e,logger:te});await uh({client:g,skipPrompts:r});let h=OB(import.meta.url),f=wc.dirname(h),S=wc.resolve(f,"..","static"),b=wc.resolve(f,"..","assets"),y=o??Nf();Df(y),await hU({momenticServerUrl:n,apiKey:e,serverPort:Rf,appPort:Rf,staticDir:S,assetsDir:b,devicePixelRatio:y,regenerateCache:s??!1,noCache:i??!1,alwaysSaveCache:a??!1,initialProject:c});let T=`http://localhost:${Rf}`;await w7(T)});dr.command("mcp").description("Start the MCP server over stdio.").addOption(Tn).addOption(vn).addOption(Ei).addOption(Dr).addOption(LU).addOption(Cf).addOption(op).action(async t=>{te.setApp("mcp"),v.setMinLevel("error");let{apiKey:e,server:r,yes:n,headfulBrowser:o,pixelRatio:i}=t,a=o!==void 0?o:Sl(process.env.MOMENTIC_HEADFUL_BROWSER)??!0,s=i??Nf();Df(s);let c=np(t.customHeaders),l=await Ct({configFilePath:t.config,nameFilter:void 0}),{errors:u,parsingErrors:d,failedTestFilePaths:p,failedModuleFilePaths:m,parsingErrorDetails:g}=await tp({project:l,fix:!1});d>0?(Bl({parsingErrors:d,parsingErrorDetails:g,failedTestFilePaths:p,failedModuleFilePaths:m}),process.exit(1)):u>0&&(v.error(`Found ${u} errors`),v.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 h=new ct({baseUrl:r,apiKey:e,logger:te});await uh({client:h,skipPrompts:n}),await Bv({project:l,logger:te,apiKey:e,serverUrl:r,cliVersion:nn??"0.0.0",supportsFileOutput:!0,headfulBrowserDefault:a,devicePixelRatio:s,customHeaders:c})});var kB=dr.command("queue").description("Queue tests or suites to run on Momentic Cloud");kB.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Tn).addOption(vn).addOption(Wv).addOption(qv).addOption(Ei).addArgument(qU).addOption(xf).addOption(wf).addOption(op).action(async(t,e)=>{await ho(te);let{apiKey:r,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=np(e.customHeaders),l=new ct({baseUrl:n,apiKey:r,logger:te});(!t||!Array.isArray(t)||!t.length)&&(v.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await l.getAuthInfo();await aB({client:l,orgId:u,wait:o,suitePaths:t,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await Ti()});kB.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Tn).addOption(vn).addOption(Ei).addOption(op).addOption(Jv).addOption(xf).addOption(wf).addOption(new kr("--all","Run all tests.").default(!1)).addOption(Wv).addOption(qv).addArgument($U).action(async(t,e)=>{await ho(te);let{all:r,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=np(e.customHeaders);for(let h of t)(h.endsWith(".yaml")||Uf.existsSync(h))&&v.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 ct({baseUrl:i,apiKey:n,logger:te}),{orgId:m}=await p.getAuthInfo(),g;a&&(g=await cA(a)),await sB({client:p,orgId:m,tests:t,all:r,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:g,yes:u}),await Ti(),process.exit(0)});var x7=dr.command("list").description("List test paths");x7.addOption(Dr).addOption(Sa).addOption(Yv).addOption(Xv).addOption(new kr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(tA).action(async(t,e)=>{let r=await Ct({configFilePath:e.config,nameFilter:e.filter}),n=await ce(r),o=await vc({tests:t,momenticFiles:n,yes:!0,project:r,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Ya(40,{})});v.info(o.map(i=>i.relativeFilePath).join(`
|
|
5111
5111
|
`)),process.exit(0)});var _7=dr.command("run").alias("test").description("Run tests on the local machine");_7.addOption(Tn).addOption(vn).addOption(Dr).addOption(Sa).addOption(Ei).addOption(op).addOption(Jv).addOption(Zv).addOption(Qv).addOption(eA).addOption(zU).addOption(VU).addOption(HU).addOption(GU).addOption(jU).addOption(wf).addOption(xf).addOption(Cf).addOption(new kr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new kr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new kr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new kr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(go)).addOption(new kr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(go)).addOption(new kr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(go)).addOption(new kr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(XU).addOption(new kr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(NU).addOption(DU).addOption(Kv).addOption(kU).addOption(UU).addOption(FU).addOption(Yv).addOption(Xv).addOption(YU).addArgument(tA).action(async(t,e)=>{await ho(te);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;lE({disableCache:r,saveCache:n,regenerateCache:o}),nO({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=np(e.customHeaders),s=await Ct({configFilePath:e.config,nameFilter:e.filter}),c=e.parallel??s.config.parallel??1;MB().length<c*2&&v.warn(`You requested to run tests in parallel ${c} at a time on a machine with ${MB().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),v.debug({projectName:s.config.name},"Identified project config");let{errors:l,parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}=await tp({project:s,fix:!1});u>0?(Bl({parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}),process.exit(1)):l>0&&(v.error(`Found ${l} errors`),v.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 g=new ct({baseUrl:e.server,apiKey:e.apiKey,logger:te});v.debug("Checking API key and dependencies");let{orgId:h,userId:f}=await uh({client:g,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let S=e.outputDir??s.config.outputDir,b=e.reporterDir??s.config.reporterDir,y=R7(),T=te.child({cliVersion:nn,orgId:h,userId:f,runGroupId:y}),C=await fr(te,g,s);T.info({gitMetadata:C,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let I;e.inputCsv&&(I=await cA(e.inputCsv));let A=e.pixelRatio??Nf();Df(A);try{let x=await _B({...e,suiteName:i,parallel:c,retriesOverride:e.retries,devicePixelRatio:A,tests:t,project:s,client:g,outputDir:S,uploadResults:e.uploadResults,reporterDir:b,customHeaders:a,envName:e.env,orgId:h,testInputMatrix:I,logger:T,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:C,cacheOptions:{regenerateCache:o??!1,alwaysSaveCache:n??!1,noCache:r??!1,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??s.config.recordVideo,runGroupId:y,timeoutMinutes:e.timeoutMinutes});await Ti(),x.failed>0?process.exit(1):process.exit(0)}catch(x){v.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),v.error(x),await Ti(),process.exit(1)}});var I7=dr.command("apply").description("Apply an operation to local resources");I7.command("patch").addOption(Tn).addOption(vn).addOption(Dr).addOption(Sa).addOption(Ei).addOption(new kr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new kr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async t=>{let{apiKey:e,server:r,config:n,yes:o}=t,i=await Ct({configFilePath:n}),a=te,s=new ct({baseUrl:r,apiKey:e,logger:a}),c=await ce(i),l=c.tests[t.to]??Object.values(c.tests).find(d=>st(d.name)===t.to.trim());l||(v.error(`No test matching '${t.to}' could be found in the current project.`),process.exit(1));let u=await s.fetchTestFragment(t.from);await vU({client:s,test:l,fragment:u,yes:o,entities:c,logger:te}),process.exit(0)});var mA=dr.command("results").description("Merge and upload test results.");mA.command("merge").description("Merge test results files.").addOption(Kv).addArgument(KU).action(async(t,e)=>{let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),Uf.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),Uf.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),BL(te,r,t)});mA.command("upload").description("Upload test results to Momentic cloud.").addOption(Tn).addOption(vn).addArgument(rA).action(async(t,e)=>{let{apiKey:r,server:n}=e,o=te,i=new ct({baseUrl:n,apiKey:r,logger:o});await gh({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});mA.command("view").description("Launch the run viewer to view test results in your current directory.").addOption(new kr("--port <port>",`Port to run the backend server on. Defaults to ${Tm}.`).argParser(go)).addArgument(rA).addArgument(new T7("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await ho(te),te.setApp("local-run-viewer");let n=OB(import.meta.url),o=wc.dirname(n),i=wc.resolve(o,"..","run-viewer-static");await Vv({staticDir:i,resultsPath:t,runId:e,port:r.port})});var gA=dr.command("quarantine").description("Manage test quarantines");gA.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(Tn).addOption(vn).addOption(Dr).addOption(Sa).addOption(nA).addArgument(oA).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=te,s=await Ct({configFilePath:o}),c=new ct({baseUrl:n,apiKey:r,logger:a}),l=await fr(te,c,s);await QU({test:t,reason:i,apiClient:c,project:s,logger:a,identity:l})});gA.command("list").description("List quarantined tests.").addOption(Tn).addOption(vn).addOption(Dr).addOption(Sa).action(async t=>{let{apiKey:e,server:r,config:n}=t,o=te,i=await Ct({configFilePath:n}),a=new ct({baseUrl:r,apiKey:e,logger:o});await nB({apiClient:a,project:i})});gA.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(Tn).addOption(vn).addOption(Dr).addOption(Sa).addOption(nA).addArgument(oA).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=te,s=await Ct({configFilePath:o}),c=new ct({baseUrl:n,apiKey:r,logger:a}),l=await fr(te,c,s);await oB({test:t,reason:i,apiClient:c,project:s,identity:l})});dr.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(Dr).addOption(Sa).action(async t=>{let e=await Ct({configFilePath:t.config,nameFilter:t.filter});v.info("Updating Momentic version in package.json..."),await IB(),v.info("Updating project configuration..."),PB(e),v.success("Your project configuration was successfully updated to the latest recommended settings."),v.info("You can optionally run tests with the `--regenerate-cache` flag to entirely rebuild caches with the newer configuration. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.")});async function P7(){NB("Main program started");try{await dr.parseAsync(process.argv),await Ti()}catch(t){let e={};try{e.playwrightVersion=A7("npx playwright --version").toString()}catch(r){te.error({err:r},"Error fetching debug information")}te.error({err:t,debugInfo:e},"Uncaught error in CLI"),v.error(t),await Ti(),process.exit(1)}}C7.setMaxListeners(25);process.on("warning",t=>{te.warn({err:t},`Node warning received on CLI: ${t.message}`)});NB("CLI parsing setup complete");P7();
|
|
5112
5112
|
//# sourceMappingURL=cli.js.map
|
|
5113
|
-
//# debugId=
|
|
5113
|
+
//# debugId=f216725f-a41e-5a6f-86d8-1dd7732416a0
|