momentic 2.77.0 → 2.78.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 globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3e47fa1a-671a-5b3f-9e6b-e337a95a9d37")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4910b9de-c772-5d99-bef6-4375233c2bc2")}catch(e){}}();
4
4
  var E1=Object.create;var qS=Object.defineProperty;var T1=Object.getOwnPropertyDescriptor;var b1=Object.getOwnPropertyNames;var v1=Object.getPrototypeOf,A1=Object.prototype.hasOwnProperty;var Mt=(t,e)=>()=>(t&&(e=t(t=0)),e);var C1=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),R1=(t,e)=>{for(var r in e)qS(t,r,{get:e[r],enumerable:!0})},w1=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of b1(e))!A1.call(t,o)&&o!==r&&qS(t,o,{get:()=>e[o],enumerable:!(n=T1(e,o))||n.enumerable});return t};var MC=(t,e,r)=>(r=t!=null?E1(v1(t)):{},w1(e||!t||!t.__esModule?qS(r,"default",{value:t,enumerable:!0}):r,t));var xP,_P=Mt(()=>{"use strict";xP=typeof globalThis=="object"?globalThis:global});var IP=Mt(()=>{"use strict";_P()});var PP=Mt(()=>{"use strict";IP()});var Ti,rT=Mt(()=>{"use strict";Ti="1.9.0"});function tK(t){var e=new Set([t]),r=new Set,n=t.match(MP);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(MP);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 MP,OP,LP=Mt(()=>{"use strict";rT();MP=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;OP=tK(Ti)});function cc(t,e,r,n){var o;n===void 0&&(n=!1);var i=Cd[Ad]=(o=Cd[Ad])!==null&&o!==void 0?o:{version:Ti};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!==Ti){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+Ti);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+Ti+"."),!0}function bi(t){var e,r,n=(e=Cd[Ad])===null||e===void 0?void 0:e.version;if(!(!n||!OP(n)))return(r=Cd[Ad])===null||r===void 0?void 0:r[t]}function uc(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+Ti+".");var r=Cd[Ad];r&&delete r[t]}var rK,Ad,Cd,Rd=Mt(()=>{"use strict";PP();rT();LP();rK=Ti.split(".")[0],Ad=Symbol.for("opentelemetry.js.api."+rK),Cd=xP});function wd(t,e,r){var n=bi("diag");if(n)return r.unshift(e),n[t].apply(n,oK([],nK(r),!1))}var nK,oK,NP,DP=Mt(()=>{"use strict";Rd();nK=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},oK=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))},NP=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 wd("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return wd("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return wd("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return wd("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return wd("verbose",this._namespace,e)},t}()});var At,wf=Mt(()=>{"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"})(At||(At={}))});function kP(t,e){t<At.NONE?t=At.NONE:t>At.ALL&&(t=At.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",At.ERROR),warn:r("warn",At.WARN),info:r("info",At.INFO),debug:r("debug",At.DEBUG),verbose:r("verbose",At.VERBOSE)}}var UP=Mt(()=>{"use strict";wf()});var iK,aK,sK,Go,xd=Mt(()=>{"use strict";DP();UP();wf();Rd();iK=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},aK=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))},sK="diag",Go=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=bi("diag");if(s)return s[o].apply(s,aK([],iK(i),!1))}}var r=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:At.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=bi("diag"),d=kP((s=i.logLevel)!==null&&s!==void 0?s:At.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 cc("diag",d,r,!0)};r.setLogger=n,r.disable=function(){uc(sK,r)},r.createComponentLogger=function(o){return new NP(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 FP,BP=Mt(()=>{"use strict";FP=Symbol("BaggageEntryMetadata")});function nT(t){return typeof t!="string"&&(lK.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:FP,toString:function(){return t}}}var lK,zP=Mt(()=>{"use strict";xd();BP();lK=Go.instance()});function oT(t){return Symbol.for(t)}var cK,iT,aT=Mt(()=>{"use strict";cK=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}(),iT=new cK});function cT(){return lT}var vs,uK,xf,dK,pK,mK,fK,sT,hK,gK,SK,lT,yK,EK,TK,bK,vK,AK,CK,uT=Mt(()=>{"use strict";vs=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)}}(),uK=function(){function t(){}return t.prototype.createGauge=function(e,r){return EK},t.prototype.createHistogram=function(e,r){return TK},t.prototype.createCounter=function(e,r){return yK},t.prototype.createUpDownCounter=function(e,r){return bK},t.prototype.createObservableGauge=function(e,r){return AK},t.prototype.createObservableCounter=function(e,r){return vK},t.prototype.createObservableUpDownCounter=function(e,r){return CK},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),xf=function(){function t(){}return t}(),dK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(xf),pK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(xf),mK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(xf),fK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(xf),sT=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),hK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(sT),gK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(sT),SK=function(t){vs(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(sT),lT=new uK,yK=new dK,EK=new mK,TK=new fK,bK=new pK,vK=new hK,AK=new gK,CK=new SK});var yn,HP=Mt(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(yn||(yn={}))});var RK,wK,GP,jP=Mt(()=>{"use strict";aT();RK=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},wK=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))},GP=function(){function t(){}return t.prototype.active=function(){return iT},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,wK([n],RK(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var xK,_K,dT,IK,VP,$P=Mt(()=>{"use strict";jP();Rd();xd();xK=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},_K=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))},dT="context",IK=new GP,VP=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return cc(dT,e,Go.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,_K([e,r,n],xK(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return bi(dT)||IK},t.prototype.disable=function(){this._getContextManager().disable(),uc(dT,Go.instance())},t}()});var dc,WP=Mt(()=>{"use strict";$P();dc=VP.getInstance()});var ae,qP=Mt(()=>{"use strict";xd();ae=Go.instance()});var PK,KP,YP=Mt(()=>{"use strict";uT();PK=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return lT},t}(),KP=new PK});var pT,XP,JP=Mt(()=>{"use strict";YP();Rd();xd();pT="metrics",XP=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return cc(pT,e,Go.instance())},t.prototype.getMeterProvider=function(){return bi(pT)||KP},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){uc(pT,Go.instance())},t}()});var _f,QP=Mt(()=>{"use strict";JP();_f=XP.getInstance()});var yt=Mt(()=>{"use strict";zP();aT();wf();uT();HP();WP();qP();QP()});var hA=C1((Tp,fA)=>{"use strict";(function(t,e){if(typeof Tp=="object"&&typeof fA=="object")fA.exports=e();else if(typeof define=="function"&&define.amd)define([],e);else{var r=e();for(var n in r)(typeof Tp=="object"?Tp:t)[n]=r[n]}})(typeof self<"u"?self:Tp,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(n,o,i){r.o(n,o)||Object.defineProperty(n,o,{enumerable:!0,get:i})},r.r=function(n){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},r.t=function(n,o){if(1&o&&(n=r(n)),8&o||4&o&&typeof n=="object"&&n&&n.__esModule)return n;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&o&&typeof n!="string")for(var a in n)r.d(i,a,function(s){return n[s]}.bind(null,a));return i},r.n=function(n){var o=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(o,"a",o),o},r.o=function(n,o){return Object.prototype.hasOwnProperty.call(n,o)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";var n;r.r(e),function(g){g[g.Empty=0]="Empty",g[g.InsideToken=1]="InsideToken",g[g.InsideSingleQuotedToken=2]="InsideSingleQuotedToken",g[g.InsideDoubleQuotedToken=3]="InsideDoubleQuotedToken",g[g.AfterEscapeInsideToken=4]="AfterEscapeInsideToken",g[g.AfterEscapeInsideSingleQuotedToken=5]="AfterEscapeInsideSingleQuotedToken",g[g.AfterEscapeInsideDoubleQuotedToken=6]="AfterEscapeInsideDoubleQuotedToken"}(n||(n={}));var o=function(g){return[null,null]},i={onCharacter:o,onWhitespace:o,onDoubleQuote:o,onSingleQuote:o,onEscape:o},a=function(){return(a=Object.assign||function(g){for(var E,y=1,b=arguments.length;y<b;y++)for(var R in E=arguments[y])Object.prototype.hasOwnProperty.call(E,R)&&(g[R]=E[R]);return g}).apply(this,arguments)},s=a({},i,{stateHandle:n.AfterEscapeInsideDoubleQuotedToken,onCharacter:function(g){return["\\"+g,n.InsideDoubleQuotedToken]},onWhitespace:function(g){return["\\"+g,n.InsideDoubleQuotedToken]},onSingleQuote:function(g){return["\\"+g,n.InsideDoubleQuotedToken]},onDoubleQuote:function(g){return[g,n.InsideDoubleQuotedToken]},onEscape:function(g){return[g,n.InsideDoubleQuotedToken]}}),c=a({},i,{stateHandle:n.AfterEscapeInsideSingleQuotedToken,onCharacter:function(g){return["\\"+g,n.InsideSingleQuotedToken]},onWhitespace:function(g){return["\\"+g,n.InsideSingleQuotedToken]},onSingleQuote:function(g){return[g,n.InsideSingleQuotedToken]},onDoubleQuote:function(g){return["\\"+g,n.InsideSingleQuotedToken]},onEscape:function(g){return[g,n.InsideSingleQuotedToken]}}),l=a({},i,{stateHandle:n.AfterEscapeInsideToken,onCharacter:function(g){return[g,n.InsideToken]},onWhitespace:function(g){return[g,n.InsideToken]},onSingleQuote:function(g){return[g,n.InsideToken]},onDoubleQuote:function(g){return[g,n.InsideToken]},onEscape:function(g){return[g,n.InsideToken]}}),u=a({},i,{stateHandle:n.Empty,onCharacter:function(g){return[g,n.InsideToken]},onSingleQuote:function(){return[null,n.InsideSingleQuotedToken]},onDoubleQuote:function(){return[null,n.InsideDoubleQuotedToken]},onEscape:function(){return[null,n.AfterEscapeInsideToken]}}),d=a({},i,{stateHandle:n.InsideDoubleQuotedToken,onCharacter:function(g){return[g,null]},onWhitespace:function(g){return[g,null]},onSingleQuote:function(g){return[g,null]},onDoubleQuote:function(){return["",n.Empty]},onEscape:function(){return["",n.AfterEscapeInsideDoubleQuotedToken]}}),p=a({},i,{stateHandle:n.InsideSingleQuotedToken,onCharacter:function(g){return[g,null]},onWhitespace:function(g){return[g,null]},onSingleQuote:function(){return["",n.Empty]},onDoubleQuote:function(g){return[g,null]},onEscape:function(){return["",n.AfterEscapeInsideSingleQuotedToken]}}),m=[u,a({},i,{stateHandle:n.InsideToken,onCharacter:function(g){return[g,null]},onWhitespace:function(){return[null,n.Empty]},onSingleQuote:function(){return["",n.InsideSingleQuotedToken]},onDoubleQuote:function(){return["",n.InsideDoubleQuotedToken]},onEscape:function(){return["",n.AfterEscapeInsideToken]}}),p,d,l,c,s];function f(g){for(var E=0,y=m;E<y.length;E++){var b=y[E];if(b.stateHandle===g)return b}throw new Error("State with handle = "+g+" cannot be found")}var h=function(){function g(){this.currentState=f(n.Empty)}return g.prototype.handleCharacter=function(E){var y=this.performTransition(E),b=y[0],R=y[1];return R!==null&&(this.currentState=f(R)),b},g.prototype.performTransition=function(E){var y=this.currentState;switch(E){case" ":return y.onWhitespace(E);case"'":return y.onSingleQuote(E);case'"':return y.onDoubleQuote(E);case"\\":return y.onEscape(E);default:return y.onCharacter(E)}},g}();function S(g){for(var E=new h,y=[],b=0,R=0,I=g;R<I.length;R++){var _=I[R],A=E.handleCharacter(_);A!==null?y[b]=y[b]?y[b]+A:A:y[b]&&b++}return y}r.d(e,"default",function(){return S}),S.default=S}]).default})});import jwe,{multistream as $we}from"pino";import qwe from"pino-pretty";import{z as KS}from"zod";var Sne=KS.object({input:KS.string(),agentConfigVersion:KS.string().optional()}),mu="finish";import{z as tr}from"zod";var Tne=tr.object({srcs:tr.array(tr.string()),urls:tr.array(tr.string()),desiredSrc:tr.string().optional(),desiredUrl:tr.string().optional()}),OC=tr.object({srcRegex:tr.string().optional(),urlRegex:tr.string().optional()}),LC=tr.object({x:tr.number(),y:tr.number(),correlation:tr.number()}),bne=tr.object({searchImageBase64String:tr.string(),pageImageBase64String:tr.string(),id:tr.string().uuid(),timeoutMs:tr.number().max(1e4).min(0).optional()});import{z as k}from"zod";import*as j from"zod";import{extendZodWithOpenApi as x1}from"zod-openapi";import fu from"zod";var Va=fu.object({updatedAt:fu.coerce.date().optional()}),$a=fu.object({contentType:fu.enum(["image/jpeg","image/png"]),id:fu.string()});x1(j);var Oo=(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))(Oo||{}),_1=j.object({mPathSelectorTokens:j.string().array(),frameSrcRegex:j.string().optional(),frameUrlRegex:j.string().optional(),indices:j.number().array()}),hu=j.object({result:j.number(),traceId:j.string()}).array(),po=j.object({type:j.literal("GCS_TRACES"),traces:hu}),tn=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(tn||{}),NC=j.object({attributes:j.record(j.string(),j.string()).optional(),text:j.string().optional(),position:j.object({x1:j.number(),y1:j.number(),x2:j.number(),y2:j.number(),tolerance:j.nativeEnum(tn)}).optional(),shape:j.object({width:j.number(),height:j.number(),tolerance:j.nativeEnum(tn)}).optional(),boundingBox:j.object({x:j.number(),y:j.number(),width:j.number(),height:j.number()}).optional()}),I1=j.object({selectors:j.string().array(),requirements:NC.optional(),relativeAngleRadians:j.number().min(0).max(2*Math.PI).optional(),relativeDistance:j.number().optional()}),ui=j.object({id:j.number().int(),dataMomenticId:j.number().int().optional(),selector:j.string().optional(),hybridSelector:j.object({textContent:j.string().nullish(),attributes:j.record(j.string(),j.string().optional()),tagName:j.string(),expandShadowRoot:j.boolean().optional(),classNames:j.string().array(),nthChild:j.number()}).array().optional(),generatedSelectors:j.string().array().optional(),requirements:NC.optional(),additionalElements:I1.array().optional(),role:j.string().optional(),name:j.string().optional(),numChildren:j.number().optional(),content:j.string().optional(),pathFromRoot:j.string().optional(),serializedHtml:j.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:j.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:j.string().url().optional().or($a.optional()),boundingBox:j.object({x:j.number().optional(),y:j.number().optional(),width:j.number(),height:j.number()}).describe("css pixel bounding box").optional(),frameCache:_1.optional(),inputDescription:j.string().optional().describe("the description that generated this cache"),targetSource:j.nativeEnum(Oo).optional(),targetUpdateTime:j.string().optional(),targetUpdateLoggerTags:j.record(j.string(),j.string()).optional(),cacheResolutionUpdateSource:j.string().optional(),cacheResolutionUpdateTime:j.string().optional(),cacheResolutionUpdateLoggerTags:j.record(j.string(),j.string()).optional(),memory:po.optional()}).openapi({ref:"ElementTargetCache"});function fl(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var P1=j.object({type:j.literal("description"),elementDescriptor:j.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),M1=j.object({x:j.number(),y:j.number()}),O1=j.object({type:j.literal("coordinates"),pixels:M1}).openapi({ref:"CoordinatesTarget"});function Gi(t){return t.type==="description"}function Lo(t){return t.type==="coordinates"}var xr=j.discriminatedUnion("type",[P1,O1]).openapi({ref:"ElementTarget"});function YS(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function _r(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function Jp(t){return po.safeParse(t).success}import{v4 as ct}from"uuid";import*as w from"zod";import{extendZodWithOpenApi as V1}from"zod-openapi";import{z as ze}from"zod";import{extendZodWithOpenApi as L1}from"zod-openapi";import{z as gu}from"zod";var Su=gu.object({result:gu.boolean(),traceId:gu.string()}).array(),Wa=gu.object({type:gu.literal("GCS_TRACES"),traces:Su}),XS=Va.extend({memory:Wa.optional()});var hl=(b=>(b.MissingScript="missing-script",b.EvaluationError="evaluation-error",b.NoSelectors="no-selectors",b.NoSelectorsMatched="no-selectors-matched",b.NotEnoughSelectorsMatched="not-enough-selectors-matched",b.CandidateHasNoBoundingBox="candidate-has-no-bounding-box",b.AdditionalElementsDoNotExist="additional-elements-do-not-exist",b.BoundingBoxChanged="bounding-box-changed",b.FailedLdistCheck="failing-ldist",b.FailedTextRequirements="failed-text-requirements",b.FailedAttributeRequirements="failed-attribute-requirements",b.FailedBoundingBoxRequirements="failed-bounding-box-requirements",b.FailedPositionRequirements="failed-position-requirements",b.FailedShapeRequirements="failed-shape-requirements",b.NoWinnerFound="no-winner-found",b.AmbiguousWinner="ambiguous-winner",b.WeakWinner="weak-winner",b.SecondaryResolutionFailed="secondary-resolution-failed",b.CouldNotFindIframe="could-not-find-iframe",b.Unknown="unknown",b))(hl||{});L1(ze);var DC=ze.object({thoughts:ze.string(),result:ze.boolean(),relevantElements:ze.array(ze.number()).optional(),updatedMemory:Su.optional()}),hn=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(hn||{});var JS=["EXISTS","VISIBLE","ENABLED","EDITABLE","FOCUSED","CONTENT_CONTAINS","CONTENT_EQUALS","CONTENT_STARTS_WITH","ATTRIBUTE_CONTAINS","ATTRIBUTE_EQUALS","ATTRIBUTE_STARTS_WITH","NAME_CONTAINS","NAME_EQUALS","NAME_STARTS_WITH","STYLE_CONTAINS","STYLE_EQUALS","STYLE_STARTS_WITH"],N1=ze.object({type:ze.literal("ELEMENT_NAME"),negated:ze.boolean().optional(),operation:ze.nativeEnum(hn),value:ze.string()}).openapi({ref:"ElementNameAssertion"}),D1=ze.object({type:ze.literal("ELEMENT_STYLE"),negated:ze.boolean().optional(),operation:ze.nativeEnum(hn),property:ze.string(),value:ze.string()}).openapi({ref:"ElementStyleAssertion"}),k1=ze.object({type:ze.literal("ELEMENT_CONTENT"),negated:ze.boolean().optional(),operation:ze.nativeEnum(hn),value:ze.string()}).openapi({ref:"ElementContentAssertion"}),U1=ze.object({type:ze.literal("ELEMENT_ATTRIBUTE"),negated:ze.boolean().optional(),operation:ze.nativeEnum(hn),attr:ze.string(),value:ze.string()}).openapi({ref:"ElementAttributeValueAssertion"}),On=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(On||{});var F1=ze.object({type:ze.literal("ELEMENT_EXISTENCE"),negated:ze.boolean().optional(),condition:ze.nativeEnum(On).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Qp=ze.discriminatedUnion("type",[k1,U1,F1,N1,D1]).openapi({ref:"ManualElementAssertion"});var B1=ze.object({type:ze.literal("CONTENT"),negated:ze.boolean().optional(),value:ze.string()}).openapi({ref:"PageContentAssertion"}),kC=ze.discriminatedUnion("type",[B1]).openapi({ref:"ManualPageAssertion"});import jr from"zod";var yu=jr.discriminatedUnion("type",[jr.object({type:jr.literal("SUBSTRING"),url:jr.string()}),jr.object({type:jr.literal("GLOB"),glob:jr.string()}),jr.object({type:jr.literal("REGEX"),regex:jr.string()}),jr.object({type:jr.literal("DOMAIN"),domain:jr.string()})]),Eu=jr.object({urlMatcher:yu,method:jr.string().optional()});import{z as Ze}from"zod";var z1=Ze.object({type:Ze.literal("json"),content:Ze.string().describe("The JSON content to send in the request body")}),H1=Ze.object({type:Ze.literal("form-urlencoded"),content:Ze.record(Ze.string(),Ze.string()).describe("The form fields to send in the request body")}),G1=Ze.discriminatedUnion("type",[z1,H1]),j1=["GET","POST","PUT","DELETE","PATCH"],Tu=Ze.enum(j1),qa=Ze.object({url:Ze.string(),method:Tu,headers:Ze.record(Ze.string(),Ze.string()).optional(),params:Ze.record(Ze.string(),Ze.string()).optional(),body:G1.optional(),timeout:Ze.number().int().optional().describe("Max seconds to wait for the request to complete")}),UC=Ze.object({url:Ze.string(),headers:Ze.record(Ze.string(),Ze.string()).optional(),query:Ze.string(),variables:Ze.string().optional(),timeout:Ze.number().int().optional().describe("Max seconds to wait for the request to complete")}),Zp=Ze.object({code:Ze.string(),fragment:Ze.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:Ze.union([Ze.literal("NODE"),Ze.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:Ze.number().int().max(60).optional().describe("Max seconds for the code to complete")});var et=(ue=>(ue.AI_EXTRACT="AI_EXTRACT",ue.AI_ASSERTION="AI_ASSERTION",ue.AUTH_LOAD="AUTH_LOAD",ue.AUTH_SAVE="AUTH_SAVE",ue.BLUR="BLUR",ue.CAPTCHA="CAPTCHA",ue.CLICK="CLICK",ue.COOKIE="COOKIE",ue.COPY="COPY",ue.DIALOG="DIALOG",ue.DRAG="DRAG",ue.ELEMENT_CHECK="ELEMENT_CHECK",ue.FILE_UPLOAD="FILE_UPLOAD",ue.FOCUS="FOCUS",ue.GO_BACK="GO_BACK",ue.GO_FORWARD="GO_FORWARD",ue.HOVER="HOVER",ue.JAVASCRIPT="JAVASCRIPT",ue.LOCAL_STORAGE="LOCAL_STORAGE",ue.MOUSE_DRAG="MOUSE_DRAG",ue.NAVIGATE="NAVIGATE",ue.NEW_TAB="NEW_TAB",ue.PAGE_CHECK="PAGE_CHECK",ue.PASTE="PASTE",ue.PRESS="PRESS",ue.KEY_DOWN="KEY_DOWN",ue.KEY_UP="KEY_UP",ue.REFRESH="REFRESH",ue.REQUEST="REQUEST",ue.GRAPHQL_REQUEST="GRAPHQL_REQUEST",ue.SCROLL_DOWN="SCROLL_DOWN",ue.SCROLL_UP="SCROLL_UP",ue.SCROLL_LEFT="SCROLL_LEFT",ue.SCROLL_RIGHT="SCROLL_RIGHT",ue.SELECT_OPTION="SELECT_OPTION",ue.SWITCH_TAB="TAB",ue.TYPE="TYPE",ue.VISUAL_DIFF="VISUAL_DIFF",ue.WAIT="WAIT",ue.WAIT_FOR_URL="WAIT_FOR_URL",ue.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",ue.AWAIT_LISTENER="AWAIT_LISTENER",ue.RECORD_REQUESTS="RECORD_REQUESTS",ue.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",ue.SET_HEADER="SET_HEADER",ue.MOCK_ROUTE="MOCK_ROUTE",ue.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",ue.OFFLINE_MODE="OFFLINE_MODE",ue.SUCCESS="SUCCESS",ue))(et||{});V1(w);var he=w.object({thoughts:w.string().optional(),id:w.string().uuid().describe("unique identifier to this step, used for step cache")}),Nn=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"}),gn=Va.extend({target:ui}).optional().openapi({ref:"SingleTargetCache"});function em(t){return!!t&&gn.safeParse(t).success}var tm=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),FC=he.merge(tm).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),rm=Nn.merge(w.object({cache:gn})),Ka=he.merge(rm.merge(w.object({target:xr.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Ya=he.merge(rm.merge(w.object({target:xr.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),gl=he.merge(rm.merge(w.object({target:xr.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Sl=he.merge(rm.merge(w.object({target:xr.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),roe=w.discriminatedUnion("type",[Ka,Ya,gl,Sl]).openapi({ref:"AllScrollCommands"}),$1=he.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),BC=he.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),W1=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")}),zC=he.extend({type:w.literal("WAIT_FOR_URL"),matcher:yu}).merge(W1).openapi({ref:"WaitUrlCommand"}),HC=he.merge(tm).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),GC=he.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),jC=he.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),q1=he.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),K1=he.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"}),QS=he.merge(Nn).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),VC=he.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),$C=he.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),WC=he.merge(Zp).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),yl=he.merge(Nn).extend({type:w.literal("CLICK"),target:xr,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:gn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()}).openapi({ref:"ClickCommand"}),ZS=Va.extend({fromTarget:ui.optional(),toTarget:ui.optional()}),El=he.merge(Nn).merge(w.object({type:w.literal("DRAG"),fromTarget:xr,toTarget:xr,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:ZS.optional()})).openapi({ref:"DragCommand"}),Tl=he.merge(Nn).merge(w.object({type:w.literal("MOUSE_DRAG"),target:xr.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:gn})).openapi({ref:"MouseDragCommand"}),bl=he.merge(Nn).merge(w.object({type:w.literal("HOVER"),target:xr,cache:gn})).openapi({ref:"HoverCommand"}),vu=he.merge(Nn).merge(w.object({type:w.literal("FOCUS"),target:xr,cache:gn})).openapi({ref:"FocusCommand"}),Au=he.merge(Nn).extend({type:w.literal("BLUR"),target:xr.optional(),cache:gn}).openapi({ref:"BlurCommand"}),Y1=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),X1=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),J1=he.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[Y1,X1]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),qC=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()})]),vl=he.merge(Nn).extend({type:w.literal("SELECT_OPTION"),target:xr,cache:gn,choice:qC.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),ey=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),Cu=he.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:ey.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:XS.optional(),source:w.string().optional()})).openapi({ref:"AIAssertionCommand"}),Dn=5,Xa=600,Al=he.merge(Nn).extend({type:w.literal("ELEMENT_CHECK"),target:xr,assertion:Qp,cache:gn.or(XS).optional(),timeout:w.number().int().min(0).max(Xa).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),KC=he.extend({type:w.literal("PAGE_CHECK"),assertion:kC,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"}),YC=he.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"}),Q1=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()}),XC=25,Cl=he.merge(Nn).merge(Q1).extend({type:w.literal("TYPE"),target:xr.optional(),value:w.string(),cache:gn}).openapi({ref:"TypeCommand"}),JC=he.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"}),QC=he.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),ZC=he.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),Z1=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),eG=w.object({type:w.literal("REGEX"),pattern:w.string()}),tG=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),rG=w.discriminatedUnion("type",[Z1,eG,tG]),nG=he.merge(tm).merge(w.object({type:w.literal("TAB"),action:rG})).openapi({ref:"TabCommand"}),eR=he.merge(tm).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),oG=he.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),tR=he.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),rR=he.extend({type:w.literal("REQUEST")}).merge(qa).openapi({ref:"RequestCommand"}),Ru=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()})}),nR=he.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(UC).openapi({ref:"GraphQLRequestCommand"}),oR=he.merge(w.object({type:w.literal("SUCCESS"),condition:Cu.optional()})).openapi({ref:"SuccessCommand"}),iR=he.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),iG=w.object({data:w.union([w.string().describe("location at which to find a jpg - public URL or local"),$a]),width:w.number(),height:w.number()});function aR(t){return t?$a.safeParse(t).success:!1}var wu=he.merge(Nn).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:xr.optional(),screenshot:iG.optional(),cache:gn})).openapi({ref:"VisualDiffCommand"}),sR=he.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Eu,key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),aG=he.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),lR=he.merge(w.object({type:w.literal("RECORD_REQUESTS"),requestMatcher:Eu,key:w.string()})).openapi({ref:"RecordRequestsCommand"}),sG=he.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),cR=he.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),requestMatcher:Eu.optional()})).openapi({ref:"SetHeaderCommand"}),uR=he.merge(w.object({type:w.literal("MOCK_ROUTE"),requestMatcher:Eu,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"})),lG=he.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"})),cG=he.merge(w.object({type:w.literal("OFFLINE_MODE"),enable:w.boolean()})).openapi({ref:"OfflineModeCommand"}),uG=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],noe=[...uG,"DRAG"],dG=w.discriminatedUnion("type",[yl,Cl,JC,QC,ZC,vl,FC,Ya,Ka,Cu,GC,bl,BC]),pG=w.discriminatedUnion("type",[...dG.options,El]),mG=w.discriminatedUnion("type",[...pG.options]),dR=w.discriminatedUnion("type",[...mG.options,oR]),ty=w.discriminatedUnion("type",[oR,yl,Cl,JC,QC,ZC,vl,FC,Ya,Ka,Cu,GC,bl,BC,WC,Al,KC,eR,zC,YC,VC,jC,tR,El,Tl,$C,HC,rR,nR,cR,sR,lR,uR]),fG=w.discriminatedUnion("type",[YC,K1,q1,QS,oG,VC,$1,Al,J1,jC,WC,tR,Tl,eR,KC,$C,HC,rR,nR,gl,Sl,nG,wu,vu,Au,zC,sR,aG,lR,sG,cR,uR,lG,cG]),Rl=w.discriminatedUnion("type",[...dR.options,...fG.options]).openapi({ref:"Command"}),nm=w.discriminatedUnion("type",[...dR.options,iR]),ooe=w.discriminatedUnion("type",[...ty.options,iR]);function di(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:ct(),type:t};break;case"AUTH_LOAD":{e={id:ct(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:ct(),type:t,goal:""};break;case"DIALOG":e={id:ct(),type:t,action:"DISMISS"};break;case"DRAG":e={id:ct(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ct(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ct(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ct(),type:t,delay:1};break;case"BLUR":e={id:ct(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ct(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ct(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ct(),type:t,value:""};break;case"SELECT_OPTION":e={id:ct(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ct(),type:t,url:""};case"TAB":e={id:ct(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ct(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ct(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ct(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:ct(),type:t,code:""};break;case"AI_ASSERTION":e={id:ct(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:ct(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ct(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"VISIBLE"}};break}case"PAGE_CHECK":{e={id:ct(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ct(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ct(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:ct(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ct(),type:t,key:""};break}case"SET_HEADER":{e={id:ct(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ct(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ct(),type:t};break}case"OFFLINE_MODE":{e={id:ct(),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 loe={AI_ASSERTION:"AI check",ELEMENT_CHECK:"Element check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page check"};import{z as hG}from"zod";var moe=hG.discriminatedUnion("type",[Au,QS,yl,El,vu,bl,Tl,Ka,Ya,gl,Sl,vl,Cl,wu,Al]);function pR(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as im}from"zod";import{z as Vr}from"zod";function wl(t){return Vr.object({key:Vr.string(),testId:Vr.string().optional(),environment:Vr.string().optional(),moduleId:Vr.string().optional(),organizationId:Vr.string(),value:t})}function Ja(t){return Vr.object({key:Vr.string(),testId:Vr.string().optional(),environment:Vr.string().optional(),moduleId:Vr.string().optional(),organizationId:Vr.string(),value:t,uniqueKey:Vr.string()})}function mR(t){return Vr.record(Vr.string(),Ja(t))}import{v4 as hR}from"uuid";import{z as Vi}from"zod";import{extendZodWithOpenApi as yG}from"zod-openapi";import{z as fR}from"zod";import{extendZodWithOpenApi as gG}from"zod-openapi";import{z as ji}from"zod";var kn=ji.object({index:ji.number().optional().describe("global index within a test (in-order traversal)"),id:ji.string(),skipped:ji.boolean().optional(),comment:ji.string().optional(),envKey:ji.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:ji.boolean().optional(),retries:ji.number().optional()});gG(fR);var SG=kn.extend({type:fR.literal("PRESET_ACTION")}),Ir=SG.extend({command:Rl}).openapi({ref:"PresetAction"});yG(Vi);var xu=30,xl=(r=>(r.V2="2",r.V3="3",r))(xl||{}),EG=Vi.nativeEnum(xl),ry=Va.extend({resolvedGoal:Vi.string(),steps:Ir.array()}),_l=kn.extend({type:Vi.literal("AI_ACTION_DYNAMIC"),text:Vi.string(),retries:Vi.number().optional(),version:EG.optional(),cache:ry.optional(),precondition:Vi.string().optional(),postcondition:Vi.string().optional()}).openapi({ref:"AIActionDynamic"});function gR(t){return{id:hR(),type:"PRESET_ACTION",command:{id:hR(),type:"AI_ASSERTION",assertion:t,timeout:5}}}function om(t){return{preconditionStep:t.precondition?.trim()?gR(t.precondition):void 0,generatedSteps:t.cache?.steps??[],postconditionStep:t.postcondition?.trim()?gR(t.postcondition):void 0}}var $r={type:!0,cache:!0},No=im.discriminatedUnion("type",[Cu.pick($r),Au.pick($r),yl.pick($r),El.pick($r),Al.pick($r),vu.pick($r),bl.pick($r),Tl.pick($r),Ka.pick($r),Ya.pick($r),gl.pick($r),Sl.pick($r),vl.pick($r),Cl.pick($r),wu.pick($r)]),TG=im.object({type:im.literal("AI_ACTION_DYNAMIC"),cache:ry}),Il=im.union([No,TG]),am=Object.values(et).filter(t=>No.options.some(e=>e.shape.type.safeParse(t).success));Rl.options.forEach(t=>{if("target"in t.shape&&!am.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function Un(t){return am.includes(t.type)}var SR=wl(Il),yR=Ja(Il),joe=mR(Il);import{v4 as $se}from"uuid";import{z as M}from"zod";var TR=Symbol("Let zodToJsonSchema decide on which parser to use");var ER={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"},bR=t=>typeof t=="string"?{...ER,name:t}:{...ER,...t};var vR=t=>{let e=bR(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 ny(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function qe(t,e,r,n,o){t[e]=r,ny(t,e,n,o)}var sm=(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 je}from"zod";function wt(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?sm(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as bG}from"zod";function AR(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==bG.ZodAny&&(r.items=Se(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&qe(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&qe(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(qe(r,"minItems",t.exactLength.value,t.exactLength.message,e),qe(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function CR(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?qe(r,"minimum",n.value,n.message,e):qe(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),qe(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?qe(r,"maximum",n.value,n.message,e):qe(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),qe(r,"maximum",n.value,n.message,e));break;case"multipleOf":qe(r,"multipleOf",n.value,n.message,e);break}return r}function RR(){return{type:"boolean"}}function lm(t,e){return Se(t.type._def,e)}var wR=(t,e)=>Se(t.innerType._def,e);function oy(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>oy(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 vG(t,e)}}var vG=(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":qe(r,"minimum",n.value,n.message,e);break;case"max":qe(r,"maximum",n.value,n.message,e);break}return r};function xR(t,e){return{...Se(t.innerType._def,e),default:t.defaultValue()}}function _R(t,e){return e.effectStrategy==="input"?Se(t.schema._def,e):wt(e)}function IR(t){return{type:"string",enum:Array.from(t.values)}}var AG=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function PR(t,e){let r=[Se(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),Se(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(AG(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 MR(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 _u}from"zod";var iy,mo={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:()=>(iy===void 0&&(iy=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),iy),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 cm(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":qe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":qe(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":fo(r,"email",n.message,e);break;case"format:idn-email":fo(r,"idn-email",n.message,e);break;case"pattern:zod":Wr(r,mo.email,n.message,e);break}break;case"url":fo(r,"uri",n.message,e);break;case"uuid":fo(r,"uuid",n.message,e);break;case"regex":Wr(r,n.regex,n.message,e);break;case"cuid":Wr(r,mo.cuid,n.message,e);break;case"cuid2":Wr(r,mo.cuid2,n.message,e);break;case"startsWith":Wr(r,RegExp(`^${ay(n.value,e)}`),n.message,e);break;case"endsWith":Wr(r,RegExp(`${ay(n.value,e)}$`),n.message,e);break;case"datetime":fo(r,"date-time",n.message,e);break;case"date":fo(r,"date",n.message,e);break;case"time":fo(r,"time",n.message,e);break;case"duration":fo(r,"duration",n.message,e);break;case"length":qe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),qe(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{Wr(r,RegExp(ay(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&fo(r,"ipv4",n.message,e),n.version!=="v4"&&fo(r,"ipv6",n.message,e);break}case"base64url":Wr(r,mo.base64url,n.message,e);break;case"jwt":Wr(r,mo.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Wr(r,mo.ipv4Cidr,n.message,e),n.version!=="v4"&&Wr(r,mo.ipv6Cidr,n.message,e);break}case"emoji":Wr(r,mo.emoji(),n.message,e);break;case"ulid":{Wr(r,mo.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{fo(r,"binary",n.message,e);break}case"contentEncoding:base64":{qe(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Wr(r,mo.base64,n.message,e);break}}break}case"nanoid":Wr(r,mo.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function ay(t,e){return e.patternStrategy==="escape"?RG(t):t}var CG=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function RG(t){let e="";for(let r=0;r<t.length;r++)CG.has(t[r])||(e+="\\"),e+=t[r];return e}function fo(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}}})):qe(t,"format",e,r,n)}function Wr(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:OR(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):qe(t,"pattern",OR(e,n),r,n)}function OR(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
@@ -8,7 +8,7 @@ var E1=Object.create;var qS=Object.defineProperty;var T1=Object.getOwnPropertyDe
8
8
  ]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return o}function um(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===_u.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((n,o)=>({...n,[o]:Se(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??wt(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let r={type:"object",additionalProperties:Se(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return r;if(t.keyType?._def.typeName===_u.ZodString&&t.keyType._def.checks?.length){let{type:n,...o}=cm(t.keyType._def,e);return{...r,propertyNames:o}}else{if(t.keyType?._def.typeName===_u.ZodEnum)return{...r,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===_u.ZodBranded&&t.keyType._def.type._def.typeName===_u.ZodString&&t.keyType._def.type._def.checks?.length){let{type:n,...o}=lm(t.keyType._def,e);return{...r,propertyNames:o}}}return r}function LR(t,e){if(e.mapStrategy==="record")return um(t,e);let r=Se(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||wt(e),n=Se(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||wt(e);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}function NR(t){let e=t.values,n=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function DR(t){return t.target==="openAi"?void 0:{not:wt({...t,currentPath:[...t.currentPath,"not"]})}}function kR(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var Iu={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function FR(t,e){if(e.target==="openApi3")return UR(t,e);let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(n=>n._def.typeName in Iu&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,i)=>{let a=Iu[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:r.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(r.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return UR(t,e)}var UR=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((n,o)=>Se(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};function BR(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:Iu[t.innerType._def.typeName],nullable:!0}:{type:[Iu[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=Se(t.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let r=Se(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function zR(t,e){let r={type:"number"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"int":r.type="integer",ny(r,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?qe(r,"minimum",n.value,n.message,e):qe(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),qe(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?qe(r,"maximum",n.value,n.message,e):qe(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),qe(r,"maximum",n.value,n.message,e));break;case"multipleOf":qe(r,"multipleOf",n.value,n.message,e);break}return r}function HR(t,e){let r=e.target==="openAi",n={type:"object",properties:{}},o=[],i=t.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=xG(c);l&&r&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=Se(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=wG(t,e);return a!==void 0&&(n.additionalProperties=a),n}function wG(t,e){if(t.catchall._def.typeName!=="ZodNever")return Se(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function xG(t){try{return t.isOptional()}catch{return!0}}var GR=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return Se(t.innerType._def,e);let r=Se(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return r?{anyOf:[{not:wt(e)},r]}:wt(e)};var jR=(t,e)=>{if(e.pipeStrategy==="input")return Se(t.in._def,e);if(e.pipeStrategy==="output")return Se(t.out._def,e);let r=Se(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=Se(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter(o=>o!==void 0)}};function VR(t,e){return Se(t.type._def,e)}function $R(t,e){let n={type:"array",uniqueItems:!0,items:Se(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&qe(n,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&qe(n,"maxItems",t.maxSize.value,t.maxSize.message,e),n}function WR(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,n)=>Se(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:Se(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,n)=>Se(r._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}function qR(t){return{not:wt(t)}}function KR(t){return wt(t)}var YR=(t,e)=>Se(t.innerType._def,e);var XR=(t,e,r)=>{switch(e){case je.ZodString:return cm(t,r);case je.ZodNumber:return zR(t,r);case je.ZodObject:return HR(t,r);case je.ZodBigInt:return CR(t,r);case je.ZodBoolean:return RR();case je.ZodDate:return oy(t,r);case je.ZodUndefined:return qR(r);case je.ZodNull:return kR(r);case je.ZodArray:return AR(t,r);case je.ZodUnion:case je.ZodDiscriminatedUnion:return FR(t,r);case je.ZodIntersection:return PR(t,r);case je.ZodTuple:return WR(t,r);case je.ZodRecord:return um(t,r);case je.ZodLiteral:return MR(t,r);case je.ZodEnum:return IR(t);case je.ZodNativeEnum:return NR(t);case je.ZodNullable:return BR(t,r);case je.ZodOptional:return GR(t,r);case je.ZodMap:return LR(t,r);case je.ZodSet:return $R(t,r);case je.ZodLazy:return()=>t.getter()._def;case je.ZodPromise:return VR(t,r);case je.ZodNaN:case je.ZodNever:return DR(r);case je.ZodEffects:return _R(t,r);case je.ZodAny:return wt(r);case je.ZodUnknown:return KR(r);case je.ZodDefault:return xR(t,r);case je.ZodBranded:return lm(t,r);case je.ZodReadonly:return YR(t,r);case je.ZodCatch:return wR(t,r);case je.ZodPipeline:return jR(t,r);case je.ZodFunction:case je.ZodVoid:case je.ZodSymbol:return;default:return(n=>{})(e)}};function Se(t,e,r=!1){let n=e.seen.get(t);if(e.override){let s=e.override?.(t,e,n,r);if(s!==TR)return s}if(n&&!r){let s=_G(n,e);if(s!==void 0)return s}let o={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,o);let i=XR(t,t.typeName,e),a=typeof i=="function"?Se(i(),e):i;if(a&&IG(t,e,a),e.postProcess){let s=e.postProcess(a,t,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var _G=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:sm(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,n)=>e.currentPath[n]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),wt(e)):e.$refStrategy==="seen"?wt(e):void 0}},IG=(t,e,r)=>(t.description&&(r.description=t.description,e.markdownDescription&&(r.markdownDescription=t.description)),r);var Qa=(t,e)=>{let r=vR(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:Se(u._def,{...r,currentPath:[...r.basePath,r.definitionPath,l]},!0)??wt(r)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=Se(t._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},!1)??wt(r),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),r.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[r.openAiAnyTypeName]||(n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[r.definitionPath]:n}:i:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:i}};return r.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as Do}from"zod";import{extendZodWithOpenApi as PG}from"zod-openapi";PG(Do);var Ne=(m=>(m.AI_PROVIDER="AIProviderError",m.USER_INFRA="UserInfrastructureError",m.ACTION_FAILURE="ActionFailureError",m.NO_MATCHING_ELEMENT="NoMatchingElementError",m.ASSERTION_FAILURE="AssertionFailureError",m.CONFIG_ERROR="UserConfigurationError",m.SETUP_FAILURE="SetupFailureError",m.TEARDOWN_FAILURE="TeardownFailureError",m.WEB_AGENT_PLATFORM="InternalWebAgentError",m.UNKNOWN_PLATFORM="InternalPlatformError",m.JOB_TIMEOUT="JobTimeoutError",m.CONCURRENCY_ERROR="ConcurrencyError",m.UNKNOWN="UnknownError",m))(Ne||{});var JR=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Pl={ActionFailureError:"Action failure",NoMatchingElementError:"No matching element",AssertionFailureError:"Assertion failure",SetupFailureError:"Setup failure",TeardownFailureError:"Teardown failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error",ConcurrencyError:"Concurrency error"},$i={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",NoMatchingElementError:"The AI agent failed to find a matching element for the given description.",AssertionFailureError:"An AI check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",SetupFailureError:"A setup step failed to execute, preventing the main test from running. This indicates an issue with test preparation, prerequisite steps, or initial state. This can only apply to failures that occur before teardown.",TeardownFailureError:"A teardown step failed to execute after the main test completed. This indicates an issue with cleanup or post-test operations or an uncaught error in the test. This can only apply to failures that occur after setup.",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",ConcurrencyError:"The AI test executed correctly, but the application state did not match expectations because another process modified the same resource concurrently. This failure is due to a concurrency error, such as a race condition or deadlock. Commonly caused by tests running simultaneously when using constants rather than random values, or underlying operations that allow for race conditions. For example, in Notion, if multiple tests are running at the same time where one creates a page and enters text to check if it renders, but another test deletes all pages before it can validate the render, this would be a concurrency error.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},sy=Do.object({reason:Do.nativeEnum(Ne),previousStepsDescription:Do.array(Do.string()).optional(),summary:Do.string(),rootCause:Do.string().optional()}).openapi({ref:"TestResultClassification"}),dm=Do.object({errorMessage:Do.string(),errorStack:Do.string().optional(),classification:sy.optional()}).openapi({ref:"TestFailureDetails"});var ar=class extends Error{constructor(e,r={}){super(e,r),this.name="ValidationError"}};var Pu=class extends Error{constructor(e,r,n,o={}){super(`The ${n} with id ${r} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var Za=class extends Pu{zodIssues;constructor(e,r,n,o,i={}){super(e,r,n,i),this.zodIssues=o,this.name="SchemaValidationError"}};function QR(t){for(let e of Object.values(Ne))if(t.includes(e))return e}var L=class t extends Error{reason;constructor(e,r,n){let o=!1;for(let i of Object.values(Ne))if(r.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?r:`${e}: ${r}`,n?.errOptions);else{let i=o?r:`${e}${r?`: ${r}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message,stack:this.stack,reason:this.reason}}static fromMessage(e){let r,n=e;for(let o of Object.values(Ne))if(e.startsWith(o)){r=o,e.startsWith(`${o}: `)?n=e.slice(`${o}: `.length):e===o&&(n="");break}return r||(r="UnknownError"),new t(r,n)}};var Ml=class extends Error{updatedLocatorMemory;constructor(e,r,n={}){super(e,n),this.updatedLocatorMemory=r,this.name="NoElementsFoundUsingAIError"}},rn=class extends Error{decisions;cacheMissReason;constructor(e,r=[],n,o={}){super(e,o),this.decisions=r,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
9
9
  Decisions:
10
10
  ${this.decisions.map(e=>e.toString()).join(`
11
- `)}`}};function MG(t){return t instanceof Error?t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator"):!1}function OG(t){return!(t instanceof Error)||t.message.includes("locator resolved to visible")?!1:!!(t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("body >")||t.message.includes("Element is not attached to the DOM"))}var Ol=class extends Error{constructor(e,r={}){super(e,r),this.name="CacheAttributesDisqualifyElementError"}},Wi=class extends Ol{constructor(e,r={}){super(e,r),this.name="ElementMovedError"}},pm=class extends Ol{constructor(e,r={}){super(e,r),this.name="ZeroOpacityError"}},Mu=class extends Error{constructor(e,r={}){super(e,r),this.name="IsInvalidMomenticIdError"}};function LG(t){return t instanceof Error?t.message.includes("Could not find attribute data-momentic-id for object"):!1}var ly="Element to be clicked has no bounding box";function NG(t){return t instanceof Error?t.message.startsWith(ly):!1}function cy(t){return t instanceof Wi||OG(t)||DG(t)||kG(t)||MG(t)||LG(t)||NG(t)}function DG(t){return t instanceof Error?t instanceof Mu?!0:t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator")&&t.message.includes("data-momentic-id")&&!t.message.includes("locator resolved")&&!t.message.includes("waiting for element to be"):!1}function kG(t){return t instanceof Error?t.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||t.message.includes("Could not resolve backend node"):!1}var Ou=class extends Error{constructor(e,r={}){super(e,r),this.name="InsufficientCacheDataError"}};function Ot(t){return t instanceof Error?t.message:String(t)}function ZR(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function UG({name:t,schema:e}){let r=[{node:Qa(e),path:t}];for(;r.length>0;){let n=r.pop();if(!n)continue;let{node:o,path:i}=n;if(Array.isArray(o)){o.forEach((s,c)=>{r.push({node:s,path:`${i}[${c}]`})});continue}if(!ZR(o))continue;let a=o.properties;if(ZR(a)){if(o.additionalProperties!==!1)throw new Error(`${t} violates OpenAI strict schema requirements at ${i}: object schemas must set additionalProperties to false.`);let s=Array.isArray(o.required)?o.required.filter(l=>typeof l=="string"):[],c=Object.keys(a).filter(l=>!s.includes(l));if(c.length>0)throw new Error(`${t} violates OpenAI strict schema requirements at ${i}: [${c.join(", ")}] must be required. Use nullable() or z.union([X, z.null()]) instead of optional()/nullish().`)}Object.entries(o).forEach(([s,c])=>{r.push({node:c,path:`${i}.${s}`})})}}function ew(t){t.forEach(UG)}var FG={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST.",SET_HEADER:"Set a header for subsequent network requests. Optionally scope it to matching requests.",REGISTER_REQUEST_LISTENER:"Register a request listener for matching requests and save them under a key.",RECORD_REQUESTS:"Record matching requests and store them under a key for later retrieval.",MOCK_ROUTE:"Mock matching network requests with a generated response."};ty.options.forEach(t=>{let e=t.shape.type.value;if(e!=="SUCCESS"&&!FG[e])throw new Error(`Command type ${e} is missing a description`)});var mm=M.object({urlMatcher:yu,method:M.string().nullable()});var tw=M.object({type:M.literal("CLICK"),description:M.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:M.boolean().nullable(),rightClick:M.boolean().nullable(),waitForDownload:M.boolean().nullable().describe("Wait for the click to trigger a file download and for the download to complete."),downloadTimeoutMs:M.number().int().nullable().describe("Max milliseconds to wait for a download to start and complete when waitForDownload is enabled."),delayMs:M.number().int().nullable().describe("Delay before performing the click, in milliseconds.")}),rw=M.object({type:M.literal("TYPE"),description:M.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:M.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:M.boolean().nullable().describe("Press enter after typing (useful for form submissions)."),clearContent:M.boolean().nullable().describe("Clear existing content before typing. Disable to append to the existing text.")}),nw=M.object({type:M.literal("GO_BACK")}),BG=M.object({type:M.literal("GO_FORWARD")}),zG=M.object({type:M.literal("LOCAL_STORAGE"),key:M.string().describe("The localStorage key to set or get."),value:M.string().describe("The value to store in localStorage. If reading, this can be empty.")}),ow=M.object({type:M.literal("PRESS"),keys:M.array(M.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),iw=M.object({type:M.literal("SELECT_OPTION"),description:M.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:M.discriminatedUnion("type",[M.object({type:M.literal("VALUE"),value:M.string()}),M.object({type:M.literal("LABEL"),label:M.string()}),M.object({type:M.literal("INDEX"),index:M.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),aw=M.object({type:M.literal("NAVIGATE"),url:M.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),sw=M.object({type:M.literal("SCROLL"),y:M.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),lw=M.object({type:M.literal("WAIT"),timeout:M.number().describe("The number of seconds to wait.")}),cw=M.object({type:M.literal("AI_ASSERTION"),assertion:M.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:M.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),uw=M.object({type:M.literal("HOVER"),description:M.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),HG=M.object({type:M.literal("COPY"),value:M.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),GG=M.object({type:M.literal("PASTE")}),jG=M.object({type:M.literal("REFRESH")}),VG=M.object({type:M.literal("REQUEST"),url:M.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:M.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:M.record(M.string(),M.string()).nullable().describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:M.record(M.string(),M.string()).nullable().describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:M.string().nullable().describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:M.number().int().nullable().describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),$G=M.object({type:M.literal("GRAPHQL_REQUEST"),url:M.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:M.record(M.string(),M.string()).nullable().describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:M.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:M.string().nullable().describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:M.number().int().nullable().describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),WG=M.object({type:M.literal("SET_HEADER"),name:M.string().describe("The header name to set."),value:M.string().describe("The header value to set."),requestMatcher:mm.nullable().describe("Optional request matcher to scope the header to matching requests.")}),qG=M.object({type:M.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:mm.describe("Request matcher to define which requests should be captured."),key:M.string().describe("Identifier for the listener. Used to retrieve recorded data.")}),KG=M.object({type:M.literal("RECORD_REQUESTS"),requestMatcher:mm.describe("Request matcher to define which requests should be recorded."),key:M.string().describe("Identifier for the recording. Used to retrieve recorded data.")}),YG=M.object({type:M.literal("MOCK_ROUTE"),requestMatcher:mm.describe("Request matcher defining which requests should be mocked."),responseGenerator:M.string().describe("JavaScript code to generate the mocked response."),fetchOriginalResponse:M.boolean().nullable().describe("Whether to fetch the real response and pass it to the response generator."),key:M.string().nullable().describe("Optional key to reference this mock for removal.")}),dw=M.object({type:M.literal("DRAG"),fromDescription:M.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:M.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:M.number().int().positive().nullable().describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:M.number().positive().nullable().describe("Optional seconds to hover over the destination before releasing the drag.")}),XG=M.object({type:M.literal("MOUSE_DRAG"),description:M.string().nullable().describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:M.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:M.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:M.number().int().positive().nullable().describe("Optional number of intermediate mouse move steps during the drag.")}),JG=M.object({type:M.literal("JAVASCRIPT"),code:M.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:M.union([M.literal("NODE"),M.literal("BROWSER")]).nullable().describe("Execution environment. Default is NODE."),timeout:M.number().nullable().describe("Max seconds for the code to complete. Max 60 seconds.")}),QG=M.object({type:M.literal("AI_EXTRACT"),goal:M.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:M.string().nullable().describe("JSON schema defining the expected structure of the extracted data."),iframeUrl:M.string().nullable().describe("URL or URL regex for the iframe to extract data from.")}),ZG=M.object({type:M.literal("ELEMENT_CHECK"),description:M.string().describe("Description of the element to check."),assertionType:M.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:M.string().nullable().describe("The value to check against (required for CONTENT assertions)."),negated:M.boolean().nullable().describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:M.number().nullable().describe("Max seconds to wait for the assertion to be true.")}),ej=M.object({type:M.literal("PAGE_CHECK"),value:M.string().describe("The text content to check for on the page."),negated:M.boolean().nullable().describe("If true, checks that the content is NOT present."),timeout:M.number().nullable().describe("Max seconds to wait for the assertion to be true.")}),tj=M.object({type:M.literal("NEW_TAB"),url:M.string().describe("The URL to open in the new tab.")}),rj=M.object({type:M.literal("WAIT_FOR_URL"),matcher:M.discriminatedUnion("type",[M.object({type:M.literal("SUBSTRING"),url:M.string()}),M.object({type:M.literal("GLOB"),glob:M.string()}),M.object({type:M.literal("REGEX"),regex:M.string()}),M.object({type:M.literal("DOMAIN"),domain:M.string()})]).describe("How to match the URL."),caseInsensitive:M.boolean().nullable(),negated:M.boolean().nullable().describe("Wait for the URL to NOT match instead."),timeout:M.number().nullable().describe("Max seconds to wait for the URL.")}),uy=M.object({type:M.literal("SUCCESS")}),dy=M.object({type:M.literal("FAILURE")}),py=M.discriminatedUnion("type",[tw,rw,ow,iw,aw,sw,lw,cw,uw,nw]),pw=M.discriminatedUnion("type",[...py.options,dw]),nj=py,oj=pw,fm=["CLICK","TYPE","PRESS","SELECT_OPTION","NAVIGATE","SCROLL","WAIT","AI_ASSERTION","HOVER","GO_BACK","DRAG"],my=M.discriminatedUnion("type",[tw,rw,ow,iw,aw,sw,lw,cw,uw,nw,dw,JG,ZG,ej,tj,rj,QG,HG,BG,zG,XG,GG,jG,VG,$G,WG,qG,KG,YG]);ew([{name:"AI_ACTION_COMMAND_OPTIONS_V1",schema:nj},{name:"AI_ACTION_COMMAND_OPTIONS_V2",schema:oj},{name:"AgentRawCommandSchema",schema:my}]);var nle=Qa(my),ole=M.discriminatedUnion("type",[...my.options,uy,dy]),ile=Qa(M.discriminatedUnion("type",[...py.options,uy,dy])),ale=Qa(M.discriminatedUnion("type",[...pw.options,uy,dy])),sle=M.object({command:M.unknown(),thoughts:M.string()});import{z as fy}from"zod";import{extendZodWithOpenApi as ij}from"zod-openapi";ij(fy);var es=kn.extend({type:fy.literal("AI_ACTION"),text:fy.string(),steps:Ir.array().optional()}).openapi({ref:"AIAction"});import{z as qr}from"zod";import{z as mw}from"zod";var hy=kn.extend({type:mw.literal("CONDITIONAL"),skipped:mw.boolean().optional()});import{z as Ke}from"zod";var aj=Ke.object({cacheKey:Ke.string(),cacheExpiryMs:Ke.number()}),gy=kn.extend({id:Ke.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ke.record(Ke.string()).optional(),cacheConfig:aj.optional()}),ho=gy.extend({type:Ke.literal("MODULE"),moduleId:Ke.string().uuid()}),sj=Ke.union([ho.pick({type:!0,moduleId:!0}),Ke.record(Ke.unknown())]),lj=Ke.object({type:Ke.literal("URL_REGEX"),regex:Ke.string()}),cj=Ke.object({type:Ke.literal("PAGE_CHECK"),substring:Ke.string()}),Sy=Ke.object({cacheInvalidation:Ke.discriminatedUnion("type",[cj,lj]).optional()}),nn=Ke.object({moduleId:Ke.string().uuid(),name:Ke.string(),description:Ke.string().nullish(),enabled:Ke.boolean().nullish(),parameters:Ke.string().array().nullish(),defaultParameters:Ke.record(Ke.string(),Ke.string()).nullish(),parameterEnums:Ke.record(Ke.string(),Ke.string().array()).nullish(),defaultCacheKey:Ke.string().nullish(),defaultCacheTtl:Ke.number().nullish(),defaultCacheAllInvocations:Ke.boolean().nullish(),autoAuth:Ke.boolean().nullish(),advanced:Sy.nullish()});var yy=t=>t.type==="RESOLVED_MODULE";import{z as Fn}from"zod";var Ey=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Ey||{});var uj=Fn.discriminatedUnion("type",[Fn.object({type:Fn.literal("NAVIGATE_URL"),url:Fn.string().url()}),Fn.object({type:Fn.literal("GO_TO_SECTION_START")})]),dj=Fn.object({trigger:Fn.nativeEnum(Ey).optional(),attempts:Fn.number().int().optional(),restartBehavior:uj}),Nu=kn.extend({type:Fn.literal("SECTION"),description:Fn.string().describe("user provided goal of what the section should accomplish"),plan:Fn.string().array().optional(),autohealingConfig:dj.optional()});var fw=nn.merge(gy).extend({type:qr.literal("RESOLVED_MODULE"),steps:qr.lazy(()=>Dt.array())}),Ty=nn.extend({steps:qr.lazy(()=>Dt.array())}),by=Nu.extend({steps:qr.lazy(()=>bt.array())}),pj=Nu.extend({steps:qr.lazy(()=>Dt.array())}),ts=hy.extend({blocks:qr.object({assertion:qr.lazy(()=>Ir),steps:qr.lazy(()=>bt.array())}).array(),elseSteps:qr.lazy(()=>bt.array().optional())}),mj=hy.extend({blocks:qr.object({assertion:qr.lazy(()=>Ir),steps:qr.lazy(()=>Dt.array())}).array(),elseSteps:qr.lazy(()=>Dt.array().optional())}),bt=qr.discriminatedUnion("type",[Ir,es,_l,ho,ts,by]),Dt=qr.discriminatedUnion("type",[Ir,es,_l,fw,mj,pj]);import{z as Bn}from"zod";var fj=Bn.object({steps:bt.array(),beforeSteps:bt.array().nullish(),afterSteps:bt.array().nullish()}),qi=Bn.object({steps:Dt.array(),beforeSteps:Dt.array().nullish(),afterSteps:Dt.array().nullish()}),rs=Bn.object({steps:Bn.record(Bn.string(),Bn.unknown()).array(),beforeSteps:Bn.record(Bn.string(),Bn.unknown()).array().nullish(),afterSteps:Bn.record(Bn.string(),Bn.unknown()).array().nullish()});var De="1.0.22",vy="0.0.3";import{z as vm}from"zod";import{z as ns}from"zod";var hj=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,dt=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var pi=ns.string().min(1).max(255).superRefine((t,e)=>{try{go(t)}catch(r){return e.addIssue({code:ns.ZodIssueCode.custom,message:r.message,fatal:!0}),ns.NEVER}});function go(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Error(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Error("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(t==="none")throw new Error("Name cannot be 'none'.");if(t.match(hj))throw new Error("Name cannot be a UUID. Please choose a different name.")}var hm=ns.preprocess(t=>t===null?"":t,ns.union([ns.string().url(),ns.literal("")])).optional();var Sn="get_browser_state",gm="get_environment_variables",Sm="reset_session",ko="run_step",zn="preview_preflight",hw="preview_ensure",Jt="preview_step",ym="test_get",Qt="test_splice_steps",Em="module_create",Tm="module_list",gw="momentic_module_create",Ki="momentic_module_get",Yi="momentic_module_recommend",bm="momentic_get_artifacts",Sw="momentic_test_create",yw="momentic_test_splice_steps",Ew="momentic_run_step",Tw="momentic_session_start",bw="momentic_session_terminate",vw="momentic_get_session_state",Aw="momentic_get_environment_variables",mi="momentic_get_initial_data",Ay="momentic_preview_step";var Cw=["CLICK","TYPE","PRESS","SELECT_OPTION","DRAG","NAVIGATE","SCROLL","WAIT","AI_ASSERTION","HOVER","BLUR","GO_BACK","GO_FORWARD","REFRESH","NEW_TAB","SWITCH_TAB","WAIT_FOR_URL","COPY","PASTE","ELEMENT_CHECK","PAGE_CHECK","AI_EXTRACT","COOKIE","LOCAL_STORAGE","REQUEST","GRAPHQL_REQUEST","JAVASCRIPT","SET_HEADER","MOCK_ROUTE","REMOVE_ROUTE_MOCK","FILE_UPLOAD","DIALOG","MOUSE_DRAG","MODULE","AI_ACTION_DYNAMIC","CONDITIONAL"],os=vm.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),Rw=vm.object({id:vm.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:pi.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:vm.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided.");function ww(t,e){let r=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=t??{},a=new Set([...r,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=r.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call ${Ki} to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var xw=k.object({phrase:k.string()}),Am=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),jce=k.object({text:k.string()}),gj=k.boolean().or(k.nativeEnum(tn)).transform(t=>!(!t||t==="irrelevant")),_w=k.object({attributes:k.array(k.string()).nullish(),text:gj.nullish(),position:k.nativeEnum(tn).nullish(),shape:k.nativeEnum(tn).nullish()}),Sj=k.object({id:k.number().int(),requirements:_w}),yj=Sj.array(),Cm=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int(),updatedMemory:hu.optional(),requirements:_w.nullish().transform(t=>{if(t!==null)return t}),additionalElements:yj.nullish().transform(t=>{if(t!==null)return t})});var Iw=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(Iw||{}),Pw=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(Pw||{});var Mw=k.object({thoughts:k.string(),category:k.nativeEnum(Iw)}),Ow=k.object({thoughts:k.string(),category:k.nativeEnum(Pw)}),Lw=k.object({anyUntestedSteps:k.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:k.object({error:k.string(),solutionFound:k.object({description:k.string(),passedSuccessfully:k.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:k.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:k.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),Nw=k.object({summary:k.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:k.array(k.object({error:k.string(),workAround:k.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:k.array(k.string()).default([]).describe("Steps added/discussed but not validated.")}),Ej=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),Vce=k.object({thoughts:k.string(),patches:Ej.array()}),Tj=[k.literal("add"),k.literal("replace"),k.literal("remove")],bj=k.object({op:k.union(Tj),path:k.string(),value:Dt.optional()}),Dw=k.object({patches:bj.array(),thoughts:k.string()}),Cy=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Cy||{}),kw=k.object({thoughts:k.string(),scenario:k.nativeEnum(Cy),instructions:k.string().nullish()}),Uw=k.object({reasoning:k.string(),scenario:k.string(),patch:k.null().optional()}),$ce=k.object({thoughts:k.string(),evaluation:k.number().min(0).max(10)}),Wce=k.object({observations:k.string(),reasoning:k.string(),command:nm});var Ry=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])}),vj=k.object({startId:k.number().int(),endId:k.number().int()}),Fw=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(Fw||{}),Bw=k.object({categoryThoughts:k.string(),category:k.nativeEnum(Fw),relevantSections:vj.array()}),fi=k.boolean().nullish().transform(t=>t??!1),zw=k.object({thoughts:k.string().optional(),isPageReady:fi,descriptionLabels:k.object({usesTextContent:fi,usesAppearance:fi,usesPosition:fi,usesRelativeElements:fi,usesSingleQuotes:fi,isAmbiguous:fi,targetDoesNotExist:fi,usesIcon:fi}).optional()});import{z as N}from"zod";import*as Ue from"zod";var Zce=Ue.object({thoughts:Ue.string().optional().describe("only provided if a description was provided"),target:ui.optional().describe("only provided if a description was provided"),pageState:Ue.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Ue.object({label:Ue.string(),value:Ue.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:Ue.object({data:Ue.string().or($a),height:Ue.number().int(),width:Ue.number().int()}).optional().describe("only provided if returnScreenshot is true")}),Hw=Ue.union([Ue.literal("ELEMENT_CHECK"),Ue.literal("NEGATED_CHECK"),Ue.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),Ue.literal("SELECT_OPTION"),Ue.literal("TYPE")]);function is(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return"SELECT_OPTION";if(t.type==="TYPE")return"TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return"NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Du=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Du||{}),Ll=Ue.object({matched:Ue.boolean(),reason:Ue.string().optional().describe("Human understandable description"),logs:Ue.string().array().optional().describe("Logs for debugging")}),Aj=Ll.extend({type:Ue.literal("USER_SELECTOR")}),Cj=Ll.extend({type:Ue.literal("CSS_SELECTOR"),selectors:Ue.string().array()}),Rj=Ll.extend({type:Ue.literal("HYBRID_SELECTOR")}),wj=Ll.extend({type:Ue.literal("HTML_DISTANCE"),distance:Ue.number().optional(),closestElement:Ue.string().optional(),savedElement:Ue.string().optional()}),xj=Ll.extend({type:Ue.literal("TEMPLATE_MATCHING")}),_j=Ll.extend({type:Ue.literal("AUTO_FRAME"),logs:Ue.string().array().optional()}),Gw=Ue.discriminatedUnion("type",[Aj,Cj,Rj,wj,xj,_j]);import{z as Fu}from"zod";import{z as Gj}from"zod";import*as de from"zod";import{extendZodWithOpenApi as Nj}from"zod-openapi";import{cloneDeep as ku}from"lodash-es";import Yw from"truncate-json";import*as ls from"zod";import{extendZodWithOpenApi as Mj}from"zod-openapi";import{z as Mr}from"zod";import{z as Ce}from"zod";import{z as wy}from"zod";var So=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(So||{});var Rm=wy.object({width:wy.number().min(200).max(1e4),height:wy.number().min(200).max(1e4)}),jw={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},rue=Object.keys(jw);var Pr=jw["Desktop Large"],Xi="en-us",Ji="America/Los_Angeles",Ij="Chromium",Qi={latitude:37.7749,longitude:-122.4194};function wm({configuredBrowserType:t,orgDefaultBrowserType:e,browserTypeOverride:r}){let n=r??t;return n==="Org Default"&&e?e:n??Ij}var xm=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(xm||{});var xy=Ce.object({autoFollowNewTabs:Ce.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:Ce.union([Ce.boolean(),Ce.literal("inputs-only")]).optional(),ignoreHrefForCaching:Ce.boolean().optional(),disableSecondaryCacheResolution:Ce.boolean().optional(),hybridSelectorMode:Ce.enum(["off","test","prefer","always"]).optional(),globalLocatorRedirect:Ce.union([Ce.boolean(),Ce.literal("always")]).optional(),enableForceClickForMissingRedirectElement:Ce.boolean().optional(),visualActions:Ce.boolean().optional(),autoExpandIframes:Ce.boolean().optional(),disableHtmlSnapshots:Ce.boolean().optional(),recordVideo:Ce.boolean().optional(),defaultBrowserType:Ce.nativeEnum(So).optional(),importantAttributes:Ce.string().array().optional(),importantClasses:Ce.string().array().optional(),importantStyles:Ce.string().array().optional()});var Vw=1e4,$w=6e4,Pj=Ce.object({server:Ce.string(),username:Ce.string().optional(),password:Ce.string().optional()}),as=xy.extend({pageLoadTimeoutMs:Ce.number().optional().refine(t=>t===void 0||t<=$w&&t>=-1,{message:`Page load timeout must be between 0 and ${$w/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:Ce.number().optional().refine(t=>t===void 0||t<=Vw&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${Vw/1e3} seconds`}),ignorePageLoadTimeouts:Ce.boolean().optional(),localChromeExtensionPaths:Ce.string().array().optional(),extraHeaders:Ce.record(Ce.string(),Ce.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:Ce.record(Ce.string(),Ce.record(Ce.string(),Ce.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:Ce.string().optional(),disableGpu:Ce.boolean().optional(),disableZygote:Ce.boolean().optional(),disableBrowserMonitoring:Ce.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:Ce.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:Ce.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:Ce.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:Ce.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:Ce.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:Pj.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:Ce.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:Ce.nativeEnum(xm).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var sr="BASE_URL",_m="CURRENT_URL",ss="ENV_NAME",Nl="TEST_NAME",due={[sr]:"https://www.google.com"},Ww=Mr.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),qw=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.string().describe("variable value"))}),Kw=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.unknown().describe("variable value")),browser:as.optional()});var pue=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.unknown().describe("variable value"))});Mj(ls);var _y=ls.object({env:ls.record(ls.unknown())}).openapi({ref:"TestContextSnapshot"}),Oj="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",Lj=[sr,ss,Nl],Xw=[_m,sr,ss,Nl],Kr=class t{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,r=void 0,n={}){return new t({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:r,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:r}){let n=e.env[sr]??"about:blank",o=e.env[_m]??"about:blank",i=e.env[ss],a=e.env[Nl],s={};for(let[l,u]of Object.entries(e.env))Xw.includes(l)||(r??{})[l]===void 0&&(s[l]=u);return new t({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:r??{}})}setEnvVariables(e){let r=ku(e);this.env=Object.assign(this.env,r)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,r){this.varsFromMomenticEnvironment[e]=r}getVariable(e){return this.env[e]}setVariable(e,r){Lj.includes(e)||(this.env[e]=r)}getEnvName(){return this.env[ss]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return ku(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>Xw.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,Oj]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=Yw(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:r}=Yw(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(r)}catch{e.env={}}return e}setCurrentUrl(e){this.env[_m]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=ku(e.variablesFromEnvironment),this.setMomenticSystemVariable(sr,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ss,e.envName),e.testName&&this.setMomenticSystemVariable(Nl,e.testName)}getDynamicVariablesCopy(){return ku(this.env)}getVariablesFromEnvironmentCopy(){return ku(this.varsFromMomenticEnvironment)}};var ot=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(ot||{}),Im=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Im||{});Nj(de);var Iy=de.object({beforeUrl:de.string().optional(),afterUrl:de.string().optional(),message:de.string().optional(),beforeSnapshot:de.string().optional(),afterSnapshot:de.string().optional(),startedAt:de.coerce.date(),finishedAt:de.coerce.date()}),Dj=Iy.extend({viewport:de.object({height:de.number(),width:de.number()}).nullish(),status:de.nativeEnum(Im),message:de.string().optional(),elementInteracted:de.string().optional()}),cs=Iy.extend({status:de.nativeEnum(ot),message:de.string().optional(),data:de.unknown().optional(),beforeTestContext:_y.optional(),afterTestContext:_y.optional(),failureReason:de.nativeEnum(Ne).optional(),details:de.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:de.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)")}).openapi({ref:"StepResultMetadata"}),Py=(r=>(r.NOT_ELIGIBLE="NOT_ELIGIBLE",r.ATTEMPTED="ATTEMPTED",r))(Py||{}),Pm=cs.merge(Ir).extend({results:Dj.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:de.lazy(()=>hr.array()).optional(),failureRecoveryStatus:de.object({type:de.nativeEnum(Py),message:de.string()}).optional()}),kj=cs.merge(es).extend({results:de.lazy(()=>Pm.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Uj=cs.merge(_l).extend({results:de.lazy(()=>Pm.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Fj=cs.merge(ho).extend({moduleName:de.string().optional(),results:de.lazy(()=>hr.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Bj=cs.merge(ts).extend({assertionResult:Pm.optional(),results:de.lazy(()=>hr.array()).describe("results for the block actually executed"),previousAttempts:de.lazy(()=>hr.array()).optional()}),zj=cs.merge(Nu).extend({results:de.lazy(()=>hr.array()),healingAttempts:de.lazy(()=>hr.array().array()).optional(),previousAttempts:de.lazy(()=>hr.array()).optional()}),hr=de.discriminatedUnion("type",[kj,Uj,Pm,Fj,Bj,zj]),Mm=cs.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),Hj=Iy.extend({index:de.number().optional(),userFacingStepReference:de.string().optional(),description:de.string(),pageState:de.string().optional(),elementInteracted:de.string().optional(),startedAt:de.coerce.date().or(de.string()).optional().catch(void 0),finishedAt:de.coerce.date().or(de.string()).optional().catch(void 0)}),Om=Hj.extend({beforeScreenshot:de.string().optional(),afterScreenshot:de.string().optional()});var My=Gj.object({results:hr.array().describe("main results"),beforeResults:hr.array().optional(),afterResults:hr.array().optional()}),Uu=My.partial();import{z as ee}from"zod";import{extendZodWithOpenApi as Yj}from"zod-openapi";import{z as Zi}from"zod";import jj from"zod";var gr=(r=>(r.ANDROID="ANDROID",r.IOS="IOS",r))(gr||{});var Jw=jj.nativeEnum(gr);var Dl=(n=>(n.WEB="WEB",n.ANDROID="ANDROID",n.IOS="IOS",n))(Dl||{});var Lm=Zi.object({fromStepId:Zi.string(),parentStepIdChain:Zi.array(Zi.string())}),Nm=Zi.object({toStepId:Zi.string(),parentStepIdChain:Zi.array(Zi.string())});import{z as St}from"zod";import{isValidCron as Vj}from"cron-validator";import{z as Fe}from"zod";var Qw=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Zw=1e4,kl=as.extend({browserType:Fe.nativeEnum(So).optional(),slowMoMs:Fe.number().optional().refine(t=>t===void 0||t<=Zw&&t>=-1,{message:`Slow motion must be between 0 and ${Zw} milliseconds`}),basicAuthorization:Fe.object({username:Fe.string().optional(),password:Fe.string().optional()}).optional(),geolocation:Fe.object({latitude:Fe.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Fe.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:Fe.boolean().optional(),locale:Fe.string().optional(),timezone:Fe.enum(Qw).optional(),colorScheme:Fe.enum(["light","dark"]).optional()}),ex=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],Oy=Fe.object({useMemory:Fe.boolean().optional(),failureRecovery:Fe.boolean().optional().describe("undefined means inherit org settings")}),Ly=Oy.extend({disableAICaching:Fe.boolean().optional(),failureRecoveryInstructions:Fe.string().optional()}),$j=Fe.object({viewport:Rm.optional()}),us=$j.merge(Ly).merge(kl),Ul=Fe.object({cron:Fe.string().refine(t=>Vj(t),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Fe.boolean().default(!1),env:Fe.string().optional(),timeZone:Fe.string().default("America/Los_Angeles"),jobKey:Fe.string().optional()}),Fl=Fe.object({onSuccess:Fe.boolean().default(!1),failureMessage:Fe.string().optional(),onFailure:Fe.boolean().default(!0),successMessage:Fe.string().optional()}),Wj=Fe.object({name:Fe.string(),required:Fe.boolean().optional(),defaultValue:Fe.string().describe("this is not optional because we need a value when the editor is first loaded")}),Dm=Wj.array(),qj=Fe.object({name:Fe.string(),value:Fe.string()}),tx=qj.array(),km=Fe.object({name:Fe.string(),default:Fe.boolean().optional(),fixtures:Ww.array().optional()});var hi=Oy.extend({agentConfig:St.record(St.string(),St.string()).optional(),aiFailureAnalysis:St.boolean().optional(),aiPageFiltering:St.boolean().optional().describe("rag v2 feature flag")}),Kj=St.object({cliOnly:St.boolean().optional(),neverShowUsageBanner:St.boolean().optional(),hideInternalTraceInfo:St.boolean().optional()}),Ny=St.object({fakerConstantSeed:St.boolean().optional(),isolateCachesByEnvironment:St.boolean().optional()}),rx=St.object({ai:hi.optional(),githubAppInstallationId:St.number().nullish(),githubAppSummaryMessageEnabled:St.boolean().nullish(),githubReleaseAppInstallationId:St.number().nullish(),gitlabAppAccessToken:St.string().nullish(),gitlabAppBaseUrl:St.string().nullish(),browser:xy.optional(),internal:Kj.optional(),advanced:Ny.optional()}),Jue=St.object({globalOverrides:St.record(St.string()).optional(),agentConfig:St.record(St.string(),St.string()).optional()}),Que=St.record(St.string(),St.string()).nullish();Yj(ee);var on={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},it=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(it||{}),Um=(r=>(r.BEFORE_ALL="BEFORE_ALL",r.AFTER_ALL="AFTER_ALL",r))(Um||{});var Xj=ee.object({attempts:ee.number().int().nonnegative()}),Zt=ee.string().pipe(ee.coerce.date()).or(ee.date()),ds=ee.object({id:ee.string(),runKey:ee.string(),organizationId:ee.string(),executionType:ee.nativeEnum(Dl).optional().default("WEB"),createdAt:Zt,createdBy:ee.string(),flake:ee.boolean().nullish(),scheduledAt:Zt.or(ee.null()),startedAt:Zt.or(ee.null()),updatedAt:Zt.nullish(),finishedAt:Zt.or(ee.null()),resolvedBaseUrl:ee.string().nullish(),environmentName:ee.string().nullish(),gitBranchName:ee.string().nullish(),githubRepository:ee.string().nullish(),gitlabProjectPath:ee.string().nullish(),labels:ee.array(ee.string()).optional(),gitOriginUrl:ee.string().nullish(),gitCommitSha:ee.string().nullish(),gitCommitShaShort:ee.string().nullish(),gitCommitAuthorName:ee.string().nullish(),cliVersion:ee.string().nullish(),section:ee.nativeEnum(Um).nullish(),status:ee.nativeEnum(it),trigger:ee.nativeEnum(on),attempts:ee.number(),runAttempts:ee.array(ee.object({id:ee.string(),status:ee.nativeEnum(it),startedAt:Zt.or(ee.null()),finishedAt:Zt.or(ee.null())})).optional(),videos:ee.array(ee.string()).optional(),failureReason:ee.nativeEnum(Ne).nullish(),failureDetails:dm.nullish(),failureRecoveryDetails:Xj.nullish(),pipelineId:ee.string().nullish(),resolvedInputs:ee.record(ee.string(),ee.string()).nullish(),quarantined:ee.boolean().nullish().default(!1),quarantinedReason:ee.string().nullish(),localTestId:ee.string().nullish(),testId:ee.string().nullish(),testName:ee.string().nullish(),description:ee.string().nullish(),directory:ee.string().nullish(),test:ee.object({name:ee.string(),id:ee.string()}).nullish().default(null),suiteId:ee.string().nullish(),aiSettings:hi.nullish()}).openapi({ref:"RunMetadata"}),Jj={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Fm=ds.pick({...Jj,test:!0}),nx=ds.omit({failureReason:!0,failureDetails:!0,test:!0}),Dy=ds.extend({stepsSnapshot:ee.array(ee.record(ee.unknown())).nullish(),resolvedInputs:ee.record(ee.string(),ee.string()).nullish(),test:ee.object({name:ee.string(),id:ee.string(),description:ee.string().nullish(),baseUrl:ee.string().nullish(),advanced:us.nullish()}).nullish()}).merge(My),ox=t=>t.includes("PASSED")&&t.includes("FAILED");var Qj=Fu.object({id:Fu.string().uuid(),startedAt:Zt.or(Fu.null()),finishedAt:Zt.or(Fu.null()),status:Fu.nativeEnum(it)}).merge(Uu),mde=Qj.array();var Bm=(i=>(i.JUNIT="junit",i.ALLURE="allure",i.ALLURE_JSON="allure-json",i.PLAYWRIGHT_JSON="playwright-json",i.BUILDKITE_JSON="buildkite-json",i))(Bm||{});import{z as kt}from"zod";var ix=kt.object({id:kt.string(),status:kt.nativeEnum(it),trigger:kt.nativeEnum(on),createdAt:Zt,startedAt:Zt.nullish(),finishedAt:Zt.nullish(),gitCommitSha:kt.string().nullish(),gitCommitShaShort:kt.string().nullish(),gitCommitTimestamp:Zt.nullish(),gitBranchName:kt.string().nullish(),gitOriginUrl:kt.string().nullish(),gitCommitMessage:kt.string().nullish(),gitCommitAuthorName:kt.string().nullish(),githubRepository:kt.string().nullish(),gitlabProjectPath:kt.string().nullish(),pipelineId:kt.string().nullish(),ciProvider:kt.string().nullish(),cliVersion:kt.string().nullish(),labels:kt.string().array().optional(),localSuiteName:kt.string().optional(),suite:kt.object({id:kt.string(),name:kt.string()}).nullish(),runs:kt.object({status:kt.nativeEnum(it)}).array()}).openapi({ref:"RunGroup"}),ax=ix.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0,localSuiteName:!0}).extend({runs:Fm.array()}),Ede=ix.extend({runs:ds.array()});import{z as lr}from"zod";var Zj=lr.object({type:lr.literal("TARGETING"),name:lr.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:Gw.array(),pageState:lr.string().optional(),targetSource:lr.nativeEnum(Oo).optional(),targetUpdateTime:lr.string().optional()}),eV=lr.object({type:lr.literal("AI_LOCATION"),matched:lr.boolean(),pageState:lr.string().optional(),ragUsed:lr.boolean().optional(),thoughts:lr.string().optional()}),tV=lr.object({type:lr.literal("ASSERTION"),relevantElementsSerialized:lr.string().array().optional(),pageState:lr.string().optional(),ragUsed:lr.boolean().optional()}),sx=lr.discriminatedUnion("type",[Zj,eV,tV]);import{z as jt}from"zod";var rV=jt.object({id:jt.string(),name:jt.string()}),_de=rV.merge(jt.object({createdAt:Zt,createdBy:jt.string(),schedule:Ul,notification:Fl,environment:jt.object({name:jt.string()}).nullish(),beforeTests:jt.object({id:jt.string()}).array().nullish(),afterTests:jt.object({id:jt.string()}).array().nullish()})),lx=jt.object({id:jt.string().uuid(),orgId:jt.string(),createdAt:Zt,startedAt:Zt.or(jt.null()),finishedAt:Zt.or(jt.null()),status:jt.nativeEnum(it),trigger:jt.nativeEnum(on),suite:jt.object({id:jt.string(),name:jt.string()}).nullish(),runs:ds.array()}),Ide=lx.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),cx=lx.extend({runs:Fm.array()});import{z as Yr}from"zod";var ky=Yr.object({content:Yr.string(),ids:Yr.string().array(),tokenLength:Yr.number()}),nV=Yr.object({chunks:ky.array()}),$de=Yr.object({ids:Yr.string().array(),score:Yr.number(),tokenLength:Yr.number()}),Wde=nV.extend({description:Yr.string().describe("Input to pass to RAG engine"),tokenLimit:Yr.number()}),ux=Yr.object({ids:Yr.number().array()}),dx=Yr.object({indices:Yr.number().array()});var Vt=N.object({disableCache:N.boolean().optional(),useMemory:N.boolean().optional(),clientMode:N.enum(["interactive","runner"]).optional(),loggerTags:N.record(N.string(),N.string()).optional(),langfuseSessionId:N.string().optional(),agentConfigVersion:N.string().optional()}),tpe=Vt.extend({chunks:ky.array(),description:N.string().describe("Input to pass to AI"),type:N.union([N.literal("locator"),N.literal("assertion"),N.literal("ai-action")]),softTokenLimit:N.number(),hardTokenLimit:N.number(),callId:N.string().optional()}),oV=N.object({screenshotBase64AfterCommand:N.string(),urlAfterCommand:N.string(),serializedCommand:N.string(),elementInteracted:N.string().optional(),thoughts:N.string().optional()}),px=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string(),source:Hw.optional().catch(void 0),isTieBreakerCall:N.boolean().optional(),memory:N.discriminatedUnion("type",[po,N.object({type:N.literal("RESOLVED_TRACES"),traces:N.unknown().array()})]).optional(),firstPassModelResults:Cm.array().optional()}),mx=N.object({target:N.string().or(N.number()),browserState:N.string().optional(),screenshot:N.string().optional(),boundingBox:N.object({x:N.number(),y:N.number(),height:N.number(),width:N.number()}).optional()}),fx=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string().optional(),returnSchema:N.string().optional()}),hx=N.object({goal:N.string(),emulatorState:N.string(),screenshot:N.string().optional(),returnSchema:N.string().optional()}),Uy=N.union([N.literal("NEGATED_CHECK"),N.literal("CONDITIONAL_CHECK")]),gx=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string(),url:N.string(),contextChoice:ey.optional(),memory:N.discriminatedUnion("type",[Wa,N.object({type:N.literal("RESOLVED_TRACES"),traces:N.unknown().array()})]).optional(),source:Uy.optional()}),Sx=N.object({command:Rl}),yx=N.object({message:N.string()}),Ex=N.object({messagesAndToolCalls:N.array(N.string())}),Tx=N.object({messagesAndToolCalls:N.array(N.string()).describe("Chat history to condense for summarization")}),Fy=N.object({goal:N.string(),browserState:N.string(),startingScreenshot:N.string().optional(),screenshot:N.string(),url:N.string(),history:oV.array(),actionHint:N.string().optional(),lastError:N.string().optional()}),bx=N.object({results:Om.array(),errorMessage:N.string(),errorStack:N.string().optional()}),vx=N.object({results:Om.array(),goal:N.string(),errorMessage:N.string()}),Ax=N.object({failedResults:Om.array(),nextStepsSerialized:N.string().array(),currentUrl:N.string(),currentPageState:N.string(),currentScreenshot:N.string(),customInstructions:N.string().optional(),testDescription:N.string().optional()}),rpe=N.object({description:N.string(),type:N.union([N.literal("locator"),N.literal("assertion"),N.literal("ai-action")]),excerpt:N.string()}),Cx=N.object({type:N.string(),browserContext:N.string(),currentStep:N.string(),screenshot:N.string()}),Rx=N.object({description:N.string(),browserState:N.string(),screenshot:N.string()}),iV=N.enum(["locator","assertion"]),npe=N.object({completionType:iV,currentGoal:N.string(),pastGoal:N.string().optional(),currentScreenshot:N.string(),pastScreenshot:N.string(),pastResult:N.union([N.boolean(),N.number()])});import{z as Bu}from"zod";var ape=Bu.object({goal:Bu.string()}),wx=Bu.object({keywords:Bu.array(Bu.string())});import{z as Bl}from"zod";var zu=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(zu||{}),cpe=Bl.nativeEnum(zu),upe=new Set(Object.values(zu));var aV=Bl.enum(["v1","v2","v3","v4"]),sV=Bl.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1"),dpe=Bl.union([aV,sV,Bl.string().describe("for people with special configurations")]),zl={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};var xx=(a=>(a.ANDROID_LOCATOR="android-locator",a.IOS_LOCATOR="ios-locator",a.ANDROID_ASSERTION="android-assertion",a.IOS_ASSERTION="ios-assertion",a.ANDROID_TEXT_EXTRACTION="android-text-extraction",a.IOS_TEXT_EXTRACTION="ios-text-extraction",a))(xx||{}),ppe=Bl.nativeEnum(xx);import{z as _e}from"zod";import ld from"zod";import xt from"zod";import rr from"zod";import{v4 as Afe}from"uuid";import CV from"zod";import*as B from"zod";var zm=B.discriminatedUnion("type",[B.object({type:B.literal("SCREEN")}),B.object({type:B.literal("OPEN_APP")}),B.object({type:B.literal("OPEN_WEBVIEW")})]),gi=B.object({type:B.literal("description"),description:B.string()}),By=B.object({type:B.literal("CUSTOM_COORDINATES"),startX:B.number().describe("Starting X coordinate in pixels"),startY:B.number().describe("Starting Y coordinate in pixels"),deltaPixels:B.number().describe("Number of pixels to scroll in the specified direction")}),Hm=B.discriminatedUnion("type",[...zm.options,B.object({type:B.literal("CUSTOM"),target:gi}),By]);var lV=B.object({type:B.literal("coordinates"),xPercent:B.number(),yPercent:B.number()}),Hl=B.discriminatedUnion("type",[gi,lV]);var cV=B.object({x1:B.number(),y1:B.number(),x2:B.number(),y2:B.number(),tolerance:B.nativeEnum(tn),preciseTolerance:B.boolean().optional()}),uV=B.object({width:B.number(),height:B.number(),tolerance:B.nativeEnum(tn),preciseTolerance:B.boolean().optional()}),zy=B.object({requiredText:B.string().optional(),requiredAttributes:B.record(B.string(),B.string()).optional(),requiredBounds:B.boolean().optional(),position:cV.optional(),shape:uV.optional()}),_x=B.object({xPath:B.string(),requirements:zy.optional()}),dV=B.object({type:B.literal("CUSTOM"),target:gi,cache:B.lazy(()=>Ix).optional()}),pV=B.object({pixelDelta:B.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:B.union([zm,dV,By]),direction:B.enum(["up","down"])}),Ix=B.object({type:B.literal("NATIVE"),bounds:B.number().array().optional(),resolvedDescription:B.string().optional(),xPath:B.string().optional(),elementOnlySerializedXml:B.string().optional(),scrollDetails:pV.optional(),requirements:zy.optional(),requiredRelatedElements:_x.array().optional(),memory:po.optional()}),mV=B.object({type:B.literal("WEBVIEW"),resolvedDescription:B.string().optional(),xPath:B.string().optional(),browserCache:ui.optional(),memory:po.optional()}),Gm=B.union([Ix,mV]);var fV=B.object({left:B.number(),top:B.number(),right:B.number(),bottom:B.number()}),gpe=B.object({newViewportBounds:fV}),hV=B.object({type:B.literal("CUSTOM"),target:gi,cache:B.lazy(()=>Mx).optional()}),Px=B.object({pixelDelta:B.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:B.union([zm,hV,By]),direction:B.enum(["up","down"])}),Mx=B.object({type:B.literal("NATIVE"),bounds:B.tuple([B.number(),B.number(),B.number(),B.number()]).optional(),resolvedDescription:B.string().optional(),xPath:B.string().optional(),elementOnlySerializedXml:B.string().optional(),scrollDetails:Px.optional(),requirements:zy.optional(),requiredRelatedElements:_x.array().optional(),memory:po.optional()}),gV=B.object({type:B.literal("WEBVIEW"),resolvedDescription:B.string().optional(),xPath:B.string().optional(),scrollDetails:Px.optional(),browserCache:ui.optional(),memory:po.optional()}),jm=B.discriminatedUnion("type",[Mx,gV]);import Hy from"zod";import ea from"zod";var He=(A=>(A.AI_CHECK="AI_CHECK",A.AI_EXTRACT="AI_EXTRACT",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB="ADB",A.STATE="STATE",A))(He||{}),ge=ea.object({id:ea.string().uuid(),disableCache:ea.boolean().optional()}),Gl=ea.object({updatedAt:ea.coerce.date().optional(),updatedAtLoggerTags:ea.record(ea.string(),ea.string()).optional()}),Hn=Gl.extend({target:Gm}),Vm=Gl.extend({fromTarget:Gm,toTarget:Gm}),yo=Gl.extend({target:jm}),Ox=Gl.extend({fromTarget:jm,toTarget:jm});var Gy=ge.extend({type:Hy.literal("ADB"),command:Hy.string(),jsonArgs:Hy.string().optional()});import Lx from"zod";var SV=Lx.string().trim(),jy=ge.extend({type:Lx.literal("INSTALL_APP"),uri:SV});import yV from"zod";var Vy=ge.extend({type:yV.literal("OPEN_NOTIFICATION_DRAWER")});import Nx from"zod";var jl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(jl||{}),$y=ge.extend({type:Nx.literal("TOGGLE_SETTINGS"),settingsType:Nx.nativeEnum(jl)});import Dx from"zod";var Wy=ge.extend({type:Dx.literal("UNINSTALL_APP"),packageName:Dx.string()});import Fx from"zod";import qy from"zod";var Ky=ge.extend({type:qy.literal("ADD_FILE"),file:qy.string(),storageLocation:qy.string()});import Yy from"zod";var Vl=ge.extend({type:Yy.literal("AI_CHECK"),assertion:Yy.string(),timeoutSecs:Yy.number().optional(),cache:Gl.extend({memory:Wa.optional()}).optional()});import Xy from"zod";var Jy=ge.extend({type:Xy.literal("AI_EXTRACT"),goal:Xy.string(),schema:Xy.string().optional()});import Qy from"zod";var Zy=ge.extend({type:Qy.literal("JAVASCRIPT"),code:Qy.string(),timeout:Qy.number().int().max(60).optional().describe("Max seconds for the code to complete")});import EV from"zod";var eE=ge.extend({type:EV.literal("KILL_APP")});import Hu from"zod";var ta=(r=>(r.HOME="HOME",r.POWER="POWER",r))(ta||{}),ps=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(ps||{}),Gu=ge.extend({type:Hu.literal("PRESS"),key:Hu.nativeEnum(ta),longPress:Hu.boolean().optional()}),tE=Gu.extend({key:Hu.nativeEnum(ps).or(Hu.nativeEnum(ta))}),rE=Gu;import TV from"zod";var nE=ge.extend({type:TV.literal("REQUEST")}).merge(qa);import kx from"zod";var $l=(r=>(r.PORTRAIT="PORTRAIT",r.LANDSCAPE="LANDSCAPE",r))($l||{}),oE=ge.extend({type:kx.literal("ROTATE_ORIENTATION"),orientation:kx.nativeEnum($l)});import Wl from"zod";var bV=Wl.object({type:Wl.literal("CONTENT"),negated:Wl.boolean().optional(),value:Wl.string()}),iE=ge.extend({type:Wl.literal("SCREEN_CHECK"),assertion:bV,timeout:Wl.number().int().min(0).max(Xa).optional().describe("max seconds to wait for the assertion to be true")});import vV from"zod";var aE=ge.extend({type:vV.literal("STATE")});import Ux from"zod";var sE=ge.extend({type:Ux.literal("WAIT"),timeoutSecs:Ux.number()});var ju=Fx.discriminatedUnion("type",[aE,Vl,Jy,Zy,sE,nE,oE,iE,Ky,eE]),AV=Fx.discriminatedUnion("type",[...ju.options,Gu]);import lE from"zod";var Bx=ge.extend({type:lE.literal("DRAG_AND_DROP"),fromTarget:gi,toTarget:gi,hoverDuration:lE.number().optional(),dragDuration:lE.number().optional()}),Vu=Bx.extend({cache:Vm.optional()}),$u=Bx.extend({cache:Ox.optional()});import zx from"zod";var Hx=ge.extend({type:zx.literal("ELEMENT_CHECK"),target:Hl,assertion:Qp,timeout:zx.number().int().min(0).max(Xa).optional().describe("max seconds to wait for the assertion to be true")}),Wu=Hx.extend({cache:Hn.optional()}),qu=Hx.extend({cache:yo.optional()});import Ku from"zod";var ra=(r=>(r.ENTER="ENTER",r.BACKSPACE="BACKSPACE",r))(ra||{}),Yu=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Yu||{}),cE=ge.extend({type:Ku.literal("PRESS_KEYBOARD"),key:Ku.nativeEnum(ra)}),uE=ge.extend({type:Ku.literal("PRESS_KEYBOARD"),key:Ku.nativeEnum(Yu).or(Ku.nativeEnum(ra))});import ms from"zod";var dE=ge.extend({type:ms.literal("OPEN_APP"),packageName:ms.string(),activityName:ms.string().optional(),intentExtras:ms.string().optional()}),pE=ge.extend({type:ms.literal("OPEN_APP"),packageName:ms.string(),intentExtras:ms.string().optional()});import $m from"zod";var Gx=ge.extend({type:$m.literal("SCROLL_TO"),target:gi,direction:$m.enum(["down","up"]),scrollableElement:Hm,scrollStepPercent:$m.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),maxScrollAttempts:$m.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 5.")}),Xu=Gx.extend({cache:Hn.optional()}),Ju=Gx.extend({cache:yo.optional()});import fs from"zod";var jx=ge.extend({type:fs.literal("SWIPE"),direction:fs.enum(["up","down","left","right"]),scrollableElement:Hm,viewportPercent:fs.number().optional(),durationMs:fs.number().optional(),relativePosition:fs.object({x:fs.number(),y:fs.number()}).optional()}),Qu=jx.extend({cache:Hn.optional()}),Zu=jx.extend({cache:yo.optional()});import Uo from"zod";var Vx=ge.extend({type:Uo.literal("TAP"),target:Hl,longPress:Uo.boolean().optional(),longPressDurationMs:Uo.number().optional(),iterations:Uo.number().optional(),tapDelayMs:Uo.number().optional(),relativePosition:Uo.object({x:Uo.number(),y:Uo.number()}).optional(),doubleTap:Uo.boolean().optional(),doubleTapDelayMs:Uo.number().optional()}),ed=Vx.extend({cache:Hn.optional()}),td=Vx.extend({cache:yo.optional()});import rd from"zod";var $x=ge.extend({type:rd.literal("TYPE"),target:Hl.optional(),keyPressDelayMs:rd.number().optional(),text:rd.string(),clearContent:rd.boolean().optional(),forceClearContent:rd.boolean().optional()});var nd=$x.extend({cache:Hn.optional()}),od=$x.extend({cache:yo.optional()});var mE=CV.discriminatedUnion("type",[...ju.options,ed,nd,tE,uE,Wy,jy,Gy,Vu,Vy,Xu,Qu,$y,Wu,dE]);import{v4 as lhe}from"uuid";import RV from"zod";var fE=RV.discriminatedUnion("type",[...ju.options,td,od,rE,cE,pE,Zu,$u,Ju,qu]);var Or=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Or||{}),ql=rr.object({id:rr.string().uuid(),envKey:rr.string().optional(),skipped:rr.boolean().optional(),retries:rr.number().optional()}),qx=ql.extend({type:rr.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:rr.number().optional()}),ad=qx.extend({command:mE}),sd=qx.extend({command:fE}),Kl=rr.object({moduleId:rr.string(),inputs:rr.record(rr.string(),rr.string()).optional()}),Yl=ql.merge(Kl.extend({type:rr.literal("MOBILE_MODULE_STEP")})),Age=Kl.extend({steps:rr.lazy(()=>qm.array())}),Cge=Kl.extend({steps:rr.lazy(()=>hE.array())}),na=ql.extend({type:rr.literal("MOBILE_AI_ACTION_STEP"),text:rr.string()}),qm=rr.discriminatedUnion("type",[ad,Yl,na]),hE=rr.discriminatedUnion("type",[sd,Yl,na]);var oa=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(ot),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step"),aiSuggested:xt.boolean().optional()}),xV=oa.merge(ad).extend({previousAttempts:xt.lazy(()=>Si.array()).optional()}),_V=oa.merge(Yl).extend({steps:xt.lazy(()=>Si.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>Si.array()).optional()}),IV=oa.merge(na).extend({steps:xt.lazy(()=>Si.array()),previousAttempts:xt.lazy(()=>Si.array()).optional()}),Si=xt.discriminatedUnion("type",[xV,_V,IV]),PV=oa.merge(sd).extend({previousAttempts:xt.lazy(()=>yi.array()).optional()}),MV=oa.merge(Yl).extend({steps:xt.lazy(()=>yi.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>yi.array()).optional()}),OV=oa.merge(na).extend({steps:xt.lazy(()=>yi.array()),previousAttempts:xt.lazy(()=>yi.array()).optional()}),yi=xt.discriminatedUnion("type",[PV,MV,OV]);var LV=oa.extend({index:ld.number().optional(),userFacingStepReference:ld.string().optional(),description:ld.string()}),Kx=LV.extend({beforeScreenshot:ld.string().optional(),afterScreenshot:ld.string().optional()});var Yx=_e.object({attributesRequired:_e.array(_e.string()).optional(),textRequired:_e.boolean().optional(),boundsRequired:_e.boolean().optional(),positionSpecificity:_e.nativeEnum(tn).optional(),shapeSpecificity:_e.nativeEnum(tn).optional()}),NV=_e.object({id:_e.number(),requirements:Yx}).array(),DV=_e.object({thoughts:_e.string(),id:_e.number(),updatedMemory:hu.optional(),inWebview:_e.boolean().optional(),requirements:Yx.optional(),additionalElements:NV.optional()}),Xx=_e.object({description:_e.string(),screenXml:_e.string(),screenshot:_e.string(),memory:_e.discriminatedUnion("type",[po,_e.object({type:_e.literal("RESOLVED_TRACES"),traces:_e.unknown().array()})]).optional()}),Jx=_e.object({assertion:_e.string(),screenXml:_e.string(),screenshot:_e.string(),memory:_e.discriminatedUnion("type",[Wa,_e.object({type:_e.literal("RESOLVED_TRACES"),traces:_e.unknown().array()})]).optional()}),kV=_e.object({thoughts:_e.string(),result:_e.boolean(),relevantElements:_e.array(_e.number()).optional(),updatedMemory:Su.optional()}),Qx=_e.object({failedResults:Kx.array(),nextStepsSerialized:_e.string().array(),currentScreenXml:_e.string(),currentScreenshot:_e.string(),customInstructions:_e.string().optional(),testDescription:_e.string()}),Zx=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Zx||{}),UV=_e.object({thoughts:_e.string(),scenario:_e.nativeEnum(Zx),instructions:_e.string().nullish()});var e_=t=>!(!t.org_id||!t.user_id||!t.platform);import{z as hs}from"zod";var t_=hs.object({id:hs.string().uuid(),skipped:hs.boolean().optional(),envKey:hs.string().optional().describe("key in the environment to save the result of this step to")}),gE=t_.merge(qa).extend({type:hs.literal("REQUEST")}),SE=t_.merge(Zp).extend({type:hs.literal("JAVASCRIPT")}),yE=hs.discriminatedUnion("type",[SE,gE]);import{z as Gn}from"zod";var r_=Gn.object({id:Gn.string(),name:pi,description:Gn.string().optional().nullish(),baseUrl:hm.nullish(),schemaVersion:Gn.string(),advanced:Gn.unknown().optional(),retries:Gn.number(),envs:Gn.array(km).nullish(),parameters:Dm.nullish()}),FV=Gn.object({createdAt:Gn.coerce.date(),updatedAt:Gn.coerce.date(),schedule:Ul.nullish(),notification:Fl.nullish(),createdBy:Gn.string(),organizationId:Gn.string()}),BV=r_.merge(FV),sSe=BV.extend({steps:yE.array()}),lSe=r_.extend({steps:yE.array()});import{z as an}from"zod";var n_=an.object({startedAt:an.coerce.date(),finishedAt:an.coerce.date(),status:an.nativeEnum(ot),message:an.string().optional(),data:an.unknown().optional()}),zV=n_.merge(SE).extend({type:an.literal("JAVASCRIPT")}),HV=n_.merge(gE).extend({type:an.literal("REQUEST")}),GV=an.discriminatedUnion("type",[zV,HV]),o_=an.object({startedAt:an.coerce.date(),finishedAt:an.coerce.date().nullish(),status:an.nativeEnum(it),results:GV.array(),failureReason:an.string().nullish(),failureDetails:dm.nullish()});import{z as sn}from"zod";var jV=sn.object({id:sn.string(),organizationId:sn.string(),createdAt:sn.coerce.date(),updatedAt:sn.coerce.date(),createdBy:sn.string(),scheduledAt:sn.coerce.date().nullish(),startedAt:sn.coerce.date().nullish(),finishedAt:sn.coerce.date().nullish(),status:sn.nativeEnum(it),trigger:sn.nativeEnum(on),results:o_.array().nullish(),apiTestName:sn.string().nullish(),apiTestPath:sn.string().nullish(),apiTestId:sn.string().nullish()}),ySe=jV.pick({status:!0,startedAt:!0,finishedAt:!0});var cd=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(cd||{}),i_=3;function VV(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function EE(t){if(!VV(t))switch(t){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function TE(t){switch(t.type){case"AI_EXTRACT":case"AI_ASSERTION":return i_;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case"DRAG":return t.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var Xl=class{trackStepExecution(){}async flush(){}};import{parseString as $V,splitCookiesString as WV}from"set-cookie-parser";import{z as tt}from"zod";var bE=tt.object({name:tt.string(),value:tt.string(),url:tt.string().optional(),domain:tt.string().optional(),path:tt.string().optional(),expires:tt.number().default(Date.now()/1e3+60*60*24*365),httpOnly:tt.boolean().optional(),secure:tt.boolean().default(!0),sameSite:tt.union([tt.literal("Strict"),tt.literal("Lax"),tt.literal("None")]).default("None")});function Km(t,e){let r=[],n=WV(t);for(let o of n){let i=$V(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=bE.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});r.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||r.push({...s,name:d,value:p})}}return r}var qV=tt.object({origin:tt.string(),localStorage:tt.array(tt.object({name:tt.string(),value:tt.string()})),sessionStorage:tt.array(tt.object({name:tt.string(),value:tt.string()})).optional()}),KV=tt.object({entries:tt.record(tt.string(),tt.array(tt.tuple([tt.unknown(),tt.unknown()]))),version:tt.number().optional()}),Ym=tt.object({cookies:bE.array().optional(),origins:qV.array().optional(),idb:tt.record(tt.string(),KV).optional().describe("key is db name")});function a_(t,e){let r=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=bE.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),r.push(i)}),r}import{v4 as BSe}from"uuid";import Z from"zod";var YV=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],s_=Z.object({type:Z.enum(YV).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit, CUSTOM_COORDINATES = use explicit pixel coordinates for the scroll start position and distance (fallback if other containers don't work)."),description:Z.string().or(Z.null()).describe("Description of the container to interact with. Only used if the container type is CUSTOM, else set to null."),startX:Z.number().or(Z.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:Z.number().or(Z.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:Z.number().or(Z.null()).describe("Number of pixels to scroll in the specified direction. Only used if the container type is CUSTOM_COORDINATES, else set to null.")}),XV=Z.object({xPercent:Z.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:Z.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),JV=Z.string().or(XV).describe("Either a string description of an actual element in the page XML to target, or an object with xPercent/yPercent (0-1) for coordinate-based targeting when no suitable element exists. Prefer element descriptions when possible."),l_=Z.object({type:Z.literal("TAP"),target:JV,longPress:Z.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:Z.null().or(Z.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:Z.null().or(Z.object({x:Z.number(),y:Z.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner. Only applicable when target is a string description.")}).describe("Tap on an element on the screen, or tap at specific coordinates."),QV=Z.object({type:Z.literal("PRESS"),key:Z.nativeEnum(ps)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),c_=Z.object({type:Z.literal("AI_CHECK"),assertion:Z.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:Z.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe("Use AI to verify a statement about the state of the emulator. Will retry up until the timeout, so this can be used as a flexible wait that supports visual, numerical, and logical reasoning."),u_=Z.object({type:Z.literal("WAIT"),timeoutSecs:Z.number().describe("Number of seconds to wait.")}).describe("Wait for a fixed number of seconds. Use this in these scenarios: 1. Short waits that are expected to be less than 5 seconds almost all the time, which shouldn't warrant an AI call (e.g. an app needs to finish loading, or some contents are suspending); 2. Waits with an obvious deterministic duration (e.g. a 60-second countdown is on the page). For other scenarios, prefer AI_CHECK."),qSe=Z.object({type:Z.literal("AI_EXTRACT"),goal:Z.string().describe("Natural language description of what to extract from the current emulator state."),schema:Z.string().or(Z.null()).describe("Optional JSON schema string for the expected output shape. Use null to omit.")}).describe("Use AI to extract structured data from the current emulator state."),d_=Z.object({type:Z.literal("TYPE"),text:Z.string().describe("Exact type to text, which will be passed to appium's driver.keys() method."),keyPressDelayMs:Z.number().or(Z.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:Z.boolean().or(Z.null()).describe("Clear the content of the input before typing. Do not set to true if the input is already empty.")}),p_=Z.object({type:Z.literal("SWIPE"),direction:Z.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:s_,viewportPercent:Z.number().min(.1).max(1).or(Z.null()).describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Set to null for default (0.8)."),durationMs:Z.number().int().positive().or(Z.null()).describe("Optional swipe duration in milliseconds. Set to null for default.")}).describe("Swipe a single time in a specified direction within a container (screen/app/webview/custom container/custom coordinates)."),m_=Z.object({type:Z.literal("SCROLL_TO"),targetDescription:Z.string().describe("Description of the element to scroll to inside the container."),direction:Z.enum(["down","up"]).describe("Direction to search for the target. Important: this is direction the target is in relative to the current position. E.g. 'down' means the desired element is below the current position."),container:s_,scrollStepPercent:Z.number().min(.1).max(1).or(Z.null()).describe("How much of the container height to scroll at each step (0.1 - 1). Set to null for default (0.8)."),maxScrollAttempts:Z.number().int().min(1).max(50).or(Z.null()).describe("Maximum number of scroll attempts before giving up. Set to null for default (5).")}).describe("Scroll within a container until the described target is visible or we can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If a scroll fails, we do not restore the position automatically."),KSe=Z.discriminatedUnion("type",[l_,QV,c_,u_,d_,p_,m_]),ZV=Z.object({type:Z.literal("PRESS"),key:Z.nativeEnum(ta)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),e$=Z.object({type:Z.literal("PRESS_KEYBOARD"),key:Z.nativeEnum(ra)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),YSe=Z.discriminatedUnion("type",[l_,ZV,e$,c_,u_,d_,p_,m_]);var XSe={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a fixed number of seconds. Prefer this for short, deterministic waits; use AI_CHECK for longer or undefined waits.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",ROTATE_ORIENTATION:"Rotate the device orientation.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true.",AI_EXTRACT:"Extract data from the emulator state and optionally store it in an environment variable."};var JSe=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","ROTATE_ORIENTATION","AI_CHECK"];import f_ from"zod";var ln={type:!0,cache:!0},h_=[Vl.pick(ln),Wu.pick(ln),ed.pick(ln),nd.pick(ln),Qu.pick(ln),Xu.pick(ln),Vu.pick(ln)],Jl=f_.discriminatedUnion("type",h_),g_=[Vl.pick(ln),qu.pick(ln),td.pick(ln),od.pick(ln),Zu.pick(ln),$u.pick(ln),Ju.pick(ln)],S_=f_.discriminatedUnion("type",g_);var fye=Object.values(He).filter(t=>h_.some(e=>e.shape.type.safeParse(t).success));var hye=Object.values(He).filter(t=>g_.some(e=>e.shape.type.safeParse(t).success));function Xm(t){switch(t){case"ANDROID":return Jl;case"IOS":return S_;default:throw new Error(`Unsupported platform: ${t}`)}}var gye=wl(Jl),Sye=wl(S_);var yye=Ja(Jl);import y_ from"zod";var ud=(n=>(n.US_WEST_1="us-west1",n.EU_NORTH_1="eu-north1",n.AS_SOUTH_1="as-south1",n))(ud||{}),E_=(e=>(e.LOCAL="local",e))(E_||{}),T_=y_.nativeEnum(ud).or(y_.nativeEnum(E_)),dd=(r=>(r.ANDROID_14="14",r.ANDROID_15="15",r))(dd||{});var vE=(e=>(e.IOS_26="26",e))(vE||{});import{cloneDeep as Aye}from"lodash-es";import Rye from"truncate-json";import $t from"zod";import{z as Eo}from"zod";import{z as _t}from"zod";var Lr=_t.object({id:_t.string(),name:pi,baseUrl:hm,description:_t.string().optional().nullish(),schemaVersion:_t.string(),advanced:us,retries:_t.number().optional().nullish(),envs:_t.array(km).nullish(),parameters:Dm.nullish(),disabled:_t.boolean().optional(),labels:_t.array(_t.string()).optional().catch([])}),Oye=_t.enum(["INHERIT","ENABLED","DISABLED"]);var t$=us.extend({failureRecovery:_t.boolean().or(_t.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED"),useMemory:_t.boolean().or(_t.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED")});var Lye=Lr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:t$}),Nye=Lr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),r$=_t.object({labels:_t.array(_t.string()).optional(),outputs:tx.nullish()}),jn=Lr.merge(r$),n$=_t.object({createdAt:_t.coerce.date(),updatedAt:_t.coerce.date(),updatedBy:_t.string().nullable(),schedule:Ul,notification:Fl,createdBy:_t.string(),organizationId:_t.string(),folderId:_t.string().nullable().optional()}),o$=Lr.merge(n$),Dye=o$.merge(qi),Jm=Lr.merge(qi),kye=Lr.merge(rs);var i$="test",a$="module",s$="mobile-test",l$="mobile-module";var ye=(o=>(o.TEST=`momentic/${i$}`,o.MODULE=`momentic/${a$}`,o.MOBILE_TEST=`momentic/${s$}`,o.MOBILE_MODULE=`momentic/${l$}`,o))(ye||{}),jye=Lr.merge(rs),AE=nn.extend({steps:Eo.array(Eo.record(Eo.string(),Eo.unknown())),schemaVersion:Eo.string()}),Vye=AE.extend({fileType:Eo.literal(ye.MODULE)}),$ye=Eo.object({test:Eo.string().describe("YAML for the test, including metadata and steps"),modules:Eo.record(Eo.string(),Eo.string()).describe("Map of module name to YAML for the module")});function Qm(t){if(t===void 0)return"__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(Qm);let e={};for(let[r,n]of Object.entries(t))e[r]=Qm(n);return e}var pd=$t.object({parameterNames:$t.string().array(),defaultParameters:$t.record($t.string(),$t.string()).optional(),parameterEnums:$t.record($t.string(),$t.string().array()).optional()}),c$=$t.object({moduleId:$t.string().uuid(),name:$t.string(),description:$t.string().nullish(),platform:$t.nativeEnum(gr).optional().default("ANDROID"),parameters:pd.optional(),enabled:$t.boolean().nullish(),schemaVersion:$t.string()}),Zm=c$.omit({name:!0}),b_=Zm.extend({steps:$t.array($t.record($t.string(),$t.unknown()))}),u$=$t.object({fileType:$t.literal(ye.MOBILE_MODULE)}).merge(b_);import Oe from"zod";import*as Ql from"zod";var eEe=Ql.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."}),RE=Ql.preprocess(t=>{if(typeof t!="string")return t;let e=t.trim();return e.length===0?void 0:e},Ql.string().optional());import To from"zod";var Fo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Fo||{}),v_=To.object({description:To.string().optional(),name:To.string().describe("name of the module"),parameters:pd.optional()}),wE=Kl.merge(v_).extend({platform:To.literal("ANDROID"),steps:To.lazy(()=>gs.array())}),xE=Kl.merge(v_).extend({platform:To.literal("IOS"),steps:To.lazy(()=>Ss.array())}),d$=ql.merge(wE).extend({type:To.literal("RESOLVED_MOBILE_MODULE")}),p$=ql.merge(xE).extend({type:To.literal("RESOLVED_MOBILE_MODULE")}),gs=To.discriminatedUnion("type",[d$,ad,na]),Ss=To.discriminatedUnion("type",[p$,sd,na]);function A_(t){return Object.values(Fo).includes(t)||Object.values(Or).includes(t)}var m$=Oe.object({disableMomenticAccessibilityTree:Oe.boolean().optional(),autoGrantPermissions:Oe.boolean().optional(),disableXmlSnapshots:Oe.boolean().optional().describe("Skip collecting XML snapshots during test runs. This can speed up test runs, but will cause the run viewer to show less information."),browserSettings:kl.optional()}),_E=m$.extend({region:T_.optional().describe("Do you want local or Limbar? Default behavior is Limbar (remote emulators)"),remoteEmulatorSettings:Oe.object({androidVersion:Oe.nativeEnum(dd).optional()}).optional(),localEmulatorSettings:Oe.object({avdId:RE}).optional(),geolocation:Oe.object({latitude:Oe.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Oe.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:Oe.boolean().optional().describe("wait for stability before every targeting action")}),Zl=Oe.object({retries:Oe.number().optional().describe("number of retries to run"),defaultChannel:Oe.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:Oe.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:Oe.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:RE.describe("APK to install when using the emulator in the local region."),emulator:_E.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:Ly.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),C_=Oe.object({id:Oe.string().uuid(),description:Oe.string(),schemaVersion:Oe.string(),settings:Zl.optional(),disabled:Oe.boolean().optional(),labels:Oe.array(Oe.string()).optional()}),ef=C_.extend({platform:Oe.literal("ANDROID").optional().default("ANDROID")}),tf=C_.extend({platform:Oe.literal("IOS")}),IE=Oe.discriminatedUnion("platform",[ef,tf]),R_=Oe.object({fileType:Oe.literal(ye.MOBILE_TEST)}),rf=R_.merge(ef),nf=R_.merge(tf),bEe=Oe.discriminatedUnion("platform",[rf,nf]),w_=ef.merge(Oe.object({steps:Oe.array(qm)})),x_=tf.merge(Oe.object({steps:Oe.array(hE)})),vEe=Oe.discriminatedUnion("platform",[w_,x_]),f$=rf.merge(w_),h$=nf.merge(x_),g$=Oe.discriminatedUnion("platform",[f$,h$]),AEe=Oe.object({name:Oe.string(),steps:Oe.array(qm).optional(),settings:Zl.optional()}),__=ef.extend({steps:gs.array()}),I_=tf.extend({steps:Ss.array()}),CEe=Oe.discriminatedUnion("platform",[__,I_]),S$=__.extend({name:Oe.string()}),y$=I_.extend({name:Oe.string()}),E$=Oe.discriminatedUnion("platform",[S$,y$]);import ke from"zod";import ne from"zod";var cn=ne.object({startTime:ne.number(),endTime:ne.number().optional(),durationMs:ne.number().optional(),error:ne.string().optional(),result:ne.unknown().optional(),attributes:ne.record(ne.string(),ne.unknown()),subSpans:ne.lazy(()=>L$.array())});var PE=cn.extend({type:ne.literal("SECTION"),name:ne.string()}),T$=cn.extend({type:ne.literal("GET_PAGE_STATE")}),b$=cn.extend({type:ne.literal("GET_PAGE_SCREENSHOT")}),v$=cn.extend({type:ne.literal("SMART_WAITING")}),A$=cn.extend({type:ne.literal("SCROLL_ELEMENT_INTO_VIEW")}),C$=cn.extend({type:ne.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:ne.string().optional(),result:ne.object({id:ne.number(),thoughts:ne.string()}).optional()}),R$=cn.extend({type:ne.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:ne.string().optional(),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({thoughts:ne.string(),result:ne.boolean()}).optional()}),w$=cn.extend({type:ne.literal("ELEMENT_ASSERTION"),name:ne.string(),result:ne.object({success:ne.boolean(),message:ne.string().optional()}).optional()}),x$=cn.extend({type:ne.literal("BROWSER_INTERACTION"),name:ne.string(),coordinates:ne.object({x:ne.number(),y:ne.number()}).optional(),value:ne.string().optional(),selector:ne.string().optional()}),_$=cn.extend({type:ne.literal("CACHE_RESOLUTION"),resolutionMethod:ne.string().optional(),cacheMissReason:ne.nativeEnum(hl).optional(),targetSource:ne.string().optional(),result:ne.object({serializedElement:ne.string()}).optional()}),I$=cn.extend({type:ne.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({serializedElement:ne.string()}).optional()}),P$=cn.extend({type:ne.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({outcome:ne.string(),logs:ne.string().array().optional(),serializedElement:ne.string().optional(),relativeClickPoint:ne.object({x:ne.number(),y:ne.number()}).optional(),force:ne.boolean().optional()}).optional()}),M$=cn.extend({type:ne.literal("WAIT_FOR_STABILITY")}),O$=cn.extend({type:ne.literal("GENERIC"),name:ne.string()}),L$=ne.discriminatedUnion("type",[PE,T$,b$,v$,A$,C$,R$,w$,x$,I$,_$,P$,M$,O$]);var Vn=ke.object({startTime:ke.number(),endTime:ke.number().optional(),durationMs:ke.number().optional(),error:ke.string().optional(),result:ke.unknown().optional(),attributes:ke.record(ke.string(),ke.unknown()),subSpans:ke.lazy(()=>W$.array())});var N$=Vn.extend({type:ke.literal("SECTION"),name:ke.string()}),D$=Vn.extend({type:ke.literal("AI_LOCATOR_CALL"),result:ke.object({id:ke.number(),thoughts:ke.string()}).optional()}),k$=Vn.extend({type:ke.literal("AI_ASSERTION_CALL"),result:ke.object({thoughts:ke.string(),result:ke.boolean()}).optional()}),U$=Vn.extend({type:ke.literal("TARGET_RESOLUTION"),result:ke.object({serializedElement:ke.string()}).optional()}),F$=Vn.extend({type:ke.literal("EMULATOR_INTERACTION"),name:ke.string(),withinWebview:ke.boolean().optional()}),B$=Vn.extend({type:ke.literal("EMULATOR_READ_STATE"),name:ke.string()}),z$=Vn.extend({type:ke.literal("ELEMENT_ASSERTION"),name:ke.string(),result:ke.object({success:ke.boolean(),message:ke.string().optional()}).optional()}),H$=Vn.extend({type:ke.literal("CACHE_RESOLUTION")}),G$=Vn.extend({type:ke.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),j$=Vn.extend({type:ke.literal("WAIT_FOR_PAGE_STABILITY")}),V$=Vn.extend({type:ke.literal("WEBVIEW_LOCATOR_CALL"),webTrace:PE}),$$=Vn.extend({type:ke.literal("GENERIC"),name:ke.string()}),W$=ke.discriminatedUnion("type",[N$,D$,k$,U$,F$,B$,z$,H$,G$,j$,V$,$$]);import{parse as NEe}from"date-fns";import{z as ec}from"zod";var kEe=ec.object({testId:ec.string(),sessionId:ec.string()}),P_=ec.object({uploadUrl:ec.string(),id:ec.string()});import q$ from"zod";var M_=(r=>(r.LOCAL="local",r.REMOTE="remote",r))(M_||{}),BEe=q$.nativeEnum(M_);var STe=new Set(Object.values(et));var K$={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},yTe={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},pt={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of a conditional check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},ETe={AI_CHECK:"AI check",AI_EXTRACT:"AI extract",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ROTATE_ORIENTATION:"Rotate orientation",ADB:"ADB command",STATE:"Debug state"},TTe={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ROTATE_ORIENTATION:"Rotate the device orientation to portrait or landscape.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen.",AI_EXTRACT:"Ask AI to extract data from the emulator state."};import Y$ from"semver";import{z as X$}from"zod";var CTe=X$.string().refine(t=>Y$.valid(t),{message:"must be a valid semver string"});function tc(t){if(t!==void 0)return t===!0||t==="true"||t==="1"}import{Faker as xTe,en as _Te}from"@faker-js/faker";import{z as q}from"zod";var rc=55555,PTe=q.object({body:q.string(),to:q.string(),from:q.string()}),MTe=q.object({from:q.string().optional(),to:q.string(),timeout:q.number().optional(),beforeDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional()}),OTe=q.object({to:q.string().email(),from:q.string(),subject:q.string(),body:q.string(),html:q.string().optional()}),LTe=q.object({inbox:q.string().transform(t=>t.toLowerCase()),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),timeout:q.number().optional(),trimWhitespace:q.boolean().optional()}),NTe=q.object({inbox:q.string(),limit:q.number().optional(),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),trimWhitespace:q.boolean().optional()});var of=(r=>(r.RAW="RAW",r.RESPONSE="RESPONSE",r))(of||{}),O_=q.object({body:q.string().nullish(),status:q.number().optional(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}),J$=q.object({url:q.string(),options:q.object({method:q.string(),body:q.string().nullish(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}).optional()}).optional(),Q$=q.object({body:q.string().nullish(),options:q.object({status:q.number(),statusText:q.string().optional(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}).optional()}).optional(),L_=q.object({result:q.unknown(),variableUpdates:q.record(q.string(),q.unknown()).optional(),persistentVariableUpdates:q.record(q.string(),q.unknown()).optional(),error:q.string().optional(),success:q.boolean()}),DTe=q.object({id:q.string().optional(),orgId:q.string(),momenticLambdaAuthHash:q.string(),code:q.string(),fragment:q.boolean(),state:q.object({env:q.record(q.string(),q.unknown()),request:J$,response:Q$,additionalBindings:q.record(q.string(),q.unknown()).optional()}),timeoutMs:q.number().optional(),disallowVariableUpdates:q.boolean().optional(),responseSerialization:q.nativeEnum(of).optional()}),ia=15e3;import*as Nr from"zod";import{extendZodWithOpenApi as Z$}from"zod-openapi";Z$(Nr);var eW=Nr.object({url:Nr.string(),lineNumber:Nr.number(),columnNumber:Nr.number()}).openapi({ref:"CodeLocation"}),af=Nr.object({timestamp:Nr.number(),text:Nr.string(),type:Nr.string(),tabIndex:Nr.number(),args:Nr.unknown().array().optional(),url:Nr.string().optional(),location:eW.optional()}).openapi({ref:"ConsoleLog"}),N_=af.array(),ME=N_.array();import*as OE from"zod";import{extendZodWithOpenApi as tW}from"zod-openapi";tW(OE);var rW=OE.object({logsPerPage:af.array().array()}).openapi({ref:"DebugData"});import*as Lt from"zod";import{extendZodWithOpenApi as nW}from"zod-openapi";nW(Lt);var D_=Lt.object({total:Lt.number(),user:Lt.number(),sys:Lt.number(),intervalMs:Lt.number()}),oW=Lt.object({total:Lt.number(),free:Lt.number(),freePercentage:Lt.number()}),iW=Lt.object({rss:Lt.number(),heapTotal:Lt.number(),heapUsed:Lt.number(),external:Lt.number(),arrayBuffers:Lt.number()}),k_=Lt.object({timestamp:Lt.number(),system:Lt.object({cpu:D_.nullable(),memory:oW}),process:Lt.object({cpu:D_.nullable(),memory:iW})}).openapi({ref:"ResourceUsageSample"}),aW=Lt.object({samples:k_.array()}).openapi({ref:"ResourceUsageSeries"});var md=class{async getConsoleLogsForRunAttempt(e,r,n){}async getNetworkLogsForRunAttempt(e,r,n){}async getHtmlSnapshot(e,r){}async getA11yTreeSnapshot(e,r){}async getScreenshot(e,r){}async storeConsoleLogsForRunAttempt(e,r,n,o){}async storeNetworkLogsForRunAttempt(e,r,n,o){}listVideoAssetPaths(){return[]}close(){}async storeScreenshot(e,r,n){}async storeOnDemandScreenshotById(e,r,n,o){}async storeHtmlSnapshot(e,r,n){}};import{z as U}from"zod";var sW=U.object({name:U.string(),version:U.string(),comment:U.string().optional()}),lW=U.object({name:U.string(),version:U.string(),comment:U.string().optional()}),cW=U.object({onContentLoad:U.number().optional(),onLoad:U.number().optional(),comment:U.string().optional()}),fd=U.object({startedDateTime:U.string(),id:U.string(),title:U.string().optional(),pageTimings:cW,comment:U.string().optional()}),uW=U.array(fd),dW=U.object({name:U.string(),value:U.string(),path:U.string().optional(),domain:U.string().optional(),expires:U.string().optional(),httpOnly:U.boolean().optional(),secure:U.boolean().optional(),comment:U.string().optional()}),F_=U.array(dW),pW=U.object({name:U.string(),value:U.string(),comment:U.string().optional()}),B_=U.array(pW),mW=U.object({name:U.string(),value:U.string(),comment:U.string().optional()}),fW=U.array(mW),hW=U.object({name:U.string(),value:U.string().optional(),fileName:U.string().optional(),contentType:U.string().optional(),comment:U.string().optional()}),gW=U.array(hW),SW=U.object({mimeType:U.string(),params:gW,text:U.string(),comment:U.string().optional(),_redactedReason:U.string().optional()}),yW=U.object({method:U.string(),url:U.string(),httpVersion:U.string().optional(),cookies:F_,headers:B_,queryString:fW,postData:SW.optional(),headersSize:U.number().optional(),bodySize:U.number().optional(),comment:U.string().optional()}),EW=U.object({size:U.number().optional(),compression:U.number().optional(),mimeType:U.string().optional(),text:U.string().optional(),encoding:U.string().optional(),comment:U.string().optional(),_redactedReason:U.string().optional()}),TW=U.object({status:U.number(),statusText:U.string(),httpVersion:U.string().optional(),cookies:F_,headers:B_,content:EW,redirectURL:U.string().optional(),headersSize:U.number().optional(),bodySize:U.number().optional(),comment:U.string().optional(),_mocked:U.boolean().optional()}),U_=U.object({expires:U.string().optional(),lastAccess:U.string(),eTag:U.string(),hitCount:U.number(),comment:U.string().optional()}),bW=U.object({beforeRequest:U_.optional(),afterRequest:U_.optional(),comment:U.string().optional()}),vW=U.object({blocked:U.number().optional(),dns:U.number().optional(),connect:U.number().optional(),send:U.number(),wait:U.number(),receive:U.number(),ssl:U.number().optional(),comment:U.string().optional()}),hd=U.object({pageref:U.string().optional(),startedDateTime:U.string(),time:U.number().optional(),request:yW,response:TW.optional(),cache:bW.optional(),timings:vW,serverIPAddress:U.string().optional(),connection:U.string().optional(),comment:U.string().optional(),_resourceType:U.string().optional()}),AW=U.array(hd),CW=U.object({version:U.string().default("1.1"),creator:sW.optional(),browser:lW.optional(),pages:uW.optional(),entries:AW,comment:U.string().optional()}),RW=U.object({log:CW}),XTe=U.record(U.string(),fd),JTe=U.record(U.string(),hd);function LE(t,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}var z_=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{cloneDeep as wW}from"lodash-es";import{z as Bo}from"zod";var NE=(u=>(u.DisableClickhouseCaches="disable_clickhouse_caches",u.ShowZeroOpacityElements="show_zero_opacity_elements",u.VisualActions="visual_actions",u.RagV2="rag_v2",u.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",u.GlobalLocatorRedirect="global_locator_redirect",u.FakerConstantSeed="faker_constant_seed",u.AutoExpandIframes="auto_expand_iframes",u.NewAiActionStepsUseV3="new_ai_action_steps_use_v3",u.PerformanceInsights="performance_insights",u))(NE||{});var H_=Bo.union([Bo.string(),Bo.number(),Bo.boolean(),Bo.null(),Bo.record(Bo.string(),Bo.lazy(()=>H_)),Bo.array(Bo.lazy(()=>H_))]),gd=class{flags;payloads;constructor(e,r){this.flags=e,this.payloads=r}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=wW(this.flags);return Object.entries(e).forEach(([r,n])=>{typeof n=="boolean"&&Object.values(NE).includes(r)&&(e[r]=this.isBooleanFlagEnabled(r))}),e}getFlagPayload(e){let r=this.payloads[e];if(r!==void 0){if(typeof r=="string")try{return JSON.parse(r)}catch{return r}return r}}refresh(){throw new Error("Not implemented")}},cbe=new gd({},{});var Sd={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},G_=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],dbe=Object.keys(Sd);import{z as aa}from"zod";var fbe=aa.object({id:aa.string(),name:aa.string(),createdAt:aa.coerce.date(),createdBy:aa.string(),updatedAt:aa.coerce.date(),updatedBy:aa.string().nullable(),organizationId:aa.string()});import{z as V}from"zod";import sa from"zod";var nc=sa.object({platformSep:sa.string(),fullPathSegments:sa.string().array(),relativePathSegments:sa.string().array(),relativePath:sa.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:sa.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:sa.coerce.date(),createdAt:sa.coerce.date()});var xW=V.array(nc.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),_W=nc.extend({id:V.string(),name:V.string(),description:V.string().optional(),content:Ty}),IW=V.array(_W),xbe=V.object({tests:xW,modules:IW,labels:V.string().array()}),_be=Jm.merge(jn),j_=V.object({schemaVersion:V.string(),stepLists:qi}),V_=jn.partial().merge(Lr.pick({id:!0})),la="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",DE={name:V.string().min(1).max(255).describe(la),description:V.string().optional(),baseUrl:V.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:V.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:V.nativeEnum(So).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Rm.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:V.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder. Paths are relative to the project root.")},$_=V.object(DE),Ibe=Jm.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),W_=V.object({name:V.string()}),Pbe=V.object({relativeFilePath:V.string()}),q_=V.object({name:V.string()}),Mbe=V.object({relativeFilePath:V.string()}),K_=V.object({name:V.string(),description:V.string(),enabled:V.boolean(),steps:V.lazy(()=>Dt.array()),testFilePath:V.string().describe("relative to the project root"),folderPath:V.string().optional().describe("user selected folder path")}),Y_=V.object({name:V.string(),description:V.string(),enabled:V.boolean()}).partial();var Obe=V.array(Kw),X_=V.object({defaultEnv:V.string().optional().describe("name of the default env, or undefined to unset")}),J_=V.object({configFilePath:V.string().describe("full path on disk")}),Lbe=V.string().array(),Nbe=V.object({message:V.string(),newRelativeTestPath:V.string().optional()}),kE=V.object({name:V.string(),absolutePath:V.string(),relativePath:V.string(),pathSegments:V.array(V.string()),isDirectory:V.boolean(),size:V.number(),createdAt:V.coerce.date(),modifiedAt:V.coerce.date(),accessedAt:V.coerce.date()}),Q_=V.object({pathSegments:V.array(V.string())}),Dbe=V.object({absolutePath:V.string(),pathSegments:V.array(V.string()),contents:V.array(kE)}),Z_=V.object({pathSegments:V.array(V.string())}),eI=V.object({pathSegments:V.array(V.string()),newPathSegments:V.array(V.string())}),tI=V.object({pathSegments:V.array(V.string()),recursive:V.boolean().optional()}),kbe=V.object({success:V.boolean(),message:V.string(),pathSegments:V.array(V.string()).optional()}),Ube=V.object({gitBranch:V.string(),fileMtime:V.coerce.date(),gitCommitSha:V.string()});var sf=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],lf=sf.map(t=>`**/${t}/**`),rI=typeof process<"u"&&!0&&!0,$n=typeof process<"u"&&!1,nI=2e5;var cf=58889;import zo from"chalk";import PW from"safe-stable-stringify";import MW from"truncate-json";import OW from"zod";var ys=PW.configure({deterministic:!1});function oI(t){let e=ys(t),{jsonString:r}=MW(e,5e4);return r}var LW=["app","version","env","namespace","host"];function at(t){let e=t.bindings()??{},r={};for(let n of Object.keys(e)){let o=e[n];!LW.includes(n)&&typeof o=="string"&&(r[n]=o)}return r}var UE=OW.enum(["debug","info","warn","error"]);var yd={debug:20,info:30,warn:40,error:50},iI={20:"debug",30:"info",40:"warn",50:"error"},Es=class t{minLogLevel;logBindings;constructor(e,r){typeof e=="string"?this.minLogLevel=yd[e]:this.minLogLevel=e,this.logBindings=r}logWithLevel(e,r,...n){try{this.logWithLevelHelper(e,r,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,r=" "){return e.split(`
11
+ `)}`}};function MG(t){return t instanceof Error?t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator"):!1}function OG(t){return!(t instanceof Error)||t.message.includes("locator resolved to visible")?!1:!!(t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("body >")||t.message.includes("Element is not attached to the DOM"))}var Ol=class extends Error{constructor(e,r={}){super(e,r),this.name="CacheAttributesDisqualifyElementError"}},Wi=class extends Ol{constructor(e,r={}){super(e,r),this.name="ElementMovedError"}},pm=class extends Ol{constructor(e,r={}){super(e,r),this.name="ZeroOpacityError"}},Mu=class extends Error{constructor(e,r={}){super(e,r),this.name="IsInvalidMomenticIdError"}};function LG(t){return t instanceof Error?t.message.includes("Could not find attribute data-momentic-id for object"):!1}var ly="Element to be clicked has no bounding box";function NG(t){return t instanceof Error?t.message.startsWith(ly):!1}function cy(t){return t instanceof Wi||OG(t)||DG(t)||kG(t)||MG(t)||LG(t)||NG(t)}function DG(t){return t instanceof Error?t instanceof Mu?!0:t.message.includes("Timeout")&&t.message.includes("exceeded")&&t.message.includes("waiting for locator")&&t.message.includes("data-momentic-id")&&!t.message.includes("locator resolved")&&!t.message.includes("waiting for element to be"):!1}function kG(t){return t instanceof Error?t.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||t.message.includes("Could not resolve backend node"):!1}var Ou=class extends Error{constructor(e,r={}){super(e,r),this.name="InsufficientCacheDataError"}};function Ot(t){return t instanceof Error?t.message:String(t)}function ZR(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function UG({name:t,schema:e}){let r=[{node:Qa(e),path:t}];for(;r.length>0;){let n=r.pop();if(!n)continue;let{node:o,path:i}=n;if(Array.isArray(o)){o.forEach((s,c)=>{r.push({node:s,path:`${i}[${c}]`})});continue}if(!ZR(o))continue;let a=o.properties;if(ZR(a)){if(o.additionalProperties!==!1)throw new Error(`${t} violates OpenAI strict schema requirements at ${i}: object schemas must set additionalProperties to false.`);let s=Array.isArray(o.required)?o.required.filter(l=>typeof l=="string"):[],c=Object.keys(a).filter(l=>!s.includes(l));if(c.length>0)throw new Error(`${t} violates OpenAI strict schema requirements at ${i}: [${c.join(", ")}] must be required. Use nullable() or z.union([X, z.null()]) instead of optional()/nullish().`)}Object.entries(o).forEach(([s,c])=>{r.push({node:c,path:`${i}.${s}`})})}}function ew(t){t.forEach(UG)}var FG={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST.",SET_HEADER:"Set a header for subsequent network requests. Optionally scope it to matching requests.",REGISTER_REQUEST_LISTENER:"Register a request listener for matching requests and save them under a key.",RECORD_REQUESTS:"Record matching requests and store them under a key for later retrieval.",MOCK_ROUTE:"Mock matching network requests with a generated response."};ty.options.forEach(t=>{let e=t.shape.type.value;if(e!=="SUCCESS"&&!FG[e])throw new Error(`Command type ${e} is missing a description`)});var mm=M.object({urlMatcher:yu,method:M.string().nullable()});var tw=M.object({type:M.literal("CLICK"),description:M.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:M.boolean().nullable(),rightClick:M.boolean().nullable(),waitForDownload:M.boolean().nullable().describe("Wait for the click to trigger a file download and for the download to complete."),downloadTimeoutMs:M.number().int().nullable().describe("Max milliseconds to wait for a download to start and complete when waitForDownload is enabled."),delayMs:M.number().int().nullable().describe("Delay before performing the click, in milliseconds.")}),rw=M.object({type:M.literal("TYPE"),description:M.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:M.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:M.boolean().nullable().describe("Press enter after typing (useful for form submissions)."),clearContent:M.boolean().nullable().describe("Clear existing content before typing. Disable to append to the existing text.")}),nw=M.object({type:M.literal("GO_BACK")}),BG=M.object({type:M.literal("GO_FORWARD")}),zG=M.object({type:M.literal("LOCAL_STORAGE"),key:M.string().describe("The localStorage key to set or get."),value:M.string().describe("The value to store in localStorage. If reading, this can be empty.")}),ow=M.object({type:M.literal("PRESS"),keys:M.array(M.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),iw=M.object({type:M.literal("SELECT_OPTION"),description:M.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:M.discriminatedUnion("type",[M.object({type:M.literal("VALUE"),value:M.string()}),M.object({type:M.literal("LABEL"),label:M.string()}),M.object({type:M.literal("INDEX"),index:M.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),aw=M.object({type:M.literal("NAVIGATE"),url:M.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),sw=M.object({type:M.literal("SCROLL"),y:M.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),lw=M.object({type:M.literal("WAIT"),timeout:M.number().describe("The number of seconds to wait.")}),cw=M.object({type:M.literal("AI_ASSERTION"),assertion:M.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:M.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),uw=M.object({type:M.literal("HOVER"),description:M.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),HG=M.object({type:M.literal("COPY"),value:M.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),GG=M.object({type:M.literal("PASTE")}),jG=M.object({type:M.literal("REFRESH")}),VG=M.object({type:M.literal("REQUEST"),url:M.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:M.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:M.record(M.string(),M.string()).nullable().describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:M.record(M.string(),M.string()).nullable().describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:M.string().nullable().describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:M.number().int().nullable().describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),$G=M.object({type:M.literal("GRAPHQL_REQUEST"),url:M.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:M.record(M.string(),M.string()).nullable().describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:M.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:M.string().nullable().describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:M.number().int().nullable().describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),WG=M.object({type:M.literal("SET_HEADER"),name:M.string().describe("The header name to set."),value:M.string().describe("The header value to set."),requestMatcher:mm.nullable().describe("Optional request matcher to scope the header to matching requests.")}),qG=M.object({type:M.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:mm.describe("Request matcher to define which requests should be captured."),key:M.string().describe("Identifier for the listener. Used to retrieve recorded data.")}),KG=M.object({type:M.literal("RECORD_REQUESTS"),requestMatcher:mm.describe("Request matcher to define which requests should be recorded."),key:M.string().describe("Identifier for the recording. Used to retrieve recorded data.")}),YG=M.object({type:M.literal("MOCK_ROUTE"),requestMatcher:mm.describe("Request matcher defining which requests should be mocked."),responseGenerator:M.string().describe("JavaScript code to generate the mocked response."),fetchOriginalResponse:M.boolean().nullable().describe("Whether to fetch the real response and pass it to the response generator."),key:M.string().nullable().describe("Optional key to reference this mock for removal.")}),dw=M.object({type:M.literal("DRAG"),fromDescription:M.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:M.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:M.number().int().positive().nullable().describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:M.number().positive().nullable().describe("Optional seconds to hover over the destination before releasing the drag.")}),XG=M.object({type:M.literal("MOUSE_DRAG"),description:M.string().nullable().describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:M.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:M.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:M.number().int().positive().nullable().describe("Optional number of intermediate mouse move steps during the drag.")}),JG=M.object({type:M.literal("JAVASCRIPT"),code:M.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:M.union([M.literal("NODE"),M.literal("BROWSER")]).nullable().describe("Execution environment. Default is NODE."),timeout:M.number().nullable().describe("Max seconds for the code to complete. Max 60 seconds.")}),QG=M.object({type:M.literal("AI_EXTRACT"),goal:M.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:M.string().nullable().describe("JSON schema defining the expected structure of the extracted data."),iframeUrl:M.string().nullable().describe("URL or URL regex for the iframe to extract data from.")}),ZG=M.object({type:M.literal("ELEMENT_CHECK"),description:M.string().describe("Description of the element to check."),assertionType:M.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:M.string().nullable().describe("The value to check against (required for CONTENT assertions)."),negated:M.boolean().nullable().describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:M.number().nullable().describe("Max seconds to wait for the assertion to be true.")}),ej=M.object({type:M.literal("PAGE_CHECK"),value:M.string().describe("The text content to check for on the page."),negated:M.boolean().nullable().describe("If true, checks that the content is NOT present."),timeout:M.number().nullable().describe("Max seconds to wait for the assertion to be true.")}),tj=M.object({type:M.literal("NEW_TAB"),url:M.string().describe("The URL to open in the new tab.")}),rj=M.object({type:M.literal("WAIT_FOR_URL"),matcher:M.discriminatedUnion("type",[M.object({type:M.literal("SUBSTRING"),url:M.string()}),M.object({type:M.literal("GLOB"),glob:M.string()}),M.object({type:M.literal("REGEX"),regex:M.string()}),M.object({type:M.literal("DOMAIN"),domain:M.string()})]).describe("How to match the URL."),caseInsensitive:M.boolean().nullable(),negated:M.boolean().nullable().describe("Wait for the URL to NOT match instead."),timeout:M.number().nullable().describe("Max seconds to wait for the URL.")}),uy=M.object({type:M.literal("SUCCESS")}),dy=M.object({type:M.literal("FAILURE")}),py=M.discriminatedUnion("type",[tw,rw,ow,iw,aw,sw,lw,cw,uw,nw]),pw=M.discriminatedUnion("type",[...py.options,dw]),nj=py,oj=pw,fm=["CLICK","TYPE","PRESS","SELECT_OPTION","NAVIGATE","SCROLL","WAIT","AI_ASSERTION","HOVER","GO_BACK","DRAG"],my=M.discriminatedUnion("type",[tw,rw,ow,iw,aw,sw,lw,cw,uw,nw,dw,JG,ZG,ej,tj,rj,QG,HG,BG,zG,XG,GG,jG,VG,$G,WG,qG,KG,YG]);ew([{name:"AI_ACTION_COMMAND_OPTIONS_V1",schema:nj},{name:"AI_ACTION_COMMAND_OPTIONS_V2",schema:oj},{name:"AgentRawCommandSchema",schema:my}]);var nle=Qa(my),ole=M.discriminatedUnion("type",[...my.options,uy,dy]),ile=Qa(M.discriminatedUnion("type",[...py.options,uy,dy])),ale=Qa(M.discriminatedUnion("type",[...pw.options,uy,dy])),sle=M.object({command:M.unknown(),thoughts:M.string()});import{z as fy}from"zod";import{extendZodWithOpenApi as ij}from"zod-openapi";ij(fy);var es=kn.extend({type:fy.literal("AI_ACTION"),text:fy.string(),steps:Ir.array().optional()}).openapi({ref:"AIAction"});import{z as qr}from"zod";import{z as mw}from"zod";var hy=kn.extend({type:mw.literal("CONDITIONAL"),skipped:mw.boolean().optional()});import{z as Ke}from"zod";var aj=Ke.object({cacheKey:Ke.string(),cacheExpiryMs:Ke.number()}),gy=kn.extend({id:Ke.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Ke.record(Ke.string()).optional(),cacheConfig:aj.optional()}),ho=gy.extend({type:Ke.literal("MODULE"),moduleId:Ke.string().uuid()}),sj=Ke.union([ho.pick({type:!0,moduleId:!0}),Ke.record(Ke.unknown())]),lj=Ke.object({type:Ke.literal("URL_REGEX"),regex:Ke.string()}),cj=Ke.object({type:Ke.literal("PAGE_CHECK"),substring:Ke.string()}),Sy=Ke.object({cacheInvalidation:Ke.discriminatedUnion("type",[cj,lj]).optional()}),nn=Ke.object({moduleId:Ke.string().uuid(),name:Ke.string(),description:Ke.string().nullish(),enabled:Ke.boolean().nullish(),parameters:Ke.string().array().nullish(),defaultParameters:Ke.record(Ke.string(),Ke.string()).nullish(),parameterEnums:Ke.record(Ke.string(),Ke.string().array()).nullish(),defaultCacheKey:Ke.string().nullish(),defaultCacheTtl:Ke.number().nullish(),defaultCacheAllInvocations:Ke.boolean().nullish(),autoAuth:Ke.boolean().nullish(),advanced:Sy.nullish()});var yy=t=>t.type==="RESOLVED_MODULE";import{z as Fn}from"zod";var Ey=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(Ey||{});var uj=Fn.discriminatedUnion("type",[Fn.object({type:Fn.literal("NAVIGATE_URL"),url:Fn.string().url()}),Fn.object({type:Fn.literal("GO_TO_SECTION_START")})]),dj=Fn.object({trigger:Fn.nativeEnum(Ey).optional(),attempts:Fn.number().int().optional(),restartBehavior:uj}),Nu=kn.extend({type:Fn.literal("SECTION"),description:Fn.string().describe("user provided goal of what the section should accomplish"),plan:Fn.string().array().optional(),autohealingConfig:dj.optional()});var fw=nn.merge(gy).extend({type:qr.literal("RESOLVED_MODULE"),steps:qr.lazy(()=>Dt.array())}),Ty=nn.extend({steps:qr.lazy(()=>Dt.array())}),by=Nu.extend({steps:qr.lazy(()=>bt.array())}),pj=Nu.extend({steps:qr.lazy(()=>Dt.array())}),ts=hy.extend({blocks:qr.object({assertion:qr.lazy(()=>Ir),steps:qr.lazy(()=>bt.array())}).array(),elseSteps:qr.lazy(()=>bt.array().optional())}),mj=hy.extend({blocks:qr.object({assertion:qr.lazy(()=>Ir),steps:qr.lazy(()=>Dt.array())}).array(),elseSteps:qr.lazy(()=>Dt.array().optional())}),bt=qr.discriminatedUnion("type",[Ir,es,_l,ho,ts,by]),Dt=qr.discriminatedUnion("type",[Ir,es,_l,fw,mj,pj]);import{z as Bn}from"zod";var fj=Bn.object({steps:bt.array(),beforeSteps:bt.array().nullish(),afterSteps:bt.array().nullish()}),qi=Bn.object({steps:Dt.array(),beforeSteps:Dt.array().nullish(),afterSteps:Dt.array().nullish()}),rs=Bn.object({steps:Bn.record(Bn.string(),Bn.unknown()).array(),beforeSteps:Bn.record(Bn.string(),Bn.unknown()).array().nullish(),afterSteps:Bn.record(Bn.string(),Bn.unknown()).array().nullish()});var De="1.0.22",vy="0.0.3";import{z as vm}from"zod";import{z as ns}from"zod";var hj=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,dt=t=>{let e=t.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var pi=ns.string().min(1).max(255).superRefine((t,e)=>{try{go(t)}catch(r){return e.addIssue({code:ns.ZodIssueCode.custom,message:r.message,fatal:!0}),ns.NEVER}});function go(t){if(t=t.toLowerCase().trim(),t.length===0||t.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(t))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(t.endsWith("-")||t.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(t.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(t))throw new Error(`"${t}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(t)||/^\s|\s$/.test(t))throw new Error("Name cannot start or end with a space or dot.");if(t.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(t==="none")throw new Error("Name cannot be 'none'.");if(t.match(hj))throw new Error("Name cannot be a UUID. Please choose a different name.")}var hm=ns.preprocess(t=>t===null?"":t,ns.union([ns.string().url(),ns.literal("")])).optional();var Sn="get_browser_state",gm="get_environment_variables",Sm="reset_session",ko="run_step",zn="preview_preflight",hw="preview_ensure",Jt="preview_step",ym="test_get",Qt="test_splice_steps",Em="module_create",Tm="module_list",gw="momentic_module_create",Ki="momentic_module_get",Yi="momentic_module_recommend",bm="momentic_get_artifacts",Sw="momentic_test_create",yw="momentic_test_splice_steps",Ew="momentic_run_step",Tw="momentic_session_start",bw="momentic_session_terminate",vw="momentic_get_session_state",Aw="momentic_get_environment_variables",mi="momentic_get_initial_data",Ay="momentic_preview_step";var Cw=["CLICK","TYPE","PRESS","SELECT_OPTION","DRAG","NAVIGATE","SCROLL","WAIT","AI_ASSERTION","HOVER","BLUR","GO_BACK","GO_FORWARD","REFRESH","NEW_TAB","SWITCH_TAB","WAIT_FOR_URL","COPY","PASTE","ELEMENT_CHECK","PAGE_CHECK","AI_EXTRACT","COOKIE","LOCAL_STORAGE","REQUEST","GRAPHQL_REQUEST","JAVASCRIPT","SET_HEADER","MOCK_ROUTE","REMOVE_ROUTE_MOCK","FILE_UPLOAD","DIALOG","MOUSE_DRAG","MODULE","AI_ACTION_DYNAMIC","CONDITIONAL"],os=vm.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),Rw=vm.object({id:vm.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:pi.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:vm.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(t=>[t.id,t.name,t.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided.");function ww(t,e){let r=e.parameters??[],n=e.defaultParameters??{},o=e.parameterEnums??{},i=t??{},a=new Set([...r,...Object.keys(n)]),s=Object.keys(i).filter(u=>!a.has(u));if(s.length>0){let u=a.size>0?Array.from(a).join(", "):"none";throw new Error(`Module "${e.name}" received unknown parameters: ${s.join(", ")}. Valid parameters are: ${u}`)}let l=r.filter(u=>!(u in n)).filter(u=>!(u in i));if(l.length>0)throw new Error(`Module "${e.name}" is missing required parameters: ${l.join(", ")}. Please call ${Ki} to inspect the module's parameter requirements.`);for(let[u,d]of Object.entries(i))if(u in o){let p=o[u];if(p&&!p.includes(d))throw new Error(`Module "${e.name}" parameter "${u}" must be one of: ${p.join(", ")}. Received: "${d}"`)}}var xw=k.object({phrase:k.string()}),Am=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),jce=k.object({text:k.string()}),gj=k.boolean().or(k.nativeEnum(tn)).transform(t=>!(!t||t==="irrelevant")),_w=k.object({attributes:k.array(k.string()).nullish(),text:gj.nullish(),position:k.nativeEnum(tn).nullish(),shape:k.nativeEnum(tn).nullish()}),Sj=k.object({id:k.number().int(),requirements:_w}),yj=Sj.array(),Cm=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int(),updatedMemory:hu.optional(),requirements:_w.nullish().transform(t=>{if(t!==null)return t}),additionalElements:yj.nullish().transform(t=>{if(t!==null)return t})});var Iw=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(Iw||{}),Pw=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(Pw||{});var Mw=k.object({thoughts:k.string(),category:k.nativeEnum(Iw)}),Ow=k.object({thoughts:k.string(),category:k.nativeEnum(Pw)}),Lw=k.object({anyUntestedSteps:k.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:k.object({error:k.string(),solutionFound:k.object({description:k.string(),passedSuccessfully:k.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:k.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:k.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),Nw=k.object({summary:k.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:k.array(k.object({error:k.string(),workAround:k.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:k.array(k.string()).default([]).describe("Steps added/discussed but not validated.")}),Ej=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),Vce=k.object({thoughts:k.string(),patches:Ej.array()}),Tj=[k.literal("add"),k.literal("replace"),k.literal("remove")],bj=k.object({op:k.union(Tj),path:k.string(),value:Dt.optional()}),Dw=k.object({patches:bj.array(),thoughts:k.string()}),Cy=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Cy||{}),kw=k.object({thoughts:k.string(),scenario:k.nativeEnum(Cy),instructions:k.string().nullish()}),Uw=k.object({reasoning:k.string(),scenario:k.string(),patch:k.null().optional()}),$ce=k.object({thoughts:k.string(),evaluation:k.number().min(0).max(10)}),Wce=k.object({observations:k.string(),reasoning:k.string(),command:nm});var Ry=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])}),vj=k.object({startId:k.number().int(),endId:k.number().int()}),Fw=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(Fw||{}),Bw=k.object({categoryThoughts:k.string(),category:k.nativeEnum(Fw),relevantSections:vj.array()}),fi=k.boolean().nullish().transform(t=>t??!1),zw=k.object({thoughts:k.string().optional(),isPageReady:fi,descriptionLabels:k.object({usesTextContent:fi,usesAppearance:fi,usesPosition:fi,usesRelativeElements:fi,usesSingleQuotes:fi,isAmbiguous:fi,targetDoesNotExist:fi,usesIcon:fi}).optional()});import{z as N}from"zod";import*as Ue from"zod";var Zce=Ue.object({thoughts:Ue.string().optional().describe("only provided if a description was provided"),target:ui.optional().describe("only provided if a description was provided"),pageState:Ue.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:Ue.object({label:Ue.string(),value:Ue.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:Ue.object({data:Ue.string().or($a),height:Ue.number().int(),width:Ue.number().int()}).optional().describe("only provided if returnScreenshot is true")}),Hw=Ue.union([Ue.literal("ELEMENT_CHECK"),Ue.literal("NEGATED_CHECK"),Ue.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),Ue.literal("SELECT_OPTION"),Ue.literal("TYPE")]);function is(t){if(!("useSelector"in t&&t.useSelector)){if(t.type==="SELECT_OPTION")return"SELECT_OPTION";if(t.type==="TYPE")return"TYPE";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="EXISTS"&&t.assertion.negated)return"NEGATED_CHECK";if(t.type==="ELEMENT_CHECK"&&t.assertion.type==="ELEMENT_EXISTENCE"&&t.assertion.condition==="VISIBLE"&&t.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(t.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Du=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Du||{}),Ll=Ue.object({matched:Ue.boolean(),reason:Ue.string().optional().describe("Human understandable description"),logs:Ue.string().array().optional().describe("Logs for debugging")}),Aj=Ll.extend({type:Ue.literal("USER_SELECTOR")}),Cj=Ll.extend({type:Ue.literal("CSS_SELECTOR"),selectors:Ue.string().array()}),Rj=Ll.extend({type:Ue.literal("HYBRID_SELECTOR")}),wj=Ll.extend({type:Ue.literal("HTML_DISTANCE"),distance:Ue.number().optional(),closestElement:Ue.string().optional(),savedElement:Ue.string().optional()}),xj=Ll.extend({type:Ue.literal("TEMPLATE_MATCHING")}),_j=Ll.extend({type:Ue.literal("AUTO_FRAME"),logs:Ue.string().array().optional()}),Gw=Ue.discriminatedUnion("type",[Aj,Cj,Rj,wj,xj,_j]);import{z as Fu}from"zod";import{z as Gj}from"zod";import*as de from"zod";import{extendZodWithOpenApi as Nj}from"zod-openapi";import{cloneDeep as ku}from"lodash-es";import Yw from"truncate-json";import*as ls from"zod";import{extendZodWithOpenApi as Mj}from"zod-openapi";import{z as Mr}from"zod";import{z as Ce}from"zod";import{z as wy}from"zod";var So=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(So||{});var Rm=wy.object({width:wy.number().min(200).max(1e4),height:wy.number().min(200).max(1e4)}),jw={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},rue=Object.keys(jw);var Pr=jw["Desktop Large"],Xi="en-us",Ji="America/Los_Angeles",Ij="Chromium",Qi={latitude:37.7749,longitude:-122.4194};function wm({configuredBrowserType:t,orgDefaultBrowserType:e,browserTypeOverride:r}){let n=r??t;return n==="Org Default"&&e?e:n??Ij}var xm=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(xm||{});var xy=Ce.object({autoFollowNewTabs:Ce.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:Ce.union([Ce.boolean(),Ce.literal("inputs-only")]).optional(),ignoreHrefForCaching:Ce.boolean().optional(),disableSecondaryCacheResolution:Ce.boolean().optional(),hybridSelectorMode:Ce.enum(["off","test","prefer","always"]).optional(),globalLocatorRedirect:Ce.union([Ce.boolean(),Ce.literal("always")]).optional(),forceClickForMissingRedirectElement:Ce.boolean().optional(),visualActions:Ce.boolean().optional(),autoExpandIframes:Ce.boolean().optional(),disableHtmlSnapshots:Ce.boolean().optional(),recordVideo:Ce.boolean().optional(),defaultBrowserType:Ce.nativeEnum(So).optional(),importantAttributes:Ce.string().array().optional(),importantClasses:Ce.string().array().optional(),importantStyles:Ce.string().array().optional()});var Vw=1e4,$w=6e4,Pj=Ce.object({server:Ce.string(),username:Ce.string().optional(),password:Ce.string().optional()}),as=xy.extend({pageLoadTimeoutMs:Ce.number().optional().refine(t=>t===void 0||t<=$w&&t>=-1,{message:`Page load timeout must be between 0 and ${$w/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:Ce.number().optional().refine(t=>t===void 0||t<=Vw&&t>=-1,{message:`Smart waiting timeout must be between 0 and ${Vw/1e3} seconds`}),ignorePageLoadTimeouts:Ce.boolean().optional(),localChromeExtensionPaths:Ce.string().array().optional(),extraHeaders:Ce.record(Ce.string(),Ce.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:Ce.record(Ce.string(),Ce.record(Ce.string(),Ce.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:Ce.string().optional(),disableGpu:Ce.boolean().optional(),disableZygote:Ce.boolean().optional(),disableBrowserMonitoring:Ce.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:Ce.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:Ce.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:Ce.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:Ce.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:Ce.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:Pj.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:Ce.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:Ce.nativeEnum(xm).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var sr="BASE_URL",_m="CURRENT_URL",ss="ENV_NAME",Nl="TEST_NAME",due={[sr]:"https://www.google.com"},Ww=Mr.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),qw=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.string().describe("variable value"))}),Kw=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.unknown().describe("variable value")),browser:as.optional()});var pue=Mr.object({name:Mr.string(),variables:Mr.record(Mr.string().describe("variable name"),Mr.unknown().describe("variable value"))});Mj(ls);var _y=ls.object({env:ls.record(ls.unknown())}).openapi({ref:"TestContextSnapshot"}),Oj="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",Lj=[sr,ss,Nl],Xw=[_m,sr,ss,Nl],Kr=class t{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,r=void 0,n={}){return new t({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:r,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:r}){let n=e.env[sr]??"about:blank",o=e.env[_m]??"about:blank",i=e.env[ss],a=e.env[Nl],s={};for(let[l,u]of Object.entries(e.env))Xw.includes(l)||(r??{})[l]===void 0&&(s[l]=u);return new t({baseUrl:n,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:r??{}})}setEnvVariables(e){let r=ku(e);this.env=Object.assign(this.env,r)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,r){this.varsFromMomenticEnvironment[e]=r}getVariable(e){return this.env[e]}setVariable(e,r){Lj.includes(e)||(this.env[e]=r)}getEnvName(){return this.env[ss]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return ku(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>Xw.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,Oj]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=Yw(JSON.stringify(o),5e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:r}=Yw(JSON.stringify(e.env),25e3);try{e.env=JSON.parse(r)}catch{e.env={}}return e}setCurrentUrl(e){this.env[_m]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=ku(e.variablesFromEnvironment),this.setMomenticSystemVariable(sr,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ss,e.envName),e.testName&&this.setMomenticSystemVariable(Nl,e.testName)}getDynamicVariablesCopy(){return ku(this.env)}getVariablesFromEnvironmentCopy(){return ku(this.varsFromMomenticEnvironment)}};var ot=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(ot||{}),Im=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Im||{});Nj(de);var Iy=de.object({beforeUrl:de.string().optional(),afterUrl:de.string().optional(),message:de.string().optional(),beforeSnapshot:de.string().optional(),afterSnapshot:de.string().optional(),startedAt:de.coerce.date(),finishedAt:de.coerce.date()}),Dj=Iy.extend({viewport:de.object({height:de.number(),width:de.number()}).nullish(),status:de.nativeEnum(Im),message:de.string().optional(),elementInteracted:de.string().optional()}),cs=Iy.extend({status:de.nativeEnum(ot),message:de.string().optional(),data:de.unknown().optional(),beforeTestContext:_y.optional(),afterTestContext:_y.optional(),failureReason:de.nativeEnum(Ne).optional(),details:de.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information."),trace:de.unknown().optional().describe("Web interaction trace from step execution (WebSectionSpan)")}).openapi({ref:"StepResultMetadata"}),Py=(r=>(r.NOT_ELIGIBLE="NOT_ELIGIBLE",r.ATTEMPTED="ATTEMPTED",r))(Py||{}),Pm=cs.merge(Ir).extend({results:Dj.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:de.lazy(()=>hr.array()).optional(),failureRecoveryStatus:de.object({type:de.nativeEnum(Py),message:de.string()}).optional()}),kj=cs.merge(es).extend({results:de.lazy(()=>Pm.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Uj=cs.merge(_l).extend({results:de.lazy(()=>Pm.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Fj=cs.merge(ho).extend({moduleName:de.string().optional(),results:de.lazy(()=>hr.array()),previousAttempts:de.lazy(()=>hr.array()).optional()}),Bj=cs.merge(ts).extend({assertionResult:Pm.optional(),results:de.lazy(()=>hr.array()).describe("results for the block actually executed"),previousAttempts:de.lazy(()=>hr.array()).optional()}),zj=cs.merge(Nu).extend({results:de.lazy(()=>hr.array()),healingAttempts:de.lazy(()=>hr.array().array()).optional(),previousAttempts:de.lazy(()=>hr.array()).optional()}),hr=de.discriminatedUnion("type",[kj,Uj,Pm,Fj,Bj,zj]),Mm=cs.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),Hj=Iy.extend({index:de.number().optional(),userFacingStepReference:de.string().optional(),description:de.string(),pageState:de.string().optional(),elementInteracted:de.string().optional(),startedAt:de.coerce.date().or(de.string()).optional().catch(void 0),finishedAt:de.coerce.date().or(de.string()).optional().catch(void 0)}),Om=Hj.extend({beforeScreenshot:de.string().optional(),afterScreenshot:de.string().optional()});var My=Gj.object({results:hr.array().describe("main results"),beforeResults:hr.array().optional(),afterResults:hr.array().optional()}),Uu=My.partial();import{z as ee}from"zod";import{extendZodWithOpenApi as Yj}from"zod-openapi";import{z as Zi}from"zod";import jj from"zod";var gr=(r=>(r.ANDROID="ANDROID",r.IOS="IOS",r))(gr||{});var Jw=jj.nativeEnum(gr);var Dl=(n=>(n.WEB="WEB",n.ANDROID="ANDROID",n.IOS="IOS",n))(Dl||{});var Lm=Zi.object({fromStepId:Zi.string(),parentStepIdChain:Zi.array(Zi.string())}),Nm=Zi.object({toStepId:Zi.string(),parentStepIdChain:Zi.array(Zi.string())});import{z as St}from"zod";import{isValidCron as Vj}from"cron-validator";import{z as Fe}from"zod";var Qw=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Zw=1e4,kl=as.extend({browserType:Fe.nativeEnum(So).optional(),slowMoMs:Fe.number().optional().refine(t=>t===void 0||t<=Zw&&t>=-1,{message:`Slow motion must be between 0 and ${Zw} milliseconds`}),basicAuthorization:Fe.object({username:Fe.string().optional(),password:Fe.string().optional()}).optional(),geolocation:Fe.object({latitude:Fe.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Fe.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:Fe.boolean().optional(),locale:Fe.string().optional(),timezone:Fe.enum(Qw).optional(),colorScheme:Fe.enum(["light","dark"]).optional()}),ex=["extraHeaders","basicAuthorization","localChromeExtensionPaths","proxy"],Oy=Fe.object({useMemory:Fe.boolean().optional(),failureRecovery:Fe.boolean().optional().describe("undefined means inherit org settings")}),Ly=Oy.extend({disableAICaching:Fe.boolean().optional(),failureRecoveryInstructions:Fe.string().optional()}),$j=Fe.object({viewport:Rm.optional()}),us=$j.merge(Ly).merge(kl),Ul=Fe.object({cron:Fe.string().refine(t=>Vj(t),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Fe.boolean().default(!1),env:Fe.string().optional(),timeZone:Fe.string().default("America/Los_Angeles"),jobKey:Fe.string().optional()}),Fl=Fe.object({onSuccess:Fe.boolean().default(!1),failureMessage:Fe.string().optional(),onFailure:Fe.boolean().default(!0),successMessage:Fe.string().optional()}),Wj=Fe.object({name:Fe.string(),required:Fe.boolean().optional(),defaultValue:Fe.string().describe("this is not optional because we need a value when the editor is first loaded")}),Dm=Wj.array(),qj=Fe.object({name:Fe.string(),value:Fe.string()}),tx=qj.array(),km=Fe.object({name:Fe.string(),default:Fe.boolean().optional(),fixtures:Ww.array().optional()});var hi=Oy.extend({agentConfig:St.record(St.string(),St.string()).optional(),aiFailureAnalysis:St.boolean().optional(),aiPageFiltering:St.boolean().optional().describe("rag v2 feature flag")}),Kj=St.object({cliOnly:St.boolean().optional(),neverShowUsageBanner:St.boolean().optional(),hideInternalTraceInfo:St.boolean().optional()}),Ny=St.object({fakerConstantSeed:St.boolean().optional(),isolateCachesByEnvironment:St.boolean().optional()}),rx=St.object({ai:hi.optional(),githubAppInstallationId:St.number().nullish(),githubAppSummaryMessageEnabled:St.boolean().nullish(),githubReleaseAppInstallationId:St.number().nullish(),gitlabAppAccessToken:St.string().nullish(),gitlabAppBaseUrl:St.string().nullish(),browser:xy.optional(),internal:Kj.optional(),advanced:Ny.optional()}),Jue=St.object({globalOverrides:St.record(St.string()).optional(),agentConfig:St.record(St.string(),St.string()).optional()}),Que=St.record(St.string(),St.string()).nullish();Yj(ee);var on={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},it=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(it||{}),Um=(r=>(r.BEFORE_ALL="BEFORE_ALL",r.AFTER_ALL="AFTER_ALL",r))(Um||{});var Xj=ee.object({attempts:ee.number().int().nonnegative()}),Zt=ee.string().pipe(ee.coerce.date()).or(ee.date()),ds=ee.object({id:ee.string(),runKey:ee.string(),organizationId:ee.string(),executionType:ee.nativeEnum(Dl).optional().default("WEB"),createdAt:Zt,createdBy:ee.string(),flake:ee.boolean().nullish(),scheduledAt:Zt.or(ee.null()),startedAt:Zt.or(ee.null()),updatedAt:Zt.nullish(),finishedAt:Zt.or(ee.null()),resolvedBaseUrl:ee.string().nullish(),environmentName:ee.string().nullish(),gitBranchName:ee.string().nullish(),githubRepository:ee.string().nullish(),gitlabProjectPath:ee.string().nullish(),labels:ee.array(ee.string()).optional(),gitOriginUrl:ee.string().nullish(),gitCommitSha:ee.string().nullish(),gitCommitShaShort:ee.string().nullish(),gitCommitAuthorName:ee.string().nullish(),cliVersion:ee.string().nullish(),section:ee.nativeEnum(Um).nullish(),status:ee.nativeEnum(it),trigger:ee.nativeEnum(on),attempts:ee.number(),runAttempts:ee.array(ee.object({id:ee.string(),status:ee.nativeEnum(it),startedAt:Zt.or(ee.null()),finishedAt:Zt.or(ee.null())})).optional(),videos:ee.array(ee.string()).optional(),failureReason:ee.nativeEnum(Ne).nullish(),failureDetails:dm.nullish(),failureRecoveryDetails:Xj.nullish(),pipelineId:ee.string().nullish(),resolvedInputs:ee.record(ee.string(),ee.string()).nullish(),quarantined:ee.boolean().nullish().default(!1),quarantinedReason:ee.string().nullish(),localTestId:ee.string().nullish(),testId:ee.string().nullish(),testName:ee.string().nullish(),description:ee.string().nullish(),directory:ee.string().nullish(),test:ee.object({name:ee.string(),id:ee.string()}).nullish().default(null),suiteId:ee.string().nullish(),aiSettings:hi.nullish()}).openapi({ref:"RunMetadata"}),Jj={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Fm=ds.pick({...Jj,test:!0}),nx=ds.omit({failureReason:!0,failureDetails:!0,test:!0}),Dy=ds.extend({stepsSnapshot:ee.array(ee.record(ee.unknown())).nullish(),resolvedInputs:ee.record(ee.string(),ee.string()).nullish(),test:ee.object({name:ee.string(),id:ee.string(),description:ee.string().nullish(),baseUrl:ee.string().nullish(),advanced:us.nullish()}).nullish()}).merge(My),ox=t=>t.includes("PASSED")&&t.includes("FAILED");var Qj=Fu.object({id:Fu.string().uuid(),startedAt:Zt.or(Fu.null()),finishedAt:Zt.or(Fu.null()),status:Fu.nativeEnum(it)}).merge(Uu),mde=Qj.array();var Bm=(i=>(i.JUNIT="junit",i.ALLURE="allure",i.ALLURE_JSON="allure-json",i.PLAYWRIGHT_JSON="playwright-json",i.BUILDKITE_JSON="buildkite-json",i))(Bm||{});import{z as kt}from"zod";var ix=kt.object({id:kt.string(),status:kt.nativeEnum(it),trigger:kt.nativeEnum(on),createdAt:Zt,startedAt:Zt.nullish(),finishedAt:Zt.nullish(),gitCommitSha:kt.string().nullish(),gitCommitShaShort:kt.string().nullish(),gitCommitTimestamp:Zt.nullish(),gitBranchName:kt.string().nullish(),gitOriginUrl:kt.string().nullish(),gitCommitMessage:kt.string().nullish(),gitCommitAuthorName:kt.string().nullish(),githubRepository:kt.string().nullish(),gitlabProjectPath:kt.string().nullish(),pipelineId:kt.string().nullish(),ciProvider:kt.string().nullish(),cliVersion:kt.string().nullish(),labels:kt.string().array().optional(),localSuiteName:kt.string().optional(),suite:kt.object({id:kt.string(),name:kt.string()}).nullish(),runs:kt.object({status:kt.nativeEnum(it)}).array()}).openapi({ref:"RunGroup"}),ax=ix.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0,localSuiteName:!0}).extend({runs:Fm.array()}),Ede=ix.extend({runs:ds.array()});import{z as lr}from"zod";var Zj=lr.object({type:lr.literal("TARGETING"),name:lr.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:Gw.array(),pageState:lr.string().optional(),targetSource:lr.nativeEnum(Oo).optional(),targetUpdateTime:lr.string().optional()}),eV=lr.object({type:lr.literal("AI_LOCATION"),matched:lr.boolean(),pageState:lr.string().optional(),ragUsed:lr.boolean().optional(),thoughts:lr.string().optional()}),tV=lr.object({type:lr.literal("ASSERTION"),relevantElementsSerialized:lr.string().array().optional(),pageState:lr.string().optional(),ragUsed:lr.boolean().optional()}),sx=lr.discriminatedUnion("type",[Zj,eV,tV]);import{z as jt}from"zod";var rV=jt.object({id:jt.string(),name:jt.string()}),_de=rV.merge(jt.object({createdAt:Zt,createdBy:jt.string(),schedule:Ul,notification:Fl,environment:jt.object({name:jt.string()}).nullish(),beforeTests:jt.object({id:jt.string()}).array().nullish(),afterTests:jt.object({id:jt.string()}).array().nullish()})),lx=jt.object({id:jt.string().uuid(),orgId:jt.string(),createdAt:Zt,startedAt:Zt.or(jt.null()),finishedAt:Zt.or(jt.null()),status:jt.nativeEnum(it),trigger:jt.nativeEnum(on),suite:jt.object({id:jt.string(),name:jt.string()}).nullish(),runs:ds.array()}),Ide=lx.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),cx=lx.extend({runs:Fm.array()});import{z as Yr}from"zod";var ky=Yr.object({content:Yr.string(),ids:Yr.string().array(),tokenLength:Yr.number()}),nV=Yr.object({chunks:ky.array()}),$de=Yr.object({ids:Yr.string().array(),score:Yr.number(),tokenLength:Yr.number()}),Wde=nV.extend({description:Yr.string().describe("Input to pass to RAG engine"),tokenLimit:Yr.number()}),ux=Yr.object({ids:Yr.number().array()}),dx=Yr.object({indices:Yr.number().array()});var Vt=N.object({disableCache:N.boolean().optional(),useMemory:N.boolean().optional(),clientMode:N.enum(["interactive","runner"]).optional(),loggerTags:N.record(N.string(),N.string()).optional(),langfuseSessionId:N.string().optional(),agentConfigVersion:N.string().optional()}),tpe=Vt.extend({chunks:ky.array(),description:N.string().describe("Input to pass to AI"),type:N.union([N.literal("locator"),N.literal("assertion"),N.literal("ai-action")]),softTokenLimit:N.number(),hardTokenLimit:N.number(),callId:N.string().optional()}),oV=N.object({screenshotBase64AfterCommand:N.string(),urlAfterCommand:N.string(),serializedCommand:N.string(),elementInteracted:N.string().optional(),thoughts:N.string().optional()}),px=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string(),source:Hw.optional().catch(void 0),isTieBreakerCall:N.boolean().optional(),memory:N.discriminatedUnion("type",[po,N.object({type:N.literal("RESOLVED_TRACES"),traces:N.unknown().array()})]).optional(),firstPassModelResults:Cm.array().optional()}),mx=N.object({target:N.string().or(N.number()),browserState:N.string().optional(),screenshot:N.string().optional(),boundingBox:N.object({x:N.number(),y:N.number(),height:N.number(),width:N.number()}).optional()}),fx=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string().optional(),returnSchema:N.string().optional()}),hx=N.object({goal:N.string(),emulatorState:N.string(),screenshot:N.string().optional(),returnSchema:N.string().optional()}),Uy=N.union([N.literal("NEGATED_CHECK"),N.literal("CONDITIONAL_CHECK")]),gx=N.object({goal:N.string(),browserState:N.string(),screenshot:N.string(),url:N.string(),contextChoice:ey.optional(),memory:N.discriminatedUnion("type",[Wa,N.object({type:N.literal("RESOLVED_TRACES"),traces:N.unknown().array()})]).optional(),source:Uy.optional()}),Sx=N.object({command:Rl}),yx=N.object({message:N.string()}),Ex=N.object({messagesAndToolCalls:N.array(N.string())}),Tx=N.object({messagesAndToolCalls:N.array(N.string()).describe("Chat history to condense for summarization")}),Fy=N.object({goal:N.string(),browserState:N.string(),startingScreenshot:N.string().optional(),screenshot:N.string(),url:N.string(),history:oV.array(),actionHint:N.string().optional(),lastError:N.string().optional()}),bx=N.object({results:Om.array(),errorMessage:N.string(),errorStack:N.string().optional()}),vx=N.object({results:Om.array(),goal:N.string(),errorMessage:N.string()}),Ax=N.object({failedResults:Om.array(),nextStepsSerialized:N.string().array(),currentUrl:N.string(),currentPageState:N.string(),currentScreenshot:N.string(),customInstructions:N.string().optional(),testDescription:N.string().optional()}),rpe=N.object({description:N.string(),type:N.union([N.literal("locator"),N.literal("assertion"),N.literal("ai-action")]),excerpt:N.string()}),Cx=N.object({type:N.string(),browserContext:N.string(),currentStep:N.string(),screenshot:N.string()}),Rx=N.object({description:N.string(),browserState:N.string(),screenshot:N.string()}),iV=N.enum(["locator","assertion"]),npe=N.object({completionType:iV,currentGoal:N.string(),pastGoal:N.string().optional(),currentScreenshot:N.string(),pastScreenshot:N.string(),pastResult:N.union([N.boolean(),N.number()])});import{z as Bu}from"zod";var ape=Bu.object({goal:Bu.string()}),wx=Bu.object({keywords:Bu.array(Bu.string())});import{z as Bl}from"zod";var zu=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(zu||{}),cpe=Bl.nativeEnum(zu),upe=new Set(Object.values(zu));var aV=Bl.enum(["v1","v2","v3","v4"]),sV=Bl.string().regex(/^v\d+\.\d+$/).describe("pinned sub-version like v3.1"),dpe=Bl.union([aV,sV,Bl.string().describe("for people with special configurations")]),zl={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};var xx=(a=>(a.ANDROID_LOCATOR="android-locator",a.IOS_LOCATOR="ios-locator",a.ANDROID_ASSERTION="android-assertion",a.IOS_ASSERTION="ios-assertion",a.ANDROID_TEXT_EXTRACTION="android-text-extraction",a.IOS_TEXT_EXTRACTION="ios-text-extraction",a))(xx||{}),ppe=Bl.nativeEnum(xx);import{z as _e}from"zod";import ld from"zod";import xt from"zod";import rr from"zod";import{v4 as Afe}from"uuid";import CV from"zod";import*as B from"zod";var zm=B.discriminatedUnion("type",[B.object({type:B.literal("SCREEN")}),B.object({type:B.literal("OPEN_APP")}),B.object({type:B.literal("OPEN_WEBVIEW")})]),gi=B.object({type:B.literal("description"),description:B.string()}),By=B.object({type:B.literal("CUSTOM_COORDINATES"),startX:B.number().describe("Starting X coordinate in pixels"),startY:B.number().describe("Starting Y coordinate in pixels"),deltaPixels:B.number().describe("Number of pixels to scroll in the specified direction")}),Hm=B.discriminatedUnion("type",[...zm.options,B.object({type:B.literal("CUSTOM"),target:gi}),By]);var lV=B.object({type:B.literal("coordinates"),xPercent:B.number(),yPercent:B.number()}),Hl=B.discriminatedUnion("type",[gi,lV]);var cV=B.object({x1:B.number(),y1:B.number(),x2:B.number(),y2:B.number(),tolerance:B.nativeEnum(tn),preciseTolerance:B.boolean().optional()}),uV=B.object({width:B.number(),height:B.number(),tolerance:B.nativeEnum(tn),preciseTolerance:B.boolean().optional()}),zy=B.object({requiredText:B.string().optional(),requiredAttributes:B.record(B.string(),B.string()).optional(),requiredBounds:B.boolean().optional(),position:cV.optional(),shape:uV.optional()}),_x=B.object({xPath:B.string(),requirements:zy.optional()}),dV=B.object({type:B.literal("CUSTOM"),target:gi,cache:B.lazy(()=>Ix).optional()}),pV=B.object({pixelDelta:B.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:B.union([zm,dV,By]),direction:B.enum(["up","down"])}),Ix=B.object({type:B.literal("NATIVE"),bounds:B.number().array().optional(),resolvedDescription:B.string().optional(),xPath:B.string().optional(),elementOnlySerializedXml:B.string().optional(),scrollDetails:pV.optional(),requirements:zy.optional(),requiredRelatedElements:_x.array().optional(),memory:po.optional()}),mV=B.object({type:B.literal("WEBVIEW"),resolvedDescription:B.string().optional(),xPath:B.string().optional(),browserCache:ui.optional(),memory:po.optional()}),Gm=B.union([Ix,mV]);var fV=B.object({left:B.number(),top:B.number(),right:B.number(),bottom:B.number()}),gpe=B.object({newViewportBounds:fV}),hV=B.object({type:B.literal("CUSTOM"),target:gi,cache:B.lazy(()=>Mx).optional()}),Px=B.object({pixelDelta:B.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:B.union([zm,hV,By]),direction:B.enum(["up","down"])}),Mx=B.object({type:B.literal("NATIVE"),bounds:B.tuple([B.number(),B.number(),B.number(),B.number()]).optional(),resolvedDescription:B.string().optional(),xPath:B.string().optional(),elementOnlySerializedXml:B.string().optional(),scrollDetails:Px.optional(),requirements:zy.optional(),requiredRelatedElements:_x.array().optional(),memory:po.optional()}),gV=B.object({type:B.literal("WEBVIEW"),resolvedDescription:B.string().optional(),xPath:B.string().optional(),scrollDetails:Px.optional(),browserCache:ui.optional(),memory:po.optional()}),jm=B.discriminatedUnion("type",[Mx,gV]);import Hy from"zod";import ea from"zod";var He=(A=>(A.AI_CHECK="AI_CHECK",A.AI_EXTRACT="AI_EXTRACT",A.TAP="TAP",A.TYPE="TYPE",A.PRESS="PRESS",A.PRESS_KEYBOARD="PRESS_KEYBOARD",A.OPEN_APP="OPEN_APP",A.KILL_APP="KILL_APP",A.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",A.SWIPE="SWIPE",A.SCROLL_TO="SCROLL_TO",A.SCREEN_CHECK="SCREEN_CHECK",A.ELEMENT_CHECK="ELEMENT_CHECK",A.DRAG_AND_DROP="DRAG_AND_DROP",A.JAVASCRIPT="JAVASCRIPT",A.REQUEST="REQUEST",A.WAIT="WAIT",A.ADD_FILE="ADD_FILE",A.INSTALL_APP="INSTALL_APP",A.UNINSTALL_APP="UNINSTALL_APP",A.TOGGLE_SETTINGS="TOGGLE_SETTINGS",A.ROTATE_ORIENTATION="ROTATE_ORIENTATION",A.ADB="ADB",A.STATE="STATE",A))(He||{}),ge=ea.object({id:ea.string().uuid(),disableCache:ea.boolean().optional()}),Gl=ea.object({updatedAt:ea.coerce.date().optional(),updatedAtLoggerTags:ea.record(ea.string(),ea.string()).optional()}),Hn=Gl.extend({target:Gm}),Vm=Gl.extend({fromTarget:Gm,toTarget:Gm}),yo=Gl.extend({target:jm}),Ox=Gl.extend({fromTarget:jm,toTarget:jm});var Gy=ge.extend({type:Hy.literal("ADB"),command:Hy.string(),jsonArgs:Hy.string().optional()});import Lx from"zod";var SV=Lx.string().trim(),jy=ge.extend({type:Lx.literal("INSTALL_APP"),uri:SV});import yV from"zod";var Vy=ge.extend({type:yV.literal("OPEN_NOTIFICATION_DRAWER")});import Nx from"zod";var jl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(jl||{}),$y=ge.extend({type:Nx.literal("TOGGLE_SETTINGS"),settingsType:Nx.nativeEnum(jl)});import Dx from"zod";var Wy=ge.extend({type:Dx.literal("UNINSTALL_APP"),packageName:Dx.string()});import Fx from"zod";import qy from"zod";var Ky=ge.extend({type:qy.literal("ADD_FILE"),file:qy.string(),storageLocation:qy.string()});import Yy from"zod";var Vl=ge.extend({type:Yy.literal("AI_CHECK"),assertion:Yy.string(),timeoutSecs:Yy.number().optional(),cache:Gl.extend({memory:Wa.optional()}).optional()});import Xy from"zod";var Jy=ge.extend({type:Xy.literal("AI_EXTRACT"),goal:Xy.string(),schema:Xy.string().optional()});import Qy from"zod";var Zy=ge.extend({type:Qy.literal("JAVASCRIPT"),code:Qy.string(),timeout:Qy.number().int().max(60).optional().describe("Max seconds for the code to complete")});import EV from"zod";var eE=ge.extend({type:EV.literal("KILL_APP")});import Hu from"zod";var ta=(r=>(r.HOME="HOME",r.POWER="POWER",r))(ta||{}),ps=(a=>(a.BACK="BACK",a.APP_SWITCHER="APP_SWITCHER",a.SEARCH="SEARCH",a.VOLUME_UP="VOLUME_UP",a.VOLUME_DOWN="VOLUME_DOWN",a.VOLUME_MUTE="VOLUME_MUTE",a))(ps||{}),Gu=ge.extend({type:Hu.literal("PRESS"),key:Hu.nativeEnum(ta),longPress:Hu.boolean().optional()}),tE=Gu.extend({key:Hu.nativeEnum(ps).or(Hu.nativeEnum(ta))}),rE=Gu;import TV from"zod";var nE=ge.extend({type:TV.literal("REQUEST")}).merge(qa);import kx from"zod";var $l=(r=>(r.PORTRAIT="PORTRAIT",r.LANDSCAPE="LANDSCAPE",r))($l||{}),oE=ge.extend({type:kx.literal("ROTATE_ORIENTATION"),orientation:kx.nativeEnum($l)});import Wl from"zod";var bV=Wl.object({type:Wl.literal("CONTENT"),negated:Wl.boolean().optional(),value:Wl.string()}),iE=ge.extend({type:Wl.literal("SCREEN_CHECK"),assertion:bV,timeout:Wl.number().int().min(0).max(Xa).optional().describe("max seconds to wait for the assertion to be true")});import vV from"zod";var aE=ge.extend({type:vV.literal("STATE")});import Ux from"zod";var sE=ge.extend({type:Ux.literal("WAIT"),timeoutSecs:Ux.number()});var ju=Fx.discriminatedUnion("type",[aE,Vl,Jy,Zy,sE,nE,oE,iE,Ky,eE]),AV=Fx.discriminatedUnion("type",[...ju.options,Gu]);import lE from"zod";var Bx=ge.extend({type:lE.literal("DRAG_AND_DROP"),fromTarget:gi,toTarget:gi,hoverDuration:lE.number().optional(),dragDuration:lE.number().optional()}),Vu=Bx.extend({cache:Vm.optional()}),$u=Bx.extend({cache:Ox.optional()});import zx from"zod";var Hx=ge.extend({type:zx.literal("ELEMENT_CHECK"),target:Hl,assertion:Qp,timeout:zx.number().int().min(0).max(Xa).optional().describe("max seconds to wait for the assertion to be true")}),Wu=Hx.extend({cache:Hn.optional()}),qu=Hx.extend({cache:yo.optional()});import Ku from"zod";var ra=(r=>(r.ENTER="ENTER",r.BACKSPACE="BACKSPACE",r))(ra||{}),Yu=(e=>(e.CLOSE_KEYBOARD="CLOSE_KEYBOARD",e))(Yu||{}),cE=ge.extend({type:Ku.literal("PRESS_KEYBOARD"),key:Ku.nativeEnum(ra)}),uE=ge.extend({type:Ku.literal("PRESS_KEYBOARD"),key:Ku.nativeEnum(Yu).or(Ku.nativeEnum(ra))});import ms from"zod";var dE=ge.extend({type:ms.literal("OPEN_APP"),packageName:ms.string(),activityName:ms.string().optional(),intentExtras:ms.string().optional()}),pE=ge.extend({type:ms.literal("OPEN_APP"),packageName:ms.string(),intentExtras:ms.string().optional()});import $m from"zod";var Gx=ge.extend({type:$m.literal("SCROLL_TO"),target:gi,direction:$m.enum(["down","up"]),scrollableElement:Hm,scrollStepPercent:$m.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),maxScrollAttempts:$m.number().int().min(1).max(50).optional().describe("Maximum number of scroll attempts before giving up. Default is 5.")}),Xu=Gx.extend({cache:Hn.optional()}),Ju=Gx.extend({cache:yo.optional()});import fs from"zod";var jx=ge.extend({type:fs.literal("SWIPE"),direction:fs.enum(["up","down","left","right"]),scrollableElement:Hm,viewportPercent:fs.number().optional(),durationMs:fs.number().optional(),relativePosition:fs.object({x:fs.number(),y:fs.number()}).optional()}),Qu=jx.extend({cache:Hn.optional()}),Zu=jx.extend({cache:yo.optional()});import Uo from"zod";var Vx=ge.extend({type:Uo.literal("TAP"),target:Hl,longPress:Uo.boolean().optional(),longPressDurationMs:Uo.number().optional(),iterations:Uo.number().optional(),tapDelayMs:Uo.number().optional(),relativePosition:Uo.object({x:Uo.number(),y:Uo.number()}).optional(),doubleTap:Uo.boolean().optional(),doubleTapDelayMs:Uo.number().optional()}),ed=Vx.extend({cache:Hn.optional()}),td=Vx.extend({cache:yo.optional()});import rd from"zod";var $x=ge.extend({type:rd.literal("TYPE"),target:Hl.optional(),keyPressDelayMs:rd.number().optional(),text:rd.string(),clearContent:rd.boolean().optional(),forceClearContent:rd.boolean().optional()});var nd=$x.extend({cache:Hn.optional()}),od=$x.extend({cache:yo.optional()});var mE=CV.discriminatedUnion("type",[...ju.options,ed,nd,tE,uE,Wy,jy,Gy,Vu,Vy,Xu,Qu,$y,Wu,dE]);import{v4 as lhe}from"uuid";import RV from"zod";var fE=RV.discriminatedUnion("type",[...ju.options,td,od,rE,cE,pE,Zu,$u,Ju,qu]);var Or=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Or||{}),ql=rr.object({id:rr.string().uuid(),envKey:rr.string().optional(),skipped:rr.boolean().optional(),retries:rr.number().optional()}),qx=ql.extend({type:rr.literal("MOBILE_PRESET_STEP"),keyPressDelayMs:rr.number().optional()}),ad=qx.extend({command:mE}),sd=qx.extend({command:fE}),Kl=rr.object({moduleId:rr.string(),inputs:rr.record(rr.string(),rr.string()).optional()}),Yl=ql.merge(Kl.extend({type:rr.literal("MOBILE_MODULE_STEP")})),Age=Kl.extend({steps:rr.lazy(()=>qm.array())}),Cge=Kl.extend({steps:rr.lazy(()=>hE.array())}),na=ql.extend({type:rr.literal("MOBILE_AI_ACTION_STEP"),text:rr.string()}),qm=rr.discriminatedUnion("type",[ad,Yl,na]),hE=rr.discriminatedUnion("type",[sd,Yl,na]);var oa=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(ot),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step"),aiSuggested:xt.boolean().optional()}),xV=oa.merge(ad).extend({previousAttempts:xt.lazy(()=>Si.array()).optional()}),_V=oa.merge(Yl).extend({steps:xt.lazy(()=>Si.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>Si.array()).optional()}),IV=oa.merge(na).extend({steps:xt.lazy(()=>Si.array()),previousAttempts:xt.lazy(()=>Si.array()).optional()}),Si=xt.discriminatedUnion("type",[xV,_V,IV]),PV=oa.merge(sd).extend({previousAttempts:xt.lazy(()=>yi.array()).optional()}),MV=oa.merge(Yl).extend({steps:xt.lazy(()=>yi.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>yi.array()).optional()}),OV=oa.merge(na).extend({steps:xt.lazy(()=>yi.array()),previousAttempts:xt.lazy(()=>yi.array()).optional()}),yi=xt.discriminatedUnion("type",[PV,MV,OV]);var LV=oa.extend({index:ld.number().optional(),userFacingStepReference:ld.string().optional(),description:ld.string()}),Kx=LV.extend({beforeScreenshot:ld.string().optional(),afterScreenshot:ld.string().optional()});var Yx=_e.object({attributesRequired:_e.array(_e.string()).optional(),textRequired:_e.boolean().optional(),boundsRequired:_e.boolean().optional(),positionSpecificity:_e.nativeEnum(tn).optional(),shapeSpecificity:_e.nativeEnum(tn).optional()}),NV=_e.object({id:_e.number(),requirements:Yx}).array(),DV=_e.object({thoughts:_e.string(),id:_e.number(),updatedMemory:hu.optional(),inWebview:_e.boolean().optional(),requirements:Yx.optional(),additionalElements:NV.optional()}),Xx=_e.object({description:_e.string(),screenXml:_e.string(),screenshot:_e.string(),memory:_e.discriminatedUnion("type",[po,_e.object({type:_e.literal("RESOLVED_TRACES"),traces:_e.unknown().array()})]).optional()}),Jx=_e.object({assertion:_e.string(),screenXml:_e.string(),screenshot:_e.string(),memory:_e.discriminatedUnion("type",[Wa,_e.object({type:_e.literal("RESOLVED_TRACES"),traces:_e.unknown().array()})]).optional()}),kV=_e.object({thoughts:_e.string(),result:_e.boolean(),relevantElements:_e.array(_e.number()).optional(),updatedMemory:Su.optional()}),Qx=_e.object({failedResults:Kx.array(),nextStepsSerialized:_e.string().array(),currentScreenXml:_e.string(),currentScreenshot:_e.string(),customInstructions:_e.string().optional(),testDescription:_e.string()}),Zx=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(Zx||{}),UV=_e.object({thoughts:_e.string(),scenario:_e.nativeEnum(Zx),instructions:_e.string().nullish()});var e_=t=>!(!t.org_id||!t.user_id||!t.platform);import{z as hs}from"zod";var t_=hs.object({id:hs.string().uuid(),skipped:hs.boolean().optional(),envKey:hs.string().optional().describe("key in the environment to save the result of this step to")}),gE=t_.merge(qa).extend({type:hs.literal("REQUEST")}),SE=t_.merge(Zp).extend({type:hs.literal("JAVASCRIPT")}),yE=hs.discriminatedUnion("type",[SE,gE]);import{z as Gn}from"zod";var r_=Gn.object({id:Gn.string(),name:pi,description:Gn.string().optional().nullish(),baseUrl:hm.nullish(),schemaVersion:Gn.string(),advanced:Gn.unknown().optional(),retries:Gn.number(),envs:Gn.array(km).nullish(),parameters:Dm.nullish()}),FV=Gn.object({createdAt:Gn.coerce.date(),updatedAt:Gn.coerce.date(),schedule:Ul.nullish(),notification:Fl.nullish(),createdBy:Gn.string(),organizationId:Gn.string()}),BV=r_.merge(FV),sSe=BV.extend({steps:yE.array()}),lSe=r_.extend({steps:yE.array()});import{z as an}from"zod";var n_=an.object({startedAt:an.coerce.date(),finishedAt:an.coerce.date(),status:an.nativeEnum(ot),message:an.string().optional(),data:an.unknown().optional()}),zV=n_.merge(SE).extend({type:an.literal("JAVASCRIPT")}),HV=n_.merge(gE).extend({type:an.literal("REQUEST")}),GV=an.discriminatedUnion("type",[zV,HV]),o_=an.object({startedAt:an.coerce.date(),finishedAt:an.coerce.date().nullish(),status:an.nativeEnum(it),results:GV.array(),failureReason:an.string().nullish(),failureDetails:dm.nullish()});import{z as sn}from"zod";var jV=sn.object({id:sn.string(),organizationId:sn.string(),createdAt:sn.coerce.date(),updatedAt:sn.coerce.date(),createdBy:sn.string(),scheduledAt:sn.coerce.date().nullish(),startedAt:sn.coerce.date().nullish(),finishedAt:sn.coerce.date().nullish(),status:sn.nativeEnum(it),trigger:sn.nativeEnum(on),results:o_.array().nullish(),apiTestName:sn.string().nullish(),apiTestPath:sn.string().nullish(),apiTestId:sn.string().nullish()}),ySe=jV.pick({status:!0,startedAt:!0,finishedAt:!0});var cd=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(cd||{}),i_=3;function VV(t){return t==="MODULE"||t==="CONDITIONAL"||t==="SECTION"||t==="RESOLVED_MODULE"}function EE(t){if(!VV(t))switch(t){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function TE(t){switch(t.type){case"AI_EXTRACT":case"AI_ASSERTION":return i_;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return t.useSelector||!t.target||t.target.type!=="description"?0:1;case"DRAG":return t.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var Xl=class{trackStepExecution(){}async flush(){}};import{parseString as $V,splitCookiesString as WV}from"set-cookie-parser";import{z as tt}from"zod";var bE=tt.object({name:tt.string(),value:tt.string(),url:tt.string().optional(),domain:tt.string().optional(),path:tt.string().optional(),expires:tt.number().default(Date.now()/1e3+60*60*24*365),httpOnly:tt.boolean().optional(),secure:tt.boolean().default(!0),sameSite:tt.union([tt.literal("Strict"),tt.literal("Lax"),tt.literal("None")]).default("None")});function Km(t,e){let r=[],n=WV(t);for(let o of n){let i=$V(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=bE.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});r.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||r.push({...s,name:d,value:p})}}return r}var qV=tt.object({origin:tt.string(),localStorage:tt.array(tt.object({name:tt.string(),value:tt.string()})),sessionStorage:tt.array(tt.object({name:tt.string(),value:tt.string()})).optional()}),KV=tt.object({entries:tt.record(tt.string(),tt.array(tt.tuple([tt.unknown(),tt.unknown()]))),version:tt.number().optional()}),Ym=tt.object({cookies:bE.array().optional(),origins:qV.array().optional(),idb:tt.record(tt.string(),KV).optional().describe("key is db name")});function a_(t,e){let r=[];return t.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=bE.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),r.push(i)}),r}import{v4 as BSe}from"uuid";import Z from"zod";var YV=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM","CUSTOM_COORDINATES"],s_=Z.object({type:Z.enum(YV).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit, CUSTOM_COORDINATES = use explicit pixel coordinates for the scroll start position and distance (fallback if other containers don't work)."),description:Z.string().or(Z.null()).describe("Description of the container to interact with. Only used if the container type is CUSTOM, else set to null."),startX:Z.number().or(Z.null()).describe("Starting X coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),startY:Z.number().or(Z.null()).describe("Starting Y coordinate in pixels. Only used if the container type is CUSTOM_COORDINATES, else set to null."),deltaPixels:Z.number().or(Z.null()).describe("Number of pixels to scroll in the specified direction. Only used if the container type is CUSTOM_COORDINATES, else set to null.")}),XV=Z.object({xPercent:Z.number().min(0).max(1).describe("X coordinate as a fraction of the viewport width (0 = left edge, 1 = right edge)."),yPercent:Z.number().min(0).max(1).describe("Y coordinate as a fraction of the viewport height (0 = top edge, 1 = bottom edge).")}),JV=Z.string().or(XV).describe("Either a string description of an actual element in the page XML to target, or an object with xPercent/yPercent (0-1) for coordinate-based targeting when no suitable element exists. Prefer element descriptions when possible."),l_=Z.object({type:Z.literal("TAP"),target:JV,longPress:Z.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),iterations:Z.null().or(Z.number()).describe("Number of times to tap the element, useful for selecting text, selecting a row, or opening a menu. If null, tap once."),relativePosition:Z.null().or(Z.object({x:Z.number(),y:Z.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner. Only applicable when target is a string description.")}).describe("Tap on an element on the screen, or tap at specific coordinates."),QV=Z.object({type:Z.literal("PRESS"),key:Z.nativeEnum(ps)}).describe("Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher)."),c_=Z.object({type:Z.literal("AI_CHECK"),assertion:Z.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:Z.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe("Use AI to verify a statement about the state of the emulator. Will retry up until the timeout, so this can be used as a flexible wait that supports visual, numerical, and logical reasoning."),u_=Z.object({type:Z.literal("WAIT"),timeoutSecs:Z.number().describe("Number of seconds to wait.")}).describe("Wait for a fixed number of seconds. Use this in these scenarios: 1. Short waits that are expected to be less than 5 seconds almost all the time, which shouldn't warrant an AI call (e.g. an app needs to finish loading, or some contents are suspending); 2. Waits with an obvious deterministic duration (e.g. a 60-second countdown is on the page). For other scenarios, prefer AI_CHECK."),qSe=Z.object({type:Z.literal("AI_EXTRACT"),goal:Z.string().describe("Natural language description of what to extract from the current emulator state."),schema:Z.string().or(Z.null()).describe("Optional JSON schema string for the expected output shape. Use null to omit.")}).describe("Use AI to extract structured data from the current emulator state."),d_=Z.object({type:Z.literal("TYPE"),text:Z.string().describe("Exact type to text, which will be passed to appium's driver.keys() method."),keyPressDelayMs:Z.number().or(Z.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:Z.boolean().or(Z.null()).describe("Clear the content of the input before typing. Do not set to true if the input is already empty.")}),p_=Z.object({type:Z.literal("SWIPE"),direction:Z.enum(["up","down","left","right"]).describe("Direction to swipe. Important: swiping up will scroll down, and vice versa."),container:s_,viewportPercent:Z.number().min(.1).max(1).or(Z.null()).describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Set to null for default (0.8)."),durationMs:Z.number().int().positive().or(Z.null()).describe("Optional swipe duration in milliseconds. Set to null for default.")}).describe("Swipe a single time in a specified direction within a container (screen/app/webview/custom container/custom coordinates)."),m_=Z.object({type:Z.literal("SCROLL_TO"),targetDescription:Z.string().describe("Description of the element to scroll to inside the container."),direction:Z.enum(["down","up"]).describe("Direction to search for the target. Important: this is direction the target is in relative to the current position. E.g. 'down' means the desired element is below the current position."),container:s_,scrollStepPercent:Z.number().min(.1).max(1).or(Z.null()).describe("How much of the container height to scroll at each step (0.1 - 1). Set to null for default (0.8)."),maxScrollAttempts:Z.number().int().min(1).max(50).or(Z.null()).describe("Maximum number of scroll attempts before giving up. Set to null for default (5).")}).describe("Scroll within a container until the described target is visible or we can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If a scroll fails, we do not restore the position automatically."),KSe=Z.discriminatedUnion("type",[l_,QV,c_,u_,d_,p_,m_]),ZV=Z.object({type:Z.literal("PRESS"),key:Z.nativeEnum(ta)}).describe("Press a physical button on the device. Only HOME and POWER are available on iOS."),e$=Z.object({type:Z.literal("PRESS_KEYBOARD"),key:Z.nativeEnum(ra)}).describe("Press a key on the keyboard. Available keys: ENTER, BACKSPACE."),YSe=Z.discriminatedUnion("type",[l_,ZV,e$,c_,u_,d_,p_,m_]);var XSe={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a fixed number of seconds. Prefer this for short, deterministic waits; use AI_CHECK for longer or undefined waits.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",ROTATE_ORIENTATION:"Rotate the device orientation.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true.",AI_EXTRACT:"Extract data from the emulator state and optionally store it in an environment variable."};var JSe=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","ROTATE_ORIENTATION","AI_CHECK"];import f_ from"zod";var ln={type:!0,cache:!0},h_=[Vl.pick(ln),Wu.pick(ln),ed.pick(ln),nd.pick(ln),Qu.pick(ln),Xu.pick(ln),Vu.pick(ln)],Jl=f_.discriminatedUnion("type",h_),g_=[Vl.pick(ln),qu.pick(ln),td.pick(ln),od.pick(ln),Zu.pick(ln),$u.pick(ln),Ju.pick(ln)],S_=f_.discriminatedUnion("type",g_);var fye=Object.values(He).filter(t=>h_.some(e=>e.shape.type.safeParse(t).success));var hye=Object.values(He).filter(t=>g_.some(e=>e.shape.type.safeParse(t).success));function Xm(t){switch(t){case"ANDROID":return Jl;case"IOS":return S_;default:throw new Error(`Unsupported platform: ${t}`)}}var gye=wl(Jl),Sye=wl(S_);var yye=Ja(Jl);import y_ from"zod";var ud=(n=>(n.US_WEST_1="us-west1",n.EU_NORTH_1="eu-north1",n.AS_SOUTH_1="as-south1",n))(ud||{}),E_=(e=>(e.LOCAL="local",e))(E_||{}),T_=y_.nativeEnum(ud).or(y_.nativeEnum(E_)),dd=(r=>(r.ANDROID_14="14",r.ANDROID_15="15",r))(dd||{});var vE=(e=>(e.IOS_26="26",e))(vE||{});import{cloneDeep as Aye}from"lodash-es";import Rye from"truncate-json";import $t from"zod";import{z as Eo}from"zod";import{z as _t}from"zod";var Lr=_t.object({id:_t.string(),name:pi,baseUrl:hm,description:_t.string().optional().nullish(),schemaVersion:_t.string(),advanced:us,retries:_t.number().optional().nullish(),envs:_t.array(km).nullish(),parameters:Dm.nullish(),disabled:_t.boolean().optional(),labels:_t.array(_t.string()).optional().catch([])}),Oye=_t.enum(["INHERIT","ENABLED","DISABLED"]);var t$=us.extend({failureRecovery:_t.boolean().or(_t.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED"),useMemory:_t.boolean().or(_t.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED")});var Lye=Lr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:t$}),Nye=Lr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),r$=_t.object({labels:_t.array(_t.string()).optional(),outputs:tx.nullish()}),jn=Lr.merge(r$),n$=_t.object({createdAt:_t.coerce.date(),updatedAt:_t.coerce.date(),updatedBy:_t.string().nullable(),schedule:Ul,notification:Fl,createdBy:_t.string(),organizationId:_t.string(),folderId:_t.string().nullable().optional()}),o$=Lr.merge(n$),Dye=o$.merge(qi),Jm=Lr.merge(qi),kye=Lr.merge(rs);var i$="test",a$="module",s$="mobile-test",l$="mobile-module";var ye=(o=>(o.TEST=`momentic/${i$}`,o.MODULE=`momentic/${a$}`,o.MOBILE_TEST=`momentic/${s$}`,o.MOBILE_MODULE=`momentic/${l$}`,o))(ye||{}),jye=Lr.merge(rs),AE=nn.extend({steps:Eo.array(Eo.record(Eo.string(),Eo.unknown())),schemaVersion:Eo.string()}),Vye=AE.extend({fileType:Eo.literal(ye.MODULE)}),$ye=Eo.object({test:Eo.string().describe("YAML for the test, including metadata and steps"),modules:Eo.record(Eo.string(),Eo.string()).describe("Map of module name to YAML for the module")});function Qm(t){if(t===void 0)return"__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(Qm);let e={};for(let[r,n]of Object.entries(t))e[r]=Qm(n);return e}var pd=$t.object({parameterNames:$t.string().array(),defaultParameters:$t.record($t.string(),$t.string()).optional(),parameterEnums:$t.record($t.string(),$t.string().array()).optional()}),c$=$t.object({moduleId:$t.string().uuid(),name:$t.string(),description:$t.string().nullish(),platform:$t.nativeEnum(gr).optional().default("ANDROID"),parameters:pd.optional(),enabled:$t.boolean().nullish(),schemaVersion:$t.string()}),Zm=c$.omit({name:!0}),b_=Zm.extend({steps:$t.array($t.record($t.string(),$t.unknown()))}),u$=$t.object({fileType:$t.literal(ye.MOBILE_MODULE)}).merge(b_);import Oe from"zod";import*as Ql from"zod";var eEe=Ql.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."}),RE=Ql.preprocess(t=>{if(typeof t!="string")return t;let e=t.trim();return e.length===0?void 0:e},Ql.string().optional());import To from"zod";var Fo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Fo||{}),v_=To.object({description:To.string().optional(),name:To.string().describe("name of the module"),parameters:pd.optional()}),wE=Kl.merge(v_).extend({platform:To.literal("ANDROID"),steps:To.lazy(()=>gs.array())}),xE=Kl.merge(v_).extend({platform:To.literal("IOS"),steps:To.lazy(()=>Ss.array())}),d$=ql.merge(wE).extend({type:To.literal("RESOLVED_MOBILE_MODULE")}),p$=ql.merge(xE).extend({type:To.literal("RESOLVED_MOBILE_MODULE")}),gs=To.discriminatedUnion("type",[d$,ad,na]),Ss=To.discriminatedUnion("type",[p$,sd,na]);function A_(t){return Object.values(Fo).includes(t)||Object.values(Or).includes(t)}var m$=Oe.object({disableMomenticAccessibilityTree:Oe.boolean().optional(),autoGrantPermissions:Oe.boolean().optional(),disableXmlSnapshots:Oe.boolean().optional().describe("Skip collecting XML snapshots during test runs. This can speed up test runs, but will cause the run viewer to show less information."),browserSettings:kl.optional()}),_E=m$.extend({region:T_.optional().describe("Do you want local or Limbar? Default behavior is Limbar (remote emulators)"),remoteEmulatorSettings:Oe.object({androidVersion:Oe.nativeEnum(dd).optional()}).optional(),localEmulatorSettings:Oe.object({avdId:RE}).optional(),geolocation:Oe.object({latitude:Oe.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Oe.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:Oe.boolean().optional().describe("wait for stability before every targeting action")}),Zl=Oe.object({retries:Oe.number().optional().describe("number of retries to run"),defaultChannel:Oe.string().optional().describe("Default app release channel to use when installing from managed mobile artifacts."),defaultTag:Oe.string().optional().describe("Default app artifact tag to use. If not set, the latest available tag is used."),defaultEnv:Oe.string().optional().describe("Default mobile environment name to load variables from at runtime."),defaultApkFilePath:RE.describe("APK to install when using the emulator in the local region."),emulator:_E.optional().describe("Emulator configuration for local or remote mobile execution, including region and local emulator overrides."),ai:Ly.optional().describe("AI behavior overrides for this mobile test, such as memory and failure recovery settings.")}),C_=Oe.object({id:Oe.string().uuid(),description:Oe.string(),schemaVersion:Oe.string(),settings:Zl.optional(),disabled:Oe.boolean().optional(),labels:Oe.array(Oe.string()).optional()}),ef=C_.extend({platform:Oe.literal("ANDROID").optional().default("ANDROID")}),tf=C_.extend({platform:Oe.literal("IOS")}),IE=Oe.discriminatedUnion("platform",[ef,tf]),R_=Oe.object({fileType:Oe.literal(ye.MOBILE_TEST)}),rf=R_.merge(ef),nf=R_.merge(tf),bEe=Oe.discriminatedUnion("platform",[rf,nf]),w_=ef.merge(Oe.object({steps:Oe.array(qm)})),x_=tf.merge(Oe.object({steps:Oe.array(hE)})),vEe=Oe.discriminatedUnion("platform",[w_,x_]),f$=rf.merge(w_),h$=nf.merge(x_),g$=Oe.discriminatedUnion("platform",[f$,h$]),AEe=Oe.object({name:Oe.string(),steps:Oe.array(qm).optional(),settings:Zl.optional()}),__=ef.extend({steps:gs.array()}),I_=tf.extend({steps:Ss.array()}),CEe=Oe.discriminatedUnion("platform",[__,I_]),S$=__.extend({name:Oe.string()}),y$=I_.extend({name:Oe.string()}),E$=Oe.discriminatedUnion("platform",[S$,y$]);import ke from"zod";import ne from"zod";var cn=ne.object({startTime:ne.number(),endTime:ne.number().optional(),durationMs:ne.number().optional(),error:ne.string().optional(),result:ne.unknown().optional(),attributes:ne.record(ne.string(),ne.unknown()),subSpans:ne.lazy(()=>L$.array())});var PE=cn.extend({type:ne.literal("SECTION"),name:ne.string()}),T$=cn.extend({type:ne.literal("GET_PAGE_STATE")}),b$=cn.extend({type:ne.literal("GET_PAGE_SCREENSHOT")}),v$=cn.extend({type:ne.literal("SMART_WAITING")}),A$=cn.extend({type:ne.literal("SCROLL_ELEMENT_INTO_VIEW")}),C$=cn.extend({type:ne.literal("AI_LOCATOR_CALL"),screenshotSnapshotId:ne.string().optional(),result:ne.object({id:ne.number(),thoughts:ne.string()}).optional()}),R$=cn.extend({type:ne.literal("AI_ASSERTION_CALL"),screenshotSnapshotId:ne.string().optional(),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({thoughts:ne.string(),result:ne.boolean()}).optional()}),w$=cn.extend({type:ne.literal("ELEMENT_ASSERTION"),name:ne.string(),result:ne.object({success:ne.boolean(),message:ne.string().optional()}).optional()}),x$=cn.extend({type:ne.literal("BROWSER_INTERACTION"),name:ne.string(),coordinates:ne.object({x:ne.number(),y:ne.number()}).optional(),value:ne.string().optional(),selector:ne.string().optional()}),_$=cn.extend({type:ne.literal("CACHE_RESOLUTION"),resolutionMethod:ne.string().optional(),cacheMissReason:ne.nativeEnum(hl).optional(),targetSource:ne.string().optional(),result:ne.object({serializedElement:ne.string()}).optional()}),I$=cn.extend({type:ne.literal("TARGET_RESOLUTION"),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({serializedElement:ne.string()}).optional()}),P$=cn.extend({type:ne.literal("LOCATOR_REDIRECT"),elementScreenshotSnapshotId:ne.string().optional(),result:ne.object({outcome:ne.string(),logs:ne.string().array().optional(),serializedElement:ne.string().optional(),relativeClickPoint:ne.object({x:ne.number(),y:ne.number()}).optional(),force:ne.boolean().optional()}).optional()}),M$=cn.extend({type:ne.literal("WAIT_FOR_STABILITY")}),O$=cn.extend({type:ne.literal("GENERIC"),name:ne.string()}),L$=ne.discriminatedUnion("type",[PE,T$,b$,v$,A$,C$,R$,w$,x$,I$,_$,P$,M$,O$]);var Vn=ke.object({startTime:ke.number(),endTime:ke.number().optional(),durationMs:ke.number().optional(),error:ke.string().optional(),result:ke.unknown().optional(),attributes:ke.record(ke.string(),ke.unknown()),subSpans:ke.lazy(()=>W$.array())});var N$=Vn.extend({type:ke.literal("SECTION"),name:ke.string()}),D$=Vn.extend({type:ke.literal("AI_LOCATOR_CALL"),result:ke.object({id:ke.number(),thoughts:ke.string()}).optional()}),k$=Vn.extend({type:ke.literal("AI_ASSERTION_CALL"),result:ke.object({thoughts:ke.string(),result:ke.boolean()}).optional()}),U$=Vn.extend({type:ke.literal("TARGET_RESOLUTION"),result:ke.object({serializedElement:ke.string()}).optional()}),F$=Vn.extend({type:ke.literal("EMULATOR_INTERACTION"),name:ke.string(),withinWebview:ke.boolean().optional()}),B$=Vn.extend({type:ke.literal("EMULATOR_READ_STATE"),name:ke.string()}),z$=Vn.extend({type:ke.literal("ELEMENT_ASSERTION"),name:ke.string(),result:ke.object({success:ke.boolean(),message:ke.string().optional()}).optional()}),H$=Vn.extend({type:ke.literal("CACHE_RESOLUTION")}),G$=Vn.extend({type:ke.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),j$=Vn.extend({type:ke.literal("WAIT_FOR_PAGE_STABILITY")}),V$=Vn.extend({type:ke.literal("WEBVIEW_LOCATOR_CALL"),webTrace:PE}),$$=Vn.extend({type:ke.literal("GENERIC"),name:ke.string()}),W$=ke.discriminatedUnion("type",[N$,D$,k$,U$,F$,B$,z$,H$,G$,j$,V$,$$]);import{parse as NEe}from"date-fns";import{z as ec}from"zod";var kEe=ec.object({testId:ec.string(),sessionId:ec.string()}),P_=ec.object({uploadUrl:ec.string(),id:ec.string()});import q$ from"zod";var M_=(r=>(r.LOCAL="local",r.REMOTE="remote",r))(M_||{}),BEe=q$.nativeEnum(M_);var STe=new Set(Object.values(et));var K$={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},yTe={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},pt={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of a conditional check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},ETe={AI_CHECK:"AI check",AI_EXTRACT:"AI extract",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ROTATE_ORIENTATION:"Rotate orientation",ADB:"ADB command",STATE:"Debug state"},TTe={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ROTATE_ORIENTATION:"Rotate the device orientation to portrait or landscape.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen.",AI_EXTRACT:"Ask AI to extract data from the emulator state."};import Y$ from"semver";import{z as X$}from"zod";var CTe=X$.string().refine(t=>Y$.valid(t),{message:"must be a valid semver string"});function tc(t){if(t!==void 0)return t===!0||t==="true"||t==="1"}import{Faker as xTe,en as _Te}from"@faker-js/faker";import{z as q}from"zod";var rc=55555,PTe=q.object({body:q.string(),to:q.string(),from:q.string()}),MTe=q.object({from:q.string().optional(),to:q.string(),timeout:q.number().optional(),beforeDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional()}),OTe=q.object({to:q.string().email(),from:q.string(),subject:q.string(),body:q.string(),html:q.string().optional()}),LTe=q.object({inbox:q.string().transform(t=>t.toLowerCase()),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),timeout:q.number().optional(),trimWhitespace:q.boolean().optional()}),NTe=q.object({inbox:q.string(),limit:q.number().optional(),afterDate:q.string().pipe(q.coerce.date()).or(q.date()).optional(),trimWhitespace:q.boolean().optional()});var of=(r=>(r.RAW="RAW",r.RESPONSE="RESPONSE",r))(of||{}),O_=q.object({body:q.string().nullish(),status:q.number().optional(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}),J$=q.object({url:q.string(),options:q.object({method:q.string(),body:q.string().nullish(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}).optional()}).optional(),Q$=q.object({body:q.string().nullish(),options:q.object({status:q.number(),statusText:q.string().optional(),headers:q.array(q.tuple([q.string(),q.string()])).optional()}).optional()}).optional(),L_=q.object({result:q.unknown(),variableUpdates:q.record(q.string(),q.unknown()).optional(),persistentVariableUpdates:q.record(q.string(),q.unknown()).optional(),error:q.string().optional(),success:q.boolean()}),DTe=q.object({id:q.string().optional(),orgId:q.string(),momenticLambdaAuthHash:q.string(),code:q.string(),fragment:q.boolean(),state:q.object({env:q.record(q.string(),q.unknown()),request:J$,response:Q$,additionalBindings:q.record(q.string(),q.unknown()).optional()}),timeoutMs:q.number().optional(),disallowVariableUpdates:q.boolean().optional(),responseSerialization:q.nativeEnum(of).optional()}),ia=15e3;import*as Nr from"zod";import{extendZodWithOpenApi as Z$}from"zod-openapi";Z$(Nr);var eW=Nr.object({url:Nr.string(),lineNumber:Nr.number(),columnNumber:Nr.number()}).openapi({ref:"CodeLocation"}),af=Nr.object({timestamp:Nr.number(),text:Nr.string(),type:Nr.string(),tabIndex:Nr.number(),args:Nr.unknown().array().optional(),url:Nr.string().optional(),location:eW.optional()}).openapi({ref:"ConsoleLog"}),N_=af.array(),ME=N_.array();import*as OE from"zod";import{extendZodWithOpenApi as tW}from"zod-openapi";tW(OE);var rW=OE.object({logsPerPage:af.array().array()}).openapi({ref:"DebugData"});import*as Lt from"zod";import{extendZodWithOpenApi as nW}from"zod-openapi";nW(Lt);var D_=Lt.object({total:Lt.number(),user:Lt.number(),sys:Lt.number(),intervalMs:Lt.number()}),oW=Lt.object({total:Lt.number(),free:Lt.number(),freePercentage:Lt.number()}),iW=Lt.object({rss:Lt.number(),heapTotal:Lt.number(),heapUsed:Lt.number(),external:Lt.number(),arrayBuffers:Lt.number()}),k_=Lt.object({timestamp:Lt.number(),system:Lt.object({cpu:D_.nullable(),memory:oW}),process:Lt.object({cpu:D_.nullable(),memory:iW})}).openapi({ref:"ResourceUsageSample"}),aW=Lt.object({samples:k_.array()}).openapi({ref:"ResourceUsageSeries"});var md=class{async getConsoleLogsForRunAttempt(e,r,n){}async getNetworkLogsForRunAttempt(e,r,n){}async getHtmlSnapshot(e,r){}async getA11yTreeSnapshot(e,r){}async getScreenshot(e,r){}async storeConsoleLogsForRunAttempt(e,r,n,o){}async storeNetworkLogsForRunAttempt(e,r,n,o){}listVideoAssetPaths(){return[]}close(){}async storeScreenshot(e,r,n){}async storeOnDemandScreenshotById(e,r,n,o){}async storeHtmlSnapshot(e,r,n){}};import{z as U}from"zod";var sW=U.object({name:U.string(),version:U.string(),comment:U.string().optional()}),lW=U.object({name:U.string(),version:U.string(),comment:U.string().optional()}),cW=U.object({onContentLoad:U.number().optional(),onLoad:U.number().optional(),comment:U.string().optional()}),fd=U.object({startedDateTime:U.string(),id:U.string(),title:U.string().optional(),pageTimings:cW,comment:U.string().optional()}),uW=U.array(fd),dW=U.object({name:U.string(),value:U.string(),path:U.string().optional(),domain:U.string().optional(),expires:U.string().optional(),httpOnly:U.boolean().optional(),secure:U.boolean().optional(),comment:U.string().optional()}),F_=U.array(dW),pW=U.object({name:U.string(),value:U.string(),comment:U.string().optional()}),B_=U.array(pW),mW=U.object({name:U.string(),value:U.string(),comment:U.string().optional()}),fW=U.array(mW),hW=U.object({name:U.string(),value:U.string().optional(),fileName:U.string().optional(),contentType:U.string().optional(),comment:U.string().optional()}),gW=U.array(hW),SW=U.object({mimeType:U.string(),params:gW,text:U.string(),comment:U.string().optional(),_redactedReason:U.string().optional()}),yW=U.object({method:U.string(),url:U.string(),httpVersion:U.string().optional(),cookies:F_,headers:B_,queryString:fW,postData:SW.optional(),headersSize:U.number().optional(),bodySize:U.number().optional(),comment:U.string().optional()}),EW=U.object({size:U.number().optional(),compression:U.number().optional(),mimeType:U.string().optional(),text:U.string().optional(),encoding:U.string().optional(),comment:U.string().optional(),_redactedReason:U.string().optional()}),TW=U.object({status:U.number(),statusText:U.string(),httpVersion:U.string().optional(),cookies:F_,headers:B_,content:EW,redirectURL:U.string().optional(),headersSize:U.number().optional(),bodySize:U.number().optional(),comment:U.string().optional(),_mocked:U.boolean().optional()}),U_=U.object({expires:U.string().optional(),lastAccess:U.string(),eTag:U.string(),hitCount:U.number(),comment:U.string().optional()}),bW=U.object({beforeRequest:U_.optional(),afterRequest:U_.optional(),comment:U.string().optional()}),vW=U.object({blocked:U.number().optional(),dns:U.number().optional(),connect:U.number().optional(),send:U.number(),wait:U.number(),receive:U.number(),ssl:U.number().optional(),comment:U.string().optional()}),hd=U.object({pageref:U.string().optional(),startedDateTime:U.string(),time:U.number().optional(),request:yW,response:TW.optional(),cache:bW.optional(),timings:vW,serverIPAddress:U.string().optional(),connection:U.string().optional(),comment:U.string().optional(),_resourceType:U.string().optional()}),AW=U.array(hd),CW=U.object({version:U.string().default("1.1"),creator:sW.optional(),browser:lW.optional(),pages:uW.optional(),entries:AW,comment:U.string().optional()}),RW=U.object({log:CW}),XTe=U.record(U.string(),fd),JTe=U.record(U.string(),hd);function LE(t,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}var z_=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{cloneDeep as wW}from"lodash-es";import{z as Bo}from"zod";var NE=(u=>(u.DisableClickhouseCaches="disable_clickhouse_caches",u.ShowZeroOpacityElements="show_zero_opacity_elements",u.VisualActions="visual_actions",u.RagV2="rag_v2",u.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",u.GlobalLocatorRedirect="global_locator_redirect",u.FakerConstantSeed="faker_constant_seed",u.AutoExpandIframes="auto_expand_iframes",u.NewAiActionStepsUseV3="new_ai_action_steps_use_v3",u.PerformanceInsights="performance_insights",u))(NE||{});var H_=Bo.union([Bo.string(),Bo.number(),Bo.boolean(),Bo.null(),Bo.record(Bo.string(),Bo.lazy(()=>H_)),Bo.array(Bo.lazy(()=>H_))]),gd=class{flags;payloads;constructor(e,r){this.flags=e,this.payloads=r}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=wW(this.flags);return Object.entries(e).forEach(([r,n])=>{typeof n=="boolean"&&Object.values(NE).includes(r)&&(e[r]=this.isBooleanFlagEnabled(r))}),e}getFlagPayload(e){let r=this.payloads[e];if(r!==void 0){if(typeof r=="string")try{return JSON.parse(r)}catch{return r}return r}}refresh(){throw new Error("Not implemented")}},cbe=new gd({},{});var Sd={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},G_=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],dbe=Object.keys(Sd);import{z as aa}from"zod";var fbe=aa.object({id:aa.string(),name:aa.string(),createdAt:aa.coerce.date(),createdBy:aa.string(),updatedAt:aa.coerce.date(),updatedBy:aa.string().nullable(),organizationId:aa.string()});import{z as V}from"zod";import sa from"zod";var nc=sa.object({platformSep:sa.string(),fullPathSegments:sa.string().array(),relativePathSegments:sa.string().array(),relativePath:sa.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:sa.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:sa.coerce.date(),createdAt:sa.coerce.date()});var xW=V.array(nc.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),_W=nc.extend({id:V.string(),name:V.string(),description:V.string().optional(),content:Ty}),IW=V.array(_W),xbe=V.object({tests:xW,modules:IW,labels:V.string().array()}),_be=Jm.merge(jn),j_=V.object({schemaVersion:V.string(),stepLists:qi}),V_=jn.partial().merge(Lr.pick({id:!0})),la="1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID.",DE={name:V.string().min(1).max(255).describe(la),description:V.string().optional(),baseUrl:V.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:V.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:V.nativeEnum(So).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:Rm.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:V.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder. Paths are relative to the project root.")},$_=V.object(DE),Ibe=Jm.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),W_=V.object({name:V.string()}),Pbe=V.object({relativeFilePath:V.string()}),q_=V.object({name:V.string()}),Mbe=V.object({relativeFilePath:V.string()}),K_=V.object({name:V.string(),description:V.string(),enabled:V.boolean(),steps:V.lazy(()=>Dt.array()),testFilePath:V.string().describe("relative to the project root"),folderPath:V.string().optional().describe("user selected folder path")}),Y_=V.object({name:V.string(),description:V.string(),enabled:V.boolean()}).partial();var Obe=V.array(Kw),X_=V.object({defaultEnv:V.string().optional().describe("name of the default env, or undefined to unset")}),J_=V.object({configFilePath:V.string().describe("full path on disk")}),Lbe=V.string().array(),Nbe=V.object({message:V.string(),newRelativeTestPath:V.string().optional()}),kE=V.object({name:V.string(),absolutePath:V.string(),relativePath:V.string(),pathSegments:V.array(V.string()),isDirectory:V.boolean(),size:V.number(),createdAt:V.coerce.date(),modifiedAt:V.coerce.date(),accessedAt:V.coerce.date()}),Q_=V.object({pathSegments:V.array(V.string())}),Dbe=V.object({absolutePath:V.string(),pathSegments:V.array(V.string()),contents:V.array(kE)}),Z_=V.object({pathSegments:V.array(V.string())}),eI=V.object({pathSegments:V.array(V.string()),newPathSegments:V.array(V.string())}),tI=V.object({pathSegments:V.array(V.string()),recursive:V.boolean().optional()}),kbe=V.object({success:V.boolean(),message:V.string(),pathSegments:V.array(V.string()).optional()}),Ube=V.object({gitBranch:V.string(),fileMtime:V.coerce.date(),gitCommitSha:V.string()});var sf=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],lf=sf.map(t=>`**/${t}/**`),rI=typeof process<"u"&&!0&&!0,$n=typeof process<"u"&&!1,nI=2e5;var cf=58889;import zo from"chalk";import PW from"safe-stable-stringify";import MW from"truncate-json";import OW from"zod";var ys=PW.configure({deterministic:!1});function oI(t){let e=ys(t),{jsonString:r}=MW(e,5e4);return r}var LW=["app","version","env","namespace","host"];function at(t){let e=t.bindings()??{},r={};for(let n of Object.keys(e)){let o=e[n];!LW.includes(n)&&typeof o=="string"&&(r[n]=o)}return r}var UE=OW.enum(["debug","info","warn","error"]);var yd={debug:20,info:30,warn:40,error:50},iI={20:"debug",30:"info",40:"warn",50:"error"},Es=class t{minLogLevel;logBindings;constructor(e,r){typeof e=="string"?this.minLogLevel=yd[e]:this.minLogLevel=e,this.logBindings=r}logWithLevel(e,r,...n){try{this.logWithLevelHelper(e,r,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,r=" "){return e.split(`
12
12
  `).map((n,o)=>o>0?`${r}${n}`:n).join(`
13
13
  `)}logWithLevelHelper(e,r,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(r(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(r(` ${s}:`,l)),console.log(r(" stack:",c.stack));let d=Object.entries(c).filter(([p])=>p!=="message"&&p!=="stack");for(let[p,m]of d){if(m instanceof Error){console.log(r(` ${s}.${p}:`,m.message)),m.stack&&console.log(r(` ${s}.${p}.stack:`,m.stack));continue}if(typeof m=="object"&&m!==null){let f=this.indentMultiline(ys(m,void 0,2)," ");console.log(r(` ${s}.${p}:`,f));continue}console.log(r(` ${s}.${p}:`,m))}}else typeof c=="object"?(l=ys(c,void 0,2),l=this.indentMultiline(l),console.log(r(` ${s}:`,l))):console.log(r(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=ys(a,void 0,2),s=s.split(`
14
14
  `).map((c,l)=>l>0?` ${c}`:c).join(`
@@ -24,13 +24,13 @@ ${this.decisions.map(e=>e.toString()).join(`
24
24
  To resolve the conflict:`,eb(l,e))),i=c):ae.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
25
25
  `,`Details:
26
26
  `,ZT(l,e),`To resolve the conflict:
27
- `,eb(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 dL=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}();yt();yt();var pL=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new bo}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){ae.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===yn.INT&&!Number.isInteger(e)&&(ae.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 mL=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!$d(e)){var o=this._buffer.get(e);if(o==null&&(o=new bo,this._buffer.set(e,o)),typeof r!="number"){ae.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===yn.INT&&!Number.isInteger(r)&&(ae.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 rb=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())})},nb=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}}},fL=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},hL=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))},gL=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($d));if(n.size===0){ae.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($d)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return rb(this,void 0,void 0,function(){var n,o,i,a;return nb(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,fO(hL(hL([],fL(n),!1),fL(o),!1))];case 1:return i=s.sent(),a=i.filter(hO).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 rb(n,void 0,void 0,function(){var s,c;return nb(this,function(l){switch(l.label){case 0:return s=new pL(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=ma(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 rb(n,void 0,void 0,function(){var s,c;return nb(this,function(l){switch(l.label){case 0:return s=new mL,c=Promise.resolve(i(s)),r!=null&&(c=ma(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&&gO(n.instruments,r)})},t}();var t4=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)}}(),SL=function(t){t4(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 lh(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new ch(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}(sh);var yL=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)}}(),bc=function(){function t(){}return t.Noop=function(){return n4},t}();var r4=function(t){yL(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(bc);var EL=function(t){yL(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}(bc);var n4=new r4;var o4=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())})},i4=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}}},a4=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},TL=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new uL,this.observableRegistry=new gL,this.meter=new aL(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,SL);return r.length===1?r[0]:new dL(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,cL);return r},t.prototype.collect=function(e,r,n){return o4(this,void 0,void 0,function(){var o,i,a;return i4(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(pO),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=EO(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=a4(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),f=u.selectCardinalityLimit(e.type),h=new r(e,m,bc.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var s4=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.")},bL=function(){function t(e){this.resource=e,this.viewRegistry=new QO,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=mO(e),n=this.meterSharedStates.get(r);return n==null&&(n=new TL(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=s4(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 uh=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())})},dh=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}}},l4=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},c4=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))},vL=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return uh(this,void 0,void 0,function(){var r,n,o,i,a=this;return dh(this,function(s){switch(s.label){case 0:return r=xs(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return uh(a,void 0,void 0,function(){var l;return dh(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,c4([],l4(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 uh(this,void 0,void 0,function(){return dh(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 uh(this,void 0,void 0,function(){return dh(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 AL=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())})},CL=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}}},RL=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 u4(t,e){var r=e??oh.empty();return t?oh.default().merge(r):r}var ob=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new bL(u4((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=RL(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=RL(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?(ae.warn("A shutdown MeterProvider cannot provide a Meter"),cT()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new vL(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return AL(this,void 0,void 0,function(){return CL(this,function(r){switch(r.label){case 0:return this._shutdown?(ae.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 AL(this,void 0,void 0,function(){return CL(this,function(r){switch(r.label){case 0:return this._shutdown?(ae.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 d4=/[\^$\\.+?()[\]{}|]/g,ph=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(d4,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var vc=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 wL=function(){function t(e){var r;this._nameFilter=new ph((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new vc(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 xL=function(){function t(e){this._nameFilter=new vc(e?.name),this._versionFilter=new vc(e?.version),this._schemaUrlFilter=new vc(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 p4(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var mh=function(){function t(e){var r;if(p4(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||ph.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 EL(e.attributeKeys):this.attributesProcessor=bc.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Yn.Default(),this.instrumentSelector=new wL({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new xL({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var BDe=process.env.APP||"unknown";yt();import{v4 as f4}from"uuid";function h4(){return new cO({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Rs.DELTA})}var g4=[new mh({instrumentName:"test_event_duration",instrumentType:Ye.HISTOGRAM,aggregation:new Vd([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new mh({instrumentName:"test_step_duration",instrumentType:Ye.HISTOGRAM,aggregation:new Vd([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],fh=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 xT({[Of]:e.serviceName,[iM]:r,[sM]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:f4()}),o=h4(),i=new JT({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new ob({resource:n,readers:[i],views:g4}),_f.setGlobalMeterProvider(this.provider),this.meter=_f.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Rf(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=Rf(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 Kt=new Cf;function _L(t){t.disabled||(Kt=new fh(t))}var ib=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",dist:"production",release:"cli-2.77.0",tracesSampleRate:0,sendDefaultPii:!0}),mP(t.captureException),ib=!0}catch{}import{Argument as one,Command as ine,Option as Gr}from"@commander-js/extra-typings";import{execSync as ane}from"child_process";import{existsSync as S4,statSync as y4}from"fs";function IL(t){try{return S4(t)&&y4(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as E4,input as T4}from"@inquirer/prompts";import{existsSync as b4,mkdirSync as v4,statSync as A4}from"fs";import{dirname as C4}from"path";var R4=!1,ML=(()=>{try{return A4("/.dockerenv"),!0}catch{return!1}})();async function Tr(t){return Ts||R4||ML?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await E4({message:t}))}async function ab(t){let e=C4(t);return IL(e)?b4(t)?Tr(`File '${PL(t)}' already exists. Overwrite existing content?`):!0:await Tr(`Directory '${PL(e)}' doesn't exist. Create it now?`)?(v4(e,{recursive:!0}),!0):!1}function PL(t){return t.replace(/(\s+)/g,"\\$1")}async function OL(t,e){return Ts||ML?e:(await T4({message:t,default:e})).trim()||e}import Wo,{supportsColor as x4}from"chalk";import{Console as LL}from"console";import{format as qd}from"util";var sb=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}},hh=class t extends LL{_buffer=[];_groupDepth=0;Console=LL;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new sb(void 0,t.write).stack;if(!i)return e;let a=i.split(`
27
+ `,eb(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 dL=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}();yt();yt();var pL=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new bo}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){ae.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===yn.INT&&!Number.isInteger(e)&&(ae.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 mL=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!$d(e)){var o=this._buffer.get(e);if(o==null&&(o=new bo,this._buffer.set(e,o)),typeof r!="number"){ae.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===yn.INT&&!Number.isInteger(r)&&(ae.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 rb=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())})},nb=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}}},fL=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},hL=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))},gL=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($d));if(n.size===0){ae.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($d)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return rb(this,void 0,void 0,function(){var n,o,i,a;return nb(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,fO(hL(hL([],fL(n),!1),fL(o),!1))];case 1:return i=s.sent(),a=i.filter(hO).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 rb(n,void 0,void 0,function(){var s,c;return nb(this,function(l){switch(l.label){case 0:return s=new pL(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),r!=null&&(c=ma(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 rb(n,void 0,void 0,function(){var s,c;return nb(this,function(l){switch(l.label){case 0:return s=new mL,c=Promise.resolve(i(s)),r!=null&&(c=ma(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&&gO(n.instruments,r)})},t}();var t4=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)}}(),SL=function(t){t4(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 lh(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new ch(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}(sh);var yL=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)}}(),bc=function(){function t(){}return t.Noop=function(){return n4},t}();var r4=function(t){yL(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(bc);var EL=function(t){yL(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}(bc);var n4=new r4;var o4=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())})},i4=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}}},a4=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},TL=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new uL,this.observableRegistry=new gL,this.meter=new aL(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,SL);return r.length===1?r[0]:new dL(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,cL);return r},t.prototype.collect=function(e,r,n){return o4(this,void 0,void 0,function(){var o,i,a;return i4(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(pO),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=EO(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=a4(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),f=u.selectCardinalityLimit(e.type),h=new r(e,m,bc.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var s4=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.")},bL=function(){function t(e){this.resource=e,this.viewRegistry=new QO,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=mO(e),n=this.meterSharedStates.get(r);return n==null&&(n=new TL(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=s4(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 uh=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())})},dh=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}}},l4=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},c4=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))},vL=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return uh(this,void 0,void 0,function(){var r,n,o,i,a=this;return dh(this,function(s){switch(s.label){case 0:return r=xs(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return uh(a,void 0,void 0,function(){var l;return dh(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,c4([],l4(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 uh(this,void 0,void 0,function(){return dh(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 uh(this,void 0,void 0,function(){return dh(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 AL=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())})},CL=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}}},RL=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 u4(t,e){var r=e??oh.empty();return t?oh.default().merge(r):r}var ob=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new bL(u4((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=RL(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=RL(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?(ae.warn("A shutdown MeterProvider cannot provide a Meter"),cT()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new vL(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return AL(this,void 0,void 0,function(){return CL(this,function(r){switch(r.label){case 0:return this._shutdown?(ae.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 AL(this,void 0,void 0,function(){return CL(this,function(r){switch(r.label){case 0:return this._shutdown?(ae.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 d4=/[\^$\\.+?()[\]{}|]/g,ph=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(d4,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var vc=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 wL=function(){function t(e){var r;this._nameFilter=new ph((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new vc(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 xL=function(){function t(e){this._nameFilter=new vc(e?.name),this._versionFilter=new vc(e?.version),this._schemaUrlFilter=new vc(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 p4(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var mh=function(){function t(e){var r;if(p4(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||ph.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 EL(e.attributeKeys):this.attributesProcessor=bc.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:Yn.Default(),this.instrumentSelector=new wL({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new xL({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var BDe=process.env.APP||"unknown";yt();import{v4 as f4}from"uuid";function h4(){return new cO({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Rs.DELTA})}var g4=[new mh({instrumentName:"test_event_duration",instrumentType:Ye.HISTOGRAM,aggregation:new Vd([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new mh({instrumentName:"test_step_duration",instrumentType:Ye.HISTOGRAM,aggregation:new Vd([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],fh=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 xT({[Of]:e.serviceName,[iM]:r,[sM]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:f4()}),o=h4(),i=new JT({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new ob({resource:n,readers:[i],views:g4}),_f.setGlobalMeterProvider(this.provider),this.meter=_f.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Rf(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=Rf(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 Kt=new Cf;function _L(t){t.disabled||(Kt=new fh(t))}var ib=!1;try{let t=await import("@sentry/node");t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",dist:"production",release:"cli-2.78.0",tracesSampleRate:0,sendDefaultPii:!0}),mP(t.captureException),ib=!0}catch{}import{Argument as one,Command as ine,Option as Gr}from"@commander-js/extra-typings";import{execSync as ane}from"child_process";import{existsSync as S4,statSync as y4}from"fs";function IL(t){try{return S4(t)&&y4(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as E4,input as T4}from"@inquirer/prompts";import{existsSync as b4,mkdirSync as v4,statSync as A4}from"fs";import{dirname as C4}from"path";var R4=!1,ML=(()=>{try{return A4("/.dockerenv"),!0}catch{return!1}})();async function Tr(t){return Ts||R4||ML?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await E4({message:t}))}async function ab(t){let e=C4(t);return IL(e)?b4(t)?Tr(`File '${PL(t)}' already exists. Overwrite existing content?`):!0:await Tr(`Directory '${PL(e)}' doesn't exist. Create it now?`)?(v4(e,{recursive:!0}),!0):!1}function PL(t){return t.replace(/(\s+)/g,"\\$1")}async function OL(t,e){return Ts||ML?e:(await T4({message:t,default:e})).trim()||e}import Wo,{supportsColor as x4}from"chalk";import{Console as LL}from"console";import{format as qd}from"util";var sb=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}},hh=class t extends LL{_buffer=[];_groupDepth=0;Console=LL;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new sb(void 0,t.write).stack;if(!i)return e;let a=i.split(`
28
28
  `).slice(o).filter(Boolean).join(`
29
29
  `);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",qd(e,...r))}error(e,...r){this._log("error",qd(e,...r))}info(e,...r){this._log("info",qd(e,...r))}log(e,...r){this._log("log",qd(e,...r))}warn(e,...r){this._log("warn",qd(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function NL(t){let e=globalThis.console,r=new hh;globalThis.console=r;try{t()}finally{let o=r.getBuffer()?.map(i=>i.message).join(`
30
30
  `);process.stderr.write(`${o}
31
31
  `),globalThis.console=e}}var Pt=" ".repeat(6);function DL(t,e="",r=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=t.split(`
32
32
  `),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(`
33
- `)}import{hostname as w4}from"os";var le=sc({app:"cli",hostname:w4(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.77.0"});var _4=5;async function Sh({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>_4&&(v.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(l){i++,le.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 Ac({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 NL(()=>{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 yh=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=Pl[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||$i[t.failureReason],o=t.failureDetails.classification?.rootCause;if(v.error(e),o){v.log(`${Pt}- Error type: ${Wo.dim(r)}`);let i="- Root cause analysis:",a=DL(`${i} ${o}`,`${Pt} `,!1),s=a.indexOf(":");v.log(`${Pt}${i} ${Wo.dim(a.slice(s+1))}`)}else v.log(`${Pt}Reason: ${Wo.red(r)}`),v.log(`${Pt}Description: ${Wo.red(n)}`)},Kd=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Wo.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Wo.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Wo.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Wo.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Wo.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Wo.bgMagenta.white("RUNNING"),a=0):(v.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),x4||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import I4 from"fs";import{platform as P4,tmpdir as M4}from"os";import O4 from"path";import{program as L4}from"playwright-core/lib/cli/program";import{registry as Yd}from"playwright-core/lib/server";import kL from"proper-lockfile";var UL=O4.join(M4(),"momenticBrowserInstallation");var Eh=["chrome","chromium","chrome-for-testing","ffmpeg"],lb=[...Eh.filter(t=>t!=="ffmpeg")],N4={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function FL(t){switch(t){case"chromium":return"Chromium";case"chrome":return"Google Chrome";case"chrome-for-testing":return"Chrome for Testing";case"ffmpeg":throw new Error(`Unknown browser: ${t}`);default:return(r=>{throw new Error("Unknown browser")})(t)}}var BL={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function zL(t){if(t==="Org Default")return!1;let e=BL[N4[t]??""]??"",r=Yd.findExecutable(e);return!r||r.installType==="none"?!1:cb(r)}function cb(t){let e=t.executablePath();return I4.existsSync(e)}function D4(t,e){let r=BL[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=Yd.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&cb(n)))return n}async function k4({browser:t,force:e}){let r=D4(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await Yd.installDeps([r],!1),await Yd.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=Yd.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!cb(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function U4(){if(P4()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await L4.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function HL({rawBrowsers:t,force:e=!1,all:r=!1}){await U4();let n=r?Eh:Array.from(new Set(t));try{await kL.lock(UL,{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 k4({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await kL.unlock(UL,{realpath:!1})}if(o)throw o}import{createServer as F4}from"http";async function GL(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await B4(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function B4(t){return new Promise((e,r)=>{let n=F4();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 z4 from"blocked-at";import H4 from"why-is-node-running";function jL(t){G4(t),j4()}function G4(t){z4((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(`
33
+ `)}import{hostname as w4}from"os";var le=sc({app:"cli",hostname:w4(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.78.0"});var _4=5;async function Sh({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>_4&&(v.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(l){i++,le.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 Ac({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 NL(()=>{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 yh=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=Pl[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||$i[t.failureReason],o=t.failureDetails.classification?.rootCause;if(v.error(e),o){v.log(`${Pt}- Error type: ${Wo.dim(r)}`);let i="- Root cause analysis:",a=DL(`${i} ${o}`,`${Pt} `,!1),s=a.indexOf(":");v.log(`${Pt}${i} ${Wo.dim(a.slice(s+1))}`)}else v.log(`${Pt}Reason: ${Wo.red(r)}`),v.log(`${Pt}Description: ${Wo.red(n)}`)},Kd=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Wo.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Wo.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Wo.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Wo.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Wo.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Wo.bgMagenta.white("RUNNING"),a=0):(v.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),x4||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import I4 from"fs";import{platform as P4,tmpdir as M4}from"os";import O4 from"path";import{program as L4}from"playwright-core/lib/cli/program";import{registry as Yd}from"playwright-core/lib/server";import kL from"proper-lockfile";var UL=O4.join(M4(),"momenticBrowserInstallation");var Eh=["chrome","chromium","chrome-for-testing","ffmpeg"],lb=[...Eh.filter(t=>t!=="ffmpeg")],N4={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function FL(t){switch(t){case"chromium":return"Chromium";case"chrome":return"Google Chrome";case"chrome-for-testing":return"Chrome for Testing";case"ffmpeg":throw new Error(`Unknown browser: ${t}`);default:return(r=>{throw new Error("Unknown browser")})(t)}}var BL={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function zL(t){if(t==="Org Default")return!1;let e=BL[N4[t]??""]??"",r=Yd.findExecutable(e);return!r||r.installType==="none"?!1:cb(r)}function cb(t){let e=t.executablePath();return I4.existsSync(e)}function D4(t,e){let r=BL[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=Yd.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&cb(n)))return n}async function k4({browser:t,force:e}){let r=D4(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await Yd.installDeps([r],!1),await Yd.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=Yd.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!cb(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function U4(){if(P4()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await L4.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function HL({rawBrowsers:t,force:e=!1,all:r=!1}){await U4();let n=r?Eh:Array.from(new Set(t));try{await kL.lock(UL,{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 k4({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await kL.unlock(UL,{realpath:!1})}if(o)throw o}import{createServer as F4}from"http";async function GL(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await B4(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function B4(t){return new Promise((e,r)=>{let n=F4();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 z4 from"blocked-at";import H4 from"why-is-node-running";function jL(t){G4(t),j4()}function G4(t){z4((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(`
34
34
  `);console.warn(n),t.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function j4(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}H4(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function VL(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 V4(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 $L(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?V4(e,r,n,o):e}function Th({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 ub(t,e,r){return t instanceof Za?(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 Cc({parsingErrors:t,parsingErrorDetails:e,failedTestFilePaths:r,failedModuleFilePaths:n}){if(v.error(`
35
35
  Found ${t} file(s) with validation errors that must be fixed manually:
36
36
  `),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:
@@ -58,7 +58,7 @@ ${o}`:o)(Tb(t))}function E3(t,{unflattenedIndex:e,parentStep:r}){if(!(e===void 0
58
58
  ${n}`}function Vh(t,e={}){let{includeCache:r=!0}=e,n=x3(t);return un({steps:n,earlyStop:!1,onPresetAction:(o,i)=>{let a=o;a.parentStepIdChain=i.parentChain.map(l=>l.id),Cb(o);let s;if(r&&Un(o.command)&&o.command.cache!==void 0){let l=I3(o.command.cache);l&&"target"in l&&(s=l.target)}let c=o.command;return s!==void 0?c.cache=s:delete c.cache,c.thoughts&&delete c.thoughts,delete c.id,"index"in o&&delete o.index,!1},onConditional:(o,i)=>{let a=o;return a.parentStepIdChain=i.parentChain.map(s=>s.id),Cb(o),!1},onSimpleStepContainer:(o,i)=>{let a=i.parentChain.map(c=>c.id);if(o.type==="AI_ACTION"){let c=o,l=o.text,u=o.id;return Object.keys(c).forEach(d=>{delete c[d]}),c.type="AI_ACTION_DYNAMIC",c.text=l,c.id=u,c.parentStepIdChain=a,!1}let s=o;if(s.parentStepIdChain=a,Cb(o),o.type==="RESOLVED_MODULE"){let c=o;delete c.cacheConfig,delete c.enabled,delete c.defaultCacheKey,delete c.defaultCacheTtl,delete c.defaultCacheAllInvocations,delete c.autoAuth,delete c.advanced}return!1}}),n}function Cb(t){let e=t;delete e.aiSuggested,delete e.retries,delete e.skipped}function _3(t){return t.selector?t.selector:t.generatedSelectors?.[0]}function Rb(t){let e=_3(t),r=t.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),r&&(n.nodeOnlySerializedHtml=r),Object.keys(n).length?n:void 0}function I3(t){if(!t)return;let e={};if("target"in t)return{target:Rb(t.target)};if("fromTarget"in t||"toTarget"in t){let r=t.fromTarget?Rb(t.fromTarget):void 0,n=t.toTarget?Rb(t.toTarget):void 0;return r&&(e.fromTarget=r),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}import Us from"yaml";import{z as fD}from"zod";import{execSync as P3}from"child_process";function wi(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{P3(n,{encoding:"utf-8"})}catch(o){v.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as dD}from"deep-object-diff";import vo from"fs";import{cloneDeep as M3}from"lodash-es";import ip from"path";import{v4 as O3}from"uuid";import Lc from"yaml";function pD(t,e){let r=Lc.stringify(t);vo.writeFileSync(e,r,"utf-8")}function Qn({content:t,schemaVersion:e,momenticFiles:r,project:n,forceSaveOnNoDiffs:o}){let i=r.modules[t.moduleId]?.fullFilePath;if(!i||!vo.existsSync(i))throw new Error(`Tried to update module ${t.moduleId} that could not be found on disk`);let a=vo.readFileSync(i,"utf-8"),s=Lc.parse(a),c;if(t.name&&t.name!==s.name){let m=`${dt(t.name)}.module.yaml`;if(c=ip.join(ip.dirname(i),m),vo.existsSync(c))throw new Error(`A conflicting file '${t.name}' already exists at path '${c}'`)}let l={...t,schemaVersion:e},u=En({fileType:ye.MODULE,...BE.parse(l),steps:bt.array().parse(t.steps)}),d=dD(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=Lc.stringify(u);vo.writeFileSync(i,p,"utf-8"),c&&vo.renameSync(i,c),wi(c||i,n.config)}function mD({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=xi(i,o),s={...a,...e},c=En({fileType:ye.MODULE,...BE.parse(s),steps:a.steps}),l=dD(c,a);if(l&&Object.keys(l).length===0){v.debug(`Skipping save for module ${t} since there are no changes`);return}let u=Lc.stringify(c);vo.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${dt(e.name)}.module.yaml`;if(d=ip.join(ip.dirname(i),p),vo.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);vo.renameSync(i,d)}wi(d||i,n.config)}async function $h({name:t,description:e,enabled:r,steps:n,folder:o,project:i}){let a=dt(t),s=ip.join(o,`${a}.module.yaml`),c=O3(),{stepsToSave:l}=await Ft({stepLists:{steps:n}}),u={fileType:ye.MODULE,schemaVersion:De,moduleId:c,name:t,description:e,enabled:r,steps:l.steps},d=Lc.stringify(u);return vo.writeFileSync(s,d,"utf-8"),wi(s,i.config),{moduleId:c,name:t,description:e,enabled:r,steps:n}}function xi(t,e){let r=vo.readFileSync(t,"utf-8"),n=Lc.parse(r);try{return AE.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 Ii(t,e,r,n){let o=xi(t.fullFilePath,r),{resolvedSteps:i}=await Uh({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 xi(c,r)}}}),a={...o,steps:i};return n&&(n[t.id]=M3(a)),a}async function Wh(t,e){let r={};return await Promise.all(Object.values(t.modules).map(async n=>{await Ii(n,t,e,r)})),Array.from(Object.values(r))}function hD(t,e){let r=Us.stringify(t);Zn.writeFileSync(e,r,"utf-8")}async function gD({test:t,name:e,folder:r}){let n=await iD({test:t});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${dt(e)}.test.yaml`,a=ks.join(r,i);return Zn.writeFileSync(a,n.test,"utf-8"),a}function wb(t,e,r){let n=ks.join(r.rootDir,t);if(!Zn.existsSync(n))throw new Error(`Test not found at path '${t}' in project '${r.rootDir}'`);let o=Zn.readFileSync(n,"utf-8"),i=Us.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${dt(e.name)}.test.yaml`;if(a=ks.join(ks.dirname(t),p),s=ks.join(r.rootDir,a),Zn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=jn.parse(c),u=En({fileType:ye.TEST,...jn.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0,retries:l.retries??void 0}),d=Us.stringify(u);return Zn.writeFileSync(n,d,"utf-8"),s&&Zn.renameSync(n,s),wi(n,r.config),{newRelativeTestPath:a}}function Tn({relativeTestPath:t,steps:e,schemaVersion:r,project:n,forceSaveOnNoDiffs:o}){let i=ks.join(n.rootDir,t);if(!Zn.existsSync(i))throw new Error(`Test not found at path '${t}' in project '${n.rootDir}'`);let a=Zn.readFileSync(i,"utf-8"),s=Us.parse(a),c=jn.parse({...s,schemaVersion:r}),l=bt.array().or(fD.undefined()).parse(e.beforeSteps),u=bt.array().parse(e.steps),d=bt.array().or(fD.undefined()).parse(e.afterSteps),p=En({fileType:ye.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=L3(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 f=Us.stringify(p);Zn.writeFileSync(i,f,"utf-8"),v.debug(`Saving test ${c.name} to ${i}`),wi(i,n.config)}function ap(t,e){let r=ks.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=Zn.readFileSync(r,"utf8"),n=n.replace(/\r\n|\r/g,`
59
59
  `)}catch(i){throw new Error(`Could not read test file ${r}: ${i}`)}let o;try{o=Us.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return Lr.parse(o)}function Fs(t,e,r){let n=r.project.rootDir,o;try{o=Zn.readFileSync(t,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Us.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${t} is missing steps`);return i}async function Bt(t,e,r){let n=Fs(t,e,r),o;try{o=jn.parse(n)}catch(a){throw new Error(`Test ${t} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await nD({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 xi(c,s)}}});return i}import N3 from"@dotenvx/dotenvx";import D3 from"fs";import SD from"path";function qh(t,e){return(t.config.environments??[]).map(r=>Bs(r.name,t,e))}function yD(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 k3(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=yD(i);s&&(n[o]=s);continue}let a;try{a=D3.readFileSync(SD.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 U3(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=N3.config({path:SD.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 Bs(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={[sr]:yD(n.baseUrl)},i=k3({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=U3({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 B3,readFileSync as z3,readdirSync as H3,writeFileSync as G3}from"fs";import{glob as j3}from"glob";import zs,{dirname as ED}from"path";import{cwd as _b}from"process";import TD from"yaml";import{z as gt}from"zod";import F3 from"zod";var Kh=["**/*.test.yaml","**/*.module.yaml"],xb=F3.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),Yh=15;var Ea="momentic.config.yaml",Ib="momentic.workspace.yaml",V3=gt.object({projects:gt.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),$3=gt.union([gt.string(),gt.object({fromFile:gt.string(),json:gt.boolean().optional()})]),W3=gt.object({name:xb,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(),$3).optional(),inheritFromShell:gt.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:as.optional().describe("NB: most things should use project-level configuration only")}),q3=gt.object({postSave:gt.string().optional()}),K3=gt.object({name:xb,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(W3).optional(),gitMainBranch:gt.string().optional().readonly(),gitProtectedBranches:gt.string().array().optional().readonly(),ai:hi.optional(),browser:as.optional(),emulator:_E.optional(),advanced:Ny.optional(),displayRoot:gt.string().optional().describe("relative path from project root to use as the Repository root"),hooks:q3.optional()});function bD(t,e){let r;try{r=z3(t,"utf-8")}catch(o){v.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=TD.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 Pb(t){let e=bD(t,"project configuration");if(e!==void 0)try{return K3.parse(e)}catch(r){v.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function Y3(t){let e=bD(t,"workspace configuration");if(e!==void 0)try{return V3.parse(e)}catch(r){v.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function X3(){let t=[],e=_b(),r=zs.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=zs.basename(e);if(sf.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 H3(e))if(a.endsWith(Ea)){let s=zs.join(e,a),c=Pb(s);c&&t.push({configFilePath:s,config:c,rootDir:ED(s)})}if(t.length)return t;if(e=zs.dirname(e),e===r)break}return t}async function Ct(t={}){let{configFilePath:e,nameFilter:r,skipExitOnError:n}=t,o=await Mb(e,n);if(r&&(o=o.filter(i=>i.config.name===r)),o.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
60
60
  ${o.map(i=>i.configFilePath)}`);if(o.length===0)throw new Error("No valid Momentic project file available.");return v.debug(`Found valid project configuration at ${o[0].configFilePath}`),o[0]}async function J3(t){let e=Y3(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${Ea}`)),n=AbortSignal.timeout(2e3),o;try{o=await j3(r,{absolute:!1,cwd:_b(),dotRelative:!1,maxDepth:Yh,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 ${Ib} is misconfigured.`),a}let i=[];for(let a of o){let s=zs.join(_b(),a),c=Pb(s);c&&i.push({configFilePath:s,config:c,rootDir:ED(s)})}return i}async function Mb(t,e){if(t){t=zs.resolve(t);let n=Pb(t);return n?[{config:n,configFilePath:t,rootDir:zs.dirname(t)}]:(console.error(`No valid Momentic project file found at ${t}.`),e||process.exit(1),[])}if(B3(Ib)){let n=await J3(Ib);if(n)return n}return X3()}function Ta(t,e){let r=TD.stringify(t);G3(e,r)}import AD from"fs";import{glob as Q3}from"glob";import sp from"path";import Z3 from"yaml";import{z as vD}from"zod";var CD=!1,e5=vD.object({fileType:vD.nativeEnum(ye)});async function fe(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??Kh,o=Array.from(t.config.exclude??[]).concat(lf),i=AbortSignal.timeout(5e3),a;try{a=await Q3(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:Yh,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=t5(t.rootDir,s,r,e?Ho:v);c&&(r.duplicateEntities[c.id]=c.paths)}return CD=!0,r}function t5(t,e,r,n){let o=sp.join(t,e),i=r5(o,n);if(!i)return;let a=n5(i,o,n);if(!a)return;let s=e5.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=o5(o,n);if(!l)return;let u=i5(e,o,l);switch(c){case ye.TEST:try{return a5(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case ye.MODULE:try{return s5(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case ye.MOBILE_TEST:try{return c5(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case ye.MOBILE_MODULE:try{return l5(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 r5(t,e){try{return AD.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function n5(t,e,r){try{let n=Z3.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 o5(t,e){try{return AD.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function i5(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:sp.sep,fullPathSegments:e.split(sp.sep),relativePathSegments:t.split(sp.sep),fileName:sp.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function a5(t,e,r,n,o){let i=jn.parse(t),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:ye.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}function s5(t,e,r,n,o){let i=nn.parse(t),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:ye.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...r};let s=r.fileName.replace(".module.yaml","");return!CD&&dt(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 l5(t,e,r,n,o){let i=Zm.parse(t),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=r.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:ye.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function c5(t,e,r,n,o){let i=IE.parse(t),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=r.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:ye.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import Nc from"fs";import Ob from"path";import{z as Lb}from"zod";var RD="golden/visual-diff",wD="reports",xD="test-results";var u5=Lb.object({width:Lb.number(),height:Lb.number()}),Dc=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=Ob.join(e.rootDir,e.config.goldenFileDir??RD);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(aR(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=Ob.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Nc.mkdirSync(Ob.dirname(o),{recursive:!0}),Nc.writeFileSync(o,n.buffer),Nc.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Nc.existsSync(o)){let a=Nc.readFileSync(o),s=u5.parse(JSON.parse(Nc.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new L("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as d5}from"node:child_process";import{promisify as p5}from"node:util";import m5 from"simple-git";var _D=3e3,mt=m5(),f5=p5(d5);async function eo(t){let{logger:e,operation:r,fn:n,context:o}=t,i=Date.now();try{return await n()}finally{let a=Date.now()-i;a>_D&&!process.env.CI&&e.warn({operation:r,durationMs:a,thresholdMs:_D,...o??{}},"[timing] slow git metadata operation")}}function Pi(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function h5(t){let e=await Et(t,mt.raw(["config","--list"])),r={};if(!e)return r;for(let n of e.split(`
61
- `)){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 g5(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&&e?.startsWith("git@")&&n.includes("github"))try{let{stdout:o,stderr:i}=await f5("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{return}}async function S5(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return g5(t,e,r);if(o)return}catch{}}function Xh(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 y5(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function Et(t,e){try{return(await e).trim()}catch(r){if(y5(r))return;t.error({err:r},"Failed to run git command");return}}function E5(){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 T5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.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?Pi(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 b5(t){let[e,r,n]=await Promise.all([Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.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?Pi(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 v5(t){let[e,r,n,o]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Xh(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?Pi(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 A5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Xh(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?Pi(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 C5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Xh(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?Pi(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 R5(t,e,r){let[n,o,i,a,s,c,l,u,d]=await Promise.all([Et(t,mt.revparse(["HEAD"])),Et(t,mt.revparse(["--short","HEAD"])),Et(t,mt.revparse(["--abbrev-ref","HEAD"])),Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"])),e?Et(t,mt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),h5(t)]),p=u||(e?await Et(t,mt.raw(["merge-base",e,"HEAD"])):void 0),m=p?await Et(t,mt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),S=a?Xh(a):void 0,g=d["user.email"]||void 0,E=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,_=(r?.includeHostingUsername??!0?await S5(t,a,d):void 0)??y??b??void 0;return{ciProvider:"none",gitCommitSha:n,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Pi(s):void 0,gitCommitMessage:c,gitCommitAuthorName:l,gitLocalUsername:_,gitLocalEmail:g,gitLocalName:E,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?Pi(m):void 0,githubRepository:f?S:void 0,gitlabProjectPath:h?S:void 0,pipelineId:void 0}}async function w5(){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 x5(){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:Pi(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:Pi(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 _5(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function Mi(t,e,r){let n=E5();if(!n)return R5(t,e,r);switch(n){case"GithubActions":return T5(t);case"GitlabCI":return b5(t);case"CircleCI":return v5(t);case"Buildkite":return A5(t);case"AzureDevOps":return C5(t);case"GCPCloudBuild":return w5();case"Custom":return x5()}}async function I5(t,e,r,n){let o=n,i=n.gitCommitSha;if(!i)return o;let a=n.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(r,a,i),context:{projectPath:r,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date}}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(r,i),context:{projectPath:r,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message})}catch(s){t.warn({err:s},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName){let s=n.gitBranchName;try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(r,s,i),context:{projectPath:r,branchName:s,gitCommitSha:i}});c.mergedBranch&&(o={...o,mergedGitBranchName:c.mergedBranch})}catch(c){t.warn({err:c},"Failed to get merged branch from Gitlab")}}return o}async function P5(t,e,r,n,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(r,n,s,a),context:{owner:r,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:c.sha,lastCommitOnMainTimestamp:c.committer.date}}catch(c){t.warn({err:c},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(r,n,a),context:{owner:r,repo:n,gitCommitSha:a}});c&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??c.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??c.author.name,gitCommitMessage:i.gitCommitMessage??c.message})}catch(c){t.warn({err:c},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let c=o.gitBranchName;try{let l=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(r,n,c,a),context:{owner:r,repo:n,branchName:c,gitCommitSha:a}});l.mergedBranch&&(i={...i,mergedGitBranchName:l.mergedBranch})}catch(l){t.warn({err:l},"Failed to get merged branch from GitHub")}}return i}async function M5(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await eo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>P5(t,e,n,o,r),context:{githubRepository:r.githubRepository}})}else if(r.gitlabProjectPath){let n=r.gitlabProjectPath;return await eo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>I5(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function cr(t,e,r,n){let o={},i={gitMainBranch:r.config.gitMainBranch};return eo({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([eo({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>_5(r),context:{projectConfigPath:r.configFilePath}}),eo({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await Mi(t,r.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),c={...a,...s};o.gitBranchName=c.gitBranchName,o.githubRepository=c.githubRepository,o.gitlabProjectPath=c.gitlabProjectPath,(!c.lastCommitOnMainSha||!c.lastCommitOnMainTimestamp)&&c.gitBranchName===a.gitMainBranch&&(c.lastCommitOnMainSha=c.gitCommitSha,c.lastCommitOnMainTimestamp=c.gitCommitTimestamp);let l=await eo({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>M5(t,e,c),context:{githubRepository:c.githubRepository,gitlabProjectPath:c.gitlabProjectPath,gitBranchName:c.gitBranchName}});return{...a,...s,...l}},context:o})}async function ID(){try{let t=await mt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function PD(){try{return!!(await mt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as T$e}from"deep-object-diff";import{cloneDeep as v$e}from"lodash-es";import{v4 as U$e}from"uuid";import B$e from"yaml";import tWe from"yaml";import Hs from"zod";var iWe=Hs.discriminatedUnion("platform",[rf.extend({steps:Hs.record(Hs.string(),Hs.unknown()).array()}),nf.extend({steps:Hs.record(Hs.string(),Hs.unknown()).array()})]);import{randomUUID as O5}from"crypto";import ba from"fs";import kc from"path";var OD=new Set([".DS_Store","__MACOSX"]),LD={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 L5(t,e,r){if(LD[r]){let i=LD[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 Nb=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 ND(t,e){try{let r=kc.join(e,"metadata.json");return ic.parse(JSON.parse(ba.readFileSync(r,"utf-8")))}catch{throw new Nb(t,e)}}function DD(t,e,r){let n=O5(),o=t.child({runGroupId:n});ba.rmSync(e,{recursive:!0,force:!0});let i=ba.readdirSync(r).filter(c=>!OD.has(c)).map(c=>kc.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ba.mkdirSync(e,{recursive:!0});let a={...ND(r,i[0]),id:n};for(let c of i){let l=kc.join(c,"runs");if(!ba.existsSync(l))continue;let u=ND(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=L5(a,u,m)}let d=ba.readdirSync(l);for(let p of d){if(OD.has(p))continue;let m=kc.join(l,p),f=kc.join(e,"runs",p);ba.cpSync(m,f,{recursive:!0})}}let s=kc.join(e,"metadata.json");ba.writeFileSync(s,JSON.stringify(a,null,2))}import Ek from"adm-zip";import rv from"fs";import{z as T6}from"zod";var Y="v1",Db="cli",Gs="2.77.0";var N5=9e4,D5=3,k5=1500,U5=15e3,Ao=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function F5(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var kb=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Gs&&(e[ff]=Gs),Db&&(e[fI]=Db),e}async sendRequest(e,r){let{retries:n=D5,requestTimeoutMs:o=N5,initialRetryDelayMs:i=k5,maxRetryDelayMs:a=U5,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 ca),c===0)throw u;let m=l-c,f=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,f))}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 F5(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,f)=>{p[f.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},br=class extends kb{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[mI]:this.mode??""}}};import{createAnthropic as E6}from"@ai-sdk/anthropic";import{InvalidArgumentError as z5}from"@ai-sdk/provider";import{APICallError as _We}from"@ai-sdk/provider";import{APICallError as G5}from"@ai-sdk/provider";import{LoadAPIKeyError as Zh}from"@ai-sdk/provider";import{LoadSettingError as OWe}from"@ai-sdk/provider";import{JSONParseError as ng,TypeValidationError as K5}from"@ai-sdk/provider";import{TypeValidationError as Hb}from"@ai-sdk/provider";import{TypeValidationError as Q5}from"@ai-sdk/provider";var Jh=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 Ub(t){}function kD(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=Ub,onError:r=Ub,onRetry:n=Ub,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let S=a?h.replace(/^\xEF\xBB\xBF/,""):h,[g,E]=B5(`${i}${S}`);for(let y of g)d(y);i=E,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let S=h.indexOf(":");if(S!==-1){let g=h.slice(0,S),E=h[S+1]===" "?2:1,y=h.slice(S+E);p(g,y,h);return}p(h,"",h)}function p(h,S,g){switch(h){case"event":l=S;break;case"data":c=`${c}${S}
61
+ `)){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 g5(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&&e?.startsWith("git@")&&n.includes("github"))try{let{stdout:o,stderr:i}=await f5("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{return}}async function S5(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return g5(t,e,r);if(o)return}catch{}}function Xh(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 y5(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function Et(t,e){try{return(await e).trim()}catch(r){if(y5(r))return;t.error({err:r},"Failed to run git command");return}}function E5(){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 T5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.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?Pi(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 b5(t){let[e,r,n]=await Promise.all([Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.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?Pi(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 v5(t){let[e,r,n,o]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Xh(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?Pi(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 A5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Xh(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?Pi(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 C5(t){let[e,r,n]=await Promise.all([Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Xh(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?Pi(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 R5(t,e,r){let[n,o,i,a,s,c,l,u,d]=await Promise.all([Et(t,mt.revparse(["HEAD"])),Et(t,mt.revparse(["--short","HEAD"])),Et(t,mt.revparse(["--abbrev-ref","HEAD"])),Et(t,mt.listRemote(["--get-url","origin"])),Et(t,mt.show(["--no-patch","--format=%ci"])),Et(t,mt.show(["-s","--pretty=%B"])),Et(t,mt.show(["-s","--pretty=%an"])),e?Et(t,mt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),h5(t)]),p=u||(e?await Et(t,mt.raw(["merge-base",e,"HEAD"])):void 0),m=p?await Et(t,mt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),S=a?Xh(a):void 0,g=d["user.email"]||void 0,E=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,_=(r?.includeHostingUsername??!0?await S5(t,a,d):void 0)??y??b??void 0;return{ciProvider:"none",gitCommitSha:n,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Pi(s):void 0,gitCommitMessage:c,gitCommitAuthorName:l,gitLocalUsername:_,gitLocalEmail:g,gitLocalName:E,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?Pi(m):void 0,githubRepository:f?S:void 0,gitlabProjectPath:h?S:void 0,pipelineId:void 0}}async function w5(){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 x5(){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:Pi(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:Pi(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 _5(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function Mi(t,e,r){let n=E5();if(!n)return R5(t,e,r);switch(n){case"GithubActions":return T5(t);case"GitlabCI":return b5(t);case"CircleCI":return v5(t);case"Buildkite":return A5(t);case"AzureDevOps":return C5(t);case"GCPCloudBuild":return w5();case"Custom":return x5()}}async function I5(t,e,r,n){let o=n,i=n.gitCommitSha;if(!i)return o;let a=n.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>e.getMergeBaseCommitFromGitlab(r,a,i),context:{projectPath:r,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date}}catch(s){t.warn({err:s},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>e.getCommitFromGitlab(r,i),context:{projectPath:r,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message})}catch(s){t.warn({err:s},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName){let s=n.gitBranchName;try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(r,s,i),context:{projectPath:r,branchName:s,gitCommitSha:i}});c.mergedBranch&&(o={...o,mergedGitBranchName:c.mergedBranch})}catch(c){t.warn({err:c},"Failed to get merged branch from Gitlab")}}return o}async function P5(t,e,r,n,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(r,n,s,a),context:{owner:r,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:c.sha,lastCommitOnMainTimestamp:c.committer.date}}catch(c){t.warn({err:c},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let c=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(r,n,a),context:{owner:r,repo:n,gitCommitSha:a}});c&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??c.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??c.author.name,gitCommitMessage:i.gitCommitMessage??c.message})}catch(c){t.warn({err:c},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let c=o.gitBranchName;try{let l=await eo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(r,n,c,a),context:{owner:r,repo:n,branchName:c,gitCommitSha:a}});l.mergedBranch&&(i={...i,mergedGitBranchName:l.mergedBranch})}catch(l){t.warn({err:l},"Failed to get merged branch from GitHub")}}return i}async function M5(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await eo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>P5(t,e,n,o,r),context:{githubRepository:r.githubRepository}})}else if(r.gitlabProjectPath){let n=r.gitlabProjectPath;return await eo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>I5(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function cr(t,e,r,n){let o={},i={gitMainBranch:r.config.gitMainBranch};return eo({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([eo({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>_5(r),context:{projectConfigPath:r.configFilePath}}),eo({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await Mi(t,r.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),c={...a,...s};o.gitBranchName=c.gitBranchName,o.githubRepository=c.githubRepository,o.gitlabProjectPath=c.gitlabProjectPath,(!c.lastCommitOnMainSha||!c.lastCommitOnMainTimestamp)&&c.gitBranchName===a.gitMainBranch&&(c.lastCommitOnMainSha=c.gitCommitSha,c.lastCommitOnMainTimestamp=c.gitCommitTimestamp);let l=await eo({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>M5(t,e,c),context:{githubRepository:c.githubRepository,gitlabProjectPath:c.gitlabProjectPath,gitBranchName:c.gitBranchName}});return{...a,...s,...l}},context:o})}async function ID(){try{let t=await mt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function PD(){try{return!!(await mt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as T$e}from"deep-object-diff";import{cloneDeep as v$e}from"lodash-es";import{v4 as U$e}from"uuid";import B$e from"yaml";import tWe from"yaml";import Hs from"zod";var iWe=Hs.discriminatedUnion("platform",[rf.extend({steps:Hs.record(Hs.string(),Hs.unknown()).array()}),nf.extend({steps:Hs.record(Hs.string(),Hs.unknown()).array()})]);import{randomUUID as O5}from"crypto";import ba from"fs";import kc from"path";var OD=new Set([".DS_Store","__MACOSX"]),LD={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 L5(t,e,r){if(LD[r]){let i=LD[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 Nb=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 ND(t,e){try{let r=kc.join(e,"metadata.json");return ic.parse(JSON.parse(ba.readFileSync(r,"utf-8")))}catch{throw new Nb(t,e)}}function DD(t,e,r){let n=O5(),o=t.child({runGroupId:n});ba.rmSync(e,{recursive:!0,force:!0});let i=ba.readdirSync(r).filter(c=>!OD.has(c)).map(c=>kc.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ba.mkdirSync(e,{recursive:!0});let a={...ND(r,i[0]),id:n};for(let c of i){let l=kc.join(c,"runs");if(!ba.existsSync(l))continue;let u=ND(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=L5(a,u,m)}let d=ba.readdirSync(l);for(let p of d){if(OD.has(p))continue;let m=kc.join(l,p),f=kc.join(e,"runs",p);ba.cpSync(m,f,{recursive:!0})}}let s=kc.join(e,"metadata.json");ba.writeFileSync(s,JSON.stringify(a,null,2))}import Ek from"adm-zip";import rv from"fs";import{z as T6}from"zod";var Y="v1",Db="cli",Gs="2.78.0";var N5=9e4,D5=3,k5=1500,U5=15e3,Ao=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function F5(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var kb=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Gs&&(e[ff]=Gs),Db&&(e[fI]=Db),e}async sendRequest(e,r){let{retries:n=D5,requestTimeoutMs:o=N5,initialRetryDelayMs:i=k5,maxRetryDelayMs:a=U5,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 ca),c===0)throw u;let m=l-c,f=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,f))}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 F5(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,f)=>{p[f.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},br=class extends kb{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[mI]:this.mode??""}}};import{createAnthropic as E6}from"@ai-sdk/anthropic";import{InvalidArgumentError as z5}from"@ai-sdk/provider";import{APICallError as _We}from"@ai-sdk/provider";import{APICallError as G5}from"@ai-sdk/provider";import{LoadAPIKeyError as Zh}from"@ai-sdk/provider";import{LoadSettingError as OWe}from"@ai-sdk/provider";import{JSONParseError as ng,TypeValidationError as K5}from"@ai-sdk/provider";import{TypeValidationError as Hb}from"@ai-sdk/provider";import{TypeValidationError as Q5}from"@ai-sdk/provider";var Jh=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 Ub(t){}function kD(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=Ub,onError:r=Ub,onRetry:n=Ub,onComment:o}=t,i="",a=!0,s,c="",l="";function u(h){let S=a?h.replace(/^\xEF\xBB\xBF/,""):h,[g,E]=B5(`${i}${S}`);for(let y of g)d(y);i=E,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let S=h.indexOf(":");if(S!==-1){let g=h.slice(0,S),E=h[S+1]===" "?2:1,y=h.slice(S+E);p(g,y,h);return}p(h,"",h)}function p(h,S,g){switch(h){case"event":l=S;break;case"data":c=`${c}${S}
62
62
  `;break;case"id":s=S.includes("\0")?void 0:S;break;case"retry":/^\d+$/.test(S)?n(parseInt(S,10)):r(new Jh(`Invalid \`retry\` value: "${S}"`,{type:"invalid-retry",value:S,line:g}));break;default:r(new Jh(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:S,line:g}));break}}function m(){c.length>0&&e({id:s,event:l||void 0,data:c.endsWith(`
63
63
  `)?c.slice(0,-1):c}),s=void 0,c="",l=""}function f(h={}){i&&h.consume&&d(i),a=!0,s=void 0,c="",l="",i=""}return{feed:u,reset:f}}function B5(t){let e=[],r="",n=0;for(;n<t.length;){let o=t.indexOf("\r",n),i=t.indexOf(`
64
64
  `,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]===`
@@ -79,7 +79,7 @@ ${a}
79
79
  ${e}:`]}}function nk({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 ok(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 pJ=Tt(()=>Ee(Ie.object({id:Ie.string().nullish(),created:Ie.number().nullish(),model:Ie.string().nullish(),choices:Ie.array(Ie.object({text:Ie.string(),finish_reason:Ie.string(),logprobs:Ie.object({tokens:Ie.array(Ie.string()),token_logprobs:Ie.array(Ie.number()),top_logprobs:Ie.array(Ie.record(Ie.string(),Ie.number())).nullish()}).nullish()})),usage:Ie.object({prompt_tokens:Ie.number(),completion_tokens:Ie.number(),total_tokens:Ie.number()}).nullish()}))),mJ=Tt(()=>Ee(Ie.union([Ie.object({id:Ie.string().nullish(),created:Ie.number().nullish(),model:Ie.string().nullish(),choices:Ie.array(Ie.object({text:Ie.string(),finish_reason:Ie.string().nullish(),index:Ie.number(),logprobs:Ie.object({tokens:Ie.array(Ie.string()),token_logprobs:Ie.array(Ie.number()),top_logprobs:Ie.array(Ie.record(Ie.string(),Ie.number())).nullish()}).nullish()})),usage:Ie.object({prompt_tokens:Ie.number(),completion_tokens:Ie.number(),total_tokens:Ie.number()}).nullish()}),Qb]))),ik=Tt(()=>Ee(Ko.object({echo:Ko.boolean().optional(),logitBias:Ko.record(Ko.string(),Ko.number()).optional(),suffix:Ko.string().optional(),user:Ko.string().optional(),logprobs:Ko.union([Ko.boolean(),Ko.number()]).optional()}))),fJ=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=[],f={...await Jr({provider:"openai",providerOptions:p,schema:ik}),...await Jr({provider:this.providerOptionsName,providerOptions:p,schema:ik})};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:S}=dJ({prompt:t}),g=[...S??[],...s??[]];return{args:{model:this.modelId,echo:f.echo,logit_bias:f.logitBias,logprobs:f?.logprobs===!0?0:f?.logprobs===!1?void 0:f?.logprobs,suffix:f.suffix,user:f.user,max_tokens:e,temperature:r,top_p:n,frequency_penalty:i,presence_penalty:a,seed:d,prompt:h,stop:g.length>0?g: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 Qr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:vr(this.config.headers(),t.headers),body:o,failedResponseHandler:Yo,successfulResponseHandler:ro(pJ),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:ok(l.finish_reason),request:{body:o},response:{...nk(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 Qr({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:vr(this.config.headers(),t.headers),body:n,failedResponseHandler:Yo,successfulResponseHandler:Fc(mJ),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",...nk(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=ok(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}}}},gJ=Tt(()=>Ee(Yb.object({dimensions:Yb.number().optional(),user:Yb.string().optional()}))),SJ=Tt(()=>Ee(js.object({data:js.array(js.object({embedding:js.array(js.number())})),usage:js.object({prompt_tokens:js.number()}).nullish()}))),yJ=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 hJ({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Jr({provider:"openai",providerOptions:n,schema:gJ}))!=null?o:{},{responseHeaders:a,value:s,rawValue:c}=await Qr({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:vr(this.config.headers(),e),body:{model:this.modelId,input:t,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:Yo,successfulResponseHandler:ro(SJ),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}}}},EJ=Tt(()=>Ee(Ar.object({created:Ar.number().nullish(),data:Ar.array(Ar.object({b64_json:Ar.string(),revised_prompt:Ar.string().nullish()})),background:Ar.string().nullish(),output_format:Ar.string().nullish(),size:Ar.string().nullish(),quality:Ar.string().nullish(),usage:Ar.object({input_tokens:Ar.number().nullish(),output_tokens:Ar.number().nullish(),total_tokens:Ar.number().nullish(),input_tokens_details:Ar.object({image_tokens:Ar.number().nullish(),text_tokens:Ar.number().nullish()}).nullish()}).nullish()}))),TJ={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},bJ=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),vJ=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=TJ[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:f,responseHeaders:h}=await Qr({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:vr(this.config.headers(),a),body:{model:this.modelId,prompt:t,n:e,size:r,...(d=i.openai)!=null?d:{},...bJ.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Yo,successfulResponseHandler:ro(EJ),abortSignal:s,fetch:this.config.fetch});return{images:f.data.map(S=>S.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:h},providerMetadata:{openai:{images:f.data.map(S=>({...S.revised_prompt?{revisedPrompt:S.revised_prompt}:{},...f.created!=null?{created:f.created}:{},...f.size!=null?{size:f.size}:{},...f.quality!=null?{quality:f.quality}:{},...f.background!=null?{background:f.background}:{},...f.output_format!=null?{outputFormat:f.output_format}:{}}))}}}}},AJ=zt(()=>Ee(ur.object({code:ur.string().nullish(),containerId:ur.string()}))),CJ=zt(()=>Ee(ur.object({outputs:ur.array(ur.discriminatedUnion("type",[ur.object({type:ur.literal("logs"),logs:ur.string()}),ur.object({type:ur.literal("image"),url:ur.string()})])).nullish()}))),RJ=zt(()=>Ee(ur.object({container:ur.union([ur.string(),ur.object({fileIds:ur.array(ur.string()).optional()})]).optional()}))),wJ=to({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:AJ,outputSchema:CJ}),xJ=(t={})=>wJ(t),pk=Xe.object({key:Xe.string(),type:Xe.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:Xe.union([Xe.string(),Xe.number(),Xe.boolean(),Xe.array(Xe.string())])}),mk=Xe.object({type:Xe.enum(["and","or"]),filters:Xe.array(Xe.union([pk,Xe.lazy(()=>mk)]))}),_J=zt(()=>Ee(Xe.object({vectorStoreIds:Xe.array(Xe.string()),maxNumResults:Xe.number().optional(),ranking:Xe.object({ranker:Xe.string().optional(),scoreThreshold:Xe.number().optional()}).optional(),filters:Xe.union([pk,mk]).optional()}))),IJ=zt(()=>Ee(Xe.object({queries:Xe.array(Xe.string()),results:Xe.array(Xe.object({attributes:Xe.record(Xe.string(),Xe.unknown()),fileId:Xe.string(),filename:Xe.string(),score:Xe.number(),text:Xe.string()})).nullable()}))),PJ=to({id:"openai.file_search",name:"file_search",inputSchema:Xe.object({}),outputSchema:IJ}),MJ=zt(()=>Ee(kr.object({background:kr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:kr.enum(["low","high"]).optional(),inputImageMask:kr.object({fileId:kr.string().optional(),imageUrl:kr.string().optional()}).optional(),model:kr.string().optional(),moderation:kr.enum(["auto"]).optional(),outputCompression:kr.number().int().min(0).max(100).optional(),outputFormat:kr.enum(["png","jpeg","webp"]).optional(),partialImages:kr.number().int().min(0).max(3).optional(),quality:kr.enum(["auto","low","medium","high"]).optional(),size:kr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),OJ=zt(()=>Ee(kr.object({}))),LJ=zt(()=>Ee(kr.object({result:kr.string()}))),NJ=to({id:"openai.image_generation",name:"image_generation",inputSchema:OJ,outputSchema:LJ}),DJ=(t={})=>NJ(t),fk=zt(()=>Ee(An.object({action:An.object({type:An.literal("exec"),command:An.array(An.string()),timeoutMs:An.number().optional(),user:An.string().optional(),workingDirectory:An.string().optional(),env:An.record(An.string(),An.string()).optional()})}))),hk=zt(()=>Ee(An.object({output:An.string()}))),kJ=to({id:"openai.local_shell",name:"local_shell",inputSchema:fk,outputSchema:hk}),UJ=zt(()=>Ee(st.object({externalWebAccess:st.boolean().optional(),filters:st.object({allowedDomains:st.array(st.string()).optional()}).optional(),searchContextSize:st.enum(["low","medium","high"]).optional(),userLocation:st.object({type:st.literal("approximate"),country:st.string().optional(),city:st.string().optional(),region:st.string().optional(),timezone:st.string().optional()}).optional()}))),FJ=zt(()=>Ee(st.object({}))),BJ=zt(()=>Ee(st.object({action:st.discriminatedUnion("type",[st.object({type:st.literal("search"),query:st.string().optional()}),st.object({type:st.literal("openPage"),url:st.string().nullish()}),st.object({type:st.literal("findInPage"),url:st.string().nullish(),pattern:st.string().nullish()})]),sources:st.array(st.discriminatedUnion("type",[st.object({type:st.literal("url"),url:st.string()}),st.object({type:st.literal("api"),name:st.string()})])).optional()}))),zJ=to({id:"openai.web_search",name:"web_search",inputSchema:FJ,outputSchema:BJ}),HJ=(t={})=>zJ(t),GJ=zt(()=>Ee(Yt.object({searchContextSize:Yt.enum(["low","medium","high"]).optional(),userLocation:Yt.object({type:Yt.literal("approximate"),country:Yt.string().optional(),city:Yt.string().optional(),region:Yt.string().optional(),timezone:Yt.string().optional()}).optional()}))),jJ=zt(()=>Ee(Yt.object({}))),VJ=zt(()=>Ee(Yt.object({action:Yt.discriminatedUnion("type",[Yt.object({type:Yt.literal("search"),query:Yt.string().optional()}),Yt.object({type:Yt.literal("openPage"),url:Yt.string().nullish()}),Yt.object({type:Yt.literal("findInPage"),url:Yt.string().nullish(),pattern:Yt.string().nullish()})])}))),$J=to({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:jJ,outputSchema:VJ}),WJ={codeInterpreter:xJ,fileSearch:PJ,imageGeneration:DJ,localShell:kJ,webSearchPreview:$J,webSearch:HJ};function ak(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function YJ({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,f)=>{var h,S,g;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let E=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&ak(m.data,r)?{file_id:m.data}:{image_url:`data:${E};base64,${va(m.data)}`},detail:(S=(h=m.providerOptions)==null?void 0:h.openai)==null?void 0:S.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"&&ak(m.data,r)?{file_id:m.data}:{filename:(g=m.filename)!=null?g:`part-${f}.pdf`,file_data:`data:application/pdf;base64,${va(m.data)}`}};throw new KJ({functionality:`file part media type ${m.mediaType}`})}}})});break}case"assistant":{let m={},f={};for(let h of p)switch(h.type){case"text":{let S=(a=(i=h.providerOptions)==null?void 0:i.openai)==null?void 0:a.itemId;if(n&&S!=null){l.push({type:"item_reference",id:S});break}l.push({role:"assistant",content:[{type:"output_text",text:h.text}],id:S});break}case"tool-call":{if(f[h.toolCallId]=h,h.providerExecuted)break;let S=(c=(s=h.providerOptions)==null?void 0:s.openai)==null?void 0:c.itemId;if(n&&S!=null){l.push({type:"item_reference",id:S});break}if(o&&h.toolName==="local_shell"){let g=await qo({value:h.input,schema:fk});l.push({type:"local_shell_call",call_id:h.toolCallId,id:S,action:{type:"exec",command:g.action.command,timeout_ms:g.action.timeoutMs,user:g.action.user,working_directory:g.action.workingDirectory,env:g.action.env}});break}l.push({type:"function_call",call_id:h.toolCallId,name:h.toolName,arguments:JSON.stringify(h.input),id:S});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 S=await Jr({provider:"openai",providerOptions:h.providerOptions,schema:XJ}),g=S?.itemId;if(g!=null){let E=m[g];if(n)E===void 0&&(l.push({type:"item_reference",id:g}),m[g]={type:"reasoning",id:g,summary:[]});else{let y=[];h.text.length>0?y.push({type:"summary_text",text:h.text}):E!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),E===void 0?(m[g]={type:"reasoning",id:g,encrypted_content:S?.reasoningEncryptedContent,summary:y},l.push(m[g])):(E.summary.push(...y),S?.reasoningEncryptedContent!=null&&(E.encrypted_content=S.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 f=m.output;if(o&&m.toolName==="local_shell"&&f.type==="json"){let S=await qo({value:f.value,schema:hk});l.push({type:"local_shell_call_output",call_id:m.toolCallId,output:S.output});break}let h;switch(f.type){case"text":case"error-text":h=f.value;break;case"json":case"error-json":h=JSON.stringify(f.value);break;case"content":h=f.value.map(S=>{switch(S.type){case"text":return{type:"input_text",text:S.text};case"media":return S.mediaType.startsWith("image/")?{type:"input_image",image_url:`data:${S.mediaType};base64,${S.data}`}:{type:"input_file",filename:"data",file_data:`data:${S.mediaType};base64,${S.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 XJ=Xb.object({itemId:Xb.string().nullish(),reasoningEncryptedContent:Xb.string().nullish()});function sk({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 JJ=Tt(()=>Ee(T.union([T.object({type:T.literal("response.output_text.delta"),item_id:T.string(),delta:T.string(),logprobs:T.array(T.object({token:T.string(),logprob:T.number(),top_logprobs:T.array(T.object({token:T.string(),logprob:T.number()}))})).nullish()}),T.object({type:T.enum(["response.completed","response.incomplete"]),response:T.object({incomplete_details:T.object({reason:T.string()}).nullish(),usage:T.object({input_tokens:T.number(),input_tokens_details:T.object({cached_tokens:T.number().nullish()}).nullish(),output_tokens:T.number(),output_tokens_details:T.object({reasoning_tokens:T.number().nullish()}).nullish()}),service_tier:T.string().nullish()})}),T.object({type:T.literal("response.created"),response:T.object({id:T.string(),created_at:T.number(),model:T.string(),service_tier:T.string().nullish()})}),T.object({type:T.literal("response.output_item.added"),output_index:T.number(),item:T.discriminatedUnion("type",[T.object({type:T.literal("message"),id:T.string()}),T.object({type:T.literal("reasoning"),id:T.string(),encrypted_content:T.string().nullish()}),T.object({type:T.literal("function_call"),id:T.string(),call_id:T.string(),name:T.string(),arguments:T.string()}),T.object({type:T.literal("web_search_call"),id:T.string(),status:T.string()}),T.object({type:T.literal("computer_call"),id:T.string(),status:T.string()}),T.object({type:T.literal("file_search_call"),id:T.string()}),T.object({type:T.literal("image_generation_call"),id:T.string()}),T.object({type:T.literal("code_interpreter_call"),id:T.string(),container_id:T.string(),code:T.string().nullable(),outputs:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("logs"),logs:T.string()}),T.object({type:T.literal("image"),url:T.string()})])).nullable(),status:T.string()})])}),T.object({type:T.literal("response.output_item.done"),output_index:T.number(),item:T.discriminatedUnion("type",[T.object({type:T.literal("message"),id:T.string()}),T.object({type:T.literal("reasoning"),id:T.string(),encrypted_content:T.string().nullish()}),T.object({type:T.literal("function_call"),id:T.string(),call_id:T.string(),name:T.string(),arguments:T.string(),status:T.literal("completed")}),T.object({type:T.literal("code_interpreter_call"),id:T.string(),code:T.string().nullable(),container_id:T.string(),outputs:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("logs"),logs:T.string()}),T.object({type:T.literal("image"),url:T.string()})])).nullable()}),T.object({type:T.literal("image_generation_call"),id:T.string(),result:T.string()}),T.object({type:T.literal("web_search_call"),id:T.string(),status:T.string(),action:T.discriminatedUnion("type",[T.object({type:T.literal("search"),query:T.string().nullish(),sources:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("url"),url:T.string()}),T.object({type:T.literal("api"),name:T.string()})])).nullish()}),T.object({type:T.literal("open_page"),url:T.string().nullish()}),T.object({type:T.literal("find_in_page"),url:T.string().nullish(),pattern:T.string().nullish()})])}),T.object({type:T.literal("file_search_call"),id:T.string(),queries:T.array(T.string()),results:T.array(T.object({attributes:T.record(T.string(),T.unknown()),file_id:T.string(),filename:T.string(),score:T.number(),text:T.string()})).nullish()}),T.object({type:T.literal("local_shell_call"),id:T.string(),call_id:T.string(),action:T.object({type:T.literal("exec"),command:T.array(T.string()),timeout_ms:T.number().optional(),user:T.string().optional(),working_directory:T.string().optional(),env:T.record(T.string(),T.string()).optional()})}),T.object({type:T.literal("computer_call"),id:T.string(),status:T.literal("completed")})])}),T.object({type:T.literal("response.function_call_arguments.delta"),item_id:T.string(),output_index:T.number(),delta:T.string()}),T.object({type:T.literal("response.image_generation_call.partial_image"),item_id:T.string(),output_index:T.number(),partial_image_b64:T.string()}),T.object({type:T.literal("response.code_interpreter_call_code.delta"),item_id:T.string(),output_index:T.number(),delta:T.string()}),T.object({type:T.literal("response.code_interpreter_call_code.done"),item_id:T.string(),output_index:T.number(),code:T.string()}),T.object({type:T.literal("response.output_text.annotation.added"),annotation:T.discriminatedUnion("type",[T.object({type:T.literal("url_citation"),start_index:T.number(),end_index:T.number(),url:T.string(),title:T.string()}),T.object({type:T.literal("file_citation"),file_id:T.string(),filename:T.string().nullish(),index:T.number().nullish(),start_index:T.number().nullish(),end_index:T.number().nullish(),quote:T.string().nullish()})])}),T.object({type:T.literal("response.reasoning_summary_part.added"),item_id:T.string(),summary_index:T.number()}),T.object({type:T.literal("response.reasoning_summary_text.delta"),item_id:T.string(),summary_index:T.number(),delta:T.string()}),T.object({type:T.literal("response.reasoning_summary_part.done"),item_id:T.string(),summary_index:T.number()}),T.object({type:T.literal("error"),sequence_number:T.number(),error:T.object({type:T.string(),code:T.string(),message:T.string(),param:T.string().nullish()})}),T.object({type:T.string()}).loose().transform(t=>({type:"unknown_chunk",message:t.type}))]))),QJ=Tt(()=>Ee(T.object({id:T.string().optional(),created_at:T.number().optional(),error:T.object({message:T.string(),type:T.string(),param:T.string().nullish(),code:T.string()}).nullish(),model:T.string().optional(),output:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("message"),role:T.literal("assistant"),id:T.string(),content:T.array(T.object({type:T.literal("output_text"),text:T.string(),logprobs:T.array(T.object({token:T.string(),logprob:T.number(),top_logprobs:T.array(T.object({token:T.string(),logprob:T.number()}))})).nullish(),annotations:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("url_citation"),start_index:T.number(),end_index:T.number(),url:T.string(),title:T.string()}),T.object({type:T.literal("file_citation"),file_id:T.string(),filename:T.string().nullish(),index:T.number().nullish(),start_index:T.number().nullish(),end_index:T.number().nullish(),quote:T.string().nullish()}),T.object({type:T.literal("container_file_citation"),container_id:T.string(),file_id:T.string(),filename:T.string().nullish(),start_index:T.number().nullish(),end_index:T.number().nullish(),index:T.number().nullish()}),T.object({type:T.literal("file_path"),file_id:T.string(),index:T.number().nullish()})]))}))}),T.object({type:T.literal("web_search_call"),id:T.string(),status:T.string(),action:T.discriminatedUnion("type",[T.object({type:T.literal("search"),query:T.string().nullish(),sources:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("url"),url:T.string()}),T.object({type:T.literal("api"),name:T.string()})])).nullish()}),T.object({type:T.literal("open_page"),url:T.string().nullish()}),T.object({type:T.literal("find_in_page"),url:T.string().nullish(),pattern:T.string().nullish()})])}),T.object({type:T.literal("file_search_call"),id:T.string(),queries:T.array(T.string()),results:T.array(T.object({attributes:T.record(T.string(),T.union([T.string(),T.number(),T.boolean()])),file_id:T.string(),filename:T.string(),score:T.number(),text:T.string()})).nullish()}),T.object({type:T.literal("code_interpreter_call"),id:T.string(),code:T.string().nullable(),container_id:T.string(),outputs:T.array(T.discriminatedUnion("type",[T.object({type:T.literal("logs"),logs:T.string()}),T.object({type:T.literal("image"),url:T.string()})])).nullable()}),T.object({type:T.literal("image_generation_call"),id:T.string(),result:T.string()}),T.object({type:T.literal("local_shell_call"),id:T.string(),call_id:T.string(),action:T.object({type:T.literal("exec"),command:T.array(T.string()),timeout_ms:T.number().optional(),user:T.string().optional(),working_directory:T.string().optional(),env:T.record(T.string(),T.string()).optional()})}),T.object({type:T.literal("function_call"),call_id:T.string(),name:T.string(),arguments:T.string(),id:T.string()}),T.object({type:T.literal("computer_call"),id:T.string(),status:T.string().optional()}),T.object({type:T.literal("reasoning"),id:T.string(),encrypted_content:T.string().nullish(),summary:T.array(T.object({type:T.literal("summary_text"),text:T.string()}))})])).optional(),service_tier:T.string().nullish(),incomplete_details:T.object({reason:T.string()}).nullish(),usage:T.object({input_tokens:T.number(),input_tokens_details:T.object({cached_tokens:T.number().nullish()}).nullish(),output_tokens:T.number(),output_tokens_details:T.object({reasoning_tokens:T.number().nullish()}).nullish()}).optional()}))),gk=20,ZJ=["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"],Bqe=["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",...ZJ],e6=Tt(()=>Ee(Nt.object({conversation:Nt.string().nullish(),include:Nt.array(Nt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Nt.string().nullish(),logprobs:Nt.union([Nt.boolean(),Nt.number().min(1).max(gk)]).optional(),maxToolCalls:Nt.number().nullish(),metadata:Nt.any().nullish(),parallelToolCalls:Nt.boolean().nullish(),previousResponseId:Nt.string().nullish(),promptCacheKey:Nt.string().nullish(),promptCacheRetention:Nt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Nt.string().nullish(),reasoningSummary:Nt.string().nullish(),safetyIdentifier:Nt.string().nullish(),serviceTier:Nt.enum(["auto","flex","priority","default"]).nullish(),store:Nt.boolean().nullish(),strictJsonSchema:Nt.boolean().nullish(),textVerbosity:Nt.enum(["low","medium","high"]).nullish(),truncation:Nt.enum(["auto","disabled"]).nullish(),user:Nt.string().nullish()})));async function r6({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 qo({value:a.args,schema:_J});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 qo({value:a.args,schema:GJ});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await qo({value:a.args,schema:UJ});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 qo({value:a.args,schema:RJ});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 qo({value:a.args,schema:MJ});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 t6({functionality:`tool choice type: ${a}`})}}}var n6=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,f,h,S;let g=[],E=dk(this.modelId);o!=null&&g.push({type:"unsupported-setting",setting:"topK"}),s!=null&&g.push({type:"unsupported-setting",setting:"seed"}),i!=null&&g.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&g.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&g.push({type:"unsupported-setting",setting:"stopSequences"});let y=await Jr({provider:"openai",providerOptions:l,schema:e6});y?.conversation&&y?.previousResponseId&&g.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:b,warnings:R}=await YJ({prompt:c,systemMessageMode:E.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=y?.store)!=null?m:!0,hasLocalShellTool:O("openai.local_shell")});g.push(...R);let I=(f=y?.strictJsonSchema)!=null?f:!1,_=y?.include;function A(K){_==null?_=[K]:_.includes(K)||(_=[..._,K])}function O(K){return u?.find(X=>X.type==="provider-defined"&&X.id===K)!=null}let P=typeof y?.logprobs=="number"?y?.logprobs:y?.logprobs===!0?gk:void 0;P&&A("message.output_text.logprobs");let F=(h=u?.find(K=>K.type==="provider-defined"&&(K.id==="openai.web_search"||K.id==="openai.web_search_preview")))==null?void 0:h.name;F&&A("web_search_call.action.sources"),O("openai.code_interpreter")&&A("code_interpreter_call.outputs");let D=y?.store;D===!1&&E.isReasoningModel&&A("reasoning.encrypted_content");let z={model:this.modelId,input:b,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:(S=p.name)!=null?S:"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:D,user:y?.user,instructions:y?.instructions,service_tier:y?.serviceTier,include:_,prompt_cache_key:y?.promptCacheKey,prompt_cache_retention:y?.promptCacheRetention,safety_identifier:y?.safetyIdentifier,top_logprobs:P,truncation:y?.truncation,...E.isReasoningModel&&(y?.reasoningEffort!=null||y?.reasoningSummary!=null)&&{reasoning:{...y?.reasoningEffort!=null&&{effort:y.reasoningEffort},...y?.reasoningSummary!=null&&{summary:y.reasoningSummary}}}};E.isReasoningModel?y?.reasoningEffort==="none"&&E.supportsNonReasoningParameters||(z.temperature!=null&&(z.temperature=void 0,g.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),z.top_p!=null&&(z.top_p=void 0,g.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(y?.reasoningEffort!=null&&g.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),y?.reasoningSummary!=null&&g.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),y?.serviceTier==="flex"&&!E.supportsFlexProcessing&&(g.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete z.service_tier),y?.serviceTier==="priority"&&!E.supportsPriorityProcessing&&(g.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 z.service_tier);let{tools:H,toolChoice:ie,toolWarnings:$}=await r6({tools:u,toolChoice:d,strictJsonSchema:I});return{webSearchToolName:F,args:{...z,tools:H,tool_choice:ie},warnings:[...g,...$],store:D}}async doGenerate(t){var e,r,n,o,i,a,s,c,l,u,d,p,m,f,h,S,g,E,y,b,R,I,_,A,O,P,F,D;let{args:z,warnings:H,webSearchToolName:ie}=await this.getArgs(t),$=this.config.url({path:"/responses",modelId:this.modelId}),K=this.config.provider.replace(".responses",""),{responseHeaders:X,value:oe,rawValue:pe}=await Qr({url:$,headers:vr(this.config.headers(),t.headers),body:z,failedResponseHandler:Yo,successfulResponseHandler:ro(QJ),abortSignal:t.abortSignal,fetch:this.config.fetch});if(oe.error)throw new qJ({message:oe.error.message,url:$,requestBodyValues:z,statusCode:400,responseHeaders:X,responseBody:pe,isRetryable:!1});let Te=[],te=[],be=!1;for(let x of oe.output)switch(x.type){case"reasoning":{x.summary.length===0&&x.summary.push({type:"summary_text",text:""});for(let se of x.summary)Te.push({type:"reasoning",text:se.text,providerMetadata:{[K]:{itemId:x.id,reasoningEncryptedContent:(e=x.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{Te.push({type:"tool-call",toolCallId:x.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),Te.push({type:"tool-result",toolCallId:x.id,toolName:"image_generation",result:{result:x.result},providerExecuted:!0});break}case"local_shell_call":{Te.push({type:"tool-call",toolCallId:x.call_id,toolName:"local_shell",input:JSON.stringify({action:x.action}),providerMetadata:{[K]:{itemId:x.id}}});break}case"message":{for(let se of x.content){(n=(r=t.providerOptions)==null?void 0:r.openai)!=null&&n.logprobs&&se.logprobs&&te.push(se.logprobs),Te.push({type:"text",text:se.text,providerMetadata:{[K]:{itemId:x.id}}});for(let Ae of se.annotations)Ae.type==="url_citation"?Te.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:vn(),url:Ae.url,title:Ae.title}):Ae.type==="file_citation"?Te.push({type:"source",sourceType:"document",id:(l=(c=(s=this.config).generateId)==null?void 0:c.call(s))!=null?l:vn(),mediaType:"text/plain",title:(d=(u=Ae.quote)!=null?u:Ae.filename)!=null?d:"Document",filename:(p=Ae.filename)!=null?p:Ae.file_id,...Ae.file_id?{providerMetadata:{[K]:{fileId:Ae.file_id}}}:{}}):Ae.type==="container_file_citation"?Te.push({type:"source",sourceType:"document",id:(h=(f=(m=this.config).generateId)==null?void 0:f.call(m))!=null?h:vn(),mediaType:"text/plain",title:(g=(S=Ae.filename)!=null?S:Ae.file_id)!=null?g:"Document",filename:(E=Ae.filename)!=null?E:Ae.file_id,providerMetadata:{[K]:{fileId:Ae.file_id,containerId:Ae.container_id,...Ae.index!=null?{index:Ae.index}:{}}}}):Ae.type==="file_path"&&Te.push({type:"source",sourceType:"document",id:(R=(b=(y=this.config).generateId)==null?void 0:b.call(y))!=null?R:vn(),mediaType:"application/octet-stream",title:Ae.file_id,filename:Ae.file_id,providerMetadata:{[K]:{fileId:Ae.file_id,...Ae.index!=null?{index:Ae.index}:{}}}})}break}case"function_call":{be=!0,Te.push({type:"tool-call",toolCallId:x.call_id,toolName:x.name,input:x.arguments,providerMetadata:{[K]:{itemId:x.id}}});break}case"web_search_call":{Te.push({type:"tool-call",toolCallId:x.id,toolName:ie??"web_search",input:JSON.stringify({}),providerExecuted:!0}),Te.push({type:"tool-result",toolCallId:x.id,toolName:ie??"web_search",result:ck(x.action),providerExecuted:!0});break}case"computer_call":{Te.push({type:"tool-call",toolCallId:x.id,toolName:"computer_use",input:"",providerExecuted:!0}),Te.push({type:"tool-result",toolCallId:x.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:x.status||"completed"},providerExecuted:!0});break}case"file_search_call":{Te.push({type:"tool-call",toolCallId:x.id,toolName:"file_search",input:"{}",providerExecuted:!0}),Te.push({type:"tool-result",toolCallId:x.id,toolName:"file_search",result:{queries:x.queries,results:(_=(I=x.results)==null?void 0:I.map(se=>({attributes:se.attributes,fileId:se.file_id,filename:se.filename,score:se.score,text:se.text})))!=null?_:null},providerExecuted:!0});break}case"code_interpreter_call":{Te.push({type:"tool-call",toolCallId:x.id,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:x.container_id}),providerExecuted:!0}),Te.push({type:"tool-result",toolCallId:x.id,toolName:"code_interpreter",result:{outputs:x.outputs},providerExecuted:!0});break}}let Pe={[K]:{...oe.id!=null?{responseId:oe.id}:{}}};te.length>0&&(Pe[K].logprobs=te),typeof oe.service_tier=="string"&&(Pe[K].serviceTier=oe.service_tier);let ve=oe.usage;return{content:Te,finishReason:sk({finishReason:(A=oe.incomplete_details)==null?void 0:A.reason,hasFunctionCall:be}),usage:{inputTokens:ve.input_tokens,outputTokens:ve.output_tokens,totalTokens:ve.input_tokens+ve.output_tokens,reasoningTokens:(P=(O=ve.output_tokens_details)==null?void 0:O.reasoning_tokens)!=null?P:void 0,cachedInputTokens:(D=(F=ve.input_tokens_details)==null?void 0:F.cached_tokens)!=null?D:void 0},request:{body:z},response:{id:oe.id,timestamp:new Date(oe.created_at*1e3),modelId:oe.model,headers:X,body:pe},providerMetadata:Pe,warnings:H}}async doStream(t){let{args:e,warnings:r,webSearchToolName:n,store:o}=await this.getArgs(t),{responseHeaders:i,value:a}=await Qr({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:vr(this.config.headers(),t.headers),body:{...e,stream:!0},failedResponseHandler:Yo,successfulResponseHandler:Fc(JJ),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={},f=[],h=!1,S={},g;return{stream:a.pipeThrough(new TransformStream({start(E){E.enqueue({type:"stream-start",warnings:r})},transform(E,y){var b,R,I,_,A,O,P,F,D,z,H,ie,$,K,X,oe,pe,Te,te,be,Pe,ve;if(t.includeRawChunks&&y.enqueue({type:"raw",rawValue:E.rawValue}),!E.success){l="error",y.enqueue({type:"error",error:E.error});return}let x=E.value;if(lk(x))x.item.type==="function_call"?(m[x.output_index]={toolName:x.item.name,toolCallId:x.item.call_id},y.enqueue({type:"tool-input-start",id:x.item.call_id,toolName:x.item.name})):x.item.type==="web_search_call"?(m[x.output_index]={toolName:n??"web_search",toolCallId:x.item.id},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:n??"web_search",providerExecuted:!0}),y.enqueue({type:"tool-input-end",id:x.item.id}),y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):x.item.type==="computer_call"?(m[x.output_index]={toolName:"computer_use",toolCallId:x.item.id},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:"computer_use",providerExecuted:!0})):x.item.type==="code_interpreter_call"?(m[x.output_index]={toolName:"code_interpreter",toolCallId:x.item.id,codeInterpreter:{containerId:x.item.container_id}},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:"code_interpreter",providerExecuted:!0}),y.enqueue({type:"tool-input-delta",id:x.item.id,delta:`{"containerId":"${x.item.container_id}","code":"`})):x.item.type==="file_search_call"?y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):x.item.type==="image_generation_call"?y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):x.item.type==="message"?(f.splice(0,f.length),y.enqueue({type:"text-start",id:x.item.id,providerMetadata:{[c]:{itemId:x.item.id}}})):lk(x)&&x.item.type==="reasoning"&&(S[x.item.id]={encryptedContent:x.item.encrypted_content,summaryParts:{0:"active"}},y.enqueue({type:"reasoning-start",id:`${x.item.id}:0`,providerMetadata:{[c]:{itemId:x.item.id,reasoningEncryptedContent:(b=x.item.encrypted_content)!=null?b:null}}}));else if(i6(x)){if(x.item.type==="message")y.enqueue({type:"text-end",id:x.item.id,providerMetadata:{[c]:{itemId:x.item.id,...f.length>0&&{annotations:f}}}});else if(x.item.type==="function_call")m[x.output_index]=void 0,h=!0,y.enqueue({type:"tool-input-end",id:x.item.call_id}),y.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:x.item.name,input:x.item.arguments,providerMetadata:{[c]:{itemId:x.item.id}}});else if(x.item.type==="web_search_call")m[x.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:n??"web_search",result:ck(x.item.action),providerExecuted:!0});else if(x.item.type==="computer_call")m[x.output_index]=void 0,y.enqueue({type:"tool-input-end",id:x.item.id}),y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:x.item.status||"completed"},providerExecuted:!0});else if(x.item.type==="file_search_call")m[x.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"file_search",result:{queries:x.item.queries,results:(I=(R=x.item.results)==null?void 0:R.map(se=>({attributes:se.attributes,fileId:se.file_id,filename:se.filename,score:se.score,text:se.text})))!=null?I:null},providerExecuted:!0});else if(x.item.type==="code_interpreter_call")m[x.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"code_interpreter",result:{outputs:x.item.outputs},providerExecuted:!0});else if(x.item.type==="image_generation_call")y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"image_generation",result:{result:x.item.result},providerExecuted:!0});else if(x.item.type==="local_shell_call")m[x.output_index]=void 0,y.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:x.item.action.command,timeoutMs:x.item.action.timeout_ms,user:x.item.action.user,workingDirectory:x.item.action.working_directory,env:x.item.action.env}}),providerMetadata:{[c]:{itemId:x.item.id}}});else if(x.item.type==="reasoning"){let se=S[x.item.id],Ae=Object.entries(se.summaryParts).filter(([mn,Po])=>Po==="active"||Po==="can-conclude").map(([mn])=>mn);for(let mn of Ae)y.enqueue({type:"reasoning-end",id:`${x.item.id}:${mn}`,providerMetadata:{[c]:{itemId:x.item.id,reasoningEncryptedContent:(_=x.item.encrypted_content)!=null?_:null}}});delete S[x.item.id]}}else if(l6(x)){let se=m[x.output_index];se!=null&&y.enqueue({type:"tool-input-delta",id:se.toolCallId,delta:x.delta})}else if(c6(x)){let se=m[x.output_index];se!=null&&y.enqueue({type:"tool-input-delta",id:se.toolCallId,delta:JSON.stringify(x.delta).slice(1,-1)})}else if(u6(x)){let se=m[x.output_index];se!=null&&(y.enqueue({type:"tool-input-delta",id:se.toolCallId,delta:'"}'}),y.enqueue({type:"tool-input-end",id:se.toolCallId}),y.enqueue({type:"tool-call",toolCallId:se.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:se.codeInterpreter.containerId}),providerExecuted:!0}))}else if(s6(x))p=x.response.id,y.enqueue({type:"response-metadata",id:x.response.id,timestamp:new Date(x.response.created_at*1e3),modelId:x.response.model});else if(o6(x))y.enqueue({type:"text-delta",id:x.item_id,delta:x.delta}),(O=(A=t.providerOptions)==null?void 0:A.openai)!=null&&O.logprobs&&x.logprobs&&d.push(x.logprobs);else if(x.type==="response.reasoning_summary_part.added"){if(x.summary_index>0){let se=S[x.item_id];se.summaryParts[x.summary_index]="active";for(let Ae of Object.keys(se.summaryParts))se.summaryParts[Ae]==="can-conclude"&&(y.enqueue({type:"reasoning-end",id:`${x.item_id}:${Ae}`,providerMetadata:{[c]:{itemId:x.item_id}}}),se.summaryParts[Ae]="concluded");y.enqueue({type:"reasoning-start",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[c]:{itemId:x.item_id,reasoningEncryptedContent:(F=(P=S[x.item_id])==null?void 0:P.encryptedContent)!=null?F:null}}})}}else x.type==="response.reasoning_summary_text.delta"?y.enqueue({type:"reasoning-delta",id:`${x.item_id}:${x.summary_index}`,delta:x.delta,providerMetadata:{[c]:{itemId:x.item_id}}}):x.type==="response.reasoning_summary_part.done"?o?(y.enqueue({type:"reasoning-end",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[c]:{itemId:x.item_id}}}),S[x.item_id].summaryParts[x.summary_index]="concluded"):S[x.item_id].summaryParts[x.summary_index]="can-conclude":a6(x)?(l=sk({finishReason:(D=x.response.incomplete_details)==null?void 0:D.reason,hasFunctionCall:h}),u.inputTokens=x.response.usage.input_tokens,u.outputTokens=x.response.usage.output_tokens,u.totalTokens=x.response.usage.input_tokens+x.response.usage.output_tokens,u.reasoningTokens=(H=(z=x.response.usage.output_tokens_details)==null?void 0:z.reasoning_tokens)!=null?H:void 0,u.cachedInputTokens=($=(ie=x.response.usage.input_tokens_details)==null?void 0:ie.cached_tokens)!=null?$:void 0,typeof x.response.service_tier=="string"&&(g=x.response.service_tier)):d6(x)?(f.push(x.annotation),x.annotation.type==="url_citation"?y.enqueue({type:"source",sourceType:"url",id:(oe=(X=(K=s.config).generateId)==null?void 0:X.call(K))!=null?oe:vn(),url:x.annotation.url,title:x.annotation.title}):x.annotation.type==="file_citation"&&y.enqueue({type:"source",sourceType:"document",id:(te=(Te=(pe=s.config).generateId)==null?void 0:Te.call(pe))!=null?te:vn(),mediaType:"text/plain",title:(Pe=(be=x.annotation.quote)!=null?be:x.annotation.filename)!=null?Pe:"Document",filename:(ve=x.annotation.filename)!=null?ve:x.annotation.file_id,...x.annotation.file_id?{providerMetadata:{[c]:{fileId:x.annotation.file_id}}}:{}})):p6(x)&&y.enqueue({type:"error",error:x})},flush(E){let y={[c]:{responseId:p}};d.length>0&&(y[c].logprobs=d),g!==void 0&&(y[c].serviceTier=g),E.enqueue({type:"finish",finishReason:l,usage:u,providerMetadata:y})}})),request:{body:e},response:{headers:i}}}};function o6(t){return t.type==="response.output_text.delta"}function i6(t){return t.type==="response.output_item.done"}function a6(t){return t.type==="response.completed"||t.type==="response.incomplete"}function s6(t){return t.type==="response.created"}function l6(t){return t.type==="response.function_call_arguments.delta"}function c6(t){return t.type==="response.code_interpreter_call_code.delta"}function u6(t){return t.type==="response.code_interpreter_call_code.done"}function lk(t){return t.type==="response.output_item.added"}function d6(t){return t.type==="response.output_text.annotation.added"}function p6(t){return t.type==="error"}function ck(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 m6=Tt(()=>Ee(Jb.object({instructions:Jb.string().nullish(),speed:Jb.number().min(.25).max(4).default(1).nullish()}))),f6=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 Jr({provider:"openai",providerOptions:a,schema:m6}),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 Qr({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:vr(this.config.headers(),t.headers),body:i,failedResponseHandler:Yo,successfulResponseHandler:qD(),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}}}},h6=Tt(()=>Ee(Ht.object({text:Ht.string(),language:Ht.string().nullish(),duration:Ht.number().nullish(),words:Ht.array(Ht.object({word:Ht.string(),start:Ht.number(),end:Ht.number()})).nullish(),segments:Ht.array(Ht.object({id:Ht.number(),seek:Ht.number(),start:Ht.number(),end:Ht.number(),text:Ht.string(),tokens:Ht.array(Ht.number()),temperature:Ht.number(),avg_logprob:Ht.number(),compression_ratio:Ht.number(),no_speech_prob:Ht.number()})).nullish()}))),g6=Tt(()=>Ee(Ca.object({include:Ca.array(Ca.string()).optional(),language:Ca.string().optional(),prompt:Ca.string().optional(),temperature:Ca.number().min(0).max(1).default(0).optional(),timestampGranularities:Ca.array(Ca.enum(["word","segment"])).default(["segment"]).optional()}))),uk={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"},S6=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 Jr({provider:"openai",providerOptions:r,schema:g6}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([ZD(t)]);i.append("model",this.modelId);let s=GD(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:f}=await VD({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:vr(this.config.headers(),t.headers),formData:u,failedResponseHandler:Yo,successfulResponseHandler:ro(h6),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in uk?uk[p.language]:void 0;return{text:p.text,segments:(s=(a=(o=p.segments)==null?void 0:o.map(S=>({text:S.text,startSecond:S.start,endSecond:S.end})))!=null?a:(i=p.words)==null?void 0:i.map(S=>({text:S.word,startSecond:S.start,endSecond:S.end})))!=null?s:[],language:h,durationInSeconds:(c=p.duration)!=null?c:void 0,warnings:d,response:{timestamp:l,modelId:this.modelId,headers:m,body:f}}}},y6="2.0.89";function Zb(t={}){var e,r;let n=(e=ek(HD({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>jb({Authorization:`Bearer ${zD({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${y6}`),a=h=>new cJ(h,{provider:`${o}.chat`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch}),s=h=>new fJ(h,{provider:`${o}.completion`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch}),c=h=>new yJ(h,{provider:`${o}.embedding`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch}),l=h=>new vJ(h,{provider:`${o}.image`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch}),u=h=>new S6(h,{provider:`${o}.transcription`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch}),d=h=>new f6(h,{provider:`${o}.speech`,url:({path:S})=>`${n}${S}`,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 n6(h,{provider:`${o}.responses`,url:({path:S})=>`${n}${S}`,headers:i,fetch:t.fetch,fileIdPrefixes:["file-"]}),f=function(h){return p(h)};return f.languageModel=p,f.chat=a,f.completion=s,f.responses=m,f.embedding=c,f.textEmbedding=c,f.textEmbeddingModel=c,f.image=l,f.imageModel=l,f.transcription=u,f.transcriptionModel=u,f.speech=d,f.speechModel=d,f.tools=WJ,f}var Xqe=Zb();function Sk(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[ff]:Gs??"",...r&&{[gI]:r},...n||{}};return o&&(i[hI]=JSON.stringify(o)),i}var sg=t=>e=>{let r=Sk(t);return E6({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},lg=t=>e=>{let r=Sk(t);return Zb({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var dn=class extends br{agentConfig;constructor(e,r){let n={...zl,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return dx.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${Y}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Gs,...e},signal:r.abortSignal});return ux.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${Y}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return T6.string().parse(r)}async getElementLocation(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${Y}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return vI.parse(o)}async getAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${Y}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return HE.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return bI.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return yI.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return EI.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return TI.parse(o)}async getVisualAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${Y}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return HE.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${Y}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return SI.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${Y}/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(`/${Y}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return Ry.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${Y}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return AI.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${Y}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return Am.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return Bw.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${Y}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return zw.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${Y}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return sy.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${Y}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return wx.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${Y}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Dw.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${Y}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Uw.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${Y}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return kw.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${Y}/web-agent/iframe-regex`,{method:"POST",body:e,signal:r.abortSignal});return OC.parse(n)}getAnthropicModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return sg({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...at(n),promptType:o},sessionId:r})}getOpenAIModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return lg({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...at(n),promptType:o},sessionId:r})}};import{z as ev}from"zod";var ut=class extends br{constructor(e){super({...e,mode:void 0})}getAppUrl(){return oc(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${Y}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return kI.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${Y}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return OI.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${Y}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return RI.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${Y}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${Y}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return xI.parse(n)}async deleteStepCacheEntry(e,r){await this.sendRequest(`/${Y}/cache/entry`,{method:"DELETE",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4})}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${Y}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return GE.parse(r)}cacheRouteForPlatform(e){switch(e){case"ANDROID":return"android-cache";case"IOS":return"ios-cache"}}async getMobileStepCacheMemoryTraces(e,r){let n=await this.sendRequest(`/${Y}/${this.cacheRouteForPlatform(e)}/traces`,{method:"POST",body:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return GE.parse(n)}async updateMobileStepCaches(e){await this.sendRequest(`/${Y}/${this.cacheRouteForPlatform(e.platform)}`,{method:"PATCH",body:e.body,extraHeaders:e.headers,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest({platform:e,body:r,headers:n}){let o=await this.sendRequest(`/${Y}/${this.cacheRouteForPlatform(e)}`,{method:"POST",body:r,extraHeaders:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return _I(Xm(e)).parse(o)}async queueTests(e){let r=await this.sendRequest(`/${Y}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return CI.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${Y}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return DI.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${Y}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${Y}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${Y}/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(`/${Y}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return UI.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${Y}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return tP.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${Y}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${Y}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${Y}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${Y}/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(`/${Y}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return FI.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${Y}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return ax.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${Y}/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(`/${Y}/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(`/${Y}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return BI.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${Y}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${Y}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return zI.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${Y}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return HI.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${Y}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return GI.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${Y}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return aP.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${Y}/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(`/${Y}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Td.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${Y}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Td.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${Y}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return $E.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(`/${Y}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Td.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${Y}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Td.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${Y}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return $E.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${Y}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return ev.record(ev.string(),ev.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${Y}/quarantine`,{method:"GET"});return jI.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${Y}/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(`/${Y}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}platformRoute(e){switch(e){case"ANDROID":return"android";case"IOS":return"ios"}}async createAndroidEmulator(e){let r=await this.sendRequest(`/${Y}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return VI.parse(r)}async extendEmulatorTtl(e,r){try{await this.sendRequest(`/${Y}/limbar/${this.platformRoute(e)}/${r}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAssetUploadUrl({channel:e,tag:r,md5:n,platform:o}){let i={channel:e,tag:r,md5:n},a=await this.sendRequest(`/${Y}/limbar/${this.platformRoute(o)}/upload-url`,{method:"POST",retries:3,body:i,requestTimeoutMs:15e3,logResponse:!0});return WI.parse(a)}async deleteAndroidEmulator(e){await this.sendRequest(`/${Y}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getMobileAssets(){let e=await this.sendRequest(`/${Y}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return qI.parse(e)}async getLimbarAssetDownloadUrl(e,r,n){let o=await this.sendRequest(`/${Y}/limbar/assets/${e}/${r}/${this.platformRoute(n)}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return KI.parse(o)}async deleteAsset(e,r,n){await this.sendRequest(`/${Y}/limbar/assets/${e}/${r}/${this.platformRoute(n)}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${Y}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return $I.parse(r)}async deleteIosEmulator(e){await this.sendRequest(`/${Y}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${Y}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return P_.parse(r)}};async function cg(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 ug=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var Ra=class extends br{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${Y}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return LC.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal})}};var Bc=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return oc(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 b6,en as v6}from"@faker-js/faker";var zc="v1",Xo=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 b6({locale:v6}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${zc}/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(`/${zc}/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(`/${zc}/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(`/${zc}/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(`/${zc}/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(`/${zc}/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 yk(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var dg=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await yk(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 wo({logger:t,orgId:e,client:r,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a,isolateCachesByEnvironment:s=!1,bustOldestCachePercentage:c}){return a?new hf:new tv(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:c,isolateCachesByEnvironment:s})}var tv=class{constructor(e,r,n,o,i){this.orgId=r;this.client=n;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:c,isolateCachesByEnvironment:l}=i,{gitBranchName:u,gitProtectedBranches:d}=o;e.info({options:i,gitBranchName:u,gitProtectedBranches:d},"Cache storage initialization options"),this.cacheHeaders=Ed(o),this.isolateCachesByEnvironment=l,this.readCaches=!a;let p=u&&d.includes(u);s||!p?this.writeCaches=!0:this.writeCaches=!1,p||(this.bustOldestCachePercentage=c)}cacheHeaders;readCaches;writeCaches;isolateCachesByEnvironment;bustOldestCachePercentage;async saveStepCacheEntries({entries:e,logger:r}){if(!this.writeCaches){r.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:WE(e,this.isolateCachesByEnvironment)},this.cacheHeaders)}catch(n){r.error({err:n},"Failed to save step cache entries")}}async deleteStepCacheEntry({logger:e,testId:r,key:n,environment:o}){try{await this.client.deleteStepCacheEntry({testId:r,key:n,environment:this.isolateCachesByEnvironment?o:void 0},this.cacheHeaders)}catch(i){e.error({err:i},"Failed to delete step cache entry")}}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,environment:this.isolateCachesByEnvironment?e.environment:void 0},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&&Ci({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 Ft({stepLists:e.stepLists,cacheCreationParams:{environment:e.environment,testId:e.testId,orgId:this.orgId}});this.saveStepCacheEntries({entries:a,logger:e.logger})}};import pg from"path";function A6(t){let e=new Ek,r=pg.join(t,"metadata.json"),n=ic.parse(JSON.parse(rv.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of rv.readdirSync(pg.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new Ek(pg.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(pg.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function mg(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!rv.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new dg(e);try{let{runGroupId:i,buffer:a}=A6(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 C6 from"adm-zip";import Ur from"fs";import no from"path";var cp=class t{constructor(e){this.filePath=e;Ur.rmSync(this.filePath,{recursive:!0,force:!0}),Ur.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(no.join(this.filePath,e));return this.children.push(r),r}cwd(){return this.filePath}mkdir(e){Ur.mkdirSync(no.join(this.filePath,e),{recursive:!0})}readFile(e){let r=no.join(this.filePath,e);if(Ur.existsSync(r))return Ur.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=no.join(this.filePath,r);try{Ur.writeFileSync(o,n)}catch{}}createFileStream(e){let r=no.join(this.filePath,e),n=Ur.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new nv(no.join(this.filePath,"runs"),e);return this.children.push(r),r}},nv=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=no.join(e,`temp-storage-${r}`),this.finalPath=no.join(e,`${r}.zip`),Ur.rmSync(this.tempPath,{recursive:!0,force:!0}),Ur.rmSync(this.finalPath,{recursive:!0,force:!0}),Ur.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=no.join(this.tempPath,e);if(Ur.existsSync(r))return Ur.readFileSync(r)}mkdir(e){Ur.mkdirSync(no.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new cp(no.join(this.tempPath,e));return this.children.push(r),r}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=no.join(this.tempPath,r);Ur.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new C6;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Ur.writeFileSync(this.finalPath,r),Ur.rmSync(this.tempPath,{recursive:!0,force:!0})}};import R6 from"adm-zip";import{randomUUID as w6}from"crypto";import nr from"fs";import Cr from"path";function Ak(t){try{return nr.existsSync(t)?JSON.parse(nr.readFileSync(t,"utf-8")):void 0}catch{return}}function Tk(t){return nr.existsSync(t)?nr.readFileSync(t,"utf-8").split(`
80
80
  `).map(r=>r.trim()).filter(r=>r.length>0):[]}function x6(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Cr.join(t.inflatedPath,"attempts",r);let n=Cr.join(t.inflatedPath,"attempts");if(!nr.existsSync(n))return;let o=nr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Cr.join(n,i,"metadata.json"),s=Ak(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),Cr.join(n,i)}}function bk(t,e,r){let n=Cr.join(t,"attempts");if(!nr.existsSync(n))return;let o=nr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Cr.join(n,i,"assets",`${e}.${r}`);if(nr.existsSync(a))return a}}var fg=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Cr.join(e,"runs"),this.zipPath=Cr.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||!nr.existsSync(this.zipPath))return;let n=Cr.join(this.runsDir,`temp-unzipped-${e}-${w6()}`);nr.mkdirSync(n,{recursive:!0}),new R6(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())nr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return x6(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Cr.join(e,"assets");return nr.existsSync(r)?nr.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Cr.join(r,o.name)).filter(o=>{let i=Cr.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Cr.join(n,"assets",`${e}.${r}`);if(nr.existsSync(o))try{return nr.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=Ak(Cr.join(o,"console.json")),a=ME.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=Cr.join(o,"assets","har-pages.log"),a=Cr.join(o,"assets","har-entries.log"),s={};for(let u of Tk(i)){let d=fd.safeParse(vk(u));d.success&&(s[d.data.id]=d.data)}let c={},l=Tk(a);for(let u=0;u<l.length;u++){let d=l[u],p=hd.safeParse(vk(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return LE(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=bk(o.inflatedPath,r,"html");if(i)try{return nr.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=bk(o.inflatedPath,r,"xml");if(i)try{return nr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Cr.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return nr.readFileSync(i)}catch{return}}};function vk(t){try{return JSON.parse(t)}catch{return}}function hg({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??_6(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[sr];typeof c=="string"&&(s=c)}if(!s)throw new Error(`Cannot run test with no base URL and no ${sr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function _6(t){for(let e of t.envs??[])if(e.default)return e.name}var I6={test:"tests",module:"modules",mobileTest:"mobileTests",mobileModule:"mobileModules"};async function wa(t,e,r){let n=await fe(t),o=n[I6[r]],i=P6(o,e);if(e.id){if(i.length===0)throw new ar(`No ${r} found with id '${e.id}' in project '${t.rootDir}'.`);return gg(i,n)}if(e.name){if(i.length===0)throw new ar(`No ${r} found with exact name '${e.name}' in project '${t.rootDir}'.`);if(i.length>1){let a=i.map(s=>({id:s.id,path:s.relativePath}));throw new ar([`Multiple ${r}s found with exact name '${e.name}'. Please disambiguate by id or path.`,JSON.stringify(a,null,2)].join(`
81
81
  `))}return gg(i,n)}if(e.path){let a=e.path;if(i.length===0)throw new ar(`No ${r} found at path '${a}'. Provide an absolute path or a path relative to '${t.rootDir}'.`);if(i.length>1){let s=i.filter(l=>l.fullFilePath===a||l.relativePath===a||l.fullFilePath.endsWith(`/${a}`)||l.relativePath.endsWith(`/${a}`));if(s.length===1)return gg(s,n);let c=i.map(l=>({id:l.id,path:l.fullFilePath}));throw new ar([`Multiple ${r}s matched the provided path '${a}'. Please pass the absolute path.`,JSON.stringify(c,null,2)].join(`
82
- `))}return gg(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function gg(t,e){let r=t[0];if(!r)throw t.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return{entity:r,momenticFiles:e}}function P6(t,e){if(e.id){let r=Object.values(t).find(n=>n.id===e.id);return r?[r]:[]}if(e.name)return Object.values(t).filter(r=>r.name===e.name);if(e.path){let r=e.path;return Object.values(t).filter(n=>n.fullFilePath.includes(r)||n.relativePath.includes(r))}throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}import Sg from"fs";import M6 from"path";var O6=new Oh(30,60*1e3),Eg="https://api.momentic.ai",iv,Ck,Tg=t=>{Eg=t},Gt=()=>Eg,Rk=()=>oc(Eg),bg=t=>{Ck=t},Vs=()=>Ck,Gc=()=>iv;var Hc,av,yg,vg=async t=>{if(iv&&Hc&&yg)return Hc;let e=new ut({baseUrl:Eg,apiKey:t,logger:v});iv=e;try{let r=await e.getAuthInfo();return Hc=r.orgId,av=r.userId,yg=t,Hc}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},Xt=()=>{if(!Hc)throw new Error("Your organization ID is invalid.");return Hc},Jo=()=>{if(!av)throw new Error("Your user ID is invalid.");return av},dr=()=>{if(!yg)throw new Error("Your API key is invalid.");return yg},sv,ov,jc=(t,e)=>{sv=t,ov?.abort(),ov=new AbortController;let r=ov.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=M6.resolve(t.rootDir,o.envFile);try{if(Sg.lstatSync(i).isSymbolicLink())return;Sg.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{L6({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Re=()=>sv;function L6({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()&&(O6.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.`),sv=await Promise.resolve(e(n.configFilePath)))};Sg.watchFile(o,{persistent:!1},i);let a=()=>{Sg.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ge(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as N6}from"os";var D6="2.77.0",$s=sc({app:"desktop-server",hostname:N6(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:D6});(async()=>{try{let t=await Mi($s);t.gitBranchName&&$s.addBinding("branch",t.gitBranchName)}catch{}})();var wk=k6();wk.get("/",async(t,e)=>{let r=Re(),n=Gc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await cr($s,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Vs(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var lv=wk;import{Router as U6}from"express";import Fr from"fs";import{glob as F6}from"glob";import pr from"path";var B6=5e3;function cv(t={}){let e=U6();function r(i){let a=Re(),s=pr.dirname(a.configFilePath);return pr.join(s,...i)}function n(i){let a=Re(),s=pr.dirname(a.configFilePath),c=pr.relative(s,i);return c?c.split(pr.sep):[]}function o(i,a){let s=Fr.statSync(i),c=n(i);return kE.parse({name:a,absolutePath:i,relativePath:c.join(pr.sep),pathSegments:c,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return e.post("/",Ge(async(i,a,s)=>{let c;try{c=Q_.parse(i.body).pathSegments}catch(g){a.status(400).json({error:`Failed to parse folder read body: ${g}`});return}let l=r(c);if(!Fr.existsSync(l)){a.status(404).json({error:`Path not found: ${c.join(pr.sep)}`});return}if(!Fr.statSync(l).isDirectory()){a.status(400).json({error:`Path is not a directory: ${c.join(pr.sep)}`});return}let d=Re(),p=Array.from(d.config.exclude??[]).concat(lf),m=AbortSignal.timeout(B6),f;try{f=await F6("*",{absolute:!1,cwd:l,ignore:p,dotRelative:!1,maxDepth:1,nodir:!1,signal:m})}catch(g){if(g instanceof Error&&g.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw g}let h=f.map(g=>{let E=pr.join(l,g);return o(E,g)});if(t.allowedFileTypes){let g=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let b=await z6(E.absolutePath);return b!==void 0&&g.has(b)?E:null}))).filter(E=>E!==null)}let S={absolutePath:l,pathSegments:c,contents:h};a.status(200).json(S)})),e.put("/",Ge(async(i,a,s)=>{let c;try{c=Z_.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let l=r(c);if(Fr.existsSync(l)){a.status(200).json({success:!0,message:`Folder already exists: ${c.join(pr.sep)}`,pathSegments:c});return}Fr.mkdirSync(l,{recursive:!0});let u={success:!0,message:`Folder created: ${c.join(pr.sep)}`,pathSegments:c};a.status(201).json(u)})),e.patch("/",Ge(async(i,a,s)=>{let c,l;try{let f=eI.parse(i.body);c=f.pathSegments,l=f.newPathSegments}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=r(c),d=r(l);if(!Fr.existsSync(u)){a.status(400).json({error:`Folder not found: ${c.join(pr.sep)}`});return}if(Fr.existsSync(d)){a.status(400).json({error:`Destination already exists: ${l.join(pr.sep)}`});return}let p=pr.dirname(d);Fr.existsSync(p)||Fr.mkdirSync(p,{recursive:!0}),Fr.renameSync(u,d);let m={success:!0,message:`Folder moved from ${c.join(pr.sep)} to ${l.join(pr.sep)}`,pathSegments:l};a.status(200).json(m)})),e.delete("/",Ge(async(i,a,s)=>{let c,l=!0;try{let m=tI.parse(i.body);c=m.pathSegments,l=m.recursive??!0}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=r(c);if(!Fr.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${c.join(pr.sep)}`,pathSegments:c});return}if(!Fr.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${c.join(pr.sep)}`});return}if(l)Fr.rmSync(u,{recursive:!0,force:!0});else{if(Fr.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${c.join("/")}`});return}Fr.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${c.join("/")}`,pathSegments:c};a.status(200).json(p)})),e}async function z6(t){try{let e=await Fr.promises.open(t,"r");try{let r=Buffer.alloc(4096),{bytesRead:n}=await e.read(r,0,r.length,0);return r.toString("utf-8",0,n).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close()}}catch{}}import{Router as H6}from"express";var xk=H6();xk.get("/",async(t,e)=>{let r=Re(),n=Gc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await cr($s,n,r);e.status(200).json(o)});var uv=xk;import Nte from"events";import Nz,{Router as Dte}from"express";import kte from"http";import Ute from"path";import{Server as Q7}from"socket.io";var G6=({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{}}},_k={event:"cancel",createHandler:G6};var j6=({metadata:t,logger:e,cacheStorageFactory:r})=>{let{testId:n,orgId:o}=t;return async(i,a)=>{let{stepId:s,environment:c}=i;e.info({testId:n,stepId:s},"Clearing AI action cache");try{await(await r(o)).deleteStepCacheEntry({logger:e,testId:n,key:s,environment:c}),a({ok:!0})}catch(l){e.error({testId:n,stepId:s,err:l},"Failed to clear AI action cache"),a({ok:!1,error:l instanceof Error?l.message:String(l)})}}},Ik={event:"clearAIActionCache",createHandler:j6};var V6=({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})}}},Pk={event:"fetchA11yTree",createHandler:V6};var $6=({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})}}},Mk={event:"fetchDom",createHandler:$6};var W6=({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)}},Ok={event:"disconnect",createHandler:W6};function oo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=q6(r);K6(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await Y6(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function q6(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 K6(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 Y6(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as aQ}from"crypto";import{faker as X6}from"@faker-js/faker";import J6 from"assert";import Q6 from"axios";import*as Z6 from"child_process";import eQ from"moment";import*as tQ from"otpauth";import rQ from"pg";async function Lk(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Km(n,e);r.push(...o)}),r}function nQ(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 oQ(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 iQ=Object.getPrototypeOf(async function(){}).constructor;async function Nk(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,b)=>{o[y]=b,l[y]=b},d={},p=(y,b)=>{o[y]=b,d[y]=b},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let f;n.includes("createAppAuth")&&(f=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new iQ("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Q6,eQ,c.fakerInstance??X6,J6,rQ,m,f,tQ,Z6,Lk,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,nQ(a,s),...Object.values(i??{}))),S=!0,g,E;try{let y=await J(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});g=await oQ(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),S=!1,y instanceof ca?E=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:E=y instanceof Error?y.message:`${y}`}return{result:g,variableUpdates:l,persistentVariableUpdates:d,success:S,error:E}}async function Dk({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=ia,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=aQ(),p=await Nk(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 sQ,randomUUID as lQ}from"crypto";import cQ from"fetch-retry";var uQ=cQ(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}}),kk=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,Uk=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function Fk({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=ia,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!kk)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!Uk)throw new Error("Missing lambda auth secret.");let h=sQ("sha256",Uk).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let g={id:lQ(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await J(uQ(kk,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}),{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(E){m=E}}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 S;try{S=L_.parse(await p.json())}catch(g){throw new Error(`Code evaluation server returned invalid response: ${g}`)}if(S.error)throw new Error(`Code evaluation error: ${S.error}`);return S}async function xa(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await Fk(t);else if(t.localTools)e=await Dk({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
82
+ `))}return gg(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function gg(t,e){let r=t[0];if(!r)throw t.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return{entity:r,momenticFiles:e}}function P6(t,e){if(e.id){let r=Object.values(t).find(n=>n.id===e.id);return r?[r]:[]}if(e.name)return Object.values(t).filter(r=>r.name===e.name);if(e.path){let r=e.path;return Object.values(t).filter(n=>n.fullFilePath.includes(r)||n.relativePath.includes(r))}throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}import Sg from"fs";import M6 from"path";var O6=new Oh(30,60*1e3),Eg="https://api.momentic.ai",iv,Ck,Tg=t=>{Eg=t},Gt=()=>Eg,Rk=()=>oc(Eg),bg=t=>{Ck=t},Vs=()=>Ck,Gc=()=>iv;var Hc,av,yg,vg=async t=>{if(iv&&Hc&&yg)return Hc;let e=new ut({baseUrl:Eg,apiKey:t,logger:v});iv=e;try{let r=await e.getAuthInfo();return Hc=r.orgId,av=r.userId,yg=t,Hc}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},Xt=()=>{if(!Hc)throw new Error("Your organization ID is invalid.");return Hc},Jo=()=>{if(!av)throw new Error("Your user ID is invalid.");return av},dr=()=>{if(!yg)throw new Error("Your API key is invalid.");return yg},sv,ov,jc=(t,e)=>{sv=t,ov?.abort(),ov=new AbortController;let r=ov.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=M6.resolve(t.rootDir,o.envFile);try{if(Sg.lstatSync(i).isSymbolicLink())return;Sg.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{L6({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Re=()=>sv;function L6({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()&&(O6.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.`),sv=await Promise.resolve(e(n.configFilePath)))};Sg.watchFile(o,{persistent:!1},i);let a=()=>{Sg.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ge(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as N6}from"os";var D6="2.78.0",$s=sc({app:"desktop-server",hostname:N6(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:D6});(async()=>{try{let t=await Mi($s);t.gitBranchName&&$s.addBinding("branch",t.gitBranchName)}catch{}})();var wk=k6();wk.get("/",async(t,e)=>{let r=Re(),n=Gc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await cr($s,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Vs(),c=!a&&(s||!i);e.status(200).json({saveCaches:c,checkedOutBranch:o?.gitBranchName})});var lv=wk;import{Router as U6}from"express";import Fr from"fs";import{glob as F6}from"glob";import pr from"path";var B6=5e3;function cv(t={}){let e=U6();function r(i){let a=Re(),s=pr.dirname(a.configFilePath);return pr.join(s,...i)}function n(i){let a=Re(),s=pr.dirname(a.configFilePath),c=pr.relative(s,i);return c?c.split(pr.sep):[]}function o(i,a){let s=Fr.statSync(i),c=n(i);return kE.parse({name:a,absolutePath:i,relativePath:c.join(pr.sep),pathSegments:c,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return e.post("/",Ge(async(i,a,s)=>{let c;try{c=Q_.parse(i.body).pathSegments}catch(g){a.status(400).json({error:`Failed to parse folder read body: ${g}`});return}let l=r(c);if(!Fr.existsSync(l)){a.status(404).json({error:`Path not found: ${c.join(pr.sep)}`});return}if(!Fr.statSync(l).isDirectory()){a.status(400).json({error:`Path is not a directory: ${c.join(pr.sep)}`});return}let d=Re(),p=Array.from(d.config.exclude??[]).concat(lf),m=AbortSignal.timeout(B6),f;try{f=await F6("*",{absolute:!1,cwd:l,ignore:p,dotRelative:!1,maxDepth:1,nodir:!1,signal:m})}catch(g){if(g instanceof Error&&g.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw g}let h=f.map(g=>{let E=pr.join(l,g);return o(E,g)});if(t.allowedFileTypes){let g=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let b=await z6(E.absolutePath);return b!==void 0&&g.has(b)?E:null}))).filter(E=>E!==null)}let S={absolutePath:l,pathSegments:c,contents:h};a.status(200).json(S)})),e.put("/",Ge(async(i,a,s)=>{let c;try{c=Z_.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let l=r(c);if(Fr.existsSync(l)){a.status(200).json({success:!0,message:`Folder already exists: ${c.join(pr.sep)}`,pathSegments:c});return}Fr.mkdirSync(l,{recursive:!0});let u={success:!0,message:`Folder created: ${c.join(pr.sep)}`,pathSegments:c};a.status(201).json(u)})),e.patch("/",Ge(async(i,a,s)=>{let c,l;try{let f=eI.parse(i.body);c=f.pathSegments,l=f.newPathSegments}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=r(c),d=r(l);if(!Fr.existsSync(u)){a.status(400).json({error:`Folder not found: ${c.join(pr.sep)}`});return}if(Fr.existsSync(d)){a.status(400).json({error:`Destination already exists: ${l.join(pr.sep)}`});return}let p=pr.dirname(d);Fr.existsSync(p)||Fr.mkdirSync(p,{recursive:!0}),Fr.renameSync(u,d);let m={success:!0,message:`Folder moved from ${c.join(pr.sep)} to ${l.join(pr.sep)}`,pathSegments:l};a.status(200).json(m)})),e.delete("/",Ge(async(i,a,s)=>{let c,l=!0;try{let m=tI.parse(i.body);c=m.pathSegments,l=m.recursive??!0}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=r(c);if(!Fr.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${c.join(pr.sep)}`,pathSegments:c});return}if(!Fr.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${c.join(pr.sep)}`});return}if(l)Fr.rmSync(u,{recursive:!0,force:!0});else{if(Fr.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${c.join("/")}`});return}Fr.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${c.join("/")}`,pathSegments:c};a.status(200).json(p)})),e}async function z6(t){try{let e=await Fr.promises.open(t,"r");try{let r=Buffer.alloc(4096),{bytesRead:n}=await e.read(r,0,r.length,0);return r.toString("utf-8",0,n).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await e.close()}}catch{}}import{Router as H6}from"express";var xk=H6();xk.get("/",async(t,e)=>{let r=Re(),n=Gc();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await cr($s,n,r);e.status(200).json(o)});var uv=xk;import Nte from"events";import Nz,{Router as Dte}from"express";import kte from"http";import Ute from"path";import{Server as Q7}from"socket.io";var G6=({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{}}},_k={event:"cancel",createHandler:G6};var j6=({metadata:t,logger:e,cacheStorageFactory:r})=>{let{testId:n,orgId:o}=t;return async(i,a)=>{let{stepId:s,environment:c}=i;e.info({testId:n,stepId:s},"Clearing AI action cache");try{await(await r(o)).deleteStepCacheEntry({logger:e,testId:n,key:s,environment:c}),a({ok:!0})}catch(l){e.error({testId:n,stepId:s,err:l},"Failed to clear AI action cache"),a({ok:!1,error:l instanceof Error?l.message:String(l)})}}},Ik={event:"clearAIActionCache",createHandler:j6};var V6=({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})}}},Pk={event:"fetchA11yTree",createHandler:V6};var $6=({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})}}},Mk={event:"fetchDom",createHandler:$6};var W6=({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)}},Ok={event:"disconnect",createHandler:W6};function oo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=q6(r);K6(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await Y6(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function q6(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 K6(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 Y6(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as aQ}from"crypto";import{faker as X6}from"@faker-js/faker";import J6 from"assert";import Q6 from"axios";import*as Z6 from"child_process";import eQ from"moment";import*as tQ from"otpauth";import rQ from"pg";async function Lk(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Km(n,e);r.push(...o)}),r}function nQ(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 oQ(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 iQ=Object.getPrototypeOf(async function(){}).constructor;async function Nk(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,b)=>{o[y]=b,l[y]=b},d={},p=(y,b)=>{o[y]=b,d[y]=b},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let f;n.includes("createAppAuth")&&(f=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new iQ("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(Q6,eQ,c.fakerInstance??X6,J6,rQ,m,f,tQ,Z6,Lk,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,nQ(a,s),...Object.values(i??{}))),S=!0,g,E;try{let y=await J(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});g=await oQ(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),S=!1,y instanceof ca?E=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:E=y instanceof Error?y.message:`${y}`}return{result:g,variableUpdates:l,persistentVariableUpdates:d,success:S,error:E}}async function Dk({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=ia,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=aQ(),p=await Nk(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 sQ,randomUUID as lQ}from"crypto";import cQ from"fetch-retry";var uQ=cQ(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}}),kk=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,Uk=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function Fk({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=ia,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!kk)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!Uk)throw new Error("Missing lambda auth secret.");let h=sQ("sha256",Uk).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let g={id:lQ(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await J(uQ(kk,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}),{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(E){m=E}}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 S;try{S=L_.parse(await p.json())}catch(g){throw new Error(`Code evaluation server returned invalid response: ${g}`)}if(S.error)throw new Error(`Code evaluation error: ${S.error}`);return S}async function xa(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await Fk(t);else if(t.localTools)e=await Dk({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
83
83
  ${e.error}
84
84
  Code received:
85
85
  ${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 dQ}from"lodash-es";async function Rr(t){let{orgId:e,s:r,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=ia,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(),f;try{f=await xa({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:t.localTools,signal:i})}catch(S){throw o.error({err:S,value:r},"Error evaluating template string"),S}if(f===void 0&&!c)throw new L("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 f=="string"?f:`${f}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(p[0],h)}return d}async function Ag(t){return Bk(t)}async function Bk({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 Rr({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 Bk({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:r,...a})}return i}function zk(t,e){for(let{path:r,original:n}of e)dQ(t,r,n)}import pQ from"fetch-retry";var tJe=process.env.MAILINATOR_API_KEY,rJe=pQ(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 oZ}from"os";var dv={vimiumJs:'var _=Object.defineProperty;var D=(t,e,n)=>e in t?_(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(D(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 M={_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 i of e)i();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(i){return i==="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 r=[];for(n of t.getClientRects())r.push(E.copy(n));return r})(),i=function(){let r=window.getComputedStyle(t,null),h=r.getPropertyValue("display").indexOf("inline")===0&&r.getPropertyValue("font-size")==="0px";return i=()=>h,h};for(n of o){let r;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){r=window.getComputedStyle(h,null);let m=r.getPropertyValue("position");if(r.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&i()&&r.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||(r=window.getComputedStyle(t,null),r.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 i,r,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([i,h,r,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);i=l-p,r=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([i,h,r,m]=[0,0,t.width,t.height]):s.length>=4&&([i,h,r,m]=s);let u=E.translate(E.create(i,h,r,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 i of n){let r=this.simulateMouseEvent(i,t,e);o.push(r)}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:i,metaKey:r,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=r===!0&&o===!1:n=r===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:i===!0}):i===!0&&r===!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),i=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+i}}else{let o,i;return M.isFirefox()?(i=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:i,clientLeft:o}=t,{top:-n.top-i,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:i}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(r){return r.code!==i||(this.remove(),o?f.suppressPropagation(r):f.suppressEvent(r)),handlerStack.continueBubbling},blur(r){return r.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 i=n;for(;i&&i.nodeType!==1;)i=i.previousSibling;return n=i||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"),i=document.getElementById(o);i&&(e.target=this.describe(i))}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 N=null,k=()=>j()||document.scrollingElement||document.body,P=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(M.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,i=t[o];if(t.scrollBy){let r={behavior:"instant"};r[e==="x"?"left":"top"]=n,t.scrollBy(r)}else t[o]+=n;return t[o]!==i},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 i=o*O(t,e,n)||-1;return i=P(i),I(t,e,i)&&I(t,e,-i)},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,i)=>i.area-o.area)){let o=H(e.element);if(o)return o}return null}},T={init(){N=null},isScrollableElement(t){return N||(N=k()&&H()||k()),t!==N&&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._momentic=window._momentic||{};window._momentic.scroller=T;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,i=!1,r=[],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(C=>Object.assign(C,{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,C]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&C!=="_")}}}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()&&T.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&&T.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,i=!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:i,reason:m}));r.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:i,reason:m});r.push(c)}}return r},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let i=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(i)?i:(o.push(i),i&&i.shadowRoot?S.getElementFromPoint(t,e,i.shadowRoot,o):i)},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 i=[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 i)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let r=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}});r.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of r)s.rect.top+=h,s.rect.left+=m;return r}};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"),i=e.element.attributes["data-momentic-id"]?.value??void 0;if(!i){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,i),this.hintMarkers.set(i,{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._momentic??={};window._momentic.hintManagerConstructor=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:`(() => {
@@ -4941,7 +4941,7 @@ ${c}`,{errOptions:{cause:t}})}if(i.includes("element is not visible")){let c="Th
4941
4941
  writable: false,
4942
4942
  configurable: false,
4943
4943
  });`),`${r}
4944
- //# sourceURL=momentic-injected/extra-scripts.js`}function _0(t){return t?.split(",").map(e=>e.trim()).filter(e=>e.length>0)??[]}function a8(t){let e=t.indexOf("=");return e===-1?t:t.slice(0,e)}function R0(t,e=process.env.MOMENTIC_CHROME_REMOVE_ARGS){let r=new Set(_0(e));return r.size===0?t:t.filter(n=>{let o=a8(n);return!r.has(n)&&!r.has(o)})}function Nv(t){let e=[],r="";for(let n of t)n==="+"&&r?(e.push(r),r=""):r+=n;return e.push(r),e}var s8=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],l8=["local-network-access"];function I0(t){return $n?t.filter(e=>!l8.includes(e)):t}function P0(t){return I0(t||s8)}var Dv="__momentic_session_storage_initialized";function M0(t){return t.parentFrame!==void 0}async function O0(t,e,r){try{let n=await c8(t);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),r.info(`Saved ${n.entries.length} session storage entries`)}catch(n){r.warn({err:n},"Failed to extract session storage, continuing...")}}async function c8(t){return t.evaluate(e=>{let r=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&r.push({name:o,value:i})}}return{origin:window.location.origin,entries:r}},Dv)}function L0(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n,c=Math.atan2(s,a);return c<0?c+2*Math.PI:c}function N0(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n;return Math.sqrt(a*a+s*s)}function u8(t){return t?t.match(/^\s*<\s*([a-zA-Z0-9-]+)/)?.[1]?.toLowerCase():void 0}function d8(t){if(!t)return;let e=t.match(/\srole\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+))/i);return e?.[1]??e?.[2]??e?.[3]}function kv(t,e){let r=e?.tagName??u8(t.nodeOnlySerializedHtml);if(r&&Qk.includes(r.toLowerCase()))return!0;let n=d8(t.nodeOnlySerializedHtml);return!!(n&&Zk.includes(n.toLowerCase()))}async function p8(t){let{initialLocationResult:e,cacheEvaluationParams:r,locator:n}=t;return n.evaluate((o,i)=>{let s=window._momentic,{initialLocationResult:c,cacheEvaluationParams:l}=i;if(!s?.momenticConstants)throw new Error("Momentic constants not found");if(o.tagName.toLowerCase()!==c.tagName.toLowerCase())return"Tag name mismatch";let u=(o.textContent??"").slice(0,s.momenticConstants.serializedElementForCachingTruncateLength),d=(c.textContent??"").slice(0,s.momenticConstants.serializedElementForCachingTruncateLength);if(u!==d)return"Text content mismatch";for(let[f,h]of Object.entries(c.importantAttributes))if(o.getAttribute(f)!==h)return`Attribute ${f} mismatch`;let p=c.boundingBox.width*c.boundingBox.height,m=o.getBoundingClientRect().width*o.getBoundingClientRect().height;if(p===0||m===0){if(p!==m)return"Area mismatch"}else if(Math.abs(p-m)/p>.05)return"Area mismatch";if(c.identityHash&&s.getElementIdentityHash&&c.identityHash!==s.getElementIdentityHash(o))return"Identity hash mismatch";if(l&&s.evaluatePrimaryCaches){let{css:f,hybrid:h}=s.evaluatePrimaryCaches(l);if(h?.result&&h.result.mPath&&c.mPath&&JSON.stringify(h.result.mPath)!==JSON.stringify(c.mPath))return"Hybrid selector returned a different element than the original";if(!h&&f&&f.result&&f.result.dataMomenticId!==c.dataMomenticId)return"CSS selector returned a different element than the original"}},{initialLocationResult:e,cacheEvaluationParams:r},{timeout:me})}async function Uv(t){let{logger:e}=t;try{let r=await p8(t);if(!r)return;throw e.warn({failReason:r},"Locator no longer matches cache, re-triggering evaluation"),new Wi("Locator no longer matches cache")}catch(r){if(r instanceof Wi)throw r;e.warn({err:r},"Failed to check whether locator has drifted from cache")}}import D0 from"jpeg-js";import m8 from"pixelmatch";function k0(t,e,r=.01){if(t.equals(e))return 0;let n=D0.decode(t),o=D0.decode(e);if(n.width!==o.width||n.height!==o.height)return 100;let i=n.width,a=n.height,s=Buffer.alloc(i*a*4);return m8(n.data,o.data,s,i,a,{threshold:r})/(i*a)*100}var F0=["date","datetime-local","month","time","week"],U0={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function B0(t){try{await J(f8(t),{milliseconds:me})}catch(e){t.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function f8({root:t,text:e,options:r,logger:n,callbacks:o}){let i=(await er({root:t,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:Je,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!U0[i])return;U0[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),r.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as Zr}from"zod";var z0=Zr.object({doubleClick:Zr.boolean().optional(),rightClick:Zr.boolean().optional(),force:Zr.boolean().optional(),waitForDownload:Zr.boolean().optional(),delayMs:Zr.number().optional(),downloadTimeoutMs:Zr.number().optional(),relativePosition:Zr.object({x:Zr.number(),y:Zr.number()}).optional(),iterations:Zr.number().optional()}),qQe=Zr.object({repeat:Zr.number().optional(),convertMeta:Zr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Zr.number().optional()});async function Pg({locator:t,callbacks:e,logger:r,timeoutMs:n=Je}){try{await Fv(e,n);let o=t.evaluate(a=>{let c=window._momentic;if(!c)throw new Error("Momentic namespace is not initialized");c.removeHighlightTimers??=[],c.removeHighlightFunctions??={};let l=f=>{let S=window.getComputedStyle(f,null).getPropertyValue("display");if(S==="none"||S==="contents")return!1;let g=f.getBoundingClientRect();return!(!g.height||!g.width)},u=0;for(;!l(a)&&u<3;){if(!a.parentElement)throw new Error("No eligible non-empty parent found for highlighting");a=a.parentElement,u++}let d=a.style.getPropertyValue("outline"),p=a.style.getPropertyPriority("outline");a.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let m=`momentic${Math.floor(Math.random()*1e7)}`;c.removeHighlightFunctions[m]=()=>{a.style.removeProperty("outline"),a.style.setProperty("outline",d,p),a.getAttribute("style")||a.removeAttribute("style")},c.removeHighlightTimers.push(window.setTimeout(()=>{c.removeHighlightFunctions?.[m]?.(),c.removeHighlightFunctions?.[m]&&delete c.removeHighlightFunctions[m]},5e3))},void 0,{timeout:n}).then(()=>!0).catch(a=>(r.debug({err:a},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1));return await J(o,{milliseconds:n})}catch(o){return r.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Fv(t,e=Je){let r=await t.state.getRoot();await er({root:r,fn:()=>{let i=window._momentic;if(!i)return;let a=i.removeHighlightTimers??[];for(;a.length;){let s=a.pop();s!==void 0&&clearTimeout(s)}Object.values(i.removeHighlightFunctions??{}).forEach(s=>{s()})},timeout:e,arg:void 0,waitForPageLoad:t.waitForPageLoad,codePath:"removing element highlights"})}async function Bv(t){let e=!!t.browserCallbacks.state.userBrowserSettings.visualActions;return Ks({action:"clicking element",targetingResult:t.targetingResult,logger:t.logger,retryTimeoutMs:t.retryTimeoutMs,callbacks:t.browserCallbacks,func:async r=>G0({...t,targetingResult:r,useVisualClick:e})})}async function y8({actionSource:t,position:e,targetingResult:r,logger:n}){let{locator:o}=r;if(t!=="click"||e)return{locator:o,position:e,redirected:!1};let i=await r0({targetingResult:r,logger:n});return i?{locator:i.locator,position:i.relativePoint,redirected:!0}:{locator:o,position:e,redirected:!1}}async function E8(t,e){try{return await T8(t,e)}catch(r){throw e.logger.warn({redirectionAttemptError:r,originalError:t},"Error handling click error, rethrowing original error"),t}}async function T8(t,e){let{logger:r,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(t.message.includes("label")&&t.message.includes("for=")&&t.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:Je});if(!i)throw t;let a=o.page().locator(`[for=${JSON.stringify(i)}]`),s=await a.boundingBox({timeout:Je});if(!s||s.width===0||s.height===0)throw r.warn("Label element has no bounding box, throwing original error..."),t;return r.warn({err:t},"Attempting locator redirection due to input being covered by label"),G0({...e,targetingResult:{locator:a,originalElementLocationResult:void 0,serverSideBoundingBox:s},redirectionAttempts:n+1})}else throw r.warn({err:t},"Click error does not match any known recoverable patterns, rethrowing"),t}async function b8(t){let{logger:e,targetingResult:r,position:n,options:o}=t,i=z0.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await C8({targetingResult:r,position:n,options:o,logger:e,isAndroid:t.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function v8(t){let{actionSource:e,targetingResult:r,options:n,logger:o}=t,i=t.targetingResult.locator,a=n?.relativePosition??t.position;({locator:i,position:a}=await y8({actionSource:e,position:a,targetingResult:r,logger:o}));let s=n?.force||r.hints?.force||!1;s&&!a&&r.hints?.relativeXYToLocator&&(a=r.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:me,position:a,delay:n?.delayMs??25,force:s,noWaitAfter:!0}):await i.click({button:n?.rightClick?"right":"left",timeout:me,position:a,delay:n?.delayMs??25,force:s,clickCount:n?.iterations,noWaitAfter:!0})}catch(l){if(w8(l))o.warn({err:l},"Click action timed out while waiting for navigation after completion, continuing...");else{if((t.redirectionAttempts??0)<1)return o.warn({err:l},"Error clicking on locator, attempting to recover..."),E8(l,{...t,targetingResult:r});throw l}}return{locatorSource:c}}async function G0(t){let{options:e,logger:r,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=t,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??mv;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof S8.TimeoutError?new L("ActionFailureError",`Download did not complete in ${u}ms`):new L("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Pg({locator:a.locator,callbacks:n,logger:r,timeoutMs:Je})}catch(u){r.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await b8(t):l=(await v8(t)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new L("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");r.info("Waiting for download to start and complete");let u=await J(s,{milliseconds:e.downloadTimeoutMs??mv});if(u instanceof Error)throw u;return{downloadedFile:await R8(u,o.createIsolatedFolder,r),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function A8(t,e){let r=t.serverSideBoundingBox??await t.locator.boundingBox({timeout:me});if(!r){let i=t.originalElementLocationResult?.serializedElement;throw new L("ActionFailureError",`${ly}${i?`: ${i}`:""}`)}if(t.hints?.relativeXYToLocator){let i=r.x+t.hints.relativeXYToLocator.x,a=r.y+t.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=r.x+r.width/2,o=r.y+r.height/2;return[{x:n,y:o},"halfway point"]}async function C8({options:t,targetingResult:e,position:r,logger:n}){let o,i,a;if(t?.relativePosition){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:me}),d=t.relativePosition.x,p=t.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(t.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(t.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(r){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:me});o=(u?.x??0)+r.x,i=(u?.y??0)+r.y,a="predefined position"}else{let[u,d]=await A8(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=t?.rightClick?"right":"left",l=t?.delayMs??25;return t?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l,clickCount:t?.iterations}),{clickX:o,clickY:i,reason:a}}async function R8(t,e,r){r.info("Download detected, saving file to disk");let n=await t.path(),o=Av(t.suggestedFilename()),i=e();await t.saveAs(g8(i,o)),H0(n,{force:!0}),setTimeout(()=>{H0(i,{recursive:!0,force:!0})},5*60*1e3);let a=i0(h8(i),o);return r.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function w8(t){return t.message.includes("locator.click: Timeout")&&t.message.includes("click action done")}import{platform as x8}from"os";var _8={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function I8(){let t=x8();return t==="win32"?"win32":t==="darwin"?"darwin":"linux"}function j0(t){return JSON.stringify(t.split("+").sort())}function Mg(t,e){let r=I8(),n=j0(t);for(let o of Object.values(_8))if(Object.values(o).some(i=>j0(i)===n))return o[r];return process.platform==="darwin"&&!e?t=t.replaceAll("Control","Meta"):t=t.replaceAll("Meta","Control"),t}async function zv({frame:t,page:e,deltaX:r,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!r&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(t)await er({root:t,fn:([d,p,m,f])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*f),arg:[r,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"scrolling page"});else{let d=e.viewportSize()||Pr,p=await er({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"computing page height"}),[m,f,h]=await er({root:e,fn:()=>{let S=document.activeElement;if(!S)return[void 0,void 0,void 0];let g=S.getBoundingClientRect();return[S.scrollTop,g.x,g.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"computing active element position"});await e.mouse.wheel((r??d.width)*l,(o??d.height)*u);try{let S=Date.now();for(;Date.now()-S<lt;){a?.throwIfAborted();let g=await J(e.evaluate(()=>document.body.scrollHeight),{milliseconds:Je}),[E,y,b]=await J(e.evaluate(()=>{let R=document.activeElement;if(!R)return[void 0,void 0,void 0];let I=R.getBoundingClientRect();return[R.scrollTop,I.x,I.y]}),{milliseconds:Je});if(g===p&&E===m&&y===f&&b===h)break;p=g,m=E,f=y,h=b,await xe(mr)}}catch(S){c.warn({err:S},"Failed to wait for scroll to complete, continuing...")}}}async function Hv(t,e){let r,n;for(let o=0;o<4;o++)try{return r=t.pages(),await Promise.all(r.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await xe(mr)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function Gv(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=t;if(a){await P8(t);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(r+i.x,n+i.y,{steps:o}),await xe(s??_a),await e.mouse.up()}async function V0({page:t,fromLocator:e,toLocator:r,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await r.boundingBox({timeout:me});if(!a)throw new L("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:me});if(!s)throw new L("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await Gv({page:t,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function $0(t,e,r,n){await t.mouse.move(e.x,e.y,{steps:3}),await t.mouse.down(),await t.mouse.move(r.x,r.y,{steps:3}),await xe(Math.min(n.hoverDurationMs??500,Rg)),await t.mouse.up()}async function P8(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=t,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+r,p=i.y+n;await e.evaluate(async({startX:m,startY:f,endX:h,endY:S,stepCount:g,dragDurationMs:E,hoverDurationMs:y})=>{let b=document.elementFromPoint(m,f)??document.body??document.documentElement,_=window._momentic._momenticMobileUtilities.dispatchTouch;_(b,"touchstart",m,f);for(let A=1;A<=g;A+=1){let O=m+(h-m)*A/g,P=f+(S-f)*A/g;_(b,"touchmove",O,P),await new Promise(F=>setTimeout(F,Math.floor((E??500)/g)))}y&&await new Promise(A=>setTimeout(A,y)),_(b,"touchend",h,S)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as F8}from"crypto";import{cloneDeep as $v}from"lodash-es";function Oa(t,e){let r=t.findIndex(n=>n===e);if(!(r===-1||!t[r+1]))return t[r+1]}import{createHash as M8}from"crypto";var O8="v1";function jv(t,e){if(t.tagName.toLowerCase()==="svg"&&!N8(t))try{let r=W0(t,e),n=L8(JSON.stringify(r));return{version:O8,json:r,hash:n}}catch{return}}function L8(t){return M8("md5").update(t).digest("hex")}function W0(t,e){let r=t.tagName.toLowerCase(),n=D8(t);if(r==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:r,props:n,children:[]};for(let i of t.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=W0(a,e);s&&o.children.push(s)}}return o}function N8(t){let e=t.computedStyles.display,r=t.computedStyles.visibility,n=t.computedStyles.opacity;return e==="none"||r==="hidden"||n==="0"}function D8(t){let e={},r=t.attributes;for(let n of Object.keys(r))Cn.visualAttributesForSvgSerialization.includes(n)&&(e[n]=r[n]);return r.id&&t.tagName.toLowerCase()!=="svg"&&(e.id=r.id),e}var Ys={r:147,g:196,b:125,a:.55},K0={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Ys,paddingColor:Ys,borderColor:Ys,marginColor:Ys,eventTargetColor:Ys,shapeColor:Ys,shapeMarginColor:Ys,showInfo:!0,showAccessibilityInfo:!0};function Y0({snapshot:t,devicePixelRatio:e,computedStylesToFetch:r,logger:n}){let o=t.strings,i=t.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=k8({allDocuments:i,stringConstants:o,computedStylesToFetch:r,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function k8({allDocuments:t,stringConstants:e,computedStylesToFetch:r,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=t[o],l=c.layout,u={};l.nodeIndex.forEach((_,A)=>{u[_]=A});let d=l.styles,p=l.bounds??[],m=c.nodes,f=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],S=m.attributes??[],g=m.parentIndex??[],E=m.nodeName??[],y=m.nodeType??[],b=m.pseudoType??{index:[],value:[]},R=m.inputChecked??{index:[]},I=e[c.frameId];for(let _=0;_<h.length;_++){let A=h[_],O=y[_],P=S[_]??[],F=g[_]!==void 0&&g[_]>=0?g[_]:void 0,D=F!==void 0?h[F]:void 0,z=D!==void 0?a[D]:void 0,H=b.index.indexOf(_),ie=H!==-1?e[b.value[H]]:void 0,$=u[_],K;$?K=p[$]??[]:K=[];let X=E[_]!==void 0?e[E[_]]?.toLowerCase():void 0;if(!X){s.warn({backendNodeId:A,frameId:I,frameIndex:o,nodeBounds:K},"DOM node has no tag name");continue}let oe={backendNodeId:A,psuedoType:ie,nodeType:O,frameIndex:o,parentFrameId:I,ownedFrameId:void 0,bounds:{x:K[0]??null,y:K[1]??null,width:K[2]??null,height:K[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:D??null,tagName:X,parent:z??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};z&&z.childrenBackendIds.push(A);let pe=f.index.indexOf(_);if(pe!==-1){let te=f.value[pe];i[te]=oe;let be=t[te]?.frameId;oe.ownedFrameId=be!==void 0?e[be]:void 0}for(let te of Object.keys(oe.bounds)){let be=te;oe.bounds[be]!==null&&(oe.bounds[be]/=n)}let Te=$!==void 0?d[$]??[]:[];for(let te=0;te<Te.length&&!(te>=r.length);te++){let be=Te[te];if(be===void 0||isNaN(be))continue;let Pe=e[be];if(Pe===void 0)continue;let ve=r[te];oe.computedStyles[ve]=Pe}for(let te=0;te<P.length;te+=2){let be=P[te],Pe=P[te+1];if(!be||!Pe)continue;let ve=e[be],x=e[Pe];!ve||!x||(oe.attributes[ve]=x)}R.index.includes(_)&&(oe.attributes.checked="true"),a[oe.backendNodeId]=oe}return a[h[0]]}function Vv(t,e){if(t.mPathSelector)return t.mPathSelector;let r=t.parent,n;if(!r)n=t.tagName;else if(t.tagName==="body")n="body";else{let i=r.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(t.backendNodeId),a=` > ${t.tagName}:nth-child(${i+1})`;n=`${Vv(r,e)}${a}`}return t.mPathSelector=n,n}function q0(t,e){return t.parentBackendNodeId!==null?e.backendIdToNode[t.parentBackendNodeId]:t.frameIndex===0?void 0:e.frameIndexToIframeNode[t.frameIndex]}var U8=["html","#document","#document-fragment"];function X0({node:t,domGraph:e}){let r=[],n=t,o=q0(t,e);if(!o)return[t.tagName];let i=()=>{if(n=o,o=q0(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,U8.includes(n.tagName)){i();continue}if(n.tagName==="body")r.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){r.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return r.reverse()}function J0(t,e){let r=t.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?r=r.frameLocator(a):r=r.locator(a)}}if(n.length&&(r=r.locator(n.join(" > "))),"owner"in r)throw new Error("Final locator from mpath is a frame locator");return r}async function Q0(t,e){await t.send({method:"DOM.getDocument",params:{depth:0},timeout:lt});let r=await t.send({method:"DOM.requestNode",params:{objectId:e},timeout:lt}),o=(await t.send({method:"DOM.getAttributes",params:{nodeId:r.nodeId},timeout:lt})).attributes,i=Oa(o,Ws);if(!i)throw new Error(`Could not find attribute ${Ws} for object ${e}`);return i}var B8=["svg","i"],z8=["focusable","keyshortcuts","controls","live","relevant","orientation"],H8=["selected","readonly","modal","required","invalid"],G8=["id","name","role","content"],Z0=["absolute","fixed","sticky"],j8=["i","label"],V8=["path"],$8=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],rU=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],nU=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],W8=["menulistpopup","statictext","inlinetextbox"],q8=80,eU=100,Wv=50,Yv=["StaticText","ListMarker","RootWebArea","LineBreak","::before","::after"],K8=["cite"],Y8={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"],emphasis:["em"]},X8={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},tU={indentLevel:0},qv=class t{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(r=>{r.name==="keyshortcuts"?this.dataMomenticId=parseInt(r.value.value):this.properties[r.name]=r.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let r=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(r&&r.length<Wv?r:""),this.role=this.role||(e.domNode.attributes.role??""),e9(this.properties,e.domNode,e.importantProperties)}r9(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&V8.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>nU.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>lU(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>cU(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&j8.includes(this.domNode.tagName)||$8.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Cn.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let r=this.properties.class;return typeof r=="string"&&r.split(" ").some(n=>sU(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}canRedirectFromIneligibleTag(){if(!this.domNode)return!1;let e=this.internalProperties.hasExplicitPointingLabel===!0;return t0({tagName:this.domNode.tagName,width:this.domNode.bounds.width,height:this.domNode.bounds.height})&&e}serialize(e=tU){let r=Object.assign({},tU,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=r,l=$v(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m="");let f=this.nameSources?.find(A=>!A.superseded&&A.type==="contents"),h=this.domNode?.attributes.id;f&&this.children.length>0&&(m=h&&h.length<Wv?h:"");let S=this.nameSources?.find(A=>!A.superseded);if(S&&!S.nativeSource&&S.type==="relatedElement"){let A=S.attributeValue?.relatedNodes??[];A.length===1&&A[0].text&&A[0].text===m&&(m="")}let g=Yv.includes(this.role)||K8.includes(this.tagName||"");if(this.role==="StaticText")return`${u}${m}
4944
+ //# sourceURL=momentic-injected/extra-scripts.js`}function _0(t){return t?.split(",").map(e=>e.trim()).filter(e=>e.length>0)??[]}function a8(t){let e=t.indexOf("=");return e===-1?t:t.slice(0,e)}function R0(t,e=process.env.MOMENTIC_CHROME_REMOVE_ARGS){let r=new Set(_0(e));return r.size===0?t:t.filter(n=>{let o=a8(n);return!r.has(n)&&!r.has(o)})}function Nv(t){let e=[],r="";for(let n of t)n==="+"&&r?(e.push(r),r=""):r+=n;return e.push(r),e}var s8=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],l8=["local-network-access"];function I0(t){return $n?t.filter(e=>!l8.includes(e)):t}function P0(t){return I0(t||s8)}var Dv="__momentic_session_storage_initialized";function M0(t){return t.parentFrame!==void 0}async function O0(t,e,r){try{let n=await c8(t);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),r.info(`Saved ${n.entries.length} session storage entries`)}catch(n){r.warn({err:n},"Failed to extract session storage, continuing...")}}async function c8(t){return t.evaluate(e=>{let r=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&r.push({name:o,value:i})}}return{origin:window.location.origin,entries:r}},Dv)}function L0(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n,c=Math.atan2(s,a);return c<0?c+2*Math.PI:c}function N0(t,e){if(!t||!e)return;let r=t.x+t.width/2,n=t.y+t.height/2,o=e.x+e.width/2,i=e.y+e.height/2,a=o-r,s=i-n;return Math.sqrt(a*a+s*s)}function u8(t){return t?t.match(/^\s*<\s*([a-zA-Z0-9-]+)/)?.[1]?.toLowerCase():void 0}function d8(t){if(!t)return;let e=t.match(/\srole\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+))/i);return e?.[1]??e?.[2]??e?.[3]}function kv(t,e){let r=e?.tagName??u8(t.nodeOnlySerializedHtml);if(r&&Qk.includes(r.toLowerCase()))return!0;let n=d8(t.nodeOnlySerializedHtml);return!!(n&&Zk.includes(n.toLowerCase()))}async function p8(t){let{initialLocationResult:e,cacheEvaluationParams:r,locator:n}=t;return n.evaluate((o,i)=>{let s=window._momentic,{initialLocationResult:c,cacheEvaluationParams:l}=i;if(!s?.momenticConstants)throw new Error("Momentic constants not found");if(o.tagName.toLowerCase()!==c.tagName.toLowerCase())return"Tag name mismatch";let u=(o.textContent??"").slice(0,s.momenticConstants.serializedElementForCachingTruncateLength),d=(c.textContent??"").slice(0,s.momenticConstants.serializedElementForCachingTruncateLength);if(u!==d)return"Text content mismatch";for(let[f,h]of Object.entries(c.importantAttributes))if(o.getAttribute(f)!==h)return`Attribute ${f} mismatch`;let p=c.boundingBox.width*c.boundingBox.height,m=o.getBoundingClientRect().width*o.getBoundingClientRect().height;if(p===0||m===0){if(p!==m)return"Area mismatch"}else if(Math.abs(p-m)/p>.05)return"Area mismatch";if(c.identityHash&&s.getElementIdentityHash&&c.identityHash!==s.getElementIdentityHash(o))return"Identity hash mismatch";if(l&&s.evaluatePrimaryCaches){let{css:f,hybrid:h}=s.evaluatePrimaryCaches(l);if(h?.result&&h.result.mPath&&c.mPath&&JSON.stringify(h.result.mPath)!==JSON.stringify(c.mPath))return"Hybrid selector returned a different element than the original";if(!h&&f&&f.result&&f.result.dataMomenticId!==c.dataMomenticId)return"CSS selector returned a different element than the original"}},{initialLocationResult:e,cacheEvaluationParams:r},{timeout:me})}async function Uv(t){let{logger:e}=t;try{let r=await p8(t);if(!r)return;throw e.warn({failReason:r},"Locator no longer matches cache, re-triggering evaluation"),new Wi("Locator no longer matches cache")}catch(r){if(r instanceof Wi)throw r;e.warn({err:r},"Failed to check whether locator has drifted from cache")}}import D0 from"jpeg-js";import m8 from"pixelmatch";function k0(t,e,r=.01){if(t.equals(e))return 0;let n=D0.decode(t),o=D0.decode(e);if(n.width!==o.width||n.height!==o.height)return 100;let i=n.width,a=n.height;return m8(n.data,o.data,null,i,a,{threshold:r})/(i*a)*100}var F0=["date","datetime-local","month","time","week"],U0={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function B0(t){try{await J(f8(t),{milliseconds:me})}catch(e){t.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function f8({root:t,text:e,options:r,logger:n,callbacks:o}){let i=(await er({root:t,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:Je,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!U0[i])return;U0[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),r.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as Zr}from"zod";var z0=Zr.object({doubleClick:Zr.boolean().optional(),rightClick:Zr.boolean().optional(),force:Zr.boolean().optional(),waitForDownload:Zr.boolean().optional(),delayMs:Zr.number().optional(),downloadTimeoutMs:Zr.number().optional(),relativePosition:Zr.object({x:Zr.number(),y:Zr.number()}).optional(),iterations:Zr.number().optional()}),qQe=Zr.object({repeat:Zr.number().optional(),convertMeta:Zr.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Zr.number().optional()});async function Pg({locator:t,callbacks:e,logger:r,timeoutMs:n=Je}){try{await Fv(e,n);let o=t.evaluate(a=>{let c=window._momentic;if(!c)throw new Error("Momentic namespace is not initialized");c.removeHighlightTimers??=[],c.removeHighlightFunctions??={};let l=f=>{let S=window.getComputedStyle(f,null).getPropertyValue("display");if(S==="none"||S==="contents")return!1;let g=f.getBoundingClientRect();return!(!g.height||!g.width)},u=0;for(;!l(a)&&u<3;){if(!a.parentElement)throw new Error("No eligible non-empty parent found for highlighting");a=a.parentElement,u++}let d=a.style.getPropertyValue("outline"),p=a.style.getPropertyPriority("outline");a.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let m=`momentic${Math.floor(Math.random()*1e7)}`;c.removeHighlightFunctions[m]=()=>{a.style.removeProperty("outline"),a.style.setProperty("outline",d,p),a.getAttribute("style")||a.removeAttribute("style")},c.removeHighlightTimers.push(window.setTimeout(()=>{c.removeHighlightFunctions?.[m]?.(),c.removeHighlightFunctions?.[m]&&delete c.removeHighlightFunctions[m]},5e3))},void 0,{timeout:n}).then(()=>!0).catch(a=>(r.debug({err:a},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1));return await J(o,{milliseconds:n})}catch(o){return r.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Fv(t,e=Je){let r=await t.state.getRoot();await er({root:r,fn:()=>{let i=window._momentic;if(!i)return;let a=i.removeHighlightTimers??[];for(;a.length;){let s=a.pop();s!==void 0&&clearTimeout(s)}Object.values(i.removeHighlightFunctions??{}).forEach(s=>{s()})},timeout:e,arg:void 0,waitForPageLoad:t.waitForPageLoad,codePath:"removing element highlights"})}async function Bv(t){let e=!!t.browserCallbacks.state.userBrowserSettings.visualActions;return Ks({action:"clicking element",targetingResult:t.targetingResult,logger:t.logger,retryTimeoutMs:t.retryTimeoutMs,callbacks:t.browserCallbacks,func:async r=>G0({...t,targetingResult:r,useVisualClick:e})})}async function y8({actionSource:t,position:e,targetingResult:r,logger:n}){let{locator:o}=r;if(t!=="click"||e)return{locator:o,position:e,redirected:!1};let i=await r0({targetingResult:r,logger:n});return i?{locator:i.locator,position:i.relativePoint,redirected:!0}:{locator:o,position:e,redirected:!1}}async function E8(t,e){try{return await T8(t,e)}catch(r){throw e.logger.warn({redirectionAttemptError:r,originalError:t},"Error handling click error, rethrowing original error"),t}}async function T8(t,e){let{logger:r,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(t.message.includes("label")&&t.message.includes("for=")&&t.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:Je});if(!i)throw t;let a=o.page().locator(`[for=${JSON.stringify(i)}]`),s=await a.boundingBox({timeout:Je});if(!s||s.width===0||s.height===0)throw r.warn("Label element has no bounding box, throwing original error..."),t;return r.warn({err:t},"Attempting locator redirection due to input being covered by label"),G0({...e,targetingResult:{locator:a,originalElementLocationResult:void 0,serverSideBoundingBox:s},redirectionAttempts:n+1})}else throw r.warn({err:t},"Click error does not match any known recoverable patterns, rethrowing"),t}async function b8(t){let{logger:e,targetingResult:r,position:n,options:o}=t,i=z0.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await C8({targetingResult:r,position:n,options:o,logger:e,isAndroid:t.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function v8(t){let{actionSource:e,targetingResult:r,options:n,logger:o}=t,i=t.targetingResult.locator,a=n?.relativePosition??t.position;({locator:i,position:a}=await y8({actionSource:e,position:a,targetingResult:r,logger:o}));let s=n?.force||r.hints?.force||!1;s&&!a&&r.hints?.relativeXYToLocator&&(a=r.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:me,position:a,delay:n?.delayMs??25,force:s,noWaitAfter:!0}):await i.click({button:n?.rightClick?"right":"left",timeout:me,position:a,delay:n?.delayMs??25,force:s,clickCount:n?.iterations,noWaitAfter:!0})}catch(l){if(w8(l))o.warn({err:l},"Click action timed out while waiting for navigation after completion, continuing...");else{if((t.redirectionAttempts??0)<1)return o.warn({err:l},"Error clicking on locator, attempting to recover..."),E8(l,{...t,targetingResult:r});throw l}}return{locatorSource:c}}async function G0(t){let{options:e,logger:r,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=t,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??mv;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof S8.TimeoutError?new L("ActionFailureError",`Download did not complete in ${u}ms`):new L("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Pg({locator:a.locator,callbacks:n,logger:r,timeoutMs:Je})}catch(u){r.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await b8(t):l=(await v8(t)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new L("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");r.info("Waiting for download to start and complete");let u=await J(s,{milliseconds:e.downloadTimeoutMs??mv});if(u instanceof Error)throw u;return{downloadedFile:await R8(u,o.createIsolatedFolder,r),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function A8(t,e){let r=t.serverSideBoundingBox??await t.locator.boundingBox({timeout:me});if(!r){let i=t.originalElementLocationResult?.serializedElement;throw new L("ActionFailureError",`${ly}${i?`: ${i}`:""}`)}if(t.hints?.relativeXYToLocator){let i=r.x+t.hints.relativeXYToLocator.x,a=r.y+t.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=r.x+r.width/2,o=r.y+r.height/2;return[{x:n,y:o},"halfway point"]}async function C8({options:t,targetingResult:e,position:r,logger:n}){let o,i,a;if(t?.relativePosition){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:me}),d=t.relativePosition.x,p=t.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(t.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(t.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(r){let u=e.serverSideBoundingBox??await e.locator.boundingBox({timeout:me});o=(u?.x??0)+r.x,i=(u?.y??0)+r.y,a="predefined position"}else{let[u,d]=await A8(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=t?.rightClick?"right":"left",l=t?.delayMs??25;return t?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l,clickCount:t?.iterations}),{clickX:o,clickY:i,reason:a}}async function R8(t,e,r){r.info("Download detected, saving file to disk");let n=await t.path(),o=Av(t.suggestedFilename()),i=e();await t.saveAs(g8(i,o)),H0(n,{force:!0}),setTimeout(()=>{H0(i,{recursive:!0,force:!0})},5*60*1e3);let a=i0(h8(i),o);return r.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function w8(t){return t.message.includes("locator.click: Timeout")&&t.message.includes("click action done")}import{platform as x8}from"os";var _8={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function I8(){let t=x8();return t==="win32"?"win32":t==="darwin"?"darwin":"linux"}function j0(t){return JSON.stringify(t.split("+").sort())}function Mg(t,e){let r=I8(),n=j0(t);for(let o of Object.values(_8))if(Object.values(o).some(i=>j0(i)===n))return o[r];return process.platform==="darwin"&&!e?t=t.replaceAll("Control","Meta"):t=t.replaceAll("Meta","Control"),t}async function zv({frame:t,page:e,deltaX:r,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!r&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(t)await er({root:t,fn:([d,p,m,f])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*f),arg:[r,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"scrolling page"});else{let d=e.viewportSize()||Pr,p=await er({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"computing page height"}),[m,f,h]=await er({root:e,fn:()=>{let S=document.activeElement;if(!S)return[void 0,void 0,void 0];let g=S.getBoundingClientRect();return[S.scrollTop,g.x,g.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:lt,codePath:"computing active element position"});await e.mouse.wheel((r??d.width)*l,(o??d.height)*u);try{let S=Date.now();for(;Date.now()-S<lt;){a?.throwIfAborted();let g=await J(e.evaluate(()=>document.body.scrollHeight),{milliseconds:Je}),[E,y,b]=await J(e.evaluate(()=>{let R=document.activeElement;if(!R)return[void 0,void 0,void 0];let I=R.getBoundingClientRect();return[R.scrollTop,I.x,I.y]}),{milliseconds:Je});if(g===p&&E===m&&y===f&&b===h)break;p=g,m=E,f=y,h=b,await xe(mr)}}catch(S){c.warn({err:S},"Failed to wait for scroll to complete, continuing...")}}}async function Hv(t,e){let r,n;for(let o=0;o<4;o++)try{return r=t.pages(),await Promise.all(r.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await xe(mr)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function Gv(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=t;if(a){await P8(t);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(r+i.x,n+i.y,{steps:o}),await xe(s??_a),await e.mouse.up()}async function V0({page:t,fromLocator:e,toLocator:r,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await r.boundingBox({timeout:me});if(!a)throw new L("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:me});if(!s)throw new L("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await Gv({page:t,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function $0(t,e,r,n){await t.mouse.move(e.x,e.y,{steps:3}),await t.mouse.down(),await t.mouse.move(r.x,r.y,{steps:3}),await xe(Math.min(n.hoverDurationMs??500,Rg)),await t.mouse.up()}async function P8(t){let{page:e,deltaX:r,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=t,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+r,p=i.y+n;await e.evaluate(async({startX:m,startY:f,endX:h,endY:S,stepCount:g,dragDurationMs:E,hoverDurationMs:y})=>{let b=document.elementFromPoint(m,f)??document.body??document.documentElement,_=window._momentic._momenticMobileUtilities.dispatchTouch;_(b,"touchstart",m,f);for(let A=1;A<=g;A+=1){let O=m+(h-m)*A/g,P=f+(S-f)*A/g;_(b,"touchmove",O,P),await new Promise(F=>setTimeout(F,Math.floor((E??500)/g)))}y&&await new Promise(A=>setTimeout(A,y)),_(b,"touchend",h,S)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as F8}from"crypto";import{cloneDeep as $v}from"lodash-es";function Oa(t,e){let r=t.findIndex(n=>n===e);if(!(r===-1||!t[r+1]))return t[r+1]}import{createHash as M8}from"crypto";var O8="v1";function jv(t,e){if(t.tagName.toLowerCase()==="svg"&&!N8(t))try{let r=W0(t,e),n=L8(JSON.stringify(r));return{version:O8,json:r,hash:n}}catch{return}}function L8(t){return M8("md5").update(t).digest("hex")}function W0(t,e){let r=t.tagName.toLowerCase(),n=D8(t);if(r==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:r,props:n,children:[]};for(let i of t.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=W0(a,e);s&&o.children.push(s)}}return o}function N8(t){let e=t.computedStyles.display,r=t.computedStyles.visibility,n=t.computedStyles.opacity;return e==="none"||r==="hidden"||n==="0"}function D8(t){let e={},r=t.attributes;for(let n of Object.keys(r))Cn.visualAttributesForSvgSerialization.includes(n)&&(e[n]=r[n]);return r.id&&t.tagName.toLowerCase()!=="svg"&&(e.id=r.id),e}var Ys={r:147,g:196,b:125,a:.55},K0={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Ys,paddingColor:Ys,borderColor:Ys,marginColor:Ys,eventTargetColor:Ys,shapeColor:Ys,shapeMarginColor:Ys,showInfo:!0,showAccessibilityInfo:!0};function Y0({snapshot:t,devicePixelRatio:e,computedStylesToFetch:r,logger:n}){let o=t.strings,i=t.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=k8({allDocuments:i,stringConstants:o,computedStylesToFetch:r,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function k8({allDocuments:t,stringConstants:e,computedStylesToFetch:r,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=t[o],l=c.layout,u={};l.nodeIndex.forEach((_,A)=>{u[_]=A});let d=l.styles,p=l.bounds??[],m=c.nodes,f=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],S=m.attributes??[],g=m.parentIndex??[],E=m.nodeName??[],y=m.nodeType??[],b=m.pseudoType??{index:[],value:[]},R=m.inputChecked??{index:[]},I=e[c.frameId];for(let _=0;_<h.length;_++){let A=h[_],O=y[_],P=S[_]??[],F=g[_]!==void 0&&g[_]>=0?g[_]:void 0,D=F!==void 0?h[F]:void 0,z=D!==void 0?a[D]:void 0,H=b.index.indexOf(_),ie=H!==-1?e[b.value[H]]:void 0,$=u[_],K;$?K=p[$]??[]:K=[];let X=E[_]!==void 0?e[E[_]]?.toLowerCase():void 0;if(!X){s.warn({backendNodeId:A,frameId:I,frameIndex:o,nodeBounds:K},"DOM node has no tag name");continue}let oe={backendNodeId:A,psuedoType:ie,nodeType:O,frameIndex:o,parentFrameId:I,ownedFrameId:void 0,bounds:{x:K[0]??null,y:K[1]??null,width:K[2]??null,height:K[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:D??null,tagName:X,parent:z??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};z&&z.childrenBackendIds.push(A);let pe=f.index.indexOf(_);if(pe!==-1){let te=f.value[pe];i[te]=oe;let be=t[te]?.frameId;oe.ownedFrameId=be!==void 0?e[be]:void 0}for(let te of Object.keys(oe.bounds)){let be=te;oe.bounds[be]!==null&&(oe.bounds[be]/=n)}let Te=$!==void 0?d[$]??[]:[];for(let te=0;te<Te.length&&!(te>=r.length);te++){let be=Te[te];if(be===void 0||isNaN(be))continue;let Pe=e[be];if(Pe===void 0)continue;let ve=r[te];oe.computedStyles[ve]=Pe}for(let te=0;te<P.length;te+=2){let be=P[te],Pe=P[te+1];if(!be||!Pe)continue;let ve=e[be],x=e[Pe];!ve||!x||(oe.attributes[ve]=x)}R.index.includes(_)&&(oe.attributes.checked="true"),a[oe.backendNodeId]=oe}return a[h[0]]}function Vv(t,e){if(t.mPathSelector)return t.mPathSelector;let r=t.parent,n;if(!r)n=t.tagName;else if(t.tagName==="body")n="body";else{let i=r.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(t.backendNodeId),a=` > ${t.tagName}:nth-child(${i+1})`;n=`${Vv(r,e)}${a}`}return t.mPathSelector=n,n}function q0(t,e){return t.parentBackendNodeId!==null?e.backendIdToNode[t.parentBackendNodeId]:t.frameIndex===0?void 0:e.frameIndexToIframeNode[t.frameIndex]}var U8=["html","#document","#document-fragment"];function X0({node:t,domGraph:e}){let r=[],n=t,o=q0(t,e);if(!o)return[t.tagName];let i=()=>{if(n=o,o=q0(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,U8.includes(n.tagName)){i();continue}if(n.tagName==="body")r.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],p=e.backendIdToNode[d];if(d===n.backendNodeId){r.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return r.reverse()}function J0(t,e){let r=t.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?r=r.frameLocator(a):r=r.locator(a)}}if(n.length&&(r=r.locator(n.join(" > "))),"owner"in r)throw new Error("Final locator from mpath is a frame locator");return r}async function Q0(t,e){await t.send({method:"DOM.getDocument",params:{depth:0},timeout:lt});let r=await t.send({method:"DOM.requestNode",params:{objectId:e},timeout:lt}),o=(await t.send({method:"DOM.getAttributes",params:{nodeId:r.nodeId},timeout:lt})).attributes,i=Oa(o,Ws);if(!i)throw new Error(`Could not find attribute ${Ws} for object ${e}`);return i}var B8=["svg","i"],z8=["focusable","keyshortcuts","controls","live","relevant","orientation"],H8=["selected","readonly","modal","required","invalid"],G8=["id","name","role","content"],Z0=["absolute","fixed","sticky"],j8=["i","label"],V8=["path"],$8=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],rU=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],nU=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],W8=["menulistpopup","statictext","inlinetextbox"],q8=80,eU=100,Wv=50,Yv=["StaticText","ListMarker","RootWebArea","LineBreak","::before","::after"],K8=["cite"],Y8={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"],emphasis:["em"]},X8={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},tU={indentLevel:0},qv=class t{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(r=>{r.name==="keyshortcuts"?this.dataMomenticId=parseInt(r.value.value):this.properties[r.name]=r.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let r=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(r&&r.length<Wv?r:""),this.role=this.role||(e.domNode.attributes.role??""),e9(this.properties,e.domNode,e.importantProperties)}r9(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&V8.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>nU.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>lU(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>cU(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&j8.includes(this.domNode.tagName)||$8.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Cn.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let r=this.properties.class;return typeof r=="string"&&r.split(" ").some(n=>sU(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}canRedirectFromIneligibleTag(){if(!this.domNode)return!1;let e=this.internalProperties.hasExplicitPointingLabel===!0;return t0({tagName:this.domNode.tagName,width:this.domNode.bounds.width,height:this.domNode.bounds.height})&&e}serialize(e=tU){let r=Object.assign({},tU,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=r,l=$v(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m="");let f=this.nameSources?.find(A=>!A.superseded&&A.type==="contents"),h=this.domNode?.attributes.id;f&&this.children.length>0&&(m=h&&h.length<Wv?h:"");let S=this.nameSources?.find(A=>!A.superseded);if(S&&!S.nativeSource&&S.type==="relatedElement"){let A=S.attributeValue?.relatedNodes??[];A.length===1&&A[0].text&&A[0].text===m&&(m="")}let g=Yv.includes(this.role)||K8.includes(this.tagName||"");if(this.role==="StaticText")return`${u}${m}
4945
4945
  `;let E=`${u}<${p}`;!a&&!g&&(E+=` id="${this.id}"`);let y=s??!1;(l.multiline||l.contenteditable)&&this.children.length>0&&(y=!0),d&&d!=="generic"&&d!==p&&!(Y8[d]??[]).includes(p)&&(E+=` role=${JSON.stringify(d)}`),m&&(E+=` name=${JSON.stringify(m)}`),this.content&&!y&&(E+=` content=${JSON.stringify(this.content)}`);let b=this.isIneligible(),R=b&&this.canRedirectFromIneligibleTag();if(this.flagNotActionableNodes&&this.tagName!=="#document"&&b&&!R&&(E+=` ${Cn.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let A=this.domNode.bounds,O=Math.round(A.x??0),P=Math.round(A.y??0),F=Math.round((A.x??0)+(A.width??0)),D=Math.round((A.y??0)+(A.height??0));E+=` bounds=[${O} ${P} ${F} ${D}]`}let I=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-I>1e3)throw new Error(`Serialization for the HTML element with tag ${p} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([A,O])=>{if(!z8.includes(A)){{if(H8.includes(A)&&(!O||O==="false"))return;if(A==="value"&&y&&(l.type==="text"||this.role==="textbox"))return;if(A==="level"&&`${O}`=="1")return;if(A==="url"&&l.src&&p==="img")return;if(A==="url"&&l.href&&p==="a")return;if(A==="editable"&&O==="plaintext")return;if(A==="type"&&O===p)return;if(c&&!X8[A])return}typeof O=="string"?E+=` ${A}="${ht(O,eU,!0)}"`:typeof O=="boolean"?O?E+=` ${A}`:E+=` ${A}={false}`:typeof O<"u"&&(E+=` ${A}={${ht(JSON.stringify(O),eU,!0)}}`)}})}if(p==="::before"||p==="::after"){let A="";for(let O of this.children)A+=O.serialize({...e,indentLevel:n,neighbors:0});return A}let _=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||_)E+=` />
4946
4946
  `;else{let A="";for(let P of this.children)A+=P.serialize({...e,indentLevel:n+2,neighbors:0});let O=A.trim();O.length<=q8&&!O.includes(`
4947
4947
  `)?E+=`>${O}</${p}>
@@ -4953,12 +4953,12 @@ ${P||""}`}return E}shallowClone(){let e=new t({id:this.id,role:this.role,name:th
4953
4953
  //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Lv(i,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let s=d=>this.handleNewPageEvent(d);this.context.on("page",s),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",s)});let c=!1;if(n){let d=async()=>{let p=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${dv.htmlUtilsLibJs}
4954
4954
  //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Lv(i,this.userBrowserSettings.disableFullStory)})])}catch(m){if(m instanceof Error&&(m.message.includes("Content Security Policy")||m.message.includes("TrustedScript")))this.logger.warn({err:m},"Content Security Policy error from adding Momentic scripts, reloading page instead"),c=!0;else throw m}(o??{})["add-init-scripts"]=Date.now()-p};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&b9()==="darwin"&&h9("system_profiler SPDisplaysDataType").toString().includes("Retina"))v.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let p=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-p};a.push(d())}let l=Date.now();await J(Promise.all(a),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let u=Date.now();(o??{})["ops-attach"]=u-l,c&&await this.page.reload(),this.cdpClient=await Og.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(o??{})["cdp-init"]=Date.now()-u,await this.initializeScreencast(),this.stateManager=new Dg({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let r=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:r}})}catch{}})()})}))}static async init(e){let r=await x0(e),n=new t(r);return await n.initialize({grantPermissions:!0,permissionsToGrant:e.userBrowserSettings.grantedPermissions,runInitScripts:!1}),n}static async fromExistingContext({context:e,page:r,attachTimeoutMs:n,storage:o,enricher:i,userBrowserSettings:a,properties:s,logger:c,timingRecorder:l}){let u=r??e.pages()[0];if(!u)throw new Error("No page found in existing context");let d=u.viewportSize();if(!d){let f=Date.now();d=await J(u.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),{milliseconds:n??1/0,message:"Timed out connecting Playwright to the webview"}),l["eval-viewport"]=Date.now()-f}let p=u?.url(),m=new t({browser:e.browser(),context:e,page:u,baseUrl:p,logger:c,storage:o,enricher:i,userBrowserSettings:a,viewport:d,properties:s,clientCallbacks:void 0,iconKnowledgeBase:null});try{await J(m.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:l}),{milliseconds:n??1/0,message:"Timed out connecting Playwright to the webview"})}catch(f){throw await m.cleanup(),f}return m}async handleAvailableTabsChangeHelper(){try{let e=await Hv(this.context,{getTitles:!0}),r=this.page.url();this.clientCallbacks?.onTabsChange?.(e,r)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,r){let n=kg(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await J(r(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let r=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Ds(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>r())}handleNewPageEvent(e){let r=e.url();this.logger.info({url:r},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let r=kg(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{c0(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(p0(this.logger,r,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=EU(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await wv({pageId:r,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",y0(this.customHeaders,this.logger))),$n&&await e.route("**/*",dp),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let r=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${r.slice(0,50)} (${n})`;if(!r||r==="about:blank"||!Ds(r))return;let i=this.recentFrameNavigations[o];if(i&&Date.now()-i<1e3)return;this.recentFrameNavigations[o]=Date.now();let a=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(c){this.logger.warn({err:c},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s,url:r,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>a())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._momentic._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let a=window._momentic;a._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(r){this.logger.warn({err:r},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),waitForStability:e=>this.waitForStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await J(Fv(this.getBrowserCallbacks()),{milliseconds:Je})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,r,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Vc;){a++,n?.throwIfAborted();try{if(await er({fn:()=>{let l=window._momentic;return!!(l.generateCssSelectors&&l.evaluateCssSelectors&&l.evaluatePrimaryCaches&&l.generateHtmlCacheAttributes&&l.ldist)},timeout:Je,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad({signal:n}),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){r.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await xe(mr),a%2===0&&r.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),er({root:e,fn:()=>{let n=window._momentic;if(!n.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return n.getFullHtmlTree()},arg:void 0,timeout:me,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let r=window._momentic,n=[],o=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(i=>{o.set(i,{value:i.style.getPropertyValue("caret-color"),priority:i.style.getPropertyPriority("caret-color")}),i.style.setProperty("caret-color","transparent","important")}),n.push(()=>{for(let[i,a]of o)i.style.setProperty("caret-color",a.value,a.priority)}),r._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let i of n)i();delete r._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._momentic._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:r=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:r});if(a.byteLength>5e6)this.logger.warn("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(r<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await xe(_a),this.screenshot({...e,retries:r-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:r,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:r,optimizeForSpeed:!0},timeout:o??lt}),c=Buffer.from(s.data,"base64"),l=await vU.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&y9(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:me});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:f,width:h,height:S}=p;if(!h||!S)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),f=Math.floor(f),h=Math.floor(h),S=Math.floor(S);try{let g=await vU.fromBuffer(c),E=g.bitmap.width,y=g.bitmap.height;m=Math.max(0,Math.min(m,E-1)),f=Math.max(0,Math.min(f,y-1)),h=Math.max(1,Math.min(h,E-m)),S=Math.max(1,Math.min(S,y-f)),c=await g.crop({x:m,y:f,w:h,h:S}).getBuffer("image/jpeg")}catch(g){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${f}) with size (${h}, ${S}): ${g}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:r=!1,loadTimeoutMs:n=this.pageLoadTimeout}){sD(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();r||(await this.waitForPageLoad(),await this.waitForStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.shouldIgnorePageLoadTimeout(a)){i=!0,this.logger.warn({err:a,url:e},"DOMContentLoaded timed out during navigation, continuing due to browser setting");break}if(this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await xe(mr),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:Je})}if(!i)throw new L("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(Jk.has(s))throw new L("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,r={},n=!1){await this.directTypeHelper(e,r,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await er({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:Je,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(r){this.logger.warn({err:r},"Failed to get active element");return}}async directTypeHelper(e,r={},n=!1){let o=await this.getActivePageOrFrame();await B0({root:o,text:e,options:r,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await xe(_a),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(r.clearContent)if(a||r.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:r.delay??XC}),r.pressEnter&&await this.press("Enter",{}),await this.waitForStability()}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:lt})}catch(r){this.logger.warn({err:r},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView({block:"nearest"}),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:lt})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:r}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(r.locator),!0}catch(r){return this.logger.debug({err:r,id:e},"Failed to highlight target"),!1}}async highlight(e){return Pg({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let r=new URL(e).origin;if(r==="null")return;this.originsVisited.add(r)}catch(r){this.logger.warn({err:r},"Failed to record origin visited")}}async waitForPageLoad(e){let r=e?.signal??this.abortSignal,n=Date.now(),o=Object.values(this.pageLoadPromises),i=Object.keys(this.pageLoadPromises),a=-1,s=0;for(;o.length!==0;){if(r?.throwIfAborted(),Date.now()-n>this.pageLoadTimeout){this.logger.warn({outstandingPromiseKeys:i,outstandingPromises:o},"Timed out waiting on page load promises, continuing anyways...");break}if(Date.now()-a<20&&(s++,s>2)){this.logger.error({outstandingPromiseKeys:i,outstandingPromises:o},"Synchronous waiting loop detected, exiting page load wait");return}a=Date.now(),await Promise.allSettled(o),o=Object.values(this.pageLoadPromises),i=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:Je}),this.originsVisited.delete(o);let r=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await l0(i,this.logger),o!==r&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForStability()}async loadAuthStateHelper(e){let r=[];for(let c of e.cookies??[]){let l=await this.setCookie(c);r=r.concat(l)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`);let n=0,o=[];await this.cdpClient.withDomainEnabled({domain:"DOMStorage",timeout:Je,fn:async()=>{for(let c of e.origins??[])for(let l of c.localStorage)try{await this.cdpClient.send({timeout:Je,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(c.origin).origin,isLocalStorage:!0},key:l.name,value:l.value}}),n++}catch(u){o.some(d=>d.origin===c.origin&&d.key===l.name)||o.push({key:l.name,origin:c.origin,err:u});continue}}}),o.length>0&&this.logger.warn({failedOrigins:o,currentPageUrl:this.page.url()},"Failed to set localStorage for entries, continuing..."),this.logger.info(`Loaded ${n} local storage entries`);let i={},a=0;for(let c of e.origins??[])if(c.sessionStorage&&c.sessionStorage.length>0){let l={};for(let u of c.sessionStorage)l[u.name]=u.value,a++;i[new URL(c.origin).origin]=l}a>0&&await this.context.addInitScript(({storageByOrigin:c,markerKey:l})=>{let u=window.location.origin,d=c[u];if(d&&!window.sessionStorage.getItem(l)){for(let[p,m]of Object.entries(d))window.sessionStorage.setItem(p,m);window.sessionStorage.setItem(l,"1")}},{storageByOrigin:i,markerKey:Dv}),this.logger.info(`Loaded ${a} session storage entries`);let s=e.idb;s&&Object.keys(s).length>0&&(await s0(this.page,s,this.logger),this.logger.info(`Loaded ${Object.keys(s??{}).length} indexedDB databases`))}async saveAuthState(){let r=0,n=null;for(;r<=2;)try{await this.waitForPageLoad(),await this.waitForStability();let o=await this.context.storageState();return o.idb=await a0(this.page,this.logger),await O0(this.page,o,this.logger),o}catch(o){if(n=o,r++,r<=2){this.logger.warn({err:o,retryCount:r,maxRetries:2},`Error saving auth state, retrying (${r}/2)...`);let i=Math.pow(2,r)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new L("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Hv(this.context,e)}saveA11yDetailsToCache(e,r){r.content=e.content,r.name=e.name,r.role=e.role,r.numChildren=e.children.length,delete r.serializedForm,delete r.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:r,locator:n,originalElementLocationResult:o,allowNotActionableNodesOverride:i,logger:a=this.logger,skipSavingVisualAttributes:s=!1}){if(e&&this.saveA11yDetailsToCache(e,r),r.frameCache=this.stateManager.saveAutoFrameCacheDetails(r.frameCache),n)try{let c=await this.fetchHtmlAttributes({locator:n,logger:a,originalElementLocationResult:o,allowNotActionableNodesOverride:i});c?(r.generatedSelectors=c.generatedSelectors,r.serializedHtml=c.serializedHtml,r.nodeOnlySerializedHtml=c.nodeOnlySerializedHtml,r.hybridSelector=c.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(c){if(c instanceof Ol)throw a.warn({err:c},"Error while fetching HTML attributes triggering retry"),c;a.warn({err:c},"Failed to fetch HTML attributes for target, continuing...")}try{s||await this.saveElementVisualAttributes({target:r,locator:n,originalElementLocationResult:o,logger:a})}catch(c){a.debug({err:c},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:r,originalElementLocationResult:n,logger:o}){if(!r||!kv(e,n))return;let i=await r.boundingBox({timeout:Je});if(!i||!i.width||!i.height){o.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}let a=this.getViewport();if(i.x<0||i.y<0||!a||i.x+i.width>a.width||i.y+i.height>a.height)return;let{x:s=0,y:c=0,width:l=0,height:u=0}=i;if(e.boundingBox&&Math.abs(e.boundingBox.width-l)<1&&Math.abs(e.boundingBox.height-u)<1&&Math.abs((e.boundingBox.x??0)-s)<1&&Math.abs((e.boundingBox.y??0)-c)<1)return;e.boundingBox=i;let d=await this.screenshot({locator:r,quality:75,retries:0}),p=kg(),m="image/jpeg";(async()=>{try{await this.storage.createOnDemandScreenshot(p,d,m)}catch(f){this.logger.warn({err:f,screenshotId:p},"Failed to persist on-demand screenshot")}})(),e.screenshotUrl={id:p,contentType:"image/jpeg"}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,boundingBox:r,locator:n,requirements:o}){let i={},a=!!o?.position&&o.position!=="irrelevant",s=!!o?.shape&&o.shape!=="irrelevant";if(a||s){if(!r||!r.width||!r.height)throw new L("ActionFailureError","Element does not have a bounding box as required");s&&(i.shape={width:r.width,height:r.height,tolerance:o.shape}),a&&(i.position={x1:r.x,y1:r.y,x2:r.x+r.width,y2:r.y+r.height,tolerance:o.position})}if(o?.text){let c=await n.textContent({timeout:me});i.text=c?.trim().slice(0,Cn.serializedElementForCachingTruncateLength)}if(o?.attributes&&o.attributes.length>0){let c={};for(let l of o.attributes){let u=l.trim().toLowerCase();if(!(!u||Cn.bannedAiRequiredCacheAttributes.includes(u)))try{let d=await n.getAttribute(u,{timeout:me});d!==null&&(c[l]=d)}catch(d){e.warn({err:d,attr:l},"Failed to fetch required attribute, continuing...")}}i.attributes=c}return i}async getAdditionalDetailsForElement({mainLocator:e,mainBoundingBox:r,additionalElement:n,root:o,logger:i}){let a=this.stateManager.a11yIdToNodeMap[n.id];if(!a)return;let s=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:o,node:a});if(e.contentFrame!==s.contentFrame)return;let c=await this.fetchHtmlAttributes({locator:s,logger:i});if(!c?.generatedSelectors||c.generatedSelectors.length===0)return;let l=await s.boundingBox({timeout:me}),u={selectors:c.generatedSelectors,relativeAngleRadians:L0(r,l),relativeDistance:N0(r,l)};return n.requirements&&(u.requirements=await this.getElementRequiredValues({logger:i,locator:s,boundingBox:l,requirements:n.requirements})),u}async getAllAdditionalElementsDetails({mainElementId:e,mainLocator:r,mainBoundingBox:n,additionalElements:o,root:i,logger:a}){let s=new Set,c=[];for(let d of o)d.id!==e&&(s.has(d.id)||(s.add(d.id),c.push(d)));let l=await Promise.allSettled(c.map(d=>this.getAdditionalDetailsForElement({mainLocator:r,mainBoundingBox:n,additionalElement:d,root:i,logger:a}))),u=[];for(let[d,p]of l.entries()){let m=c[d];if(m){if(p.status==="fulfilled"){let f=p.value;if(!f)continue;u.push(f);continue}this.logger.warn({err:p.reason,additionalElement:m},"Failed to fetch additional element details, continuing...")}}return u}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:r,additionalElements:n,target:o,locator:i,root:a,logger:s}){let c=await i.boundingBox({timeout:me});if(r)try{o.requirements=await this.getElementRequiredValues({logger:s,boundingBox:c,locator:i,requirements:r})}catch(l){s.warn({err:l},"Failed to generate required values for target")}n&&n.length>0&&(o.additionalElements=await this.getAllAdditionalElementsDetails({mainElementId:e,mainBoundingBox:c,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:r,targetSource:n,skipSaveToCache:o,skipSavingVisualAttributes:i,logger:a=this.logger,requirements:s,additionalElements:c}){if(e<0)throw new L("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let l=this.stateManager.a11yIdToNodeMap[e];if(!l)throw new L("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let u=this.stateManager.frameConfig,d,p,m,f;if(this.userBrowserSettings.autoExpandIframes&&!u&&l.parentFrame){let b=l.parentFrame,{cache:R,config:I}=await this.stateManager.getAutoFrameDetailsFromHandle(b);p=R,m=I,d=I.frame,f="auto iframe"}else l.parentFrame&&u?(m=u,d=await this.getActivePageOrFrame(),f="hardcoded url already on the state manager"):(d=await this.getActivePageOrFrame(),f="should not be possible");let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:d,node:l}),S=await h.evaluate(b=>window._momentic.generateCommonLocationResultMetadata(b),void 0,{timeout:lt}),g={id:e,inputDescription:r??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:at(a),frameCache:p},E,y=!1;o||(m&&(a.info({frameConfigSource:f,frameConfig:hU(m)},"A11y node was resolved to a target within an iframe"),E=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),y=!0),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:s,additionalElements:c,target:g,root:d,locator:h,logger:a}),await this.updateCacheWithNewNodeDetails({node:l,target:g,locator:h,logger:a,allowNotActionableNodesOverride:!0,skipSavingVisualAttributes:i,originalElementLocationResult:S}));try{return{resolution:{locator:h,a11yNode:l,displayString:l.getNodeOnlySerializedForm(),originalElementLocationResult:S,decisions:[]},target:g,frameConfig:m,frameConfigSource:f}}finally{y&&this.stateManager.setActiveFrameConfig(E)}}async resolveTarget(e,r={}){let{logger:n=this.logger,signal:o=this.abortSignal,allowNotActionableNodesOverride:i,skipWaitForPageLoad:a}=r;if(e.frameCache&&this.userBrowserSettings.autoExpandIframes){let d,p=!1,m=Date.now();for(;Date.now()-m<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(e.frameCache);this.setActiveFrameConfig(f),p=!0;break}catch(f){d=f,await xe(mr,o)}if(!p)throw d}let s=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(s,n,o);let c=Date.now(),l=0,u;for(;Date.now()-c<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),l++;let d=l===2||Date.now()-c>this.smartWaitingTimeout-2e3&&l%2===0;try{u=await this.resolveTargetHelper({root:s,target:e,primaryOnly:!0,shouldLogOnFailure:d,logger:n,allowNotActionableNodesOverride:i,signal:o,skipWaitForPageLoad:a});break}catch(p){if(p instanceof Ou)break;o?.throwIfAborted(),d&&n.warn({err:p},`Could not resolve target using primary cache only (x${l})`),await xe(mr,o)}}return u||(u=await this.resolveTargetHelper({root:s,target:e,primaryOnly:!1,logger:n,signal:o,allowNotActionableNodesOverride:i}),n.info({decisions:u.decisions},"Target resolution succeeded after waiting")),u}async resolveTargetHelper({root:e,target:r,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipWaitForPageLoad:c,skipSavingVisualAttributes:l}){let u=[],d;if(c||await this.waitForPageLoad(),this.userBrowserSettings.visualActions)await this.waitForStability({logger:o,signal:i});else{let m={};await this.stateManager.getFrameTreeAndAddMomenticIds({skipPageLoad:!0,logger:o,signal:i,logTimings:m}),Object.values(m).some(f=>f>750)&&o.warn({logTimings:m},"Momentic ID attach took a long time")}let p;if(r.generatedSelectors||r.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:r,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s,skipSavingVisualAttributes:l})}catch(f){p=f,f instanceof rn&&(u.push(...f.decisions),d=f.cacheMissReason)}if(m)return{...m,decisions:[...u,...m.decisions]};n||(u.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:mp(r.generatedSelectors??[])}),r.generatedSelectors=void 0,r.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,target:r,decisions:u,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:l});if(m)return r.targetSource="HEURISTIC_HEALED",r.targetUpdateTime=new Date().toISOString(),r.targetUpdateLoggerTags=at(o),m;d=d??"secondary-resolution-failed"}throw new rn("Could not find any relevant node given target",u,d)}async resolveTargetWithPrimaryMethods({root:e,target:r,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i,skipSavingVisualAttributes:a}){if(!r.nodeOnlySerializedHtml)throw new Ou("Insufficient data to resolve target using primary methods (missing node HTML)");let s={x:0,y:0};if(M0(e)){let P=await(await e.frameElement()).boundingBox();P&&(s=P)}let c=i?n:Ho,l=this.userControlledBrowserSettings.hybridSelectorMode,u=r.boundingBox,d=!!u?.width&&!!u?.height,p=!o&&d,m=this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange&&d?u:void 0,f={ldistThreshold:Xk,requireBoundingBox:p,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:m,requirements:r.requirements,additionalElements:r.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},rootBoundingBox:s},h={cssParams:{selectors:r.generatedSelectors??[],cachedElementSerialized:r.nodeOnlySerializedHtml,opts:f},hybridParams:l&&r.hybridSelector?{nodes:r.hybridSelector,cachedElementSerialized:r.nodeOnlySerializedHtml,opts:f}:void 0},{css:S,hybrid:g}=await er({fn:P=>window._momentic.evaluatePrimaryCaches(P),arg:h,root:e,timeout:me,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),E,y,b=[];if((l==="prefer"||l==="always")&&g?.result){E=g.result;let P={type:"HYBRID_SELECTOR",matched:!0,logs:g.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};b.push(P),y="HYBRID_SELECTOR"}else{if(l==="always"&&!g?.result)throw b.push({type:"HYBRID_SELECTOR",matched:!1,reason:g&&g.logs.length>1?"No hybrid selectors matched":"Hybrid evaluation failed",logs:g?.logs}),g?.error&&n.error({err:new Error(g.error)},"Cache evaluation errored unexpectedly"),new rn("Hybrid selector failed to find an element",b,g?.cacheMissReason);if(S?.result){E=S.result;let P=`${E.workingSelectors.length} CSS selectors matched the following element: ${E.serializedElement}`,F=E.workingSelectors.slice(0,5);b.push({type:"CSS_SELECTOR",matched:!0,logs:S.logs,reason:P,selectors:F}),n.debug({reason:P,workingSelectors:F},"Resolved with CSS selectors"),y="CSS_SELECTOR"}else throw b.push({type:"CSS_SELECTOR",matched:!1,reason:S.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:S.logs}),g&&b.push({type:"HYBRID_SELECTOR",matched:!1,reason:g.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:g.logs}),S?.error&&n.error({err:new Error(S.error)},"Cache evaluation errored unexpectedly (CSS)"),g?.error&&n.error({err:new Error(g.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new rn("Cache evaluation failed",b,S.cacheMissReason)}let R,I,_;if(this.userBrowserSettings.visualActions){let P=E.mPath;if(!P)throw new Error("Found element did not have an mPath despite using visual actions");let F=P.join(" > ");R=e.locator(F),I=this.stateManager.getNodeUsingMPathSelector(F)}else if(E.dataMomenticId!==void 0)_=parseInt(E.dataMomenticId),I=this.stateManager.getNodeUsingDataMomenticId(_),"workingSelectors"in E?R=e.locator(E.workingSelectors[0]):R=e.locator(Oi(_));else throw new L("InternalWebAgentError","Received an element resolution result with no identifying attributes");let A=mp(r);await this.updateCacheWithNewNodeDetails({node:I,target:r,locator:R,logger:n,originalElementLocationResult:E,allowNotActionableNodesOverride:o,skipSavingVisualAttributes:a});let O=Zv(A,r);return O&&Object.keys(O).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=at(n),r.cacheResolutionUpdateSource=y),{a11yNode:I,displayString:E.serializedElement,locator:R,decisions:b,originalElementLocationResult:E,revalidator:async()=>{await Uv({initialLocationResult:E,cacheEvaluationParams:h,locator:R,logger:n})}}}async resolveHardcodedCssSelector(e){let{selector:r,signal:n=this.abortSignal,timeoutMs:o=this.smartWaitingTimeout}=e,i=await this.getActivePageOrFrame(),a=Date.now(),s=0,c,l=[];for(;Date.now()-a<o;){n?.throwIfAborted(),s++;let u=i.locator(r),d;try{await u.waitFor({state:"attached",timeout:Je});let p=await u.evaluate(m=>window._momentic.generateCommonLocationResultMetadata?.(m),void 0,{timeout:lt});return d=p?.serializedElement??"unknown element",l.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${r} matched an element on the page.`}),{locator:u,originalElementLocationResult:p,displayString:d,decisions:l}}catch(p){let m=p.message;c=new L("ActionFailureError",`CSS selector '${r}' failed to resolve after ${s} attempts: ${m.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":m}`),await xe(mr,n)}}throw c}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:r,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:me});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!r||!n||!c||!l){this.logger.debug({oldX:r,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-r)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:r,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:r,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s}){if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.trim().length<Yk){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(r.nodeOnlySerializedHtml&&r.nodeOnlySerializedHtml.length>50)try{let l=await er({fn:u=>window._momentic.findClosestElementByLDist?.(u),arg:{nodeOnlySerializedHtml:r.nodeOnlySerializedHtml},timeout:lt,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"});if(!l)throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`);if("closestDistance"in l&&("dataMomenticId"in l&&l?.dataMomenticId||"mPath"in l&&l?.mPath)){let u=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,d,p;if(u)d=this.stateManager.getNodeUsingDataMomenticId(u),p=e.locator(Oi(u));else if(l.mPath){let S=l.mPath.join(" > ");d=this.stateManager.getNodeUsingMPathSelector(S),p=e.locator(S)}else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let m=l.serializedElement;o.warn({result:l,originalTarget:r,displayString:m},"Resolved cached target to new node with pure html levenshtein distance");let f=mp(r);await this.updateCacheWithNewNodeDetails({node:d,target:r,locator:p,logger:o,originalElementLocationResult:l,allowNotActionableNodesOverride:a,skipSavingVisualAttributes:s});let h=Zv(f,r);return h&&Object.keys(h).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=at(o),r.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:h,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:"Found an element on the page with the same string representation as the saved element.",logs:l.logs,distance:l.closestDistance,closestElement:m,savedElement:r.nodeOnlySerializedHtml}),{locator:p,a11yNode:d,displayString:m,decisions:n,originalElementLocationResult:l,revalidator:async()=>{await Uv({initialLocationResult:l,locator:p,logger:o})}}}else if("cacheMissReason"in l)throw new Error(l.error??l.cacheMissReason)}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let c=r.screenshotUrl;if(c&&kv(r))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:r,screenshot:c,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions]}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshot:e,oldTarget:r,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),s;if(typeof e=="string"){let E=await fetch(e);s=Buffer.from(await E.arrayBuffer())}else({data:s}=await this.storage.fetchOnDemandScreenshot(e));let c=C9(),l=await this.enricher.runTemplateMatching({id:c,searchImageBase64String:s.toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n});await this.stateManager.getDomGraph({devicePixelRatio:this.devicePixelRatio,logger:this.logger,signal:n});let{target:u,locator:d}=await this.getTargetFromPositionPercentages({percentX:l.x,percentY:l.y,allowNotActionableNodesOverride:o}),p=u.boundingBox?.width,m=u.boundingBox?.height;if(!p||!m)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let f=u.dataMomenticId??(u.id>0?u.id:void 0),h=f!==void 0?this.stateManager.getNodeUsingDataMomenticId(f):void 0,S=mp(r);await this.updateCacheWithNewNodeDetails({target:r,node:h,locator:d,allowNotActionableNodesOverride:o});let g=Zv(S,r);return g&&Object.keys(g).length>0&&(r.cacheResolutionUpdateTime=new Date().toISOString(),r.cacheResolutionUpdateLoggerTags=at(this.logger),r.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:c,diffs:g,templateMatch:l},"Updated cache after template matching resolution")),{locator:d,originalElementLocationResult:void 0,a11yNode:h,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot"}]}}async typeIntoTarget(e,r,n={}){await this.highlight(r.locator);let o;r.originalElementLocationResult?o=r.originalElementLocationResult.importantAttributes.type??"":o=await r.locator.getAttribute("type",{timeout:Je})??"";let i=F0.some(a=>a===o.toLowerCase());return await Bv({targetingResult:r,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,r,n={}){return Bv({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:r,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:r},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),zh(s,r,n)){a=!0;break}await xe(mr,this.abortSignal)}if(!a)throw new L("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Ah(r)} in ${o}ms.
4955
4955
  Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,r,n={}){let o=n.steps??5,i=Math.min(n.hoverDurationMs??500,lt);if(await this.highlight(e.locator),this.properties.isAndroid){await V0({page:this.page,fromLocator:e.locator,toLocator:r.locator,stepCount:o,dragDurationMs:n.dragDurationMs??1e3,hoverDurationMs:i}),await this.highlight(r.locator);return}await this.hover(e),await this.page.mouse.down();let a=await r.locator.boundingBox({timeout:me});if(!a)throw new L("ActionFailureError","Could not get bounding box of target element");let s=a.x+a.width/2,c=a.y+a.height/2;await this.page.mouse.move(s,c,{steps:o}),await xe(i),await this.highlight(r.locator),await this.page.mouse.up()}async mouseDrag(e,r,n,o){o&&await this.hover({locator:o,originalElementLocationResult:void 0,serverSideBoundingBox:null}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:me});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+r,{steps:n}),await xe(_a),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Ks({func:async r=>{await this.scrollIntoViewIfNeeded(r.locator);let n=await r.locator.boundingBox({timeout:me});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Ks({func:r=>r.locator.focus({timeout:lt}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let r=await this.getActivePageOrFrame();await er({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:r,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:Je,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Ks({func:r=>r.locator.blur({timeout:lt}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,r,n=!1){await this.highlight(e.locator),await Ks({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(r.type==="INDEX"){let i=Number(r.index);if(isNaN(i))throw new L("UserConfigurationError",`Page index ${r.index} is not a number`)}await o.locator.selectOption({value:r.type==="VALUE"?r.value:void 0,label:r.type==="LABEL"?r.label:void 0,index:r.type==="INDEX"?Number(r.index):void 0},{force:n,timeout:me})},targetingResult:e})}async press(e,r){let n=r.repeat??1;if(r.convertMeta){let o=Mg(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:r.delayMs??0});await this.waitForStability()}async keyDown(e,r){if(r.convertMeta){let n=Mg(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Nv(e))await this.page.keyboard.down(n)}async keyUp(e,r){if(r.convertMeta){let n=Mg(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Nv(e))await this.page.keyboard.up(n)}async refresh(e){let r=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:r});break}catch(i){if(this.abortSignal?.throwIfAborted(),this.shouldIgnorePageLoadTimeout(i)){this.logger.warn({err:i,attempt:n},"DOMContentLoaded timed out during reload, continuing due to browser setting");break}this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForStability()}async getBrowserState(e){let{maxAttempts:r=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:Ho;o||await this.waitForPageLoad(),e.skipWait||await this.waitForStability({logger:n,signal:s});let d=0,p;for(;d<r;){d++;try{return await J(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c,skipPageLoad:e.skipWaitForPageLoad}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(m){if(s?.throwIfAborted(),p=m instanceof Error?m.message:`${m}`,d>=r)throw m;u.warn({err:m,url:this.url()},"Error getting a11y tree, retrying...")}}throw new L("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[r,n,o,i,a]=await er({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:me,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:r,lowerBound:r+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForStability(e){return pn().startAsyncSpan("WAIT_FOR_STABILITY",async()=>{let{logger:n=this.logger,timeout:o=this.smartWaitingTimeout,signal:i}=e??{},a={value:Date.now()},s=m=>{a.value=Date.now()},c=()=>s("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",c);let l=()=>s("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",l);let u=()=>s("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",u);let d=()=>s("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",d);let p=()=>s("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",p);try{await this.waitForStabilityHelper(a,n,o,i)}finally{this.cdpClient.removeListener("DOM.documentUpdated",c),this.cdpClient.removeListener("Page.frameDetached",l),this.cdpClient.removeListener("Page.frameStartedLoading",u),this.cdpClient.removeListener("Page.navigatedWithinDocument",d),this.cdpClient.removeListener("Page.frameRequestedNavigation",p)}},{})}async waitForStabilityHelper(e,r,n,o=this.abortSignal){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0,d;for(;Date.now()-a<n;){o?.throwIfAborted();let p=Date.now();if(d!==void 0&&p-d<_a&&await xe(_a-(p-d),o),d=Date.now(),!(Date.now()-e.value<pv)){if(s)try{let m=await this.screenshot(c);if(k0(s,m)>1){s=m,l=!1;continue}l=!0}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(m){u++,u%3===0&&r.warn({err:m,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<pv)){i=!0;break}}}i||r.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,r){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:r.rightClick?"right":"left",clickCount:r.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,r,n){await $0(this.page,e,r,n)}async mouseDragUsingVisualCoordinates(e){let{fromTarget:r,...n}=e;await Gv({...n,page:this.page,visualTarget:r,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let r=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:me}),n=await J(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:lt});process.platform==="darwin"&&n===1&&(n=qk);let o=r.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let E=0;E<s.length;E++)if(c[E]===e){d=l.indexOf(E);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,f=0,h=0]=u[d];p/=n,m/=n,f/=n,h/=n;let S=p+f/2,g=m+h/2;return{centerX:S,centerY:g}}async scrollVertical(e){return zv({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return zv({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad();try{await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}catch(e){if(this.abortSignal?.throwIfAborted(),!this.shouldIgnorePageLoadTimeout(e))throw e;this.logger.warn({err:e},"DOMContentLoaded timed out during forward navigation, continuing due to browser setting")}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad();try{await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}catch(e){if(this.abortSignal?.throwIfAborted(),!this.shouldIgnorePageLoadTimeout(e))throw e;this.logger.warn({err:e},"DOMContentLoaded timed out during back navigation, continuing due to browser setting")}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,r){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=new Date,o=await e.video()?.path();if(o){let i=AU(o);this.onVideoPageChange({videoName:i,timestamp:n})}}this.page=e,await this.reinitializeCDPClient(r??this.pageLoadTimeout)}async createNewTab(e,r){let n=await this.context.newPage();await this.changeActivePage(n,r?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...r}),this.handleAvailableTabsChange()}async switchToPage(e,r){let n,o=0,i=Date.now();for(;o<2||r?.retry&&Date.now()-i<this.smartWaitingTimeout;)try{await this.switchToPageHelper(e,r);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),n=a,o++,await xe(mr)}throw n}async switchToPageHelper(e,r){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new L("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
4956
- Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Ds(o.url,this.logger)){this.logger.warn(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,r?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let r;return typeof e=="string"?r=Km(e):r=[e],await this.context.addCookies(r),r}async setLocalStorage(e,r){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,r],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await J(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},r)=>{this.transformer&&TU({event:r,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,r)=>{this.transformer&&this.transformer.recordKeystroke(r)})}async startRecordingCrons(e){if(e.aborted)return;let r,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(r);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Ds(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};r=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},mr);let s=async()=>{clearInterval(r)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,r,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let s=window._momentic;s._MOMENTIC_RECORDING_ACTIVE=!0,s._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=r,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let a=window._momentic;a._MOMENTIC_RECORDING_ACTIVE=!1,a._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:Je})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:r,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await op({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(r?.throwIfAborted(),this.shouldIgnorePageLoadTimeout(s,!0))this.logger.warn({err:s,url:i,codePath:n},"DOMContentLoaded timed out while waiting for frame load, continuing due to browser setting");else{if(s.name==="AbortError")throw new L("UserInfrastructureError",`The page with URL ${ht(i,50)} did not load within the configured timeout (${o}ms)`);if(!s.message.includes("detached"))throw s}}try{await op({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:r=!1}=e??{};return r||(await this.waitForPageLoad(),await this.waitForStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return E9.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:r,error:n}=await er({fn:()=>window._momentic.getCondensedHtmlTree(),root:e,arg:void 0,timeout:lt,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!r)throw new L("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return r}registerDialogHandler(e){let r=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",r)}async evaluateFunctionInAllFrames(e,r){return this.stateManager.executeFunctionInAllFrames(e,r)}async evaluateFunctionInPage(e,r,n,o=lt){let i=await this.getActivePageOrFrame();return er({root:i,fn:e,arg:r,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:r,context:n,timeoutMs:o=ia}){let i=g0(),a={code:e,fragment:r,context:n},{result:s}=await J(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new L("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,r){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:lt});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:r},timeout:Je})}catch(o){throw this.logger.warn({err:o,x:e,y:r},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:r,percentY:n}){if(r<0||r>1||n<0||n>1)throw new L("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*r),d=Math.ceil(i*n),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}async highlightFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(r,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:Je,params:{highlightConfig:K0,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:Je,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:Je})}catch{}}async getTargetFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId({root:r,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:r,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[r];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[Ws],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Oi(a)),c=await this.fetchHtmlAttributes({locator:s,logger:this.logger,allowNotActionableNodesOverride:n}),l={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...c};return this.logger.debug({target:l},"Tied backend ID to HTML node"),{target:l,locator:s}}async performTargetRedirection(e,r){try{return await J(this.performTargetRedirectionHelper(e,r),{milliseconds:me})}catch(n){return r.warn({err:n},"Error performing target redirection, using original element"),{metadata:{outcome:"error"}}}}async performTargetRedirectionHelper(e,r){let n=Date.now(),{locator:o,originalElementLocationResult:i}=e,a=await o.boundingBox({timeout:me});if(!a)return r.warn(`Attempted to click on element with no bounding box: ${i?.serializedElement}`),{metadata:{outcome:"no bounding box"}};let{x:s,y:c,width:l,height:u}=a,d=this.getViewport();if(s<0||c<0||!d||s+l>d.width||c+u>d.height)return r.info("Skipping locator redirection because the element is outside the viewport"),{metadata:{outcome:"element outside viewport"}};let p=await this.getActivePageOrFrame(),{dataMomenticId:m,mPathSelector:f,error:h,serializedElement:S,foundElementRelativePoint:g,force:E,logs:y}=await o.evaluate(R=>{let _=window._momentic;if(!_?.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return _.performTargetRedirection(R)},void 0,{timeout:Je}),b=Date.now()-n;return h?(r.warn({error:h,serializedElement:S,duration:b,force:E,logs:y},"Got error from target redirection with bounding box"),{metadata:{outcome:"error",logs:y,serializedElement:S,force:E}}):m?(r.info({newDataMomenticId:m,serializedElement:S,duration:b,force:E,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{targetingResult:{locator:p.locator(Oi(m)),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"redirected to new element",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):f?(r.info({newMPathSelector:f,serializedElement:S,duration:b,force:E,logs:y},"Redirected target to new element with bounding box with mPath"),{targetingResult:{locator:p.locator(f),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"redirected to new element",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):g?(r.info({foundElementRelativePoint:g,serializedElement:S,duration:b,force:E,logs:y},"Chose specific visible point on original element"),{targetingResult:{locator:o,originalElementLocationResult:i,serverSideBoundingBox:await o.boundingBox({timeout:me}),hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"specific visible point on original",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):E?(r.info({serializedElement:S,duration:b,force:E,logs:y},"Forcing click on original element"),{targetingResult:{locator:o,serverSideBoundingBox:await o.boundingBox({timeout:me}),originalElementLocationResult:i,hints:{force:E}},metadata:{outcome:"force click on original",logs:y,serializedElement:S,force:E}}):{metadata:{outcome:"no action taken"}}}async fetchHtmlAttributes({locator:e,logger:r=this.logger,originalElementLocationResult:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let d=window._momentic;return d?.generateHtmlCacheAttributes?d.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer"||i==="always",originalElementLocationResult:n,showZeroOpacityElements:o?!0:a},{timeout:lt});if("error"in s&&s.error)throw s.error.startsWith(Hk)?new Wi(s.error):s.error.startsWith(Gk)?new pm(s.error):new Error(s.error);return s.warnings.length&&r.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,r){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,r,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*r),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:Je})}async scrollFromPositionPercentages(e,r,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!e0}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(r){this.logger.debug({err:r,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,r,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Cv(e,this.debugData,i,{type:r,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:r}){if(!Ug(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.warn(c),this.logToUserConsole(this.page,"error",c);return}let n=r?.trim()||AU(e),o=g9(e),i=v9(e),a=Sd[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Ug(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:T9.getType(e)||"application/octet-stream"},{timeout:Rg})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window,p=atob(l),m=new Array(p.length);for(let h=0;h<p.length;h++)m[h]=p.charCodeAt(h);let f=new Uint8Array(m);d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[{kind:"file",name:c,isSameEntry(S){return Promise.resolve(S.name===c)},queryPermission(S){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")},async requestPermission(S){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")},async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let S=new Blob([f],{type:u});return new File([S],c,{type:u})},async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")},async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}}])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e={...this.debugData};return this.debugData={logsPerPage:[]},e}async copy(e){try{await this.evaluateFunctionInPage(r=>navigator.clipboard.writeText(r),e,"copying text to clipboard")}catch(r){if(r instanceof Error&&r.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw r}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(r=>{let n=r.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,r){this.requestRecorders[e]=r}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,r,n){this.customHeaders.push({key:e.toLowerCase(),value:r,matcher:n})}registerMock(e,r,n,o){let i=e??kg();return this.mocks[i]={matcher:r,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??Kk}shouldIgnorePageLoadTimeout(e,r=!1){if(!this.userControlledBrowserSettings.ignorePageLoadTimeouts)return!1;if(r&&e.name==="AbortError")return!0;let n=e.message.toLowerCase();return n.includes("domcontentloaded")&&(n.includes("timeout")||n.includes("exceeded"))}get userBrowserSettings(){return mp(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Vc}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=Ig();for(let r of e)if(!(!Ug(r)||!bU(r).isDirectory()||!["new","pending","completed"].some(o=>{let i=A9(r,o);return Ug(i)&&bU(i).isDirectory()&&S9(i).length>0})))return r}};import{randomUUID as tZ}from"crypto";import rZ from"fetch-cookie";import{cloneDeep as ZU}from"lodash-es";import{CookieJar as nZ}from"tough-cookie";import{randomUUID as FU}from"crypto";import{randomUUID as R9}from"crypto";async function CU({codePath:t,screenshotBuff:e,storage:r,logger:n}){if(e)try{let o=R9(),i=await r.createOnDemandScreenshot(o,e,"image/jpeg");return n.info({screenshotUrl:i.appServerUrl,codePath:t},"Saved screenshot for debugging"),i.appServerUrl}catch(o){n.error({err:o,codePath:t},"Failed to save screenshot for debugging")}}var w9=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],RU="<select> element:",wU="text input or contenteditable element:",xU="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",_U="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",eA=[RU,wU,xU,_U,...w9];function IU(t,e){if(t===e)return!0;for(let r of eA){if(!t.startsWith(r))continue;let n=t.slice(r.length).trim();if(eA.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!eA.some(r=>e.startsWith(r)&&e.slice(r.length).trim()===t.trim())}function PU(t,e){if(!t||!e)return t;switch(e){case"SELECT_OPTION":return`${RU} ${t}`;case"TYPE":return`${wU} ${t}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${xU}
4956
+ Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Ds(o.url,this.logger)){this.logger.warn(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,r?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let r;return typeof e=="string"?r=Km(e):r=[e],await this.context.addCookies(r),r}async setLocalStorage(e,r){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,r],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await J(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},r)=>{this.transformer&&TU({event:r,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,r)=>{this.transformer&&this.transformer.recordKeystroke(r)})}async startRecordingCrons(e){if(e.aborted)return;let r,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(r);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Ds(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};r=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},mr);let s=async()=>{clearInterval(r)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,r,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let s=window._momentic;s._MOMENTIC_RECORDING_ACTIVE=!0,s._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=r,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let a=window._momentic;a._MOMENTIC_RECORDING_ACTIVE=!1,a._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:Je})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:r,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await op({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(r?.throwIfAborted(),this.shouldIgnorePageLoadTimeout(s,!0))this.logger.warn({err:s,url:i,codePath:n},"DOMContentLoaded timed out while waiting for frame load, continuing due to browser setting");else{if(s.name==="AbortError")throw new L("UserInfrastructureError",`The page with URL ${ht(i,50)} did not load within the configured timeout (${o}ms)`);if(!s.message.includes("detached"))throw s}}try{await op({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:r,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:r=!1}=e??{};return r||(await this.waitForPageLoad(),await this.waitForStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return E9.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:r,error:n}=await er({fn:()=>window._momentic.getCondensedHtmlTree(),root:e,arg:void 0,timeout:lt,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!r)throw new L("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return r}registerDialogHandler(e){let r=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",r)}async evaluateFunctionInAllFrames(e,r){return this.stateManager.executeFunctionInAllFrames(e,r)}async evaluateFunctionInPage(e,r,n,o=lt){let i=await this.getActivePageOrFrame();return er({root:i,fn:e,arg:r,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:r,context:n,timeoutMs:o=ia}){let i=g0(),a={code:e,fragment:r,context:n},{result:s}=await J(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new L("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,r){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:lt});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:r},timeout:Je})}catch(o){throw this.logger.warn({err:o,x:e,y:r},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:r,percentY:n}){if(r<0||r>1||n<0||n>1)throw new L("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*r),d=Math.ceil(i*n),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}async highlightFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(r,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:Je,params:{highlightConfig:K0,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:Je,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:Je})}catch{}}async getTargetFromPositionPercentages(e){let r=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId({root:r,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:r,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[r];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[Ws],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Oi(a)),c=await this.fetchHtmlAttributes({locator:s,logger:this.logger,allowNotActionableNodesOverride:n}),l={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...c};return this.logger.debug({target:l},"Tied backend ID to HTML node"),{target:l,locator:s}}async performTargetRedirection(e,r){try{return await J(this.performTargetRedirectionHelper(e,r),{milliseconds:me})}catch(n){return r.warn({err:n},"Error performing target redirection, using original element"),{metadata:{outcome:"error"}}}}async performTargetRedirectionHelper(e,r){let n=Date.now(),{locator:o,originalElementLocationResult:i}=e,a=await o.boundingBox({timeout:me});if(!a)return r.warn(`Attempted to click on element with no bounding box: ${i?.serializedElement}`),{metadata:{outcome:"no bounding box"}};let{x:s,y:c,width:l,height:u}=a,d=this.getViewport();if(s<0||c<0||!d||s+l>d.width||c+u>d.height)return r.info("Skipping locator redirection because the element is outside the viewport"),{metadata:{outcome:"element outside viewport"}};let p=await this.getActivePageOrFrame(),{dataMomenticId:m,mPathSelector:f,error:h,serializedElement:S,foundElementRelativePoint:g,force:E,logs:y}=await o.evaluate(R=>{let _=window._momentic;if(!_?.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return _.performTargetRedirection(R)},void 0,{timeout:Je}),b=Date.now()-n;return h?(r.warn({error:h,serializedElement:S,duration:b,force:E,logs:y},"Got error from target redirection with bounding box"),{metadata:{outcome:"error",logs:y,serializedElement:S,force:E}}):m?(r.info({newDataMomenticId:m,serializedElement:S,duration:b,force:E,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{targetingResult:{locator:p.locator(Oi(m)),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"redirected to new element",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):f?(r.info({newMPathSelector:f,serializedElement:S,duration:b,force:E,logs:y},"Redirected target to new element with bounding box with mPath"),{targetingResult:{locator:p.locator(f),originalElementLocationResult:void 0,serverSideBoundingBox:null,hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"redirected to new element",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):g?(r.info({foundElementRelativePoint:g,serializedElement:S,duration:b,force:E,logs:y},"Chose specific visible point on original element"),{targetingResult:{locator:o,originalElementLocationResult:i,serverSideBoundingBox:await o.boundingBox({timeout:me}),hints:{relativeXYToLocator:g,force:E}},metadata:{outcome:"specific visible point on original",logs:y,serializedElement:S,relativeClickPoint:g,force:E}}):E?this.userControlledBrowserSettings.forceClickForMissingRedirectElement?(r.info({serializedElement:S,duration:b,force:E,logs:y},"Forcing click on original element"),{targetingResult:{locator:o,serverSideBoundingBox:await o.boundingBox({timeout:me}),originalElementLocationResult:i,hints:{force:E}},metadata:{outcome:"force click on original",logs:y,serializedElement:S,force:E}}):(r.info({serializedElement:S,duration:b,force:E,logs:y},"No redirect candidates found and forceClickForMissingRedirectElement is off, skipping force click"),{metadata:{outcome:"no action taken"}}):{metadata:{outcome:"no action taken"}}}async fetchHtmlAttributes({locator:e,logger:r=this.logger,originalElementLocationResult:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let d=window._momentic;return d?.generateHtmlCacheAttributes?d.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer"||i==="always",originalElementLocationResult:n,showZeroOpacityElements:o?!0:a},{timeout:lt});if("error"in s&&s.error)throw s.error.startsWith(Hk)?new Wi(s.error):s.error.startsWith(Gk)?new pm(s.error):new Error(s.error);return s.warnings.length&&r.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,r){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,r,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*r),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:Je})}async scrollFromPositionPercentages(e,r,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*r);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!e0}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(r){this.logger.debug({err:r,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,r,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Cv(e,this.debugData,i,{type:r,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:r}){if(!Ug(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.warn(c),this.logToUserConsole(this.page,"error",c);return}let n=r?.trim()||AU(e),o=g9(e),i=v9(e),a=Sd[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Ug(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:T9.getType(e)||"application/octet-stream"},{timeout:Rg})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window,p=atob(l),m=new Array(p.length);for(let h=0;h<p.length;h++)m[h]=p.charCodeAt(h);let f=new Uint8Array(m);d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[{kind:"file",name:c,isSameEntry(S){return Promise.resolve(S.name===c)},queryPermission(S){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")},async requestPermission(S){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")},async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let S=new Blob([f],{type:u});return new File([S],c,{type:u})},async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")},async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}}])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e={...this.debugData};return this.debugData={logsPerPage:[]},e}async copy(e){try{await this.evaluateFunctionInPage(r=>navigator.clipboard.writeText(r),e,"copying text to clipboard")}catch(r){if(r instanceof Error&&r.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw r}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(r=>{let n=r.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,r){this.requestRecorders[e]=r}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,r,n){this.customHeaders.push({key:e.toLowerCase(),value:r,matcher:n})}registerMock(e,r,n,o){let i=e??kg();return this.mocks[i]={matcher:r,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??Kk}shouldIgnorePageLoadTimeout(e,r=!1){if(!this.userControlledBrowserSettings.ignorePageLoadTimeouts)return!1;if(r&&e.name==="AbortError")return!0;let n=e.message.toLowerCase();return n.includes("domcontentloaded")&&(n.includes("timeout")||n.includes("exceeded"))}get userBrowserSettings(){return mp(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Vc}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=Ig();for(let r of e)if(!(!Ug(r)||!bU(r).isDirectory()||!["new","pending","completed"].some(o=>{let i=A9(r,o);return Ug(i)&&bU(i).isDirectory()&&S9(i).length>0})))return r}};import{randomUUID as tZ}from"crypto";import rZ from"fetch-cookie";import{cloneDeep as ZU}from"lodash-es";import{CookieJar as nZ}from"tough-cookie";import{randomUUID as FU}from"crypto";import{randomUUID as R9}from"crypto";async function CU({codePath:t,screenshotBuff:e,storage:r,logger:n}){if(e)try{let o=R9(),i=await r.createOnDemandScreenshot(o,e,"image/jpeg");return n.info({screenshotUrl:i.appServerUrl,codePath:t},"Saved screenshot for debugging"),i.appServerUrl}catch(o){n.error({err:o,codePath:t},"Failed to save screenshot for debugging")}}var w9=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],RU="<select> element:",wU="text input or contenteditable element:",xU="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",_U="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",eA=[RU,wU,xU,_U,...w9];function IU(t,e){if(t===e)return!0;for(let r of eA){if(!t.startsWith(r))continue;let n=t.slice(r.length).trim();if(eA.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!eA.some(r=>e.startsWith(r)&&e.slice(r.length).trim()===t.trim())}function PU(t,e){if(!t||!e)return t;switch(e){case"SELECT_OPTION":return`${RU} ${t}`;case"TYPE":return`${wU} ${t}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${xU}
4957
4957
  ${t}`;case"ELEMENT_CHECK":return`${_U}
4958
4958
  ${t}`;default:return t}}async function so({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 x9=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function MU({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(x9.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 xe(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(Ds(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 ti(t,e={}){let r=await t.getBrowserState(e);return{serializedTree:r.serialize(e.serializationOpts),tree:r}}var OU=t=>!!t&&fl(t),LU=t=>{let{cache:e,description:r,disableSecondaryCacheResolution:n,logger:o}=t,i=e,a=!1,s;return i&&n&&i.targetSource==="HEURISTIC_HEALED"&&(a=!0,s="Heuristic healed cache incompatible",i=void 0),i?.inputDescription&&!IU(r,i.inputDescription)&&(o.warn({old:i.inputDescription,new:r},"Target cache was generated with a different description, clearing it automatically"),a=!0,s="Description changed",i=void 0),{cache:i,cacheBustedBeforeAction:a,cacheBustReason:s}};import{randomUUID as N9}from"crypto";var DU={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},kU={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},NU=/<(\S+) id="(\d+)".*?>/g,I9=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,UU=["h1","h2","section","footer","nav","aside","form","label","dialog"],P9=[...UU,"span","div","h3"],M9=["table","select","form","ul","ol","menu","pre","code","dialog"],O9=["table","form","dialog","nav","section","ul","select"];function Fg(t){return L9(t)}function L9({logger:t,serializedTree:e,options:r}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=r,s=[],c=e.split(`
4959
4959
  `),l=0,u=[],d=0,p=[],m=[],f=!1;for(;l<c.length;){f&&(s.push({ids:p,content:u.join(`
4960
4960
  `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],f=!1);let h=c[l],S=rt(h);d+=S,h.length>a&&(h=h.slice(0,a));let y=Array.from(h.matchAll(NU)).map(H=>H&&H.length>=3?{tagName:H[1],id:H[2]}:void 0).filter(H=>!!H),R=Array.from(h.matchAll(I9)).map(H=>H&&(H[2]||H[4])).filter(H=>!!H);R.reverse();let I=h.replace(/ id="[0-9]+"/g,"");u.push(I);for(let H of y)p.push(H.id),m.push(H);for(let H of R){let ie=m[m.length-1];ie&&ie.tagName===H&&m.pop()}let _=m.some(H=>M9.includes(H.tagName)),A=c[l+1]??"",O=rt(A),F=Array.from(A.matchAll(NU)).map(H=>H&&H.length>2?H[1]:void 0).filter(H=>!!H),D=F.some(H=>UU.includes(H)),z=F.some(H=>P9.includes(H));d+O>=i&&(f=!0),d>=n&&(D&&!_||R.some(H=>O9.includes(H)))&&(f=!0),d>=o&&z&&!_&&(f=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4961
- `),tokenLength:d}),s.forEach((h,S)=>{let g=h.ids[0],E=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:g,maxId:E},`Chunk for page filtering (index ${S+1}/${s.length})`)}),{chunks:s}}var D9=75e4,Bg=3e5;async function Xs(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=rt(u);if(d>D9)try{let p=Fg({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await U9({...t,tokenLimit:Bg-1e4,chunks:p.chunks}),u=l.serialize();let m=rt(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(Bg*Sa),u=l.serialize();let m=rt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Bg)try{if(o){let p=Fg({serializedTree:u,options:kU,logger:i}),m=N9();l=await J(k9({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let f=rt(u);i.info({oldTokens:d,newTokens:f,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=f}else{let p=Fg({serializedTree:u,options:DU,logger:i});l=await J(F9({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=rt(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(Bg*Sa),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function k9({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:at(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function U9(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:at(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,f)=>m+f.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 F9(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:at(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 tA(t,e){if(!t.description)throw new L("UserConfigurationError","Cannot locate element with empty description");return so({action:async()=>B9(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function B9(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d,isAutoHeal:p,cacheBustReason:m}=t,{orgId:f,browser:h,localCodeEvalTools:S,generator:g,abortSignal:E}=e,y=t.description,b=pn(),R=t.useMemory&&!r;n&&(y=await Rr({orgId:f,s:y,context:n,localTools:S,signal:E,logger:l})),a&&(y=PU(y,a));let{serializedTree:I,tree:_}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>ti(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:E,skipWait:i,logger:l}),{}),A=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let X,oe=Date.now(),pe;for(;!X&&Date.now()-oe<3e3;){E.throwIfAborted();try{X=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Te){pe=Te}}if(!X)throw new L("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${pe?.message}`);return X}),O=I,P=!1,D=`data:image/jpeg;base64,${A.toString("base64")}`;O=await Xs({type:"locator",description:y,screenshot:D,serializedTree:I,options:{aiPageFiltering:c},tree:_,fixtures:{generator:g,signal:E,logger:l,orgId:f}}),O!==I&&(P=!0);let z=await b.startAsyncSpan("AI_LOCATOR_CALL",async X=>{p&&(X.attributes.isAutoHeal=!0),m&&(X.attributes.cacheBustReason=m);let oe=await g.getElementLocation({browserState:O,goal:y,screenshot:D,source:a,memory:R?s:void 0},{disableCache:r,abortSignal:E,loggerTags:at(l),useMemory:R});if(X.result=oe,b.storeTraceAsset){let pe=FU();b.storeTraceAsset({snapshotId:pe,data:A}),X.screenshotSnapshotId=pe}return oe});if(l.debug({usedRag:P,result:z},"Got locator result"),!(z.id>0))throw new Ml(`Could not find any relevant element: ${z.thoughts}`,z.updatedMemory?{type:"GCS_TRACES",traces:z.updatedMemory}:void 0);let{resolution:ie,target:$,frameConfig:K}=await b.startAsyncSpan("TARGET_RESOLUTION",async X=>{let oe=await h.createTargetFromA11yId({id:z.id,requirements:z.requirements,additionalElements:z.additionalElements,description:y,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});if(X.result={serializedElement:oe.target.nodeOnlySerializedHtml??"Unknown HTML element"},b.storeTraceAsset)try{let pe=await h.screenshot({locator:oe.resolution.locator,clearHighlights:!0}),Te=FU();b.storeTraceAsset({snapshotId:Te,data:pe}),X.elementScreenshotSnapshotId=Te}catch(pe){l.debug({err:pe},"Failed to capture element screenshot for locator trace, continuing...")}return oe});if(ie.a11yNode?.properties?.hidden&&ie.a11yNode?.properties?.hidden!=="false")throw new L("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: ${ie.displayString}`);return R&&(z.updatedMemory?$.memory={type:"GCS_TRACES",traces:z.updatedMemory}:s&&($.memory=s)),{thoughts:z.thoughts,target:$,resolution:ie,frameConfig:K,screenshot:D}}import{randomUUID as BU}from"crypto";var z9=15;async function zg({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=z9}){if(!t.assertion.trim())throw new L("ActionFailureError","Assertion command is missing the assertion content");let a=Uy.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=pn();return s.startAsyncSpan("AI_ASSERTION_CALL",async c=>{let{browser:l}=n,u=t.timeout?t.timeout*1e3:l.smartWaitingTimeout,d=aD(u,i-1),p=0,m=Date.now(),f=m+u,h=m,S,g,E;try{await so({action:()=>l.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:l,logger:r})}catch(R){r.warn({err:R},"Failed to clear highlights before AI check, continuing...")}for(;p<i;){n.abortSignal.throwIfAborted();let R=Date.now();if(p>0){if(R>=f)break;let A=f-R,O=h-R,P=Math.min(O,A);P>0&&await xe(P,n.abortSignal)}let I=Date.now();if(p>0&&I>=f)break;let _=!1;try{if(S=await so({action:async()=>{let O=await zU(l,r,n.abortSignal);return g&&g.serializedTree===O.serializedTree&&g.screenshotBuff.equals(O.screenshotBuff)?(_=!0,S):(g=O,HU({command:t,state:O,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:p,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:l}),S?.success){S?.updatedMemory&&Zd(t,S.updatedMemory,r);break}else throw S?.thoughts?new L("AssertionFailureError",S.thoughts):new L("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(A){n.abortSignal.throwIfAborted(),E=A instanceof Error?A:new Error(`${A}`),_?r.info(`AI check attempt ${p} failed (re-used previous result)`):r.info({err:A},`AI check assert attempt ${p} failed, retrying...`)}finally{p++,h=I+d}}if(!S?.success){let R=f-Date.now();R>0&&await xe(R,n.abortSignal)}if(!S?.success)try{S=await so({action:async()=>HU({command:t,state:await zU(l,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:p,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:l})}catch(R){n.abortSignal.throwIfAborted(),E=R instanceof Error?R:new Error(`${R}`)}finally{p++}S?.updatedMemory&&Zd(t,S.updatedMemory,r);let y=S?.afterScreenshotOverride;if(y&&s.storeTraceAsset){let R=BU();s.storeTraceAsset({snapshotId:R,data:y}),c.screenshotSnapshotId=R}let b=S?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let R=BU();s.storeTraceAsset({snapshotId:R,data:b}),c.elementScreenshotSnapshotId=R}if(!S?.success){c.result={thoughts:E?.message??"AI check failed after all attempts",result:!1};let R=`AI check still failing after ${p} attempts.`;throw E&&(R+=` Latest result: ${E.message}`),new L("AssertionFailureError",R)}return c.result={thoughts:S.thoughts,result:!0},{...S,succeedImmediately:!1,urlAfterCommand:l.url()}})}async function zU(t,e,r){await t.waitForPageLoad({signal:r});let[n,o]=await Promise.all([ti(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function HU({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:f,tree:h}=e,S=e.screenshotBuff,g=S.toString("base64"),E=u.url(),y=t.contextChoice??"MULTIMODAL",b=f;y!=="VISION_ONLY"&&(b=await Xs({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:g,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),b!==f&&(m.ragUsed=!0),m.pageState=b);let R={goal:t.assertion,url:E,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:g,contextChoice:y,source:c},_=await(y==="VISION_ONLY"?(O,P)=>d.getVisualAssertionResult(O,P):(O,P)=>d.getAssertionResult(O,P))(R,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:at(l)}),A;if((_.result||i)&&_.relevantElements?.length){m.relevantElementsSerialized=_.relevantElements.map(O=>u.getSerializedFormFromA11yId(O)).filter(O=>!!O);try{let O=_.relevantElements[0],{resolution:P}=await u.createTargetFromA11yId({id:O,description:null,targetSource:"AI",skipSaveToCache:!0});A=await u.screenshot({locator:P.locator,clearHighlights:!0,respectActiveFrame:!0})}catch(O){l.debug({err:O},"Failed to capture element screenshot for trace, continuing...")}await H9(_.relevantElements,u,l)}return{success:_.result,thoughts:_.thoughts,afterScreenshotOverride:S,elementScreenshotOverride:A,updatedMemory:o?_.updatedMemory:void 0}}async function H9(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 J(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 G9=1e5,Hg=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function GU(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await j9(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Hg?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 xe(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function j9(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await xe(o.smartWaitingTimeout,n);return}if(!e.description)throw new L("UserConfigurationError","Cannot locate element with empty description");await J(V9(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function V9(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await so({action:async()=>$9(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function $9(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 Rr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await ti(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(rt(p)>G9)throw new Hg;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){throw new L("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: ${E instanceof Error?E.message:E}`)}let S=`data:image/jpeg;base64,${f.toString("base64")}`;s.throwIfAborted();let g=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:S},{abortSignal:s,loggerTags:at(n)});return n.debug({result:g},"Got smart waiting result"),g.isPageReady}import{cloneDeep as VU}from"lodash-es";async function $U(t){return pn().startAsyncSpan("ELEMENT_ASSERTION",async r=>W9(t,r),{name:"Element check"})}async function W9(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>em(r.cache)?r.cache:void 0,c=s(),l=!i&&!!c?.target&&fl(c.target),u=VU(c),d=(E=!1)=>{if(c=s(),!!c)if(E){let y=mb(u,c);c.target=y.target,c.updatedAt=y.updatedAt}else{if(!u){c=void 0;return}c.target=u.target,c.updatedAt=u.updatedAt}},p=Date.now(),m=0,f,h=500,S=!1;for(;m<2||Date.now()-p<n;){m++,m>1&&await xe(h,a),a?.throwIfAborted(),c=s();let E=m===1,{result:y,elementWasFound:b}=await jU({cacheToUse:c,skipAISmartWaiting:!E,useAIIfCacheFails:!l,params:t});if(f=y,S=S||b,y.success)break;d(),h=Math.min(h*1.25,1e4)}if(!f)throw new L("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!f.success){let E=s(),y=E?.target?.memory?{target:{id:-1,memory:E.target.memory}}:void 0,{result:b,elementWasFound:R}=await jU({cacheToUse:y,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:t});f=b,S=S||R,f.success||d(!0)}let g=s();return f.success&&g?.target&&!S&&(g.target=Qd(g.target),g.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function jU({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:r,params:n}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:c}=n,{logger:l}=a;if(o.target&&!Gi(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=JL(o.assertion),d,p=!1,m=VU(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:S}=await c({tracer:s,command:o,target:o.target,cache:m?.target,action:async g=>q9(g.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:is(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:r?1:0});return d={success:h.success,data:h.data,err:h.err,elementInteractedDisplayString:f,thoughts:S},p=!0,h.success||(l.warn({aiThoughts:S,elementString:f,err:h.err},"Element check found an element but failed"),d={...h,thoughts:S}),{result:d,elementWasFound:p}}catch(f){if(u)return d={success:!0,thoughts:`The element described does not exist on the page: ${f.message}`,err:void 0,data:void 0},{result:d,elementWasFound:p};if(!(f instanceof L)||f.reason!="ActionFailureError")throw f;return d={success:!1,err:f,data:void 0,thoughts:void 0},l.warn({err:f},"Element check did not find an element and failed"),{result:d,elementWasFound:p}}}async function q9(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await K9(t,e.assertion)}async function K9(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:ht(a,500,!0)},!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,n=new L("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ht(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 L("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,e.operation==="EXISTS"?n=new L("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new L("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},Dn*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:Dn*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:Dn*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=wc(e);n=new L("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=wc(e);r=!1,n=new L("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(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,e.operation==="EXISTS"?n=new L("AssertionFailureError",`The style property ${e.property} ${s}`):n=new L("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 WU(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as Y9}from"jimp";async function fp(t,e){let r=await t.screenshot(e),n=await Y9.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as qU}from"jimp";import rA from"jpeg-js";import X9 from"pixelmatch";async function KU({tracer:t,command:e,disableCache:r,browser:n,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!Gi(e.target))throw new Error("Visual Diff with x/y is not supported yet");await n.waitForStability({logger:i});let s={clearHighlights:!0,hideCaret:!0},c;e.target?.elementDescriptor?c=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async P=>fp(n,{locator:P.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:c=await fp(n,s);let l=await a.prepareGoldenScreenshotForComparison(i,e,c);if((c.height!==l.height||c.width!==l.width)&&i.warn({currHeight:c.height,currWidth:c.width,savedHeight:l.height,savedWidth:l.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-l.height)>10||Math.abs(c.width-l.width)>10){let O=`${c.width}x${c.height}`,P=`${l.width}x${l.height}`;return{fail:!0,thoughts:`Current screenshot (${O}) does not match saved screenshot dimensions (${P}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:n.url()}}let u=await qU.fromBuffer(c.buffer),d={width:c.width,height:c.height},p=await qU.fromBuffer(l.buffer),m={width:l.width,height:l.height},f,h=d.width*d.height,S=m.width*m.height,g=Math.abs(d.height-m.height),E=Math.abs(d.width-m.width);if(h>S){let O=u.cover({w:m.width,h:m.height});c.buffer=await O.getBuffer("image/jpeg"),f="current",c.width=m.width,c.height=m.height}else if(S>h){let O=p.cover({w:d.width,h:d.height});l.buffer=await O.getBuffer("image/jpeg"),f="saved"}let y={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},b=e.threshold??.1,I=X9(rA.decode(l.buffer).data,rA.decode(c.buffer).data,y.data,c.width,c.height,{threshold:b,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,_=I>b*100,A=`Visual diff of ${I.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${b*100}%.`;if(f&&(A+=` The ${f} screenshot was cropped since it was taller by ${g} pixels and wider by ${E} pixels.`),_)throw new L("ActionFailureError",A);return{fail:_,thoughts:A,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:rA.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var J9=3e4;function Q9(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 YU({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??J9/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h)});let s=a.toString(),c;if(Mc(t.url)&&(c=t.url),r&&Oc(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new L("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 J((async()=>{let f=s?`${l}?${s}`:l;try{let h=Q9(t),S=new Headers(i);return h.contentType&&!S.has("Content-Type")&&S.set("Content-Type",h.contentType),await n(f,{headers:S,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 L("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text()}catch(h){f=`Failed to read response body: ${h}`}throw new L("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let p={};d.headers.forEach((f,h)=>{p[h]=f});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 Z9=5e3;async function Gg({timeout:t=Dn,...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 XU(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 xe(s,e.signal),s=Math.min(Math.floor(s*1.5),Z9);else return i}return i=await XU(e),i}async function XU({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(JU,{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(JU,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?vi.CONTAINS:Ai.CONTAINS;a=new L("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new L("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 JU({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 eZ=3e4;async function QU({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??eZ/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Mc(t.url)&&(s=t.url),r&&Oc(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new L("ActionFailureError",`Invalid URL: ${t.url}`);let l=await J((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 L("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 L("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new L("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new L("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 La=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];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 withExecutionOptions(e,r){this.executionOptionsStack.push(e);try{return await r()}finally{this.executionOptionsStack.pop()}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([ti(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 Xs({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:{...at(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([ti(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 Xs({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:{...at(a)},langfuseSessionId:s})}catch(f){throw new L("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return ti(this.browser,e)}async locateElement(e){return await tA({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return so({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({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(){return{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({tracer:e,command:r,targetNames:n,descriptions:o,caches:i,action:a,options:s,retriesWithAI:c=1}){let l=[];for(let u=0;u<o.length;u++){let d=o[u],p=await this.wrapElementTargetingCommand({tracer:e,command:r,target:d,cache:i[u],action:async m=>m,options:{...s,targetName:n[u]}});l.push(p)}try{let u=await a(...l.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=l.map((m,f)=>m.thoughts?`${d(n[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return{result:u,elementInteractedDisplayStrings:l.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),c>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:e,command:r,targetNames:n,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:c-1});throw new L("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:r,options:n,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=n;if(e.type!=="description")throw new L("ActionFailureError","Cannot use selector with non-description target");let s,c=Date.now(),l=Date.now();for(;Date.now()-l<this.browser.smartWaitingTimeout;){c=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:e.elementDescriptor,targetName:a,logger:i});return{result:await r({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-c<500&&await xe(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=pn(),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 c=>{let{targetingResult:l,metadata:u}=await this.browser.performTargetRedirection(r,o);if(c.result=u,l&&i.storeTraceAsset)try{let d=await this.browser.screenshot({locator:l.locator,clearHighlights:!0}),p=tZ();i.storeTraceAsset({snapshotId:p,data:d}),c.elementScreenshotSnapshotId=p}catch(d){o.debug({err:d},"Failed to capture element screenshot for redirect trace")}return l})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:me}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await pn().startAsyncSpan("CACHE_RESOLUTION",async c=>{c.targetSource=r.targetSource;try{let l=await this.browser.resolveTarget(r,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...n.resolveTargetOptions});c.attributes.targetDisplayString=l.displayString,c.attributes.decisions=l.decisions;let u=l.decisions.find(d=>d.matched);return u&&(c.resolutionMethod=u.type),l}catch(l){throw l instanceof rn&&(c.cacheMissReason=l.cacheMissReason,c.attributes.decisions=l.decisions),l}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:o});return await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await so({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{tracer:r,target:n,action:o,options:i,command:a,finalAttempt:s=!1,originalCache:c=e.cache}=e,{retriesWithAI:l=1}=e,{disableCache:u,useSelector:d,targetName:p}=i,m=pn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),S=ZU(e.cache);if((!S||u)&&!YS(n))throw new L("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let g=!1,E;u&&(f.info("Cache explicitly disabled for this step"),g=!0,E="Cache explicitly disabled",S=void 0);let y=LU({cache:S,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});S=y.cache,g=g||y.cacheBustedBeforeAction,!E&&y.cacheBustReason&&(E=y.cacheBustReason);let b=!0;if(!OU(S))return l--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:r,target:n,options:i,command:a,action:o,originalCache:c,logger:f,useMemory:h,cacheBustedBeforeAction:g,cacheBustReason:E});try{let{resolutionResult:R,finalTarget:I}=await this.resolveCachedTargetForAction({cache:S,options:i,logger:f}),_=await o(I);if(Kt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.77.0"]),Ih({cmd:a,key:p,newTarget:S,logger:f,updatedWithAI:!1}),b){let A=R.decisions.filter(O=>O.matched);if(A.length!==1)f.warn({decisions:R.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=A[0].type;r.recordTargetAutoHeal({healType:O})}}return{result:_,elementInteractedDisplayString:R.displayString}}catch(R){this.throwIfClosed();let I=cy(R);if(I&&!s)return f.warn({err:R},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,action:o,cache:c,originalCache:c,retriesWithAI:l,finalAttempt:!0,options:i});if(R instanceof L&&!I)throw f.warn({err:R},"Failed to execute command with target (fatal)"),R;if(l>0&&n){f.info({err:R},"Failed to execute action with cached target, retrying with AI"),Kt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.77.0",`missReason:${R instanceof rn?R.cacheMissReason:"unknown"}`]);let _;return S.memory&&Jp(S.memory)&&(_=S.memory),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,cache:void 0,action:o,originalCache:c,retriesWithAI:l,finalAttempt:!0,options:{...i,memory:_,targetHealingInProgress:!0}})}throw new L("ActionFailureError",`Failed to execute interactive command: ${R instanceof Error?R.message:`${R}`}`,{errOptions:{cause:R}})}}async executeTargetingCommandWithAI(e){let{tracer:r,stepTracer:n,target:o,options:i,command:a,action:s,originalCache:c,logger:l,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=e;l.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location"),(d||!c)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?await r.startAsyncSpan("SMART_WAITING",async()=>await GU({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:l,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())):(d||!c)&&(i.skipAISmartWaiting?l.debug("Skipping AI smart waiting for this targeting attempt"):l.debug("Skipping AI smart waiting due to controller execution options"));let m=2;for(let f=1;f<=m;f++){let h=!1,S=this.browser.getActiveFrameConfig();try{let g;try{g=await tA({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,logger:l,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(b){if(b instanceof Ml&&b.updatedLocatorMemory){let R={id:-1,...c,memory:b.updatedLocatorMemory};Ih({cmd:a,key:i.targetName,newTarget:R,logger:l,updatedWithAI:!0})}throw b}g.frameConfig&&(this.browser.setActiveFrameConfig(g.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:g.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:l}),y=await s(E);return Ih({cmd:a,key:i.targetName,newTarget:g.target,logger:l,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),g.target.targetSource="AI_HEALED",g.target.targetUpdateTime=new Date().toUTCString(),g.target.targetUpdateLoggerTags=at(l)),{result:y,elementInteractedDisplayString:g.resolution.displayString,thoughts:g.thoughts}}catch(g){if(h&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),f<m&&cy(g)){l.warn({err:g,aiAttempt:f},"Encountered retryable AI targeting error; retrying with AI once");continue}throw g instanceof L?g:new L("ActionFailureError",g.message)}}throw new L("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return fp(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await xe(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(r,n)}catch(c){throw this.throwIfClosed(),new L("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await this.executePresetCommandHelper(e,r,n,o);return this.options?.autoFollowNewTabs&&await MU({beforeUrl:a,command:r,beforePages:i.map(l=>l.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{zk(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>vv(e)}}async traceBrowserInteraction(e,r,n){return pn().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return Ag({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){o=o||"disableCache"in r&&!!r.disableCache;let i=this.logger.child({commandId:r.id});switch(r.type){case"SUCCESS":{let a=r.condition;return a?.assertion.trim()?zg({command:a,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AI_ASSERTION":{if(!r.assertion.trim())throw new L("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new L("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return zg({command:r,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i})}case"AI_EXTRACT":{if(!r.goal.trim())throw new L("ActionFailureError","Cannot perform AI extraction without goal");if(r.schema){let c=sP(r.schema);if(c)throw new L("UserConfigurationError",c)}let a=await this.browser.getCondensedHtml(),s=await this.browser.screenshot({retries:2});try{let c=await this.generator.getTextExtraction({goal:r.goal,browserState:a,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${s.toString("base64")}`},{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:at(i)});if(c.result==="NOT_FOUND")throw new L("ActionFailureError","No relevant data found for extraction goal on this page");if(c.thoughts?.includes("MaxGenerationLengthExceededError"))throw new L("UserConfigurationError",c.thoughts);return{thoughts:c.thoughts||void 0,data:c.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(c){let l=c.message;throw l.includes("MaxGenerationLengthExceededError")?new L("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."):l.includes("AIProviderError")&&l.includes("time")?new L("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:c}}):c}}case"NAVIGATE":if(!Mc(r.url)&&!Oc(r.url,this.browser.baseUrl))throw new L("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:r.url,loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0}));break;case"DIALOG":this.browser.registerDialogHandler(r.action);break;case"CAPTCHA":throw new L("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case"GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let a,s;if(r.target&&Lo(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{elementInteractedDisplayString:u,thoughts:d}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:p=>this.browser.hover(p),options:{...r,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:o}});a=u,s=d}let c=this.browser.getViewport()?.height??Pr.height,l=this.browser.getViewport()?.width??Pr.width;switch(r.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(r.deltaY??c)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(r.deltaY??c));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(r.deltaX??l)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(r.deltaX??l));break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new L("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let a=r.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:a},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":{if(r.delay>1800)throw new L("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=r.delay*1e3;await xe(a,this.executeAbortController.signal);break}case"REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0}));break;case"CLICK":{if(Lo(r.target)){let{pixels:d}=r.target;await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(d,r),{coordinates:d});break}let a=this.browser.url(),{elementInteractedDisplayString:s,result:c,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:r.target,command:r,cache:r.cache?.target,action:d=>this.traceBrowserInteraction("Click",()=>this.browser.click(d,this.createCallbacksForBrowser(this.orgId),r),{selector:d.locator.toString()}),options:{disableCache:o,targetName:"target",...r}}),u={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:l,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return Hh(a,u.urlAfterCommand)&&(u.succeedImmediately=!0,u.succeedImmediatelyReason="URL changed"),u}case"COPY":return await this.browser.copy(r.value),{succeedImmediately:!1,data:r.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Lo(r.fromTarget)&&Lo(r.toTarget)){let c=r.fromTarget.pixels,l=r.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,l,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(Lo(r.fromTarget)||Lo(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:a,thoughts:s}=await this.wrapMultiElementTargetingCommand({tracer:e,command:r,targetNames:["fromTarget","toTarget"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(c,l)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,l,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0,steps:r.steps})),options:{useSelector:!!r.useSelector,disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a[0],thoughts:s}}case"MOUSE_DRAG":{let a=parseInt(r.deltaX),s=parseInt(r.deltaY),c=r.steps??5;if(isNaN(a)||isNaN(s))throw new L("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&Lo(r.target)){let d=r.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:c,fromTarget:d}),{coordinates:d});break}let l,u;if(r.target?.elementDescriptor){let{elementInteractedDisplayString:d,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async m=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,c,m.locator,{force:r.force})),options:{disableCache:o,targetName:"target",...r}});l=d,u=p}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,c,void 0,{force:r.force}));return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:u}}case"SELECT_OPTION":{if(!Gi(r.target))throw new Error("Select with x/y is not supported yet");let a=r.target.elementDescriptor,s=r.choice,{elementInteractedDisplayString:c,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:{type:"description",elementDescriptor:a},cache:r.cache?.target,action:u=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(u,s,r.force),{value:s.type==="LABEL"?s.label:s.type==="VALUE"?s.value:s.index}),options:{...r,targetName:"target",disableCache:o,source:is(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:l}}case"TAB":{let a={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(r.action,a);break}case"NEW_TAB":await this.browser.createNewTab(r.url,{loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"COOKIE":{if(!r.value)break;let a=await this.browser.setCookie(r.value);i.debug({results:a},"Set cookies");break}case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let a;try{r.environment==="BROWSER"?(a=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:n.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),i.info({result:a},"Executed JavaScript in browser")):a=await xa({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:n,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async s=>{if(!this.options?.scratchPadId){i.warn({updates:s},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:s,logger:i})}}})}catch(s){throw this.throwIfClosed(),new L("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a)}catch(s){throw new L("ActionFailureError",`Return value is not serializable: ${s instanceof Error?s.message:`${s}`}`,{errOptions:{cause:s}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:a}}case"TYPE":{if(r.target&&Lo(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.traceBrowserInteraction("Type",()=>this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0),{value:r.value});break}let a=this.browser.url(),s,c,l=ZU(r.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(l){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:l,cache:r.cache?.target,action:f=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(r.value,f,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter,relativePosition:r.relativePosition}),{value:r.value,selector:f.locator.toString()}),options:{...r,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!u,source:is(r)}});s=p,c=m}else await this.traceBrowserInteraction("Type",()=>this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0),{value:r.value});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:c};return Hh(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(Lo(r.target)){let{pixels:c}=r.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c),{selector:c.locator.toString()}),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!Gi(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:c=>this.browser.focus(c),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(r.target&&!Gi(r.target))throw new Error("Blur with x/y is not supported yet");if(!r.target||!r.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,target:r.target,command:r,cache:r.cache?.target,action:c=>this.browser.blur(c),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"PRESS":{let a=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs}),{value:r.value});let s={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Hh(a,s.urlAfterCommand)&&(s.succeedImmediately=!0,s.succeedImmediatelyReason="URL changed"),s}case"KEY_DOWN":return await this.browser.keyDown(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let a=new nZ,s=rZ(fetch,a),c;try{c=new URL(r.url).hostname}catch{}let l=await YU({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:Ru.parse({...l,cookies:a_(a,c)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await QU({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return KU({tracer:e,command:r,disableCache:o,browser:this.browser,logger:i,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:a=>this.wrapElementTargetingCommand(a)});case"FILE_UPLOAD":{let a,s;if(r.fileSource.type==="URL"?(s=r.fileSource.url,a=await o0({uri:r.fileSource.url,logger:i,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(s=r.fileSource.name,a=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!a)throw new L("UserConfigurationError",`Attempted to use non-existent file for upload step: ${s}`);await this.browser.setFileChooserHandler({...a,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let a;if(!r.storageState.trim())a=void 0;else if(a=await xa({orgId:this.orgId,code:r.storageState,fragment:!1,context:n,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new L("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=Ym.optional().parse(a)}catch(c){throw new L("ActionFailureError",`Credentials provided do not follow the required format: ${c}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(r.timeout??Dn)*1e3,s=this.generator.getAgentConfig()?.assertion;if(WU(r.assertion)&&!r.useSelector&&r.target.type==="description"&&s&&s!=="v1"){let l={id:r.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: ${r.target.elementDescriptor}`,iframeUrl:r.iframeUrl,timeout:r.timeout,source:"NEGATED_CHECK",cache:r.cache&&"memory"in r.cache?{memory:r.cache?.memory}:void 0};try{let u=await zg({command:l,logger:i,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${u.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:u.afterScreenshotOverride}}finally{l.cache?.memory&&Zd(r,l.cache?.memory.traces,i)}}let c=await $U({command:r,tracer:e,timeoutMs:a,targetingWrapper:l=>this.wrapElementTargetingCommand(l),fixtures:this.getControllerFixtures(),disableCache:o});return{fail:!c.success,data:c.data,elementInteracted:c.elementInteractedDisplayString,thoughts:c.err?.message??c.thoughts??`Element assertion ${c.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await so({action:async()=>Gg({assertion:r.assertion,browser:this.browser,logger:i,timeout:r.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:i});return{fail:!a.success,data:a.data,thoughts:a.success?"Page assertion passed.":a.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let a=new Pa(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async c=>await xv(c)).catch(c=>{i.error({err:c},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let a=this.registeredListeners[r.key];if(!a)throw new L("ActionFailureError",`No listener registered with key: ${r.key}`);let s=r.timeout??10;return{data:await J(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new Pa(r.requestMatcher);return this.recordedRequests[r.key]={},this.browser.registerRequestRecorder(r.key,{matches:s=>a.matches({url:s.request.url,method:s.request.method}),onRequestStart:(s,c)=>{this.recordedRequests[r.key][s]=_g(c)},onRequestComplete:(s,c)=>{this.recordedRequests[r.key]?.[s]&&(this.recordedRequests[r.key][s]=_g(c))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[r.key];if(!a)throw new L("ActionFailureError",`No recorder registered with key: ${r.key}`);return delete this.recordedRequests[r.key],{data:Object.values(a),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let a;return r.requestMatcher&&(a=new Pa(r.requestMatcher)),this.browser.setHeader(r.name,r.value,a),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(r.key,new Pa(r.requestMatcher),async(s,c)=>{let l=await xa({orgId:this.orgId,code:r.responseGenerator,fragment:!1,context:n,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:c},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=O_.parse(l);return new Response(u.body,{status:u.status,headers:u.headers})},r.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(r.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(r.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}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:at(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 Ng({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:at(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:at(r??this.logger)})}};var nA=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(Os({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let S=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",g=await Rr({orgId:l,s:S,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[g,...Object.entries(r).map(([y,b])=>`${y}:${b}`)]},n.info({original:S,keyParams:h},"Module cache key params");let E=Date.now();for(;Date.now()-E<dI;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:ht(y,1e3,!0)},"Got result from module execution cache"),p=jg(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:S,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${oZ()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:S,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:S,keyParams:h},"Failed to acquire cache lock, retrying...");await xe(2500+Math.random()*1e4,d)}}try{if(!p)p=await iZ(t);else if(e.autoAuth){let S=Ym.safeParse(p.data);if(!S.success)throw new L("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${S.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(S.data);let g=!1,E=e.advanced?.cacheInvalidation;if(E&&E.type==="PAGE_CHECK"){let y={type:"CONTENT",value:E.substring},b=await Gg({timeout:Dn,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});b.success?n.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(n.info({invalResult:b},"Invalidating cached result due to page check failure"),g=!0)}if(h&&g)return await i.deleteCacheResult(h),nA(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await aZ({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},iZ=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=jg(r,t.moduleParams.resolvedInputs,"SUCCESS"),i=await n.startSubSteps(),{status:a,results:s}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:`module ('${r.name}')`,tracer:i,currentParentIdChain:e}});return o.results=s,o.status=a,o.finishedAt=new Date,oo({asyncTasks:t.work.asyncTasks,nestedResults:s,result:o,logger:t.fixtures.logger}),o};function jg(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 eF({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 xa({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new L("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function aZ({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===rP)&&(a=t.defaultCacheTtl??nP);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:Os({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function Js(t,e,r){return sZ(t,e,r)}async function sZ(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 L?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=jg(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Bh(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function xo(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 w7}from"lodash-es";import{randomUUID as tF}from"crypto";import{diff as lZ}from"deep-object-diff";import{cloneDeep as rF}from"lodash-es";var Vg=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?rF(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=tF(),h=tF();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:f,html:y})}}catch(y){l.debug({err:y},"Failed to take before screenshot, continuing...")}let S,g,E;try{let y=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),E=y.afterScreenshotOverride;let b=new Date,R=o.browser.url();g={beforeUrl:d,afterUrl:R,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},S={...e,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:R,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[g]},"assertion"in e.command&&(S.message=y.thoughts||"Assertion passed.")}catch(y){l.error({message:y.message,stack:y.stack},`Failed executing preset step ${Xn(e.command)}`);let b=o.browser.url(),R=new Date,I=y instanceof Error?y.message:`${y}`;g={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:R,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:I},S={...e,startedAt:p,finishedAt:R,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:I,failureReason:y instanceof L?y.reason:void 0,results:[g]}}finally{let y="cache"in e.command&&e.command.cache?rF(e.command.cache):{},b=lZ(u,y);b&&Object.keys(b).length>0&&l.info({diffs:Qm(b)},"Updated cache")}if(a)try{if(E||(E=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:y})}}catch(y){l.debug({err:y},"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 g.beforeSnapshot=f,S.beforeSnapshot=f,g.afterSnapshot=h,S.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),E&&r.attachAfterScreenshot({snapshotId:h,screenshot:E}),S};async function cZ(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 xo(t.work,()=>Vg({...t,presetParams:{tracer:n,step:e.assertion}})),c=a.type;switch(c){case"AI_ASSERTION":case"ELEMENT_CHECK":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 l=!!s.data;return s.status=l?"SUCCESS":"FAILED",s.message=l?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:l},`JavaScript condition ${r} evaluated`),l?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(c)}}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 uZ(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}=Ms(a.steps,e,o);if(s)return i}return-1}async function nF(t){let{currentParentIdChain:e}=t,{step:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Bh(r),s=!!o&&Jd(e,o.parentStepIdChain),c=r.elseSteps,l=!0,u=[],d,p=!1;if(s&&o){let g=uZ(r,o.fromStepId,e,o.parentStepIdChain);g>=0&&(c=r.blocks[g].steps,l=!1,p=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${g}), running ${c.length} steps`))}if(!p)for(let g=0;g<r.blocks.length;g++){n.info(`Evaluating condition ${g} in conditional step`);let E=r.blocks[g],y=await cZ(t,E,g);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:y.conditionResult.message,results:[]};return oo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:n}),b}if(y.type==="passed"){n.info(`Condition ${g} resolved to true, executing the corresponding ${y.steps.length} steps`),l=!1,c=y.steps;break}}if(c)l&&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 g={...a,assertionResult:d,status:"SUCCESS",startedAt:i,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return oo({asyncTasks:t.work.asyncTasks,nestedResults:[...u],result:g,logger:n}),g}n.info(`Executing ${c.length} steps in the selected conditional block`);let m=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:c,containerName:"conditional block",tracer:m,currentParentIdChain:e}}),S={...a,assertionResult:d,...f,startedAt:i,finishedAt:new Date};return oo({asyncTasks:t.work.asyncTasks,nestedResults:[...u,...f.results],result:S,logger:n}),S}import{randomUUID as oF}from"crypto";var iF=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await dZ(t);o.finishedAt=new Date,oo({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=oF();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=oF();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},dZ=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.aiStepParams,{controller:o,context:i,logger:a}=t.fixtures,s={...r,startedAt:new Date,beforeTestContext:i.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in r&&r.steps&&r.steps.length>0&&r.steps[r.steps.length-1]?.command.type==="SUCCESS"))throw new L("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let l=await n.startSubSteps(),{status:u}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:"AI action",results:s.results,tracer:l,currentParentIdChain:e}});return s.finishedAt=new Date,s.status=u,s}catch(l){a.warn({err:l},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=l instanceof Error?l.message:`${l}`,s.status=u?"CANCELLED":"FAILED"}return s};import{randomUUID as vA}from"crypto";var aF=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as l7}from"ai";import{existsSync as dF,mkdirSync as pZ}from"fs";import{readdir as mZ,stat as fZ,unlink as hZ,writeFile as gZ}from"fs/promises";import hp from"path";import oA from"path";function ce({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}
4961
+ `),tokenLength:d}),s.forEach((h,S)=>{let g=h.ids[0],E=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:g,maxId:E},`Chunk for page filtering (index ${S+1}/${s.length})`)}),{chunks:s}}var D9=75e4,Bg=3e5;async function Xs(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=rt(u);if(d>D9)try{let p=Fg({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await U9({...t,tokenLimit:Bg-1e4,chunks:p.chunks}),u=l.serialize();let m=rt(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(Bg*Sa),u=l.serialize();let m=rt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Bg)try{if(o){let p=Fg({serializedTree:u,options:kU,logger:i}),m=N9();l=await J(k9({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let f=rt(u);i.info({oldTokens:d,newTokens:f,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=f}else{let p=Fg({serializedTree:u,options:DU,logger:i});l=await J(F9({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=rt(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(Bg*Sa),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function k9({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:at(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function U9(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:at(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,f)=>m+f.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 F9(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:at(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 tA(t,e){if(!t.description)throw new L("UserConfigurationError","Cannot locate element with empty description");return so({action:async()=>B9(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function B9(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d,isAutoHeal:p,cacheBustReason:m}=t,{orgId:f,browser:h,localCodeEvalTools:S,generator:g,abortSignal:E}=e,y=t.description,b=pn(),R=t.useMemory&&!r;n&&(y=await Rr({orgId:f,s:y,context:n,localTools:S,signal:E,logger:l})),a&&(y=PU(y,a));let{serializedTree:I,tree:_}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>ti(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:E,skipWait:i,logger:l}),{}),A=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let X,oe=Date.now(),pe;for(;!X&&Date.now()-oe<3e3;){E.throwIfAborted();try{X=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Te){pe=Te}}if(!X)throw new L("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${pe?.message}`);return X}),O=I,P=!1,D=`data:image/jpeg;base64,${A.toString("base64")}`;O=await Xs({type:"locator",description:y,screenshot:D,serializedTree:I,options:{aiPageFiltering:c},tree:_,fixtures:{generator:g,signal:E,logger:l,orgId:f}}),O!==I&&(P=!0);let z=await b.startAsyncSpan("AI_LOCATOR_CALL",async X=>{p&&(X.attributes.isAutoHeal=!0),m&&(X.attributes.cacheBustReason=m);let oe=await g.getElementLocation({browserState:O,goal:y,screenshot:D,source:a,memory:R?s:void 0},{disableCache:r,abortSignal:E,loggerTags:at(l),useMemory:R});if(X.result=oe,b.storeTraceAsset){let pe=FU();b.storeTraceAsset({snapshotId:pe,data:A}),X.screenshotSnapshotId=pe}return oe});if(l.debug({usedRag:P,result:z},"Got locator result"),!(z.id>0))throw new Ml(`Could not find any relevant element: ${z.thoughts}`,z.updatedMemory?{type:"GCS_TRACES",traces:z.updatedMemory}:void 0);let{resolution:ie,target:$,frameConfig:K}=await b.startAsyncSpan("TARGET_RESOLUTION",async X=>{let oe=await h.createTargetFromA11yId({id:z.id,requirements:z.requirements,additionalElements:z.additionalElements,description:y,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});if(X.result={serializedElement:oe.target.nodeOnlySerializedHtml??"Unknown HTML element"},b.storeTraceAsset)try{let pe=await h.screenshot({locator:oe.resolution.locator,clearHighlights:!0}),Te=FU();b.storeTraceAsset({snapshotId:Te,data:pe}),X.elementScreenshotSnapshotId=Te}catch(pe){l.debug({err:pe},"Failed to capture element screenshot for locator trace, continuing...")}return oe});if(ie.a11yNode?.properties?.hidden&&ie.a11yNode?.properties?.hidden!=="false")throw new L("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: ${ie.displayString}`);return R&&(z.updatedMemory?$.memory={type:"GCS_TRACES",traces:z.updatedMemory}:s&&($.memory=s)),{thoughts:z.thoughts,target:$,resolution:ie,frameConfig:K,screenshot:D}}import{randomUUID as BU}from"crypto";var z9=15;async function zg({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=z9}){if(!t.assertion.trim())throw new L("ActionFailureError","Assertion command is missing the assertion content");let a=Uy.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=pn();return s.startAsyncSpan("AI_ASSERTION_CALL",async c=>{let{browser:l}=n,u=t.timeout?t.timeout*1e3:l.smartWaitingTimeout,d=aD(u,i-1),p=0,m=Date.now(),f=m+u,h=m,S,g,E;try{await so({action:()=>l.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:l,logger:r})}catch(R){r.warn({err:R},"Failed to clear highlights before AI check, continuing...")}for(;p<i;){n.abortSignal.throwIfAborted();let R=Date.now();if(p>0){if(R>=f)break;let A=f-R,O=h-R,P=Math.min(O,A);P>0&&await xe(P,n.abortSignal)}let I=Date.now();if(p>0&&I>=f)break;let _=!1;try{if(S=await so({action:async()=>{let O=await zU(l,r,n.abortSignal);return g&&g.serializedTree===O.serializedTree&&g.screenshotBuff.equals(O.screenshotBuff)?(_=!0,S):(g=O,HU({command:t,state:O,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:p,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:l}),S?.success){S?.updatedMemory&&Zd(t,S.updatedMemory,r);break}else throw S?.thoughts?new L("AssertionFailureError",S.thoughts):new L("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(A){n.abortSignal.throwIfAborted(),E=A instanceof Error?A:new Error(`${A}`),_?r.info(`AI check attempt ${p} failed (re-used previous result)`):r.info({err:A},`AI check assert attempt ${p} failed, retrying...`)}finally{p++,h=I+d}}if(!S?.success){let R=f-Date.now();R>0&&await xe(R,n.abortSignal)}if(!S?.success)try{S=await so({action:async()=>HU({command:t,state:await zU(l,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:p,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:l})}catch(R){n.abortSignal.throwIfAborted(),E=R instanceof Error?R:new Error(`${R}`)}finally{p++}S?.updatedMemory&&Zd(t,S.updatedMemory,r);let y=S?.afterScreenshotOverride;if(y&&s.storeTraceAsset){let R=BU();s.storeTraceAsset({snapshotId:R,data:y}),c.screenshotSnapshotId=R}let b=S?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let R=BU();s.storeTraceAsset({snapshotId:R,data:b}),c.elementScreenshotSnapshotId=R}if(!S?.success){c.result={thoughts:E?.message??"AI check failed after all attempts",result:!1};let R=`AI check still failing after ${p} attempts.`;throw E&&(R+=` Latest result: ${E.message}`),new L("AssertionFailureError",R)}return c.result={thoughts:S.thoughts,result:!0},{...S,succeedImmediately:!1,urlAfterCommand:l.url()}})}async function zU(t,e,r){await t.waitForPageLoad({signal:r});let[n,o]=await Promise.all([ti(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function HU({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:f,tree:h}=e,S=e.screenshotBuff,g=S.toString("base64"),E=u.url(),y=t.contextChoice??"MULTIMODAL",b=f;y!=="VISION_ONLY"&&(b=await Xs({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:g,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),b!==f&&(m.ragUsed=!0),m.pageState=b);let R={goal:t.assertion,url:E,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:g,contextChoice:y,source:c},_=await(y==="VISION_ONLY"?(O,P)=>d.getVisualAssertionResult(O,P):(O,P)=>d.getAssertionResult(O,P))(R,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:at(l)}),A;if((_.result||i)&&_.relevantElements?.length){m.relevantElementsSerialized=_.relevantElements.map(O=>u.getSerializedFormFromA11yId(O)).filter(O=>!!O);try{let O=_.relevantElements[0],{resolution:P}=await u.createTargetFromA11yId({id:O,description:null,targetSource:"AI",skipSaveToCache:!0});A=await u.screenshot({locator:P.locator,clearHighlights:!0,respectActiveFrame:!0})}catch(O){l.debug({err:O},"Failed to capture element screenshot for trace, continuing...")}await H9(_.relevantElements,u,l)}return{success:_.result,thoughts:_.thoughts,afterScreenshotOverride:S,elementScreenshotOverride:A,updatedMemory:o?_.updatedMemory:void 0}}async function H9(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 J(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 G9=1e5,Hg=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function GU(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await j9(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Hg?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 xe(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function j9(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await xe(o.smartWaitingTimeout,n);return}if(!e.description)throw new L("UserConfigurationError","Cannot locate element with empty description");await J(V9(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function V9(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await so({action:async()=>$9(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function $9(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 Rr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await ti(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(rt(p)>G9)throw new Hg;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){throw new L("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: ${E instanceof Error?E.message:E}`)}let S=`data:image/jpeg;base64,${f.toString("base64")}`;s.throwIfAborted();let g=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:S},{abortSignal:s,loggerTags:at(n)});return n.debug({result:g},"Got smart waiting result"),g.isPageReady}import{cloneDeep as VU}from"lodash-es";async function $U(t){return pn().startAsyncSpan("ELEMENT_ASSERTION",async r=>W9(t,r),{name:"Element check"})}async function W9(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>em(r.cache)?r.cache:void 0,c=s(),l=!i&&!!c?.target&&fl(c.target),u=VU(c),d=(E=!1)=>{if(c=s(),!!c)if(E){let y=mb(u,c);c.target=y.target,c.updatedAt=y.updatedAt}else{if(!u){c=void 0;return}c.target=u.target,c.updatedAt=u.updatedAt}},p=Date.now(),m=0,f,h=500,S=!1;for(;m<2||Date.now()-p<n;){m++,m>1&&await xe(h,a),a?.throwIfAborted(),c=s();let E=m===1,{result:y,elementWasFound:b}=await jU({cacheToUse:c,skipAISmartWaiting:!E,useAIIfCacheFails:!l,params:t});if(f=y,S=S||b,y.success)break;d(),h=Math.min(h*1.25,1e4)}if(!f)throw new L("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!f.success){let E=s(),y=E?.target?.memory?{target:{id:-1,memory:E.target.memory}}:void 0,{result:b,elementWasFound:R}=await jU({cacheToUse:y,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:t});f=b,S=S||R,f.success||d(!0)}let g=s();return f.success&&g?.target&&!S&&(g.target=Qd(g.target),g.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function jU({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:r,params:n}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:c}=n,{logger:l}=a;if(o.target&&!Gi(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=JL(o.assertion),d,p=!1,m=VU(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:S}=await c({tracer:s,command:o,target:o.target,cache:m?.target,action:async g=>q9(g.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:is(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:r?1:0});return d={success:h.success,data:h.data,err:h.err,elementInteractedDisplayString:f,thoughts:S},p=!0,h.success||(l.warn({aiThoughts:S,elementString:f,err:h.err},"Element check found an element but failed"),d={...h,thoughts:S}),{result:d,elementWasFound:p}}catch(f){if(u)return d={success:!0,thoughts:`The element described does not exist on the page: ${f.message}`,err:void 0,data:void 0},{result:d,elementWasFound:p};if(!(f instanceof L)||f.reason!="ActionFailureError")throw f;return d={success:!1,err:f,data:void 0,thoughts:void 0},l.warn({err:f},"Element check did not find an element and failed"),{result:d,elementWasFound:p}}}async function q9(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await K9(t,e.assertion)}async function K9(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:ht(a,500,!0)},!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,n=new L("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ht(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 L("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,e.operation==="EXISTS"?n=new L("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new L("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},Dn*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:Dn*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:Dn*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=wc(e);n=new L("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=wc(e);r=!1,n=new L("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(!Xd(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=wc(e);r=!1,e.operation==="EXISTS"?n=new L("AssertionFailureError",`The style property ${e.property} ${s}`):n=new L("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 WU(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as Y9}from"jimp";async function fp(t,e){let r=await t.screenshot(e),n=await Y9.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as qU}from"jimp";import rA from"jpeg-js";import X9 from"pixelmatch";async function KU({tracer:t,command:e,disableCache:r,browser:n,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!Gi(e.target))throw new Error("Visual Diff with x/y is not supported yet");await n.waitForStability({logger:i});let s={clearHighlights:!0,hideCaret:!0},c;e.target?.elementDescriptor?c=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async P=>fp(n,{locator:P.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:c=await fp(n,s);let l=await a.prepareGoldenScreenshotForComparison(i,e,c);if((c.height!==l.height||c.width!==l.width)&&i.warn({currHeight:c.height,currWidth:c.width,savedHeight:l.height,savedWidth:l.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-l.height)>10||Math.abs(c.width-l.width)>10){let O=`${c.width}x${c.height}`,P=`${l.width}x${l.height}`;return{fail:!0,thoughts:`Current screenshot (${O}) does not match saved screenshot dimensions (${P}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:n.url()}}let u=await qU.fromBuffer(c.buffer),d={width:c.width,height:c.height},p=await qU.fromBuffer(l.buffer),m={width:l.width,height:l.height},f,h=d.width*d.height,S=m.width*m.height,g=Math.abs(d.height-m.height),E=Math.abs(d.width-m.width);if(h>S){let O=u.cover({w:m.width,h:m.height});c.buffer=await O.getBuffer("image/jpeg"),f="current",c.width=m.width,c.height=m.height}else if(S>h){let O=p.cover({w:d.width,h:d.height});l.buffer=await O.getBuffer("image/jpeg"),f="saved"}let y={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},b=e.threshold??.1,I=X9(rA.decode(l.buffer).data,rA.decode(c.buffer).data,y.data,c.width,c.height,{threshold:b,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,_=I>b*100,A=`Visual diff of ${I.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${b*100}%.`;if(f&&(A+=` The ${f} screenshot was cropped since it was taller by ${g} pixels and wider by ${E} pixels.`),_)throw new L("ActionFailureError",A);return{fail:_,thoughts:A,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:rA.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var J9=3e4;function Q9(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 YU({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??J9/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h)});let s=a.toString(),c;if(Mc(t.url)&&(c=t.url),r&&Oc(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new L("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 J((async()=>{let f=s?`${l}?${s}`:l;try{let h=Q9(t),S=new Headers(i);return h.contentType&&!S.has("Content-Type")&&S.set("Content-Type",h.contentType),await n(f,{headers:S,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 L("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text()}catch(h){f=`Failed to read response body: ${h}`}throw new L("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let p={};d.headers.forEach((f,h)=>{p[h]=f});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 Z9=5e3;async function Gg({timeout:t=Dn,...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 XU(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 xe(s,e.signal),s=Math.min(Math.floor(s*1.5),Z9);else return i}return i=await XU(e),i}async function XU({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(JU,{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(JU,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?vi.CONTAINS:Ai.CONTAINS;a=new L("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new L("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 JU({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 eZ=3e4;async function QU({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??eZ/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Mc(t.url)&&(s=t.url),r&&Oc(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new L("ActionFailureError",`Invalid URL: ${t.url}`);let l=await J((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 L("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 L("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new L("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new L("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 La=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];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 withExecutionOptions(e,r){this.executionOptionsStack.push(e);try{return await r()}finally{this.executionOptionsStack.pop()}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([ti(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 Xs({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:{...at(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([ti(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 Xs({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:{...at(a)},langfuseSessionId:s})}catch(f){throw new L("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return ti(this.browser,e)}async locateElement(e){return await tA({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return so({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({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(){return{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({tracer:e,command:r,targetNames:n,descriptions:o,caches:i,action:a,options:s,retriesWithAI:c=1}){let l=[];for(let u=0;u<o.length;u++){let d=o[u],p=await this.wrapElementTargetingCommand({tracer:e,command:r,target:d,cache:i[u],action:async m=>m,options:{...s,targetName:n[u]}});l.push(p)}try{let u=await a(...l.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=l.map((m,f)=>m.thoughts?`${d(n[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return{result:u,elementInteractedDisplayStrings:l.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),c>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:e,command:r,targetNames:n,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:c-1});throw new L("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:e,action:r,options:n,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=n;if(e.type!=="description")throw new L("ActionFailureError","Cannot use selector with non-description target");let s,c=Date.now(),l=Date.now();for(;Date.now()-l<this.browser.smartWaitingTimeout;){c=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:e.elementDescriptor,targetName:a,logger:i});return{result:await r({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-c<500&&await xe(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=pn(),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 c=>{let{targetingResult:l,metadata:u}=await this.browser.performTargetRedirection(r,o);if(c.result=u,l&&i.storeTraceAsset)try{let d=await this.browser.screenshot({locator:l.locator,clearHighlights:!0}),p=tZ();i.storeTraceAsset({snapshotId:p,data:d}),c.elementScreenshotSnapshotId=p}catch(d){o.debug({err:d},"Failed to capture element screenshot for redirect trace")}return l})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:me}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await pn().startAsyncSpan("CACHE_RESOLUTION",async c=>{c.targetSource=r.targetSource;try{let l=await this.browser.resolveTarget(r,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...n.resolveTargetOptions});c.attributes.targetDisplayString=l.displayString,c.attributes.decisions=l.decisions;let u=l.decisions.find(d=>d.matched);return u&&(c.resolutionMethod=u.type),l}catch(l){throw l instanceof rn&&(c.cacheMissReason=l.cacheMissReason,c.attributes.decisions=l.decisions),l}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:o});return await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await so({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{tracer:r,target:n,action:o,options:i,command:a,finalAttempt:s=!1,originalCache:c=e.cache}=e,{retriesWithAI:l=1}=e,{disableCache:u,useSelector:d,targetName:p}=i,m=pn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),S=ZU(e.cache);if((!S||u)&&!YS(n))throw new L("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let g=!1,E;u&&(f.info("Cache explicitly disabled for this step"),g=!0,E="Cache explicitly disabled",S=void 0);let y=LU({cache:S,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});S=y.cache,g=g||y.cacheBustedBeforeAction,!E&&y.cacheBustReason&&(E=y.cacheBustReason);let b=!0;if(!OU(S))return l--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:r,target:n,options:i,command:a,action:o,originalCache:c,logger:f,useMemory:h,cacheBustedBeforeAction:g,cacheBustReason:E});try{let{resolutionResult:R,finalTarget:I}=await this.resolveCachedTargetForAction({cache:S,options:i,logger:f}),_=await o(I);if(Kt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.78.0"]),Ih({cmd:a,key:p,newTarget:S,logger:f,updatedWithAI:!1}),b){let A=R.decisions.filter(O=>O.matched);if(A.length!==1)f.warn({decisions:R.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let O=A[0].type;r.recordTargetAutoHeal({healType:O})}}return{result:_,elementInteractedDisplayString:R.displayString}}catch(R){this.throwIfClosed();let I=cy(R);if(I&&!s)return f.warn({err:R},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,action:o,cache:c,originalCache:c,retriesWithAI:l,finalAttempt:!0,options:i});if(R instanceof L&&!I)throw f.warn({err:R},"Failed to execute command with target (fatal)"),R;if(l>0&&n){f.info({err:R},"Failed to execute action with cached target, retrying with AI"),Kt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.78.0",`missReason:${R instanceof rn?R.cacheMissReason:"unknown"}`]);let _;return S.memory&&Jp(S.memory)&&(_=S.memory),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,cache:void 0,action:o,originalCache:c,retriesWithAI:l,finalAttempt:!0,options:{...i,memory:_,targetHealingInProgress:!0}})}throw new L("ActionFailureError",`Failed to execute interactive command: ${R instanceof Error?R.message:`${R}`}`,{errOptions:{cause:R}})}}async executeTargetingCommandWithAI(e){let{tracer:r,stepTracer:n,target:o,options:i,command:a,action:s,originalCache:c,logger:l,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=e;l.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location"),(d||!c)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?await r.startAsyncSpan("SMART_WAITING",async()=>await GU({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:l,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())):(d||!c)&&(i.skipAISmartWaiting?l.debug("Skipping AI smart waiting for this targeting attempt"):l.debug("Skipping AI smart waiting due to controller execution options"));let m=2;for(let f=1;f<=m;f++){let h=!1,S=this.browser.getActiveFrameConfig();try{let g;try{g=await tA({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,logger:l,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(b){if(b instanceof Ml&&b.updatedLocatorMemory){let R={id:-1,...c,memory:b.updatedLocatorMemory};Ih({cmd:a,key:i.targetName,newTarget:R,logger:l,updatedWithAI:!0})}throw b}g.frameConfig&&(this.browser.setActiveFrameConfig(g.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:g.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:l}),y=await s(E);return Ih({cmd:a,key:i.targetName,newTarget:g.target,logger:l,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),g.target.targetSource="AI_HEALED",g.target.targetUpdateTime=new Date().toUTCString(),g.target.targetUpdateLoggerTags=at(l)),{result:y,elementInteractedDisplayString:g.resolution.displayString,thoughts:g.thoughts}}catch(g){if(h&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),f<m&&cy(g)){l.warn({err:g,aiAttempt:f},"Encountered retryable AI targeting error; retrying with AI once");continue}throw g instanceof L?g:new L("ActionFailureError",g.message)}}throw new L("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return fp(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await xe(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(r,n)}catch(c){throw this.throwIfClosed(),new L("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await this.executePresetCommandHelper(e,r,n,o);return this.options?.autoFollowNewTabs&&await MU({beforeUrl:a,command:r,beforePages:i.map(l=>l.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{zk(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>vv(e)}}async traceBrowserInteraction(e,r,n){return pn().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return Ag({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){o=o||"disableCache"in r&&!!r.disableCache;let i=this.logger.child({commandId:r.id});switch(r.type){case"SUCCESS":{let a=r.condition;return a?.assertion.trim()?zg({command:a,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AI_ASSERTION":{if(!r.assertion.trim())throw new L("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new L("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return zg({command:r,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i})}case"AI_EXTRACT":{if(!r.goal.trim())throw new L("ActionFailureError","Cannot perform AI extraction without goal");if(r.schema){let c=sP(r.schema);if(c)throw new L("UserConfigurationError",c)}let a=await this.browser.getCondensedHtml(),s=await this.browser.screenshot({retries:2});try{let c=await this.generator.getTextExtraction({goal:r.goal,browserState:a,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${s.toString("base64")}`},{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:at(i)});if(c.result==="NOT_FOUND")throw new L("ActionFailureError","No relevant data found for extraction goal on this page");if(c.thoughts?.includes("MaxGenerationLengthExceededError"))throw new L("UserConfigurationError",c.thoughts);return{thoughts:c.thoughts||void 0,data:c.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(c){let l=c.message;throw l.includes("MaxGenerationLengthExceededError")?new L("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."):l.includes("AIProviderError")&&l.includes("time")?new L("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:c}}):c}}case"NAVIGATE":if(!Mc(r.url)&&!Oc(r.url,this.browser.baseUrl))throw new L("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:r.url,loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0}));break;case"DIALOG":this.browser.registerDialogHandler(r.action);break;case"CAPTCHA":throw new L("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case"GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let a,s;if(r.target&&Lo(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{elementInteractedDisplayString:u,thoughts:d}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:p=>this.browser.hover(p),options:{...r,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:o}});a=u,s=d}let c=this.browser.getViewport()?.height??Pr.height,l=this.browser.getViewport()?.width??Pr.width;switch(r.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(r.deltaY??c)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(r.deltaY??c));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(r.deltaX??l)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(r.deltaX??l));break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new L("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let a=r.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:a},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":{if(r.delay>1800)throw new L("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=r.delay*1e3;await xe(a,this.executeAbortController.signal);break}case"REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0}));break;case"CLICK":{if(Lo(r.target)){let{pixels:d}=r.target;await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(d,r),{coordinates:d});break}let a=this.browser.url(),{elementInteractedDisplayString:s,result:c,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,target:r.target,command:r,cache:r.cache?.target,action:d=>this.traceBrowserInteraction("Click",()=>this.browser.click(d,this.createCallbacksForBrowser(this.orgId),r),{selector:d.locator.toString()}),options:{disableCache:o,targetName:"target",...r}}),u={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:l,data:c.downloadedFile?{downloadedFile:c.downloadedFile}:void 0};return Hh(a,u.urlAfterCommand)&&(u.succeedImmediately=!0,u.succeedImmediatelyReason="URL changed"),u}case"COPY":return await this.browser.copy(r.value),{succeedImmediately:!1,data:r.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Lo(r.fromTarget)&&Lo(r.toTarget)){let c=r.fromTarget.pixels,l=r.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(c,l,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0}),{coordinates:c});break}if(Lo(r.fromTarget)||Lo(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:a,thoughts:s}=await this.wrapMultiElementTargetingCommand({tracer:e,command:r,targetNames:["fromTarget","toTarget"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(c,l)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(c,l,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0,steps:r.steps})),options:{useSelector:!!r.useSelector,disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a[0],thoughts:s}}case"MOUSE_DRAG":{let a=parseInt(r.deltaX),s=parseInt(r.deltaY),c=r.steps??5;if(isNaN(a)||isNaN(s))throw new L("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&Lo(r.target)){let d=r.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:c,fromTarget:d}),{coordinates:d});break}let l,u;if(r.target?.elementDescriptor){let{elementInteractedDisplayString:d,thoughts:p}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async m=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,c,m.locator,{force:r.force})),options:{disableCache:o,targetName:"target",...r}});l=d,u=p}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,c,void 0,{force:r.force}));return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:u}}case"SELECT_OPTION":{if(!Gi(r.target))throw new Error("Select with x/y is not supported yet");let a=r.target.elementDescriptor,s=r.choice,{elementInteractedDisplayString:c,thoughts:l}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:{type:"description",elementDescriptor:a},cache:r.cache?.target,action:u=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(u,s,r.force),{value:s.type==="LABEL"?s.label:s.type==="VALUE"?s.value:s.index}),options:{...r,targetName:"target",disableCache:o,source:is(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:l}}case"TAB":{let a={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(r.action,a);break}case"NEW_TAB":await this.browser.createNewTab(r.url,{loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"COOKIE":{if(!r.value)break;let a=await this.browser.setCookie(r.value);i.debug({results:a},"Set cookies");break}case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let a;try{r.environment==="BROWSER"?(a=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:n.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),i.info({result:a},"Executed JavaScript in browser")):a=await xa({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:n,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async s=>{if(!this.options?.scratchPadId){i.warn({updates:s},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:s,logger:i})}}})}catch(s){throw this.throwIfClosed(),new L("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a)}catch(s){throw new L("ActionFailureError",`Return value is not serializable: ${s instanceof Error?s.message:`${s}`}`,{errOptions:{cause:s}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:a}}case"TYPE":{if(r.target&&Lo(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.traceBrowserInteraction("Type",()=>this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0),{value:r.value});break}let a=this.browser.url(),s,c,l=ZU(r.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(l){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:l,cache:r.cache?.target,action:f=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(r.value,f,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter,relativePosition:r.relativePosition}),{value:r.value,selector:f.locator.toString()}),options:{...r,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!u,source:is(r)}});s=p,c=m}else await this.traceBrowserInteraction("Type",()=>this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0),{value:r.value});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:c};return Hh(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(Lo(r.target)){let{pixels:c}=r.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(c),{coordinates:c});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:c=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(c),{selector:c.locator.toString()}),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!Gi(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:c=>this.browser.focus(c),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(r.target&&!Gi(r.target))throw new Error("Blur with x/y is not supported yet");if(!r.target||!r.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,target:r.target,command:r,cache:r.cache?.target,action:c=>this.browser.blur(c),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"PRESS":{let a=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs}),{value:r.value});let s={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Hh(a,s.urlAfterCommand)&&(s.succeedImmediately=!0,s.succeedImmediatelyReason="URL changed"),s}case"KEY_DOWN":return await this.browser.keyDown(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let a=new nZ,s=rZ(fetch,a),c;try{c=new URL(r.url).hostname}catch{}let l=await YU({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:Ru.parse({...l,cookies:a_(a,c)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await QU({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return KU({tracer:e,command:r,disableCache:o,browser:this.browser,logger:i,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:a=>this.wrapElementTargetingCommand(a)});case"FILE_UPLOAD":{let a,s;if(r.fileSource.type==="URL"?(s=r.fileSource.url,a=await o0({uri:r.fileSource.url,logger:i,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(s=r.fileSource.name,a=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!a)throw new L("UserConfigurationError",`Attempted to use non-existent file for upload step: ${s}`);await this.browser.setFileChooserHandler({...a,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let a;if(!r.storageState.trim())a=void 0;else if(a=await xa({orgId:this.orgId,code:r.storageState,fragment:!1,context:n,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new L("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=Ym.optional().parse(a)}catch(c){throw new L("ActionFailureError",`Credentials provided do not follow the required format: ${c}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(r.timeout??Dn)*1e3,s=this.generator.getAgentConfig()?.assertion;if(WU(r.assertion)&&!r.useSelector&&r.target.type==="description"&&s&&s!=="v1"){let l={id:r.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: ${r.target.elementDescriptor}`,iframeUrl:r.iframeUrl,timeout:r.timeout,source:"NEGATED_CHECK",cache:r.cache&&"memory"in r.cache?{memory:r.cache?.memory}:void 0};try{let u=await zg({command:l,logger:i,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${u.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:u.afterScreenshotOverride}}finally{l.cache?.memory&&Zd(r,l.cache?.memory.traces,i)}}let c=await $U({command:r,tracer:e,timeoutMs:a,targetingWrapper:l=>this.wrapElementTargetingCommand(l),fixtures:this.getControllerFixtures(),disableCache:o});return{fail:!c.success,data:c.data,elementInteracted:c.elementInteractedDisplayString,thoughts:c.err?.message??c.thoughts??`Element assertion ${c.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await so({action:async()=>Gg({assertion:r.assertion,browser:this.browser,logger:i,timeout:r.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:i});return{fail:!a.success,data:a.data,thoughts:a.success?"Page assertion passed.":a.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let a=new Pa(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async c=>await xv(c)).catch(c=>{i.error({err:c},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let a=this.registeredListeners[r.key];if(!a)throw new L("ActionFailureError",`No listener registered with key: ${r.key}`);let s=r.timeout??10;return{data:await J(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new Pa(r.requestMatcher);return this.recordedRequests[r.key]={},this.browser.registerRequestRecorder(r.key,{matches:s=>a.matches({url:s.request.url,method:s.request.method}),onRequestStart:(s,c)=>{this.recordedRequests[r.key][s]=_g(c)},onRequestComplete:(s,c)=>{this.recordedRequests[r.key]?.[s]&&(this.recordedRequests[r.key][s]=_g(c))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[r.key];if(!a)throw new L("ActionFailureError",`No recorder registered with key: ${r.key}`);return delete this.recordedRequests[r.key],{data:Object.values(a),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let a;return r.requestMatcher&&(a=new Pa(r.requestMatcher)),this.browser.setHeader(r.name,r.value,a),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(r.key,new Pa(r.requestMatcher),async(s,c)=>{let l=await xa({orgId:this.orgId,code:r.responseGenerator,fragment:!1,context:n,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:c},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=O_.parse(l);return new Response(u.body,{status:u.status,headers:u.headers})},r.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(r.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(r.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}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:at(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 Ng({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:at(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:at(r??this.logger)})}};var nA=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(Os({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let S=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",g=await Rr({orgId:l,s:S,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[g,...Object.entries(r).map(([y,b])=>`${y}:${b}`)]},n.info({original:S,keyParams:h},"Module cache key params");let E=Date.now();for(;Date.now()-E<dI;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:ht(y,1e3,!0)},"Got result from module execution cache"),p=jg(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else n.info({cacheKey:S,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${oZ()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:S,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:S,keyParams:h},"Failed to acquire cache lock, retrying...");await xe(2500+Math.random()*1e4,d)}}try{if(!p)p=await iZ(t);else if(e.autoAuth){let S=Ym.safeParse(p.data);if(!S.success)throw new L("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${S.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(S.data);let g=!1,E=e.advanced?.cacheInvalidation;if(E&&E.type==="PAGE_CHECK"){let y={type:"CONTENT",value:E.substring},b=await Gg({timeout:Dn,assertion:y,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});b.success?n.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(n.info({invalResult:b},"Invalidating cached result due to page check failure"),g=!0)}if(h&&g)return await i.deleteCacheResult(h),nA(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await aZ({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},iZ=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=jg(r,t.moduleParams.resolvedInputs,"SUCCESS"),i=await n.startSubSteps(),{status:a,results:s}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:`module ('${r.name}')`,tracer:i,currentParentIdChain:e}});return o.results=s,o.status=a,o.finishedAt=new Date,oo({asyncTasks:t.work.asyncTasks,nestedResults:s,result:o,logger:t.fixtures.logger}),o};function jg(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 eF({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 xa({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new L("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function aZ({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===rP)&&(a=t.defaultCacheTtl??nP);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:Os({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function Js(t,e,r){return sZ(t,e,r)}async function sZ(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 L?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=jg(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Bh(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function xo(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 w7}from"lodash-es";import{randomUUID as tF}from"crypto";import{diff as lZ}from"deep-object-diff";import{cloneDeep as rF}from"lodash-es";var Vg=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?rF(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=tF(),h=tF();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:f,html:y})}}catch(y){l.debug({err:y},"Failed to take before screenshot, continuing...")}let S,g,E;try{let y=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),E=y.afterScreenshotOverride;let b=new Date,R=o.browser.url();g={beforeUrl:d,afterUrl:R,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},S={...e,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:R,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[g]},"assertion"in e.command&&(S.message=y.thoughts||"Assertion passed.")}catch(y){l.error({message:y.message,stack:y.stack},`Failed executing preset step ${Xn(e.command)}`);let b=o.browser.url(),R=new Date,I=y instanceof Error?y.message:`${y}`;g={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:R,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:I},S={...e,startedAt:p,finishedAt:R,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:I,failureReason:y instanceof L?y.reason:void 0,results:[g]}}finally{let y="cache"in e.command&&e.command.cache?rF(e.command.cache):{},b=lZ(u,y);b&&Object.keys(b).length>0&&l.info({diffs:Qm(b)},"Updated cache")}if(a)try{if(E||(E=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:y})}}catch(y){l.debug({err:y},"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 g.beforeSnapshot=f,S.beforeSnapshot=f,g.afterSnapshot=h,S.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),E&&r.attachAfterScreenshot({snapshotId:h,screenshot:E}),S};async function cZ(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 xo(t.work,()=>Vg({...t,presetParams:{tracer:n,step:e.assertion}})),c=a.type;switch(c){case"AI_ASSERTION":case"ELEMENT_CHECK":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 l=!!s.data;return s.status=l?"SUCCESS":"FAILED",s.message=l?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:l},`JavaScript condition ${r} evaluated`),l?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(c)}}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 uZ(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}=Ms(a.steps,e,o);if(s)return i}return-1}async function nF(t){let{currentParentIdChain:e}=t,{step:r}=t.conditionalParams,{logger:n}=t.fixtures,{fromStep:o}=t.inputs,i=new Date,a=Bh(r),s=!!o&&Jd(e,o.parentStepIdChain),c=r.elseSteps,l=!0,u=[],d,p=!1;if(s&&o){let g=uZ(r,o.fromStepId,e,o.parentStepIdChain);g>=0&&(c=r.blocks[g].steps,l=!1,p=!0,n.info(`Skipping conditional assertion (execution starts from step within block ${g}), running ${c.length} steps`))}if(!p)for(let g=0;g<r.blocks.length;g++){n.info(`Evaluating condition ${g} in conditional step`);let E=r.blocks[g],y=await cZ(t,E,g);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:i,finishedAt:new Date,message:y.conditionResult.message,results:[]};return oo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:n}),b}if(y.type==="passed"){n.info(`Condition ${g} resolved to true, executing the corresponding ${y.steps.length} steps`),l=!1,c=y.steps;break}}if(c)l&&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 g={...a,assertionResult:d,status:"SUCCESS",startedAt:i,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return oo({asyncTasks:t.work.asyncTasks,nestedResults:[...u],result:g,logger:n}),g}n.info(`Executing ${c.length} steps in the selected conditional block`);let m=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:c,containerName:"conditional block",tracer:m,currentParentIdChain:e}}),S={...a,assertionResult:d,...f,startedAt:i,finishedAt:new Date};return oo({asyncTasks:t.work.asyncTasks,nestedResults:[...u,...f.results],result:S,logger:n}),S}import{randomUUID as oF}from"crypto";var iF=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await dZ(t);o.finishedAt=new Date,oo({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=oF();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=oF();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},dZ=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.aiStepParams,{controller:o,context:i,logger:a}=t.fixtures,s={...r,startedAt:new Date,beforeTestContext:i.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in r&&r.steps&&r.steps.length>0&&r.steps[r.steps.length-1]?.command.type==="SUCCESS"))throw new L("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let l=await n.startSubSteps(),{status:u}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:"AI action",results:s.results,tracer:l,currentParentIdChain:e}});return s.finishedAt=new Date,s.status=u,s}catch(l){a.warn({err:l},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=l instanceof Error?l.message:`${l}`,s.status=u?"CANCELLED":"FAILED"}return s};import{randomUUID as vA}from"crypto";var aF=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as l7}from"ai";import{existsSync as dF,mkdirSync as pZ}from"fs";import{readdir as mZ,stat as fZ,unlink as hZ,writeFile as gZ}from"fs/promises";import hp from"path";import oA from"path";function ce({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}
4962
4962
  ${t}`}]}function iA({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 vt(t){if(t.length===0)throw new ar("No content parts provided to construct the tool response content.");return{type:"content",value:t}}function sF(t,e=2e4){let r={};for(let[n,o]of Object.entries(t)){if(typeof o=="object"&&o!==null){let i=JSON.stringify(o,null,2);if(rt(i)>e){r[n]="[too large truncated]";continue}r[n]=o;continue}r[n]=o}return r}function lF(t,e){let r={},n=0,o=Object.entries(t).map(([i,a])=>{let s=JSON.stringify(a,null,2),c=rt(s);return{key:i,value:a,tokens:c}}).sort((i,a)=>i.tokens-a.tokens);for(let{key:i,value:a,tokens:s}of o)n+s<=e&&(r[i]=a,n+=s);return r}function cF({projectRoot:t,filePath:e,pathLabel:r="path"}){if(!e||!oA.isAbsolute(e))return e;let n=oA.relative(t,e);if(n.startsWith("..")||oA.isAbsolute(n))throw new Error(`Error: ${r} "${e}" must be inside project root "${t}".`);return n}function uF(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 new Error("Unhandled content part")})(e)}})}var gp=".momentic-mcp",SZ=30*24*60*60*1e3;function aA(t){return t?hp.join(t,gp):hp.resolve(gp)}function sA(t){let e=aA(t);dF(e)||pZ(e,{recursive:!0})}function yZ(){return`${Date.now()}`}function lA({rootDir:t,entity:e,ext:r}){return hp.join(aA(t),`${e}-${yZ()}.${r}`)}function EZ(t){let e=hp.relative(process.cwd(),t);return e.startsWith(".")?e:`./${e}`}function cA({filePath:t,title:e}){return`- [${e}](${EZ(t)})`}async function pF({artifacts:t,rootDir:e,supportsFileOutput:r}){let n=Object.assign({},...t.map(i=>i.payload)),o=JSON.stringify(n,null,2);if(r){sA(e);let i=await Promise.all(t.map(async({title:a,entity:s,payload:c})=>{let l=lA({rootDir:e,entity:s,ext:"json"});return await gZ(l,JSON.stringify(c,null,2),"utf8"),{title:a,filePath:l}}));return ce({text:i.map(({title:a,filePath:s})=>cA({filePath:s,title:a})).join(`
4963
4963
  `),section:"Artifacts Lists"})}return[{type:"text",text:`### Artifacts Lists Json:
4964
4964
  ${o}`}]}async function mF({rootDir:t,cutoffTime:e}){let r=await mZ(t,{withFileTypes:!0});for(let n of r){let o=hp.join(t,n.name);if(n.isDirectory()){await mF({rootDir:o,cutoffTime:e});continue}if(!n.isFile())continue;(await fZ(o)).mtimeMs<e&&await hZ(o)}}async function fF(t){let e=aA(t);dF(e)&&await mF({rootDir:e,cutoffTime:Date.now()-SZ})}import{z as TZ}from"zod";var qc=class{isError;content=[];addPartFromText(e){this.addContent({type:"text",text:e})}addError(e){this.addPartFromText(`Error: ${e}`),this.isError=!0}addContent(e){this.content.push(e)}addContentParts(e){this.content.push(...uF(e))}async serialize(){return{content:this.content,isError:this.isError}}};function hF(t,e){let r=JSON.stringify(t);return r?r.length<=e?r:`${r.slice(0,e)}...`:""}function gF(t){return{addToolToMcpServer:(r,n)=>{let o=TZ.object(t.schema.inputSchema),i=async(a,s)=>{let c=s.sessionId??r.sessionId??r.serverId,l=r.logger.child({sessionId:c,toolName:t.schema.name}),u=Date.now();l.debug({params:hF(a,500),sessionId:c,toolName:t.schema.name},`MCP tool invoked: ${t.schema.name}`);let d=new qc,p;try{await t.handle({...r,sessionId:c},a,d,s)}catch(h){p=h instanceof Error?h:new Error(Ot(h)),d.addError(Ot(h))}let m=Date.now()-u,f=await d.serialize();if(p)l.error({duration:m,err:p,sessionId:c,toolName:t.schema.name},`MCP tool failed: ${t.schema.name}`);else{let h=f.content.filter(S=>S.type==="text");l.debug({duration:m,response:hF(h,500),responseIsError:f.isError,sessionId:c,toolName:t.schema.name},`MCP tool completed: ${t.schema.name}`)}return f};n.registerTool(t.schema.name,{title:t.schema.name,description:t.schema.description,inputSchema:o},i)},name:t.schema.name,tool:t}}function uA(t){return t?._meta?.progressToken!==void 0}async function SF(t,e,r,n,o,i){if(!uA(t))return!1;try{await t.sendNotification({method:"notifications/progress",params:{progressToken:t._meta.progressToken,progress:e.completed,total:e.total,...r?{message:r}:{}}})}catch(a){n.error({err:a},"Failed to send progress notification"),o.abort(a),i.addError(`Failed to send progress notification: ${Ot(a)}`)}return!0}function Sp(t,e,r,n){if(t!==r||e.length!==n.length)return!1;for(let o=0;o<e.length;o++)if(e[o]!==n[o])return!1;return!0}import{McpServer as bZ}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as vZ}from"@modelcontextprotocol/sdk/server/stdio.js";var yF=!1;function AZ({task:t,logger:e,errorMessage:r}){(async()=>{try{await t()}catch(n){e.warn({err:n},r)}})()}function CZ(t,e,r){for(let n of r)n.addToolToMcpServer(e,t)}function dA(t,e,r){yF||(yF=!0,AZ({task:async()=>fF(t.project?.rootDir),logger:t.logger,errorMessage:"Failed to clean up old MCP artifacts"}));let n=new bZ({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});return CZ(n,t,r),n}function RZ({server:t,logger:e,shutdownHandlers:r=[]}){return[async()=>{try{await t.close()}catch{}},...r.map(n=>async()=>void await n("shutdown",e))]}async function EF({context:t,info:e,tools:r,shutdownHandlers:n}){let o=dA(t,e,r),i=new vZ;for(let a of RZ({server:o,logger:t.logger,shutdownHandlers:n}))Ps(a);return await o.connect(i),{server:o,transport:i}}function TF({moduleName:t,existingModuleNames:e,parameterNames:r,defaultParameters:n,parameterEnums:o,moduleInputs:i,testPath:a,startIndex:s,endIndex:c,availableSteps:l,containsNestedModuleStep:u}){if(e.includes(t))throw new Error(`Error: module with the name "${t}" already exists. Please use a different name.`);let d=r??[],p=[...Object.keys(n??{}),...Object.keys(o??{})];for(let g of p)if(!d.includes(g)){let E=d.length?d.join(", "):"none";throw new Error(`Error: Parameter metadata "${g}" is not defined in parameters. Available parameters: ${E}`)}let m=new Set(d);for(let g of Object.keys(i??{}))if(!m.has(g)){let E=m.size?Array.from(m).join(", "):"none";throw new Error(`Error: Module input "${g}" is not defined in parameters. Available parameters: ${E}`)}let f=s??0,h=c??f+1;if(c!==void 0&&s===void 0)throw new Error("Error: startIndex is required when endIndex is provided for extraction.");if(s===void 0)return{stepsToExtract:[],startIndex:f,endIndex:h};if(!a)throw new Error("Error: testPath is required when extracting steps from the test.");if(!l)throw new Error("Error: resolved steps are required to validate module extraction.");if(f<0||f>=l.length)throw new Error(`Error: startIndex ${f} is out of bounds. Test has ${l.length} steps.`);if(h<=f||h>l.length)throw new Error(`Error: endIndex ${h} is out of bounds. Must be between ${f+1} and ${l.length}.`);let S=l.slice(f,h);for(let g of S)if(u(g))throw new Error("Error: Modules cannot be nested. Please select steps that do not include module references.");return{stepsToExtract:S,startIndex:f,endIndex:h}}import{randomUUID as CF}from"crypto";import{randomUUID as IZ}from"crypto";import{InvalidArgumentError as wZ}from"@commander-js/extra-typings";function Di(t){let e=parseInt(t,10);if(Number.isNaN(e))throw new wZ("Not a number.");return e}function $g(t){if(!t?.length)return;let e={};for(let r of t){let n=r.indexOf("=");if(n===-1)throw new Error(`Key=value pair must contain '=': ${r}`);e[r.slice(0,n)]=r.slice(n+1)}return e}function pA(t){if(!t?.length)return;let e={};for(let r of t){let n=r.indexOf("=");if(n===-1)throw new Error(`--parameter-enum pair must contain '=': ${r}`);let o=r.slice(0,n).trim(),i=r.slice(n+1).split(",").map(a=>a.trim()).filter(Boolean);e[o]=i}return e}function yp(t){let e=JSON.parse(t);if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Expected a JSON object");let r={};for(let[n,o]of Object.entries(e)){if(typeof o!="string")throw new Error("Expected a JSON object with string values");r[n]=o}return r}function xZ(t,e){let r=t??e?.defaultMethod;if(!r)throw new Error("REQUEST requires --method");let n=Tu.safeParse(r);if(n.success)return n.data;throw new Error(`REQUEST --method must be one of: ${Tu.options.join(", ")}`)}function _Z(t,e){if(t!==void 0){if((e??"json")==="json")return{type:"json",content:t};if(e==="form-urlencoded")return{type:"form-urlencoded",content:yp(t)};throw new Error(`Unsupported request body type: ${e}`)}}function mA(t,e){if(!t.url)throw new Error("REQUEST requires --url");let r=_Z(t.body,t.bodyType);return{url:t.url,method:xZ(t.method,e),...t.headers?{headers:yp(t.headers)}:{},...t.params?{params:yp(t.params)}:{},...r?{body:r}:{},...t.timeoutSeconds!==void 0?{timeout:t.timeoutSeconds}:{}}}async function bF(t,{project:e,logger:r}){if(!t.moduleId&&!t.modulePath)throw new Error("Module step requires exactly one of --module-id or --module-path");if(t.moduleId&&t.modulePath)throw new Error("Module step requires exactly one of --module-id or --module-path");let n=t.moduleId?{id:t.moduleId}:{path:t.modulePath},{entity:o,momenticFiles:i}=await wa(e,n,"module"),a=await Ii(o,i,r),s=PZ(t);if(Object.keys(s).length>0){let f=new Set(s.parameters??[]),h=s.defaultParameters?Object.keys(s.defaultParameters):[],S=s.parameterEnums?Object.keys(s.parameterEnums):[];for(let g of[...h,...S])if(!f.has(g))throw new Error(`Module metadata: defaultParameters/parameterEnums key "${g}" must be in parameters`)}let c={...a,...s};t.envKey&&(c.envKey=t.envKey);let l=$g(t.inputs);ww(l,c);let u=l?Object.keys(l).length:0,d=c.parameters&&c.parameters.length>0,p=u>0?l:d?{}:void 0,m={id:IZ(),inputs:p};return{...c,...m,type:"RESOLVED_MODULE"}}function PZ(t){let e={};return t.parameters!=null&&(e.parameters=t.parameters.split(",").map(r=>r.trim()).filter(Boolean)),t.parameterEnum!=null&&t.parameterEnum.length>0&&(e.parameterEnums=pA(t.parameterEnum)??{}),t.defaultParameter!=null&&t.defaultParameter.length>0&&(e.defaultParameters=$g(t.defaultParameter)),t.moduleName!=null&&(e.name=t.moduleName),t.moduleDescription!=null&&(e.description=t.moduleDescription),t.disabled===!0&&(e.enabled=!1),e}import{randomUUID as vF}from"crypto";function qg(t){let e=t.stepType,r=vF(),n=vF(),o=t.description;switch(e){case"CLICK":if(!o)throw new Error("CLICK requires --description");return{type:"PRESET_ACTION",id:r,command:{type:"CLICK",id:n,target:ri(o),doubleClick:t.doubleClick,rightClick:t.rightClick,waitForDownload:t.waitForDownload,delayMs:t.delayMs,downloadTimeoutMs:t.downloadTimeoutMs}};case"TYPE":{if(t.value===void 0)throw new Error("TYPE requires --value");let{clearContent:i,forceClearContent:a}=MZ(t.clearContent);return{type:"PRESET_ACTION",id:r,command:{type:"TYPE",id:n,target:o?ri(o):void 0,value:t.value,pressEnter:t.pressEnter,clearContent:i,forceClearContent:a}}}case"PRESS":{if(!t.keys)throw new Error("PRESS requires --keys");return{type:"PRESET_ACTION",id:r,command:{type:"PRESS",id:n,value:t.keys}}}case"SELECT_OPTION":{if(!o)throw new Error("SELECT_OPTION requires --description");if(t.optionValue===void 0)throw new Error("SELECT_OPTION requires --option-value");let i=t.optionType??"LABEL",a=i==="VALUE"?{type:"VALUE",value:t.optionValue}:i==="INDEX"?{type:"INDEX",index:t.optionValue}:{type:"LABEL",label:t.optionValue};return{type:"PRESET_ACTION",id:r,command:{type:"SELECT_OPTION",id:n,target:ri(o),choice:a}}}case"NAVIGATE":if(!t.url)throw new Error("NAVIGATE requires --url");return{type:"PRESET_ACTION",id:r,command:{type:"NAVIGATE",id:n,url:t.url,loadTimeout:t.timeoutSeconds}};case"SCROLL":{let i=t.deltaY,a=t.deltaX,s=o?ri(o):void 0;if(a!=null&&a!==0)return{type:"PRESET_ACTION",id:r,command:{type:a>0?"SCROLL_RIGHT":"SCROLL_LEFT",id:n,deltaX:Math.abs(a),target:s}};if(i==null)throw new Error("SCROLL requires --delta-x or --delta-y");return{type:"PRESET_ACTION",id:r,command:{type:i>=0?"SCROLL_DOWN":"SCROLL_UP",id:n,deltaY:Math.abs(i),target:s}}}case"WAIT":{if(!t.timeoutSeconds)throw new Error("WAIT requires --timeout-seconds");return{type:"PRESET_ACTION",id:r,command:{type:"WAIT",id:n,delay:t.timeoutSeconds}}}case"AI_ASSERTION":if(!t.assertion)throw new Error("AI_ASSERTION requires --assertion");return{type:"PRESET_ACTION",id:r,command:{type:"AI_ASSERTION",id:n,assertion:t.assertion,timeout:t.timeoutSeconds}};case"HOVER":if(!o)throw new Error("HOVER requires --description");return{type:"PRESET_ACTION",id:r,command:{type:"HOVER",id:n,target:ri(o)}};case"BLUR":return{type:"PRESET_ACTION",id:r,command:{type:"BLUR",id:n,target:o?ri(o):void 0}};case"GO_BACK":return{type:"PRESET_ACTION",id:r,command:{type:"GO_BACK",id:n}};case"GO_FORWARD":return{type:"PRESET_ACTION",id:r,command:{type:"GO_FORWARD",id:n}};case"DRAG":if(!t.fromDescription)throw new Error("DRAG requires --from-description");if(!t.toDescription)throw new Error("DRAG requires --to-description");return{type:"PRESET_ACTION",id:r,command:{type:"DRAG",id:n,fromTarget:ri(t.fromDescription),toTarget:ri(t.toDescription),steps:t.movements,hoverSeconds:t.hoverSeconds}};case"JAVASCRIPT":{if(!t.code)throw new Error("JAVASCRIPT requires --code");if(t.environment&&t.environment!=="NODE"&&t.environment!=="BROWSER")throw new Error("JAVASCRIPT --environment must be NODE or BROWSER");let i=t.environment;return{type:"PRESET_ACTION",id:r,...t.envKey&&{envKey:t.envKey},command:{type:"JAVASCRIPT",id:n,code:t.code,...i&&{environment:i},...t.timeoutSeconds&&{timeout:t.timeoutSeconds}}}}case"REFRESH":return{type:"PRESET_ACTION",id:r,command:{type:"REFRESH",id:n}};case"NEW_TAB":return{type:"PRESET_ACTION",id:r,command:{type:"NEW_TAB",id:n,url:t.url??"about:blank",loadTimeout:t.timeoutSeconds}};case"SWITCH_TAB":case"TAB":return{type:"PRESET_ACTION",id:r,command:{type:"TAB",id:n,action:LZ(t),loadTimeout:t.timeoutSeconds}};case"COPY":if(t.value===void 0)throw new Error("COPY requires --value");return{type:"PRESET_ACTION",id:r,...t.envKey&&{envKey:t.envKey},command:{type:"COPY",id:n,value:t.value}};case"PASTE":return{type:"PRESET_ACTION",id:r,command:{type:"PASTE",id:n}};case"ELEMENT_CHECK":{if(!o)throw new Error("ELEMENT_CHECK requires --description");let i=UZ(t);return{type:"PRESET_ACTION",id:r,command:{type:"ELEMENT_CHECK",id:n,target:ri(o),assertion:i,timeout:t.timeoutSeconds}}}case"PAGE_CHECK":{let i=t.value;if(i===void 0)throw new Error("PAGE_CHECK requires --value");return{type:"PRESET_ACTION",id:r,command:{type:"PAGE_CHECK",id:n,assertion:{type:"CONTENT",value:i,...t.negated!==void 0&&{negated:t.negated===!0}},timeout:t.timeoutSeconds}}}case"AI_EXTRACT":if(!t.goal)throw new Error("AI_EXTRACT requires --goal");return{type:"PRESET_ACTION",id:r,...t.envKey&&{envKey:t.envKey},command:{type:"AI_EXTRACT",id:n,goal:t.goal,schema:t.schema}};case"COOKIE":if(t.value===void 0)throw new Error("COOKIE requires --value");return{type:"PRESET_ACTION",id:r,command:{type:"COOKIE",id:n,value:t.value}};case"LOCAL_STORAGE":if(!t.key)throw new Error("LOCAL_STORAGE requires --key");if(t.value===void 0)throw new Error("LOCAL_STORAGE requires --value");return{type:"PRESET_ACTION",id:r,command:{type:"LOCAL_STORAGE",id:n,key:t.key,value:t.value}};case"REQUEST":{let i=mA(t);return{type:"PRESET_ACTION",id:r,...t.envKey&&{envKey:t.envKey},command:{type:"REQUEST",id:n,...i}}}case"GRAPHQL_REQUEST":if(!t.url)throw new Error("GRAPHQL_REQUEST requires --url");if(!t.query)throw new Error("GRAPHQL_REQUEST requires --query");return{type:"PRESET_ACTION",id:r,...t.envKey&&{envKey:t.envKey},command:{type:"GRAPHQL_REQUEST",id:n,url:t.url,query:t.query,variables:t.variables,...t.headers?{headers:yp(t.headers)}:{},timeout:t.timeoutSeconds}};case"SET_HEADER":if(!t.name)throw new Error("SET_HEADER requires --name");if(t.value===void 0)throw new Error("SET_HEADER requires --value");return{type:"PRESET_ACTION",id:r,command:{type:"SET_HEADER",id:n,name:t.name,value:t.value,...t.urlMatcherType&&t.urlMatcherValue!==void 0&&{requestMatcher:AF(t)}}};case"MOCK_ROUTE":if(!t.urlMatcherType||t.urlMatcherValue===void 0)throw new Error("MOCK_ROUTE requires --url-matcher-type and --url-matcher-value");if(!t.responseGenerator)throw new Error("MOCK_ROUTE requires --response-generator");return{type:"PRESET_ACTION",id:r,command:{type:"MOCK_ROUTE",id:n,requestMatcher:AF(t),responseGenerator:t.responseGenerator,fetchOriginalResponse:t.fetchOriginalResponse,key:t.key}};case"REMOVE_ROUTE_MOCK":return{type:"PRESET_ACTION",id:r,command:{type:"REMOVE_ROUTE_MOCK",id:n,key:t.key}};case"WAIT_FOR_URL":return{type:"PRESET_ACTION",id:r,command:{type:"WAIT_FOR_URL",id:n,matcher:OZ(t),caseInsensitive:t.caseInsensitive===!0?!0:void 0,negated:t.negated===!0?!0:void 0,timeout:t.timeoutSeconds}};case"DIALOG":{let i=NZ(t.dialogAction);return{type:"PRESET_ACTION",id:r,command:{type:"DIALOG",id:n,action:i}}}case"FILE_UPLOAD":{let i=DZ(t);return{type:"PRESET_ACTION",id:r,command:{type:"FILE_UPLOAD",id:n,fileSource:i,filename:t.filename}}}case"MOUSE_DRAG":{let i=t.deltaX,a=t.deltaY;if(i==null&&a==null)throw new Error("MOUSE_DRAG requires --delta-x or --delta-y");return{type:"PRESET_ACTION",id:r,command:{type:"MOUSE_DRAG",id:n,target:o?ri(o):void 0,deltaX:`${i??0}`,deltaY:`${a??0}`,steps:t.movements}}}default:throw new Error(`Unknown or unsupported step type: ${e}`)}}function ri(t){return{type:"description",elementDescriptor:t}}function MZ(t){if(t===void 0)return{};if(t==="ON")return{clearContent:!0,forceClearContent:!1};if(t==="FORCE")return{clearContent:!0,forceClearContent:!0};if(t==="NEVER")return{clearContent:!1,forceClearContent:!1};throw new Error(`--clear-content must be ON, FORCE, or NEVER. Received: ${t}`)}function AF(t){let e=t.urlMatcherType,r=t.urlMatcherValue;if(!e||r===void 0)throw new Error("SET_HEADER/MOCK_ROUTE with scoped matcher requires --url-matcher-type and --url-matcher-value");switch(e){case"SUBSTRING":return{urlMatcher:{type:"SUBSTRING",url:r}};case"GLOB":return{urlMatcher:{type:"GLOB",glob:r}};case"REGEX":return{urlMatcher:{type:"REGEX",regex:r}};case"DOMAIN":return{urlMatcher:{type:"DOMAIN",domain:r}};default:throw new Error(`--url-matcher-type must be SUBSTRING, GLOB, REGEX, or DOMAIN. Received: ${e}`)}}function OZ(t){let e=t.urlMatcherType,r=t.urlMatcherValue;if(!e||r===void 0)throw new Error("WAIT_FOR_URL requires --url-matcher-type and --url-matcher-value");switch(e){case"SUBSTRING":return{type:"SUBSTRING",url:r};case"GLOB":return{type:"GLOB",glob:r};case"REGEX":return{type:"REGEX",regex:r};case"DOMAIN":return{type:"DOMAIN",domain:r};default:throw new Error(`--url-matcher-type must be SUBSTRING, GLOB, REGEX, or DOMAIN. Received: ${e}`)}}function LZ(t){let e=t.tabSelectorType,r=t.tabSelectorValue;if(!e||r===void 0)throw new Error("SWITCH_TAB requires --tab-selector-type and --tab-selector-value");switch(e){case"SUBSTRING":return{type:"SUBSTRING",substring:r};case"REGEX":return{type:"REGEX",pattern:r};case"INDEX":return{type:"INDEX",index:r};default:throw new Error(`--tab-selector-type must be SUBSTRING, REGEX, or INDEX. Received: ${e}`)}}function NZ(t){if(!t)throw new Error("DIALOG requires --dialog-action (ACCEPT or DISMISS)");let e=t.toUpperCase();if(e==="ACCEPT"||e==="DISMISS")return e;throw new Error(`--dialog-action must be ACCEPT or DISMISS. Received: ${t}`)}function DZ(t){let e=t.fileSource;if(!e)throw new Error("FILE_UPLOAD requires --file-source");return{type:"URL",url:e}}var Wg={CONTAINS:"CONTAINS",EQUALS:"EQUALS",STARTS_WITH:"STARTS_WITH"},kZ={EXISTS:"EXISTS",VISIBLE:"VISIBLE",ENABLED:"ENABLED",EDITABLE:"EDITABLE",FOCUSED:"FOCUSED"};function UZ(t){if(!t.assertionType)throw new Error("ELEMENT_CHECK requires --assertion-type. See the agent step schema for available assertion types.");if(!JS.includes(t.assertionType))throw new Error(`ELEMENT_CHECK --assertion-type must be one of: ${JS.join(", ")}. Received: "${t.assertionType}"`);let e=t.assertionType,r=t.negated===!0;switch(e){case"EXISTS":case"VISIBLE":case"ENABLED":case"EDITABLE":case"FOCUSED":{let n=kZ[e];return{type:"ELEMENT_EXISTENCE",condition:n,negated:r}}case"CONTENT_CONTAINS":case"CONTENT_EQUALS":case"CONTENT_STARTS_WITH":{if(t.value===void 0)throw new Error("ELEMENT_CHECK with CONTENT_* assertion-type requires --value");let n=e.replace("CONTENT_",""),o=Wg[n];if(o===void 0)throw new Error(`Invalid ELEMENT_CHECK assertion type: ${e}`);return{type:"ELEMENT_CONTENT",operation:o,value:t.value,negated:r}}case"ATTRIBUTE_CONTAINS":case"ATTRIBUTE_EQUALS":case"ATTRIBUTE_STARTS_WITH":{if(!t.name)throw new Error("ELEMENT_CHECK with ATTRIBUTE_* assertion-type requires --name");if(t.value===void 0)throw new Error("ELEMENT_CHECK with ATTRIBUTE_* assertion-type requires --value");let n=e.replace("ATTRIBUTE_",""),o=Wg[n];if(o===void 0)throw new Error(`Invalid ELEMENT_CHECK assertion type: ${e}`);return{type:"ELEMENT_ATTRIBUTE",operation:o,attr:t.name,value:t.value,negated:r}}case"NAME_CONTAINS":case"NAME_EQUALS":case"NAME_STARTS_WITH":{if(t.value===void 0)throw new Error("ELEMENT_CHECK with NAME_* assertion-type requires --value");let n=e.replace("NAME_",""),o=Wg[n];if(o===void 0)throw new Error(`Invalid ELEMENT_CHECK assertion type: ${e}`);return{type:"ELEMENT_NAME",operation:o,value:t.value,negated:r}}case"STYLE_CONTAINS":case"STYLE_EQUALS":case"STYLE_STARTS_WITH":{if(!t.name)throw new Error("ELEMENT_CHECK with STYLE_* assertion-type requires --name");if(t.value===void 0)throw new Error("ELEMENT_CHECK with STYLE_* assertion-type requires --value");let n=e.replace("STYLE_",""),o=Wg[n];if(o===void 0)throw new Error(`Invalid ELEMENT_CHECK assertion type: ${e}`);return{type:"ELEMENT_STYLE",operation:o,property:t.name,value:t.value,negated:r}}}}async function Ep(t,e){switch(t.stepType){case"MODULE":return bF(t,e);case"AI_ACTION_DYNAMIC":return FZ(t,e);case"CONDITIONAL":return BZ(t,e);default:return qg(t)}}async function FZ(t,e){let r=t.text;if(!r||typeof r!="string")throw new Error("text is required for AI action steps.");return{type:"AI_ACTION_DYNAMIC",id:CF(),text:r}}async function BZ(t,e){if(!t.assertionType||!["AI_ASSERTION","PAGE_CHECK","JAVASCRIPT"].includes(t.assertionType))throw new Error(`CONDITIONAL --assertion-type must be one of AI_ASSERTION, PAGE_CHECK, JAVASCRIPT. Got: ${t.assertionType}`);let r={...t,assertionType:void 0,stepType:t.assertionType},n=await Ep(r,e);if(n.type!=="PRESET_ACTION")throw new Error(`Expected PresetAction for conditional assertion, got ${n.type}`);return{type:"CONDITIONAL",id:CF(),blocks:[{assertion:n,steps:[]}]}}var wF=MC(hA(),1);import{Command as zZ,Option as Qs}from"@commander-js/extra-typings";function RF(){return new zZ().helpOption(!1).option("--step-type <type>").option("--env-key <key>").option("--cache-id <id>").option("--description <desc>").option("--value <value>").option("--url <url>").option("--code <code>").option("--environment <env>").option("--assertion <text>").option("--from-description <desc>").option("--to-description <desc>").option("--goal <goal>").option("--schema <schema>").option("--url-matcher-type <type>").option("--url-matcher-value <value>").option("--method <method>").option("--body <body>").option("--body-type <type>").option("--query <query>").option("--variables <vars>").option("--tab-selector-type <type>").option("--tab-selector-value <value>").option("--dialog-action <action>").option("--file-source <value>").option("--filename <name>").option("--key <key>").option("--name <name>").option("--response-generator <code>").option("--text [text]").option("--module-id <id>").option("--module-path <path>").option("--parameters <list>").option("--parameter-enum <pair...>").option("--default-parameter <pair...>").option("--module-name <name>").option("--module-description <desc>").option("--disabled").option("--option-type <type>").option("--option-value <value>").option("--assertion-type <type>").option("--params <params>").option("--headers <headers>").addOption(new Qs("--timeout-seconds <n>").argParser(Di)).addOption(new Qs("--delta-x <n>").argParser(Di)).addOption(new Qs("--delta-y <n>").argParser(Di)).addOption(new Qs("--delay-ms <n>").argParser(Di)).addOption(new Qs("--download-timeout-ms <n>").argParser(Di)).addOption(new Qs("--movements <n>").argParser(Di)).addOption(new Qs("--hover-seconds <n>").argParser(Di)).option("--double-click").option("--right-click").option("--wait-for-download").option("--press-enter").option("--clear-content <mode>").option("--negated").option("--case-insensitive").option("--fetch-original-response").option("--keys <keys>").option("--inputs <pair...>")}var HZ=`Refer to the data returned from the ${mi} tool for the proper step schema.`;function xF(t){let e=Kc(t);return qg(e)}function Kc(t){let e=RF().exitOverride().configureOutput({writeErr:()=>{},writeOut:()=>{}}),r=(0,wF.default)(t.trim());if(r.includes("--help")||r.includes("-h"))throw new Error(HZ);return e.parse(r,{from:"user"}),e.opts()}async function Kg(t,e){let{logger:r,tempCaches:n}=e,o=Kc(t),i=await Ep(o,e);return i.type==="PRESET_ACTION"&&o.cacheId&&Un(i.command)&&(n?.[o.cacheId]?i.command.cache=n[o.cacheId].cache:r.warn({cacheId:o.cacheId,commandType:i.command.type},"Temp cache not found, continuing...")),i}import Me from"dedent";var $e={CLICK:pt.CLICK,TYPE:pt.TYPE,SELECT_OPTION:"Select an option from a native HTML select element.",HOVER:"Hover over an element on the page. Automatically scrolls the element into view, so can be used as a 'scroll to'.",BLUR:pt.BLUR,ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks. Primarily useful if the user asks to verify a specific condition on an element available in the a11y tree. Otherwise, prefer AI_ASSERTION.",DRAG:pt.DRAG,PRESS:pt.PRESS,NAVIGATE:pt.NAVIGATE,NEW_TAB:pt.NEW_TAB,SCROLL:"Scroll by a specified amount. Use delta-x for horizontal, delta-y for vertical.",WAIT:"Hardcoded wait. Prefer AI_ASSERTION for more stability. Use WAITs only when you know an operation will take a long time such as 5 minutes.",AI_ASSERTION:pt.AI_ASSERTION,PAGE_CHECK:"Assert on the active page body's innerHTML content. Prefer AI_ASSERTION for broader and more stable checks.",COPY:pt.COPY,PASTE:pt.PASTE,REQUEST:pt.REQUEST,GRAPHQL_REQUEST:pt.GRAPHQL_REQUEST,COOKIE:pt.COOKIE,LOCAL_STORAGE:pt.LOCAL_STORAGE,JAVASCRIPT:pt.JAVASCRIPT,AI_EXTRACT:pt.AI_EXTRACT,GO_BACK:pt.GO_BACK,GO_FORWARD:pt.GO_FORWARD,REFRESH:pt.REFRESH,SWITCH_TAB:pt.TAB,WAIT_FOR_URL:pt.WAIT_FOR_URL,MODULE:pt.RESOLVED_MODULE,AI_ACTION_DYNAMIC:pt.AI_ACTION_DYNAMIC,SET_HEADER:pt.SET_HEADER,MOCK_ROUTE:pt.MOCK_ROUTE,REMOVE_ROUTE_MOCK:pt.REMOVE_ROUTE_MOCK,FILE_UPLOAD:"Upload a file from local disk or a publicly accessible URL. This command registers a handler for the next file chooser event that occurs on the active page.",DIALOG:pt.DIALOG,MOUSE_DRAG:"Drag the mouse by pixel deltas. Useful for sliders, scrubbers, color pickers, and canvas controls.",CONDITIONAL:pt.CONDITIONAL};function Na(t){let e=t?.stepTypes??Cw,r=t?.isMcp??!0,n=new Set(e),o=[];if(o.push(Me`
@@ -5703,7 +5703,7 @@ to pick which of these modules are relevant:
5703
5703
 
5704
5704
  `;let h=hee(p);f+=h;let S=uee({schema:OA,model:m("claude-sonnet-4-5-20250929"),system:fee,messages:[{role:"user",content:f}]}),g=[];for await(let I of S.textStream)g.push(I);let E=g.join(""),y;try{let I=JSON.parse(E);y=OA.parse(I)}catch(I){i.error({rawResponse:E,parseError:I},"Failed to parse AI response as JSON"),r.addError(`Failed to parse AI response: ${Ot(I)}. Raw response: ${E}`);return}let b=new Set(p.map(I=>I.moduleId)),R=y.recommendations.filter(I=>b.has(I.moduleId)?!0:(i.warn({moduleId:I.moduleId,moduleName:I.moduleName},"AI recommended a module that doesn't exist"),!1));r.addPartFromText(JSON.stringify({recommendations:R,totalModulesAnalyzed:p.length},null,2))}catch(u){i.error({err:u},"Error in module recommendation"),r.addError(`Failed to recommend modules: ${Ot(u)}`)}}}),lS=[See,pee];var wB=or({schema:{name:mi,description:"Get the initial data for the agent: project root, cwd, and the step schema. Always call this first before performing any other momentic actions.",inputSchema:{}},handle:async(t,e,r)=>{let n=t.project.rootDir,o=process.cwd(),i=Na(),a=["## Project context","",`- **projectRoot**: \`${n}\``,`- **cwd**: \`${o}\``,"","## Step schema","",i].join(`
5705
5705
  `);r.addPartFromText(a)}});import{z as cS}from"zod";var xB=or({schema:{name:vw,description:"Get the current browser state for a granular session. Defaults: screenshot on, browser snapshot off. The browser snapshot includes the URL, accessibility tree, and other context. Ask for it (returnBrowserState: true) when you need it for locator resolution or richer page structure\u2014e.g. when screenshot-only output is insufficient.",inputSchema:{sessionId:cS.string().describe("The session id to query."),returnBrowserState:cS.boolean().default(!1).describe("Include the serialized browser snapshot. Default false. Set to true when you need the browser snapshot for element targeting or page structure."),returnScreenshot:cS.boolean().default(!0).describe("Include a screenshot. Default true. Set to false if you already have a screenshot of the present state and don't need a new one. EX: you just previewed a step and see that the page is too complicated and need the browser snapshot.")}},handle:async(t,e,r)=>{let n=el(r,e.sessionId);if(!n)return;n.controller.setOpen();let o=await IA({browser:n.controller.browser,supportsFileOutput:t.supportsFileOutput,returnBrowserState:e.returnBrowserState,returnScreenshot:e.returnScreenshot});r.addContentParts(o)}}),_B=or({schema:{name:Aw,description:"Get the current environment variables for a session.",inputSchema:{sessionId:cS.string()}},handle:async(t,e,r)=>{let n=el(r,e.sessionId);if(!n)return;let o=await lo({testContext:n.context,supportsFileOutput:t.supportsFileOutput});r.addContentParts(o)}});import{z as Qc}from"zod";var IB=or({schema:{name:Tw,description:"Start a granular browser session for a specific test. Requires a testId. Returns session metadata (sessionId, testId, testFileAbsolutePath, viewport, etc.). Use testFileAbsolutePath to read the test file for step IDs when calling tools that require step IDs.",inputSchema:{testId:Qc.string().describe("The test id to target when starting a session."),envName:Qc.string().optional().describe("Optional environment override (matches CLI --env behavior). Defaults to the test's default env when omitted."),projectConfigPath:Qc.string().optional().describe("Optional path to a momentic.config.yaml file (matches CLI --config)."),projectNameFilter:Qc.string().optional().describe("Optional project name filter for workspace configs (matches CLI --filter)."),headfulBrowser:Qc.boolean().optional().describe("Whether to launch a headful browser for the session. When omitted, uses the MCP server default if configured.")}},handle:async(t,e,r)=>{let{logger:n}=t,o;try{o=await oi.startSession({logger:n,testId:e.testId,idleTimeoutMs:t.sessionIdleTimeoutMs,envName:e.envName,projectConfigPath:e.projectConfigPath??t.project.configFilePath,projectNameFilter:e.projectNameFilter,headfulOverride:e.headfulBrowser??t.headfulBrowserDefault??!0,customHeaders:t.customHeaders,devicePixelRatio:t.devicePixelRatio,skipExitOnError:!0})}catch(l){r.addError(Ot(l));return}let{session:i,baseUrl:a,envName:s}=o,c=i.controller.browser.getViewport();r.addPartFromText(JSON.stringify({sessionId:i.sessionId,testId:i.testId,testFileAbsolutePath:i.testFileAbsolutePath,createdAt:i.createdAt,expiresAt:i.lastAccessedAt+i.idleTimeoutMs,idleTimeoutMinutes:i.idleTimeoutMs/(60*1e3),envName:s,baseUrl:a,viewport:c},null,2));try{r.addContentParts(await Br({browser:i.controller.browser,supportsFileOutput:t.supportsFileOutput}))}catch(l){n.warn({sessionId:i.sessionId,err:l},"Session started but initial screenshot capture failed"),r.addPartFromText(JSON.stringify({warning:"Session started successfully, but initial screenshot capture failed.",screenshotError:Ot(l)},null,2))}}}),PB=or({schema:{name:bw,description:"Kill a granular browser session by sessionId. Returns available session ids if the target is missing.",inputSchema:{sessionId:Qc.string().describe("The session id to terminate.")}},handle:async(t,e,r)=>{try{if(!await oi.killSession(e.sessionId,"explicit kill")){r.addError(JSON.stringify({message:`No active session found for id '${e.sessionId}'.`,availableSessionIds:oi.listSessionIds()},null,2));return}r.addPartFromText(JSON.stringify({sessionId:e.sessionId,killed:!0},null,2))}catch(n){r.addError(String(n))}}});import{z as co}from"zod";import MB from"path";import{v4 as yee}from"uuid";async function Rp({project:t,input:e}){try{go(e.name)}catch(l){throw new ar(`${l} when validating the test entity name`)}if(!e.baseUrl&&!e.environment)throw new ar("Either 'baseUrl' or 'environment' must be provided when creating a test.");let r=await fe(t);if(Object.values(r.tests).find(l=>l.name===e.name))throw new ar(`A test with the name "${e.name}" already exists. Please use a different name.`);let i={id:yee(),name:e.name,description:e.description,baseUrl:e.baseUrl,schemaVersion:De,advanced:{browserType:e.browserType??"Chromium",viewport:e.viewport??Pr},retries:1,steps:[]};e.environment&&(i.envs=[{name:e.environment,default:!0}]);let a=MB.join(t.rootDir,...e.pathSegments||[]),s=await gD({test:i,name:e.name,folder:a});return{...i,relativeFilePath:MB.relative(t.rootDir,s)}}import{randomUUID as Tee}from"crypto";import{cloneDeep as bee}from"lodash-es";import{randomUUID as Eee}from"crypto";var Zc=async({step:t,controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:c})=>{let{results:l}=await LA({steps:[t],controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:c});return l[0]},LA=async({steps:t,fromStep:e,toStep:r,tracer:n,controller:o,executionOptions:i,storage:a,codeEvalTools:s,logger:c,socket:l,testContext:u,orgId:d})=>{let p={controller:o,storage:a,codeEvalTools:s,logger:c,context:u,usageTracker:new Xl},m=n??(l?new ki({orgId:d,parentStep:null,parentTracer:null,socket:l}):new bd);o.setOpen();let f={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0,failureRecoveryAttempts:0},...e&&{fastForwardingToStep:!0}},h=()=>_o({listParams:{containerName:"copilot-steps",steps:t,tracer:m},fixtures:p,options:{collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},inputs:{orgId:d,runId:Eee(),steps:t,testMetadata:null,orgSettings:{},fromStep:e,toStep:r},callbacks:{test:{},step:{}},work:f});return i?o.withExecutionOptions(i,h):h()};async function uS({step:t,project:e,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,supportsFileOutput:l,tempCaches:u}){let d=await Kg(t,{project:e,logger:r,tempCaches:u});switch(d.type){case"PRESET_ACTION":return vee({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,supportsFileOutput:l,tempCaches:u});case"AI_ACTION_DYNAMIC":return Aee({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,supportsFileOutput:l});case"RESOLVED_MODULE":return Cee({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:c,supportsFileOutput:l});default:{let[p,m]=await Promise.all([Br({browser:o.browser,supportsFileOutput:l}),lo({testContext:c,supportsFileOutput:l})]);return[...ce({text:`Preview for step type ${d.type} is not supported. Only PRESET_ACTION, RESOLVED_MODULE, and AI_ACTION_DYNAMIC are supported.`,section:"Error"}),...p,...m]}}}async function vee({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:c,tempCaches:l}){let u=await Zc({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),d=[];u?u.status==="SUCCESS"?(Ree({logger:e,tempCaches:l,command:t.command,parts:d}),d.push(...ce({text:`Step Execution successful: ${u.message}`,section:"Successful Result"}))):d.push(...ce({text:`Step Execution failed: ${u.message}`,section:"Error"})):d.push(...ce({text:"Step Execution errored for an unknown reason.",section:"Error"}));let[p,m]=await Promise.all([Br({browser:n.browser,supportsFileOutput:c}),lo({testContext:s,supportsFileOutput:c})]);return d.push(...p,...m),d}async function Aee({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:c}){let l=await Zc({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),u=[];l?l.status==="SUCCESS"?u.push(...ce({text:`AI action completed successfully: ${l.message??"Goal achieved"}`,section:"Successful Result"})):u.push(...ce({text:`AI action failed: ${l.message??"Unknown error while previewing AI action"}`,section:"Error"})):u.push(...ce({text:"AI action executed with unknown result.",section:"Error"}));let[d,p]=await Promise.all([Br({browser:n.browser,supportsFileOutput:c}),lo({testContext:s,supportsFileOutput:c})]);return u.push(...d,...p),u}async function Cee({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:c}){let l=await Zc({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),u=[];l?l.status==="SUCCESS"?u.push(...ce({text:`Module executed successfully: ${l.message}`,section:"Successful Result"})):u.push(...ce({text:`Module execution failed: ${l.message}`,section:"Error"})):u.push(...ce({text:"Module execution errored for an unknown reason.",section:"Error"}));let[d,p]=await Promise.all([Br({browser:n.browser,supportsFileOutput:c}),lo({testContext:s,supportsFileOutput:c})]);return u.push(...d,...p),u}function Ree({logger:t,tempCaches:e,command:r,parts:n}){if(e&&Un(r)&&r.cache)try{let o=Tee();e[o]=No.parse(bee({type:r.type,cache:r.cache})),n.push(...ce({text:o,section:"CacheId"}))}catch(o){t.warn({err:o},"Failed to save temp cache for step. Continuing...")}}import{cloneDeep as WA}from"lodash-es";import WB from"path";var jA=Symbol.for("immer-nothing"),wp=Symbol.for("immer-draftable"),Rn=Symbol.for("immer-state");function zr(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var rl=Object.getPrototypeOf;function nl(t){return!!t&&!!t[Rn]}function Fa(t){return t?kB(t)||Array.isArray(t)||!!t[wp]||!!t.constructor?.[wp]||Mp(t)||Op(t):!1}var wee=Object.prototype.constructor.toString();function kB(t){if(!t||typeof t!="object")return!1;let e=rl(t);if(e===null)return!0;let r=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return r===Object?!0:typeof r=="function"&&Function.toString.call(r)===wee}function xp(t,e){ol(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function ol(t){let e=t[Rn];return e?e.type_:Array.isArray(t)?1:Mp(t)?2:Op(t)?3:0}function _p(t,e){return ol(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function NA(t,e){return ol(t)===2?t.get(e):t[e]}function UB(t,e,r){let n=ol(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function xee(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function Mp(t){return t instanceof Map}function Op(t){return t instanceof Set}function tl(t){return t.copy_||t.base_}function UA(t,e){if(Mp(t))return new Map(t);if(Op(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=kB(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[Rn];let o=Reflect.ownKeys(n);for(let i=0;i<o.length;i++){let a=o[i],s=n[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(n[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:t[a]})}return Object.create(rl(t),n)}else{let n=rl(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function VA(t,e=!1){return mS(t)||nl(t)||!Fa(t)||(ol(t)>1&&(t.set=t.add=t.clear=t.delete=_ee),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>VA(n,!0))),t}function _ee(){zr(2)}function mS(t){return Object.isFrozen(t)}var FA={};function il(t){let e=FA[t];return e||zr(0,t),e}function Iee(t,e){FA[t]||(FA[t]=e)}var Ip;function FB(){return Ip}function Pee(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function OB(t,e){e&&(il("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function BA(t){zA(t),t.drafts_.forEach(Mee),t.drafts_=null}function zA(t){t===Ip&&(Ip=t.parent_)}function LB(t){return Ip=Pee(Ip,t)}function Mee(t){let e=t[Rn];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function NB(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[Rn].modified_&&(BA(e),zr(4)),Fa(t)&&(t=dS(e,t),e.parent_||pS(e,t)),e.patches_&&il("Patches").generateReplacementPatches_(r[Rn].base_,t,e.patches_,e.inversePatches_)):t=dS(e,r,[]),BA(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==jA?t:void 0}function dS(t,e,r){if(mS(e))return e;let n=e[Rn];if(!n)return xp(e,(o,i)=>DB(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return pS(t,n.base_,!0),n.base_;if(!n.finalized_){n.finalized_=!0,n.scope_.unfinalizedDrafts_--;let o=n.copy_,i=o,a=!1;n.type_===3&&(i=new Set(o),o.clear(),a=!0),xp(i,(s,c)=>DB(t,n,o,s,c,r,a)),pS(t,o,!1),r&&t.patches_&&il("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function DB(t,e,r,n,o,i,a){if(nl(o)){let s=i&&e&&e.type_!==3&&!_p(e.assigned_,n)?i.concat(n):void 0,c=dS(t,o,s);if(UB(r,n,c),nl(c))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(Fa(o)&&!mS(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;dS(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&pS(t,o)}}function pS(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&VA(e,r)}function Oee(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:FB(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=$A;r&&(o=[n],i=Pp);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var $A={get(t,e){if(e===Rn)return t;let r=tl(t);if(!_p(r,e))return Lee(t,r,e);let n=r[e];return t.finalized_||!Fa(n)?n:n===DA(t.base_,e)?(kA(t),t.copy_[e]=GA(n,t)):n},has(t,e){return e in tl(t)},ownKeys(t){return Reflect.ownKeys(tl(t))},set(t,e,r){let n=BB(tl(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=DA(tl(t),e),i=o?.[Rn];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(xee(r,o)&&(r!==void 0||_p(t.base_,e)))return!0;kA(t),HA(t)}return t.copy_[e]===r&&(r!==void 0||e in t.copy_)||Number.isNaN(r)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=r,t.assigned_[e]=!0),!0},deleteProperty(t,e){return DA(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,kA(t),HA(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=tl(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){zr(11)},getPrototypeOf(t){return rl(t.base_)},setPrototypeOf(){zr(12)}},Pp={};xp($A,(t,e)=>{Pp[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});Pp.deleteProperty=function(t,e){return Pp.set.call(this,t,e,void 0)};Pp.set=function(t,e,r){return $A.set.call(this,t[0],e,r,t[0])};function DA(t,e){let r=t[Rn];return(r?tl(r):t)[e]}function Lee(t,e,r){let n=BB(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function BB(t,e){if(!(e in t))return;let r=rl(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=rl(r)}}function HA(t){t.modified_||(t.modified_=!0,t.parent_&&HA(t.parent_))}function kA(t){t.copy_||(t.copy_=UA(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var Nee=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(e,r,n)=>{if(typeof e=="function"&&typeof r!="function"){let i=r;r=e;let a=this;return function(c=i,...l){return a.produce(c,u=>r.call(this,u,...l))}}typeof r!="function"&&zr(6),n!==void 0&&typeof n!="function"&&zr(7);let o;if(Fa(e)){let i=LB(this),a=GA(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?BA(i):zA(i)}return OB(i,n),NB(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===jA&&(o=void 0),this.autoFreeze_&&VA(o,!0),n){let i=[],a=[];il("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else zr(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,c=>e(c,...s));let n,o;return[this.produce(e,r,(a,s)=>{n=a,o=s}),n,o]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){Fa(t)||zr(8),nl(t)&&(t=Dee(t));let e=LB(this),r=GA(t,void 0);return r[Rn].isManual_=!0,zA(e),r}finishDraft(t,e){let r=t&&t[Rn];(!r||!r.isManual_)&&zr(9);let{scope_:n}=r;return OB(n,e),NB(void 0,n)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let r;for(r=e.length-1;r>=0;r--){let o=e[r];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}r>-1&&(e=e.slice(r+1));let n=il("Patches").applyPatches_;return nl(t)?n(t,e):this.produce(t,o=>n(o,e))}};function GA(t,e){let r=Mp(t)?il("MapSet").proxyMap_(t,e):Op(t)?il("MapSet").proxySet_(t,e):Oee(t,e);return(e?e.scope_:FB()).drafts_.push(r),r}function Dee(t){return nl(t)||zr(10,t),zB(t)}function zB(t){if(!Fa(t)||mS(t))return t;let e=t[Rn],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=UA(t,e.scope_.immer_.useStrictShallowCopy_)}else r=UA(t,!0);return xp(r,(n,o)=>{UB(r,n,zB(o))}),e&&(e.finalized_=!1),r}function HB(){let e="replace",r="add",n="remove";function o(p,m,f,h){switch(p.type_){case 0:case 2:return a(p,m,f,h);case 1:return i(p,m,f,h);case 3:return s(p,m,f,h)}}function i(p,m,f,h){let{base_:S,assigned_:g}=p,E=p.copy_;E.length<S.length&&([S,E]=[E,S],[f,h]=[h,f]);for(let y=0;y<S.length;y++)if(g[y]&&E[y]!==S[y]){let b=m.concat([y]);f.push({op:e,path:b,value:d(E[y])}),h.push({op:e,path:b,value:d(S[y])})}for(let y=S.length;y<E.length;y++){let b=m.concat([y]);f.push({op:r,path:b,value:d(E[y])})}for(let y=E.length-1;S.length<=y;--y){let b=m.concat([y]);h.push({op:n,path:b})}}function a(p,m,f,h){let{base_:S,copy_:g}=p;xp(p.assigned_,(E,y)=>{let b=NA(S,E),R=NA(g,E),I=y?_p(S,E)?e:r:n;if(b===R&&I===e)return;let _=m.concat(E);f.push(I===n?{op:I,path:_}:{op:I,path:_,value:R}),h.push(I===r?{op:n,path:_}:I===n?{op:r,path:_,value:d(b)}:{op:e,path:_,value:d(b)})})}function s(p,m,f,h){let{base_:S,copy_:g}=p,E=0;S.forEach(y=>{if(!g.has(y)){let b=m.concat([E]);f.push({op:n,path:b,value:y}),h.unshift({op:r,path:b,value:y})}E++}),E=0,g.forEach(y=>{if(!S.has(y)){let b=m.concat([E]);f.push({op:r,path:b,value:y}),h.unshift({op:n,path:b,value:y})}E++})}function c(p,m,f,h){f.push({op:e,path:[],value:m===jA?void 0:m}),h.push({op:e,path:[],value:p})}function l(p,m){return m.forEach(f=>{let{path:h,op:S}=f,g=p;for(let R=0;R<h.length-1;R++){let I=ol(g),_=h[R];typeof _!="string"&&typeof _!="number"&&(_=""+_),(I===0||I===1)&&(_==="__proto__"||_==="constructor")&&zr(19),typeof g=="function"&&_==="prototype"&&zr(19),g=NA(g,_),typeof g!="object"&&zr(18,h.join("/"))}let E=ol(g),y=u(f.value),b=h[h.length-1];switch(S){case e:switch(E){case 2:return g.set(b,y);case 3:zr(16);default:return g[b]=y}case r:switch(E){case 1:return b==="-"?g.push(y):g.splice(b,0,y);case 2:return g.set(b,y);case 3:return g.add(y);default:return g[b]=y}case n:switch(E){case 1:return g.splice(b,1);case 2:return g.delete(b);case 3:return g.delete(f.value);default:return delete g[b]}default:zr(17,S)}}),p}function u(p){if(!Fa(p))return p;if(Array.isArray(p))return p.map(u);if(Mp(p))return new Map(Array.from(p.entries()).map(([f,h])=>[f,u(h)]));if(Op(p))return new Set(Array.from(p).map(u));let m=Object.create(rl(p));for(let f in p)m[f]=u(p[f]);return _p(p,wp)&&(m[wp]=p[wp]),m}function d(p){return nl(p)?u(p):p}Iee("Patches",{applyPatches_:l,generatePatches_:o,generateReplacementPatches_:c})}var wn=new Nee,uSt=wn.produce,GB=wn.produceWithPatches.bind(wn),dSt=wn.setAutoFreeze.bind(wn),pSt=wn.setUseStrictShallowCopy.bind(wn),mSt=wn.applyPatches.bind(wn),fSt=wn.createDraft.bind(wn),hSt=wn.finishDraft.bind(wn);import{v4 as kee}from"uuid";HB();function fS({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=GB(r,n),c={id:kee(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",c),t.info({patchJson:JSON.stringify(c)},"Immer patch representation of tool's effect on test"),{patch:c,newState:i}}var jB=({steps:t,fromStep:e,toStep:r})=>{let n={total:0,fastForwardingToStep:!0},o=(i,a)=>{if(i.skipped)return!1;let s=a.map(l=>l.id),c=Sp(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!c)return!1;n.fastForwardingToStep=!1}return n.total+=1,!!(r&&Sp(i.id,s,r.toStepId,r.parentStepIdChain))};return un({steps:t,earlyStop:!0,onPresetAction:(i,a)=>o(i,a.parentChain),onConditional:(i,a)=>{if(i.skipped)return!1;let s=a.parentChain.map(l=>l.id),c=Sp(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!c)return!1;n.fastForwardingToStep=!1}return!!(r&&Sp(i.id,s,r.toStepId,r.parentStepIdChain))},onSimpleStepContainer:(i,a)=>o(i,a.parentChain)}),n.total};var Uee=t=>{throw new Error(`Unknown test section: ${t}`)};function qA(t,e){switch(e){case"setup":return t.beforeSteps??[];case"teardown":return t.afterSteps??[];case"main":return t.steps;default:return Uee(e)}}function VB(t,e,r){let n=qA(t,e);if(!r?.length)return n;let o=eN(n,r);if(!o)throw new Error(`No step found with parent chain [${r.join(", ")}] in ${e} section, or parent does not support nested steps`);return o}function $B(t,e){let r=e.moduleId,n=o=>{o.type!=="RESOLVED_MODULE"||o.moduleId!==r||(e.parameters!==void 0&&(o.parameters=e.parameters),e.parameterEnums!==void 0&&(o.parameterEnums=e.parameterEnums),e.defaultParameters!==void 0&&(o.defaultParameters=e.defaultParameters),e.name!==void 0&&(o.name=e.name),e.description!==void 0&&(o.description=e.description),e.enabled!==void 0&&(o.enabled=e.enabled),e.steps!==void 0&&(o.steps=e.steps))};for(let o of[t.steps,t.beforeSteps??[],t.afterSteps??[]])un({steps:o,onPresetAction:n,onConditional:n,onSimpleStepContainer:n})}async function hS({project:t,orgId:e,logger:r,testPath:n,socket:o,saveChangesToDisk:i,supportsFileOutput:a,tempCaches:s,params:c,envName:l}){let u=await fe(t),d=await Bt(WB.join(t.rootDir,n),r,u),p={steps:d.steps??[],beforeSteps:d.beforeSteps??[],afterSteps:d.afterSteps??[]},m=await Promise.all(c.steps.map(_=>Kg(_,{project:t,logger:r,tempCaches:s}))),f=c.parentStepIdChain,h;try{h=VB(p,c.targetSection,f)}catch(_){return vt(ce({text:`Error: ${_.message}`,section:"Error"}))}if(c.startIndex<0||c.startIndex>h.length)return vt(ce({text:`Error: Invalid startIndex ${c.startIndex} for splicing ${c.targetSection} section with ${h.length} steps (must be 0-${h.length})`,section:"Error"}));let S=c.steps.length,g=c.deleteCount,E=WA(h.slice(c.startIndex,c.startIndex+g)),y=WA(m),b="Cannot add a module step inside another module. Modules cannot be nested.",R;try{R=fS({logger:r,socket:o,baseState:p,recipe:O=>{let P;if(f?.length&&(P=tN(qA(O,c.targetSection),f,c.targetSection),P.some(z=>z.type==="RESOLVED_MODULE")&&m.some(z=>z.type==="RESOLVED_MODULE")))throw new Error(b);VB(O,c.targetSection,f).splice(c.startIndex,c.deleteCount,...m);for(let D of m)D.type==="RESOLVED_MODULE"&&$B(O,D);if(P)for(let D of P)D.type==="RESOLVED_MODULE"&&$B(O,D)},description:`Splice ${S} step(s) at index ${c.startIndex} in ${c.targetSection}, removing ${g}`}).newState}catch(_){if(_ instanceof Error&&_.message===b)return vt(ce({text:`Error: ${_.message}`,section:"Error"}));throw _}if(i){let{stepsToSave:_,moduleUpdates:A}=await Ft({stepLists:R});A.forEach(O=>{Qn({content:O,schemaVersion:De,momenticFiles:u,project:t})}),Tn({relativeTestPath:n,steps:_,schemaVersion:De,project:t})}let I=[...ce({text:`Successfully spliced ${S} step(s) at index ${c.startIndex} in the ${c.targetSection} section, removing ${g} step(s).`,section:"Result"})];return I.push(...await Fee({logger:r,project:t,orgId:e,testId:d.id,environment:l,originalSteps:p,updatedSteps:R})),I.push(...await IF({rootDir:t.rootDir,supportsFileOutput:a,deletedStepRefs:E.map((_,A)=>({id:_.id,index:c.startIndex+A})),insertedStepRefs:y.map((_,A)=>({id:_.id,index:c.startIndex+A})),deletedSteps:Vh(E,{includeCache:!1}),insertedSteps:Vh(y,{includeCache:!1}),metadata:{section:c.targetSection,parentStepIdChain:f??[],startIndex:c.startIndex,deleteCount:g,insertedCount:S},artifactEntity:"splice-restoration-payload"})),c.returnTest&&I.push(...ce({text:JSON.stringify(await iS({project:t,testPath:n,envName:l,logger:r}),null,2),section:"Test Content"})),vt(I)}async function gS({project:t,logger:e,testPath:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,envName:c,testContext:l,tracer:u,params:d,tokenLimit:p,supportsFileOutput:m}){let{fromStep:f,toStep:h,targetSection:S}=d,g=await fe(t),E=await Bt(WB.join(t.rootDir,r),e,g),y=new ut({baseUrl:Gt(),apiKey:dr(),logger:e}),b=await cr(e,y,t),{alwaysSaveCache:R,noCache:I}=Vs(),_=wo({logger:e,orgId:s,client:y,gitMetadata:b,regenerateCache:!1,alwaysSaveCache:R,noCache:I,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:void 0});try{await _.resolveStepCacheEntries({logger:e,schemaVersion:E.schemaVersion,stepLists:{beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[],steps:E.steps},testId:E.id,environment:c})}catch(te){e.warn({err:te},"Failed to resolve step cache entries, continuing without cache")}let A=qA(E,S),O=WA({steps:E.steps,beforeSteps:E.beforeSteps,afterSteps:E.afterSteps}),{result:P}=Ms(A,f.fromStepId,f.parentStepIdChain);if(!P)return vt(ce({text:`Error: No step found with id "${f.fromStepId}" and parent chain [${f.parentStepIdChain.join(", ")}] in ${S} section.`,section:"Error"}));if(h){let{result:te}=Ms(A,h.toStepId,h.parentStepIdChain);if(!te)return vt(ce({text:`Error: No step found with id "${h.toStepId}" and parent chain [${h.parentStepIdChain.join(", ")}] in ${S} section.`,section:"Error"}))}if(u?.setProgressTotal){let te=jB({steps:A,fromStep:f,toStep:h});u.setProgressTotal(te)}o.setOpen();let{results:F}=await LA({steps:A,controller:o,storage:n,codeEvalTools:i,logger:e,socket:a,orgId:s,testContext:l,fromStep:f,toStep:h,tracer:u});if(!F||F.length===0)return vt(ce({text:"Error: No steps were executed.",section:"Error"}));let D=F.at(-1);if(!D)return vt(ce({text:"Error: No steps were executed.",section:"Error"}));let z={logger:e,cacheStorage:_,orgId:s,testId:E.id,environment:c,originalStepsWithCaches:O,updatedStepsWithCaches:{steps:E.steps,beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[]}},H=D.status!=="SUCCESS";if(H)D.status==="FAILED"&&await Pc(z);else try{await Ls(z)}catch(te){e.warn({err:te},"Failed to save step cache after execution, future runs may be slower")}let ie=S==="main"?"":` in ${S}`,$=te=>{let be="fromStepId"in te?te.fromStepId:te.toStepId;return te.parentStepIdChain.length>0?`id "${be}" (parent chain [${te.parentStepIdChain.join(", ")}])`:`id "${be}"`},K=f?$(f):"beginning",X=h?`Steps from ${K} through ${$(h)}${ie}`:`Steps from ${K} to end${ie}`,oe=[];if(H)oe.push(...ce({text:`Error: step with id ${D.id} failed: ${D.message}`,section:"Error"}));else{o.setOpen();let te=`${X} executed successfully.`;oe.push(...ce({text:te,section:"Result"})),D.data&&oe.push(...ce({text:`Data: ${JSON.stringify(D.data,null,2)}`,section:"Result Data"}))}let[pe,Te]=await Promise.all([Br({browser:o.browser,supportsFileOutput:m}),lo({testContext:l,supportsFileOutput:m,limits:{tokenLimit:p}})]);return vt([...oe,...pe,...Te])}async function Fee({logger:t,project:e,orgId:r,testId:n,environment:o,originalSteps:i,updatedSteps:a}){let s=[];try{let c=new ut({baseUrl:Gt(),apiKey:dr(),logger:t}),l=await cr(t,c,e),{alwaysSaveCache:u,noCache:d}=Vs(),p=wo({logger:t,orgId:r,client:c,gitMetadata:l,regenerateCache:!1,alwaysSaveCache:u,noCache:d,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:void 0});await Ls({logger:t,cacheStorage:p,orgId:r,testId:n,environment:o,originalStepsWithCaches:i,updatedStepsWithCaches:a})}catch(c){t.warn({err:c},"Failed to save step caches after execution, future runs may be slower"),s.push(...ce({text:"Warning: Steps were saved successfully, but updating the step cache failed. Future runs may be slower until the cache is refreshed.",section:"Warning"}))}return s}var KA=class{constructor(e,r,n,o){this.reporter=e;this.step=r;this.parentStepIdChain=n;this.setTotal=o}loggerBindings;attachBeforeScreenshot(e){}attachAfterScreenshot(e){}attachBeforeHtmlSnapshot(e){}attachAfterHtmlSnapshot(e){}recordTargetAutoHeal(e){}recordStepDuration(e){}storeTraceAsset(){}async finish(e){this.reporter.onStepComplete(this.step)}async startSubSteps(){return new SS(this.reporter,this.parentStepIdChain.concat(this.step.id),this.setTotal)}},SS=class{constructor(e,r=[],n){this.reporter=e;this.parentStepIdChain=r;this.setTotal=n}loggerBindings;setProgressTotal(e){this.setTotal(e)}async getScreenshot(e,r){}async getHtmlSnapshot(e,r){}async startStep(e){return this.reporter.onStepStart(e.step),new KA(this.reporter,e.step,this.parentStepIdChain,this.setTotal)}};function qB(t,e,r,n){let o=uA(t),i={completed:0,total:0},a=new AbortController,s=!1,c=p=>{o&&SF(t,i,p,e,a,r)},l=()=>{o&&(s||(s=!0,c("Starting step execution...")))},u=p=>{!Number.isFinite(p)||p<0||(i.total=p)},d={onStepStart:p=>{l(),i.total===i.completed&&(i.total+=1),c(`Starting: ${Jn(p)}`)},onStepComplete:p=>{n(),l(),i.completed+=1,i.total<i.completed&&(i.total=i.completed),c(`Completed: ${Jn(p)}`)}};return new SS(d,[],u)}var Bee=or({schema:{name:Sw,description:"Create a test. The name must satisfy Momentic entity naming rules, and you must provide either a baseUrl or environment or the tool will fail.",inputSchema:DE},handle:async(t,e,r,n)=>{let{project:o}=t;try{let i=await Rp({project:o,input:e});r.addPartFromText(JSON.stringify(i,null,2))}catch(i){r.addError(Ot(i));return}}}),zee=or({schema:{name:bm,description:"List local test artifacts. Returns a separate segment for each relevant artifact type: tests, modules, and environments. When file output is enabled, read or grep only the specific artifact files you need instead of loading everything at once. Assume nothing changed since your last successful call to this tool unless the user indicates updates (e.g. new/changed tests, modules, environments, or project config change); avoid redundant calls just to refresh.",inputSchema:{}},handle:async(t,e,r,n)=>{let{project:o,logger:i}=t,a=[],s=[];try{let c=await fe(o),l=Object.values(c.tests).map(d=>({id:d.id,name:d.name,description:d.description,testFileAbsolutePath:d.fullFilePath,labels:d.labels||[]}));a.push({title:"Tests",entity:"test-list",payload:{tests:l}});let u=Object.values(c.modules).map(d=>({id:d.id,name:d.name,description:d.description,fullFilePath:d.fullFilePath,type:d.type}));a.push({title:"Modules",entity:"module-list",payload:{modules:u}})}catch(c){s.push(`Tests and modules discovery failed: ${Ot(c)}`)}try{let c=qh(o,i);a.push({title:"Environments",entity:"environment-list",payload:{environments:c}})}catch(c){s.push(`Environments discovery failed: ${Ot(c)}`)}if(a.length>0){let c=await pF({artifacts:a,rootDir:o.rootDir,supportsFileOutput:t.supportsFileOutput});r.addContentParts(c)}s.length>0&&r.addContentParts(ce({section:"Discovery Errors",text:s.map(c=>`- ${c}`).join(`
5706
- `)}))}}),KB=or({schema:{name:Ay,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:co.string(),step:co.string().describe(`CLI-style step definition. Use data returned from the ${mi} tool to get the full step schema.`)}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=el(r,o);if(!a)return;a.controller.setOpen();let s=await uS({project:t.project,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)}}),YB=or({schema:{name:yw,description:"Insert, delete, or replace steps in the test by index. Use parentStepIdChain to splice into nested steps (e.g. inside a conditional or module). The response always includes a recovery artifact with the full deleted and inserted payloads; only inspect it when you need to undo or inspect a mistaken splice.",inputSchema:{sessionId:co.string(),startIndex:co.number(),deleteCount:co.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:co.array(co.string()).describe(`CLI-style definition of steps to insert. Use data returned from the ${mi} tool to get the full step schema.`),targetSection:os.default("main"),parentStepIdChain:co.array(co.string()).optional().describe("When splicing into a nested step (e.g. conditional or module), the chain of parent step ids from root to the container. Empty or omit for top-level."),returnTest:co.boolean().default(!1).describe("Return the full post-splice test snapshot. Avoid this by default. Use true only when you truly need the full updated test; the normal response already includes inserted/deleted step references plus a recovery artifact for mistaken-splice recovery.")}},handle:async(t,e,r,n)=>{let o=el(r,e.sessionId);if(!o)return;let a=(await hS({project:t.project,orgId:o.orgId,logger:t.logger,testPath:o.relativeTestPath,envName:o.envName,saveChangesToDisk:t.saveChangesToDisk,supportsFileOutput:t.supportsFileOutput,tempCaches:o.tempCaches,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,parentStepIdChain:e.parentStepIdChain,returnTest:e.returnTest}})).value.map(s=>s.type==="media"?{type:"media",data:s.data,mediaType:"image/jpeg"}:s);r.addContentParts(a)}}),XB=or({schema:{name:Ew,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:co.string(),fromStep:Lm,toStep:Nm.optional(),targetSection:os.default("main"),resetSession:co.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=el(r,e.sessionId);if(!o)return;o.controller.setOpen(),e.resetSession&&await aS({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:dr(),baseUrl:Gt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=qB(n,t.logger,r,()=>{oi.touchSession(o.sessionId)}),s=(await gS({project:t.project,logger:t.logger,testPath:o.relativeTestPath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:i,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},supportsFileOutput:t.supportsFileOutput,envName:o.envName})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),JB=[zee,Bee];var QB=[wB,xB,_B,IB,PB,KB,XB,YB];import{z as wr}from"zod";import Gee from"fs";import Lp from"path";import Hee from"fs";import eu from"path";function ZB(t){let e=t.subDir?eu.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${dt(t.name)}.module.yaml`,n=eu.join(e,r),o=eu.relative(t.project.rootDir,n),i=Hee.statSync(n);return{type:ye.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:eu.sep,fullPathSegments:n.split(eu.sep),relativePathSegments:o.split(eu.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function jee({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await Ft({stepLists:{steps:e}});Qn({content:{...t,steps:o.steps},schemaVersion:De,momenticFiles:r,project:n})}async function yS({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){go(i.name);let a=await fe(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Lp.isAbsolute(r)?r:Lp.join(t.rootDir,r);s=(await Bt(f,e,a)).steps}let{stepsToExtract:c,startIndex:l,endIndex:u}=TF({moduleName:i.name,existingModuleNames:Object.values(a.modules).map(f=>f.name),parameterNames:i.parameters,defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums,moduleInputs:i.moduleInputs,testPath:r,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:s,containsNestedModuleStep:ZL}),d=i.subDir?Lp.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Gee.mkdirSync(d,{recursive:!0});let p=await $h({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:c,folder:d,project:t}),m=ZB({project:t,name:i.name,moduleId:p.moduleId,subDir:i.subDir,description:p.description??void 0});if(a.modules[p.moduleId]=m,i.parameters!==void 0||i.defaultParameters!==void 0||i.parameterEnums!==void 0){let f={moduleId:p.moduleId,name:i.name,description:i.description??p.description,enabled:i.enabled??p.enabled,parameters:i.parameters??[],defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums};await jee({moduleMetadata:f,steps:c,momenticFiles:a,project:t}),p={...p,name:i.name,description:i.description??p.description,enabled:i.enabled??p.enabled,parameters:i.parameters??[],defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums}}if(i.startIndex!==void 0&&r!==void 0){let f=Lp.isAbsolute(r)?r:Lp.join(t.rootDir,r),h=await Bt(f,e,a),S={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},g=await Ep({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,R])=>`${b}=${R}`)},{project:t,logger:e}),E=b=>{b.steps.splice(l,u-l,g)},{newState:y}=fS({logger:e,socket:n,baseState:S,recipe:E,description:`Create module "${i.name}" from steps ${l}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:R}=await Ft({stepLists:y});R.forEach(I=>{Qn({content:I,schemaVersion:De,momenticFiles:a,project:t})}),Tn({relativeTestPath:r,steps:b,schemaVersion:De,project:t})}}return{module:p}}var ez=or({schema:{name:gw,description:"Create a module. The name must satisfy Momentic entity naming rules or the tool will fail. If startIndex is provided, testPath is required and the specified test range is extracted into the module, then replaced with a module invocation in that test. endIndex may only be provided when startIndex is set.",inputSchema:{name:wr.string().describe(la),description:wr.string(),enabled:wr.boolean().default(!0),parameters:wr.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:wr.record(wr.string(),wr.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:wr.record(wr.string(),wr.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:wr.record(wr.string(),wr.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant when extracting from a test."),subDir:wr.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:wr.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:wr.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:wr.number().optional().describe("End index of steps to extract from the target test (exclusive). Only valid when startIndex is provided. If not provided, extracts just startIndex.")}},handle:async(t,e,r,n)=>{let{testPath:o,...i}=e;try{let a=cF({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await yS({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,params:i});r.addPartFromText(JSON.stringify(s.module,null,2))}catch(a){r.addError(Ot(a))}}});var ES=[...JB,...lS,...QB,ez];var YA=async(t,e)=>{try{let{killed:r,failed:n}=await oi.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")}};async function XA({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",supportsFileOutput:a=!0,alwaysSaveCache:s=!1,noCache:c=!1,headfulBrowserDefault:l=!0,customHeaders:u,devicePixelRatio:d,sessionIdleTimeoutMinutes:p}){Rc(e,!0),Tg(n),bg({alwaysSaveCache:s,noCache:c}),await vg(r),jc(t,g=>Ct({configFilePath:g}));let m={serverId:Vee(),applicationName:i,cliVersion:o},f=e.child({orgId:Xt(),userId:Jo(),...m}),h=new dn(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:f,mode:"interactive"}),S={project:t,orgId:Xt(),logger:f,generator:h,serverId:m.serverId,saveChangesToDisk:!0,supportsFileOutput:a,headfulBrowserDefault:l,sessionIdleTimeoutMs:(p&&p>=1?p:ka)*60*1e3,customHeaders:u,devicePixelRatio:d};return EF({context:S,info:m,tools:ES,shutdownHandlers:[YA]})}import{Router as Yee}from"express";import{Router as Wee}from"express";import kp from"fs";import Dp from"path";import{v4 as qee}from"uuid";import Kee from"yaml";import{hostname as $ee}from"os";var Np="2.77.0",Qe=sc({app:"desktop-server",hostname:$ee(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Np});(async()=>{try{let t=await Mi(Qe);t.gitBranchName&&Qe.addBinding("branch",t.gitBranchName)}catch{}})();var al=Wee();async function TS(t){return(await Wh(t,Qe)).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)}al.get("/",Ge(async(t,e)=>{let r=Re(),n=await fe(r),o=await TS(n);e.status(200).json(o)}));al.get("/tests-join",Ge(async(t,e)=>{let r=Re(),n=await fe(r),o=await TS(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 Bt(s.fullFilePath,Qe,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)un({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{yy(f)&&d.add(f.moduleId)}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));al.post("/",Ge(async(t,e)=>{let r;try{r=K_.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{go(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Re(),o=(await fe(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=Dp.join(n.rootDir,r.folderPath??"");if(!kp.existsSync(i)||!kp.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await $h({...r,folder:i,project:n});e.status(201).json(a)}));al.get("/:moduleId",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await fe(Re()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await Ii(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));al.post("/:moduleId/duplicate",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=q_.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{go(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=Re(),o=await fe(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 Ii(i,o,v),s=Dp.join(n.rootDir,Dp.dirname(i.relativePath));if(!kp.existsSync(s)||!kp.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=dt(r.name),l=Dp.join(s,`${c}.module.yaml`),u=qee(),{stepsToSave:d}=await Ft({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:ye.MODULE,schemaVersion:De,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=Kee.stringify(p);kp.writeFileSync(l,m,"utf-8");let f={relativeFilePath:Dp.relative(n.rootDir,l)};e.status(201).json(f)}));al.patch("/:moduleId/metadata",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Y_.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Re(),o=await fe(n);mD({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var tz=al;var rz=Yee();rz.get("/",Ge(async(t,e)=>{let r=Re(),n=await fe(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 TS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var nz=rz;import{Router as Xee}from"express";var JA=Xee();JA.get("/",Ge((t,e)=>{let r=qh(Re(),Qe);e.status(200).json(r)}));JA.get("/names",Ge((t,e)=>{let n=Re().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var oz=JA;import{Router as Jee}from"express";var iz=Jee();iz.get("/",Ge((t,e)=>{let r={userId:Jo(),orgId:Xt(),cliVersion:Np??"0.0.0"};e.status(200).json(r)}));var az=iz;import{StreamableHTTPServerTransport as Qee}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as Zee}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as lz}from"crypto";import{Router as ete}from"express";var QA="mcp-session-id",sz="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",bS=ete();function tte(){let t=process.env[sz];if(!t)return ka*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(Qe.warn({envVar:sz,rawValue:t,fallback:ka},"Invalid MCP session idle timeout env var; falling back to default"),ka*60*1e3):e*60*1e3}function rte(t,e){let r={serverId:lz(),applicationName:"momentic-mcp-desktop-server",cliVersion:Np??"0.0.0"},n=Re(),o=dr(),i=Gt(),a=Qe.child({orgId:Xt(),userId:Jo(),...r}),s=tc(process.env.MOMENTIC_HEADFUL_BROWSER),c=new dn(n.config.ai?.agentConfig,{baseUrl:i,apiKey:o,logger:a,mode:"interactive"});return{context:{project:n,orgId:Xt(),logger:a,generator:c,serverId:r.serverId,saveChangesToDisk:!0,supportsFileOutput:e??!0,sessionIdleTimeoutMs:tte(),headfulBrowserDefault:t??s??!0},info:r}}var Ui={};bS.post("/",async(t,e)=>{let r=String(t.headers[QA]??"");try{if(r&&Ui[r]){await Ui[r].handleRequest(t,e,t.body);return}if(!r&&Zee(t.body)){let{context:n,info:o}=rte(),i=dA(n,o,ES),a=new Qee({sessionIdGenerator:()=>lz(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{Ui[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&Ui[s]&&delete Ui[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})}});bS.get("/",async(t,e)=>{let r=String(t.headers[QA]??"");if(!r||!Ui[r]){e.status(400).send("Invalid or missing session ID");return}await Ui[r].handleRequest(t,e)});bS.delete("/",async(t,e)=>{let r=String(t.headers[QA]??"");if(!r||!Ui[r]){e.status(400).send("Invalid or missing session ID");return}let n=Ui[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var cz=bS;import{Router as nte}from"express";var uz=nte();uz.get("/:id",Ge(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=Gc();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){Qe.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var dz=uz;import{Router as ote}from"express";var vS=ote();vS.get("/",Ge(async(t,e)=>{let r=(await Mb()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));vS.get("/current",Ge((t,e)=>{let r=Re();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)}));vS.post("/set",Ge(async(t,e)=>{let r;try{r=J_.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}Qe.info("Setting local project");try{let n=await Ct({configFilePath:r.configFilePath});jc(n,o=>Ct({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var pz=vS;import{Router as ite}from"express";var mz=ite();mz.get("/",Ge((t,e)=>{let r=Re(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var fz=mz;import{streamText as _te}from"ai";import{Router as Ite}from"express";import nu from"fs";import sl from"path";import{v4 as Pte}from"uuid";import Mte from"yaml";import{convertToModelMessages as fte,pruneMessages as hte,stepCountIs as gte}from"ai";function hz(t,e,r){let n=t.execute;return n?{...t,execute:async(o,i)=>{r.info({toolName:e,input:o},"Copilot tool started");try{let a=await n(o,i);return r.info({toolName:e,result:a},"Copilot tool completed"),a}catch(a){throw r.warn({toolName:e,err:a},"Copilot tool failed"),a}}}:t}import AS from"dedent";var tu="3",ate=AS`
5706
+ `)}))}}),KB=or({schema:{name:Ay,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:co.string(),step:co.string().describe(`CLI-style step definition. Use data returned from the ${mi} tool to get the full step schema.`)}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=el(r,o);if(!a)return;a.controller.setOpen();let s=await uS({project:t.project,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)}}),YB=or({schema:{name:yw,description:"Insert, delete, or replace steps in the test by index. Use parentStepIdChain to splice into nested steps (e.g. inside a conditional or module). The response always includes a recovery artifact with the full deleted and inserted payloads; only inspect it when you need to undo or inspect a mistaken splice.",inputSchema:{sessionId:co.string(),startIndex:co.number(),deleteCount:co.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:co.array(co.string()).describe(`CLI-style definition of steps to insert. Use data returned from the ${mi} tool to get the full step schema.`),targetSection:os.default("main"),parentStepIdChain:co.array(co.string()).optional().describe("When splicing into a nested step (e.g. conditional or module), the chain of parent step ids from root to the container. Empty or omit for top-level."),returnTest:co.boolean().default(!1).describe("Return the full post-splice test snapshot. Avoid this by default. Use true only when you truly need the full updated test; the normal response already includes inserted/deleted step references plus a recovery artifact for mistaken-splice recovery.")}},handle:async(t,e,r,n)=>{let o=el(r,e.sessionId);if(!o)return;let a=(await hS({project:t.project,orgId:o.orgId,logger:t.logger,testPath:o.relativeTestPath,envName:o.envName,saveChangesToDisk:t.saveChangesToDisk,supportsFileOutput:t.supportsFileOutput,tempCaches:o.tempCaches,params:{startIndex:e.startIndex,deleteCount:e.deleteCount,steps:e.steps,targetSection:e.targetSection,parentStepIdChain:e.parentStepIdChain,returnTest:e.returnTest}})).value.map(s=>s.type==="media"?{type:"media",data:s.data,mediaType:"image/jpeg"}:s);r.addContentParts(a)}}),XB=or({schema:{name:Ew,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:co.string(),fromStep:Lm,toStep:Nm.optional(),targetSection:os.default("main"),resetSession:co.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=el(r,e.sessionId);if(!o)return;o.controller.setOpen(),e.resetSession&&await aS({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:dr(),baseUrl:Gt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=qB(n,t.logger,r,()=>{oi.touchSession(o.sessionId)}),s=(await gS({project:t.project,logger:t.logger,testPath:o.relativeTestPath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:i,params:{fromStep:e.fromStep,toStep:e.toStep,targetSection:e.targetSection},supportsFileOutput:t.supportsFileOutput,envName:o.envName})).value.map(c=>c.type==="media"?{type:"media",data:c.data,mediaType:"image/jpeg"}:c);r.addContentParts(s)}}),JB=[zee,Bee];var QB=[wB,xB,_B,IB,PB,KB,XB,YB];import{z as wr}from"zod";import Gee from"fs";import Lp from"path";import Hee from"fs";import eu from"path";function ZB(t){let e=t.subDir?eu.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${dt(t.name)}.module.yaml`,n=eu.join(e,r),o=eu.relative(t.project.rootDir,n),i=Hee.statSync(n);return{type:ye.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:eu.sep,fullPathSegments:n.split(eu.sep),relativePathSegments:o.split(eu.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function jee({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await Ft({stepLists:{steps:e}});Qn({content:{...t,steps:o.steps},schemaVersion:De,momenticFiles:r,project:n})}async function yS({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){go(i.name);let a=await fe(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Lp.isAbsolute(r)?r:Lp.join(t.rootDir,r);s=(await Bt(f,e,a)).steps}let{stepsToExtract:c,startIndex:l,endIndex:u}=TF({moduleName:i.name,existingModuleNames:Object.values(a.modules).map(f=>f.name),parameterNames:i.parameters,defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums,moduleInputs:i.moduleInputs,testPath:r,startIndex:i.startIndex,endIndex:i.endIndex,availableSteps:s,containsNestedModuleStep:ZL}),d=i.subDir?Lp.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Gee.mkdirSync(d,{recursive:!0});let p=await $h({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:c,folder:d,project:t}),m=ZB({project:t,name:i.name,moduleId:p.moduleId,subDir:i.subDir,description:p.description??void 0});if(a.modules[p.moduleId]=m,i.parameters!==void 0||i.defaultParameters!==void 0||i.parameterEnums!==void 0){let f={moduleId:p.moduleId,name:i.name,description:i.description??p.description,enabled:i.enabled??p.enabled,parameters:i.parameters??[],defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums};await jee({moduleMetadata:f,steps:c,momenticFiles:a,project:t}),p={...p,name:i.name,description:i.description??p.description,enabled:i.enabled??p.enabled,parameters:i.parameters??[],defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums}}if(i.startIndex!==void 0&&r!==void 0){let f=Lp.isAbsolute(r)?r:Lp.join(t.rootDir,r),h=await Bt(f,e,a),S={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},g=await Ep({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,R])=>`${b}=${R}`)},{project:t,logger:e}),E=b=>{b.steps.splice(l,u-l,g)},{newState:y}=fS({logger:e,socket:n,baseState:S,recipe:E,description:`Create module "${i.name}" from steps ${l}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:R}=await Ft({stepLists:y});R.forEach(I=>{Qn({content:I,schemaVersion:De,momenticFiles:a,project:t})}),Tn({relativeTestPath:r,steps:b,schemaVersion:De,project:t})}}return{module:p}}var ez=or({schema:{name:gw,description:"Create a module. The name must satisfy Momentic entity naming rules or the tool will fail. If startIndex is provided, testPath is required and the specified test range is extracted into the module, then replaced with a module invocation in that test. endIndex may only be provided when startIndex is set.",inputSchema:{name:wr.string().describe(la),description:wr.string(),enabled:wr.boolean().default(!0),parameters:wr.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:wr.record(wr.string(),wr.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:wr.record(wr.string(),wr.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:wr.record(wr.string(),wr.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant when extracting from a test."),subDir:wr.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:wr.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:wr.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:wr.number().optional().describe("End index of steps to extract from the target test (exclusive). Only valid when startIndex is provided. If not provided, extracts just startIndex.")}},handle:async(t,e,r,n)=>{let{testPath:o,...i}=e;try{let a=cF({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await yS({project:t.project,logger:t.logger,testPath:a,saveChangesToDisk:t.saveChangesToDisk,params:i});r.addPartFromText(JSON.stringify(s.module,null,2))}catch(a){r.addError(Ot(a))}}});var ES=[...JB,...lS,...QB,ez];var YA=async(t,e)=>{try{let{killed:r,failed:n}=await oi.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")}};async function XA({project:t,logger:e,apiKey:r,serverUrl:n,cliVersion:o,applicationName:i="momentic-mcp-stdio-server",supportsFileOutput:a=!0,alwaysSaveCache:s=!1,noCache:c=!1,headfulBrowserDefault:l=!0,customHeaders:u,devicePixelRatio:d,sessionIdleTimeoutMinutes:p}){Rc(e,!0),Tg(n),bg({alwaysSaveCache:s,noCache:c}),await vg(r),jc(t,g=>Ct({configFilePath:g}));let m={serverId:Vee(),applicationName:i,cliVersion:o},f=e.child({orgId:Xt(),userId:Jo(),...m}),h=new dn(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:f,mode:"interactive"}),S={project:t,orgId:Xt(),logger:f,generator:h,serverId:m.serverId,saveChangesToDisk:!0,supportsFileOutput:a,headfulBrowserDefault:l,sessionIdleTimeoutMs:(p&&p>=1?p:ka)*60*1e3,customHeaders:u,devicePixelRatio:d};return EF({context:S,info:m,tools:ES,shutdownHandlers:[YA]})}import{Router as Yee}from"express";import{Router as Wee}from"express";import kp from"fs";import Dp from"path";import{v4 as qee}from"uuid";import Kee from"yaml";import{hostname as $ee}from"os";var Np="2.78.0",Qe=sc({app:"desktop-server",hostname:$ee(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Np});(async()=>{try{let t=await Mi(Qe);t.gitBranchName&&Qe.addBinding("branch",t.gitBranchName)}catch{}})();var al=Wee();async function TS(t){return(await Wh(t,Qe)).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)}al.get("/",Ge(async(t,e)=>{let r=Re(),n=await fe(r),o=await TS(n);e.status(200).json(o)}));al.get("/tests-join",Ge(async(t,e)=>{let r=Re(),n=await fe(r),o=await TS(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 Bt(s.fullFilePath,Qe,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)un({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{yy(f)&&d.add(f.moduleId)}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:c,relativePath:l})}}e.status(200).json(i)}));al.post("/",Ge(async(t,e)=>{let r;try{r=K_.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{go(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Re(),o=(await fe(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=Dp.join(n.rootDir,r.folderPath??"");if(!kp.existsSync(i)||!kp.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await $h({...r,folder:i,project:n});e.status(201).json(a)}));al.get("/:moduleId",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await fe(Re()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await Ii(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));al.post("/:moduleId/duplicate",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=q_.parse(t.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{go(r.name)}catch(h){e.status(400).json({error:h.message});return}let n=Re(),o=await fe(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 Ii(i,o,v),s=Dp.join(n.rootDir,Dp.dirname(i.relativePath));if(!kp.existsSync(s)||!kp.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=dt(r.name),l=Dp.join(s,`${c}.module.yaml`),u=qee(),{stepsToSave:d}=await Ft({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:ye.MODULE,schemaVersion:De,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=Kee.stringify(p);kp.writeFileSync(l,m,"utf-8");let f={relativeFilePath:Dp.relative(n.rootDir,l)};e.status(201).json(f)}));al.patch("/:moduleId/metadata",Ge(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=Y_.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Re(),o=await fe(n);mD({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var tz=al;var rz=Yee();rz.get("/",Ge(async(t,e)=>{let r=Re(),n=await fe(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 TS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var nz=rz;import{Router as Xee}from"express";var JA=Xee();JA.get("/",Ge((t,e)=>{let r=qh(Re(),Qe);e.status(200).json(r)}));JA.get("/names",Ge((t,e)=>{let n=Re().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var oz=JA;import{Router as Jee}from"express";var iz=Jee();iz.get("/",Ge((t,e)=>{let r={userId:Jo(),orgId:Xt(),cliVersion:Np??"0.0.0"};e.status(200).json(r)}));var az=iz;import{StreamableHTTPServerTransport as Qee}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as Zee}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as lz}from"crypto";import{Router as ete}from"express";var QA="mcp-session-id",sz="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",bS=ete();function tte(){let t=process.env[sz];if(!t)return ka*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(Qe.warn({envVar:sz,rawValue:t,fallback:ka},"Invalid MCP session idle timeout env var; falling back to default"),ka*60*1e3):e*60*1e3}function rte(t,e){let r={serverId:lz(),applicationName:"momentic-mcp-desktop-server",cliVersion:Np??"0.0.0"},n=Re(),o=dr(),i=Gt(),a=Qe.child({orgId:Xt(),userId:Jo(),...r}),s=tc(process.env.MOMENTIC_HEADFUL_BROWSER),c=new dn(n.config.ai?.agentConfig,{baseUrl:i,apiKey:o,logger:a,mode:"interactive"});return{context:{project:n,orgId:Xt(),logger:a,generator:c,serverId:r.serverId,saveChangesToDisk:!0,supportsFileOutput:e??!0,sessionIdleTimeoutMs:tte(),headfulBrowserDefault:t??s??!0},info:r}}var Ui={};bS.post("/",async(t,e)=>{let r=String(t.headers[QA]??"");try{if(r&&Ui[r]){await Ui[r].handleRequest(t,e,t.body);return}if(!r&&Zee(t.body)){let{context:n,info:o}=rte(),i=dA(n,o,ES),a=new Qee({sessionIdGenerator:()=>lz(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{Ui[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&Ui[s]&&delete Ui[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})}});bS.get("/",async(t,e)=>{let r=String(t.headers[QA]??"");if(!r||!Ui[r]){e.status(400).send("Invalid or missing session ID");return}await Ui[r].handleRequest(t,e)});bS.delete("/",async(t,e)=>{let r=String(t.headers[QA]??"");if(!r||!Ui[r]){e.status(400).send("Invalid or missing session ID");return}let n=Ui[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var cz=bS;import{Router as nte}from"express";var uz=nte();uz.get("/:id",Ge(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=Gc();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){Qe.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var dz=uz;import{Router as ote}from"express";var vS=ote();vS.get("/",Ge(async(t,e)=>{let r=(await Mb()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));vS.get("/current",Ge((t,e)=>{let r=Re();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)}));vS.post("/set",Ge(async(t,e)=>{let r;try{r=J_.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}Qe.info("Setting local project");try{let n=await Ct({configFilePath:r.configFilePath});jc(n,o=>Ct({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var pz=vS;import{Router as ite}from"express";var mz=ite();mz.get("/",Ge((t,e)=>{let r=Re(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var fz=mz;import{streamText as _te}from"ai";import{Router as Ite}from"express";import nu from"fs";import sl from"path";import{v4 as Pte}from"uuid";import Mte from"yaml";import{convertToModelMessages as fte,pruneMessages as hte,stepCountIs as gte}from"ai";function hz(t,e,r){let n=t.execute;return n?{...t,execute:async(o,i)=>{r.info({toolName:e,input:o},"Copilot tool started");try{let a=await n(o,i);return r.info({toolName:e,result:a},"Copilot tool completed"),a}catch(a){throw r.warn({toolName:e,err:a},"Copilot tool failed"),a}}}:t}import AS from"dedent";var tu="3",ate=AS`
5707
5707
  <ai-actions>
5708
5708
  AI actions (--step-type AI_ACTION) are special steps that dynamically generate up to 15 sub-steps to achieve a complex goal. They are useful for:
5709
5709
  - Multi-step workflows that require decision-making (e.g., "Find and click the first available appointment slot")
@@ -6007,7 +6007,7 @@ ${t.map(p=>`${Pt}- ${p}`).join(`
6007
6007
  `))}async function IH({test:t,reason:e,apiClient:r,project:n,identity:o}){let i=(await fe(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 LS({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:l}),d=await NS({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 PH(t){return t?dt(t):"Unknown suite"}async function MH({client:t,orgId:e,suitePaths:r,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await t.queueSuiteRuns({paths:r,...i});le.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 S of s)v.dimmed(`${Pt}- ${t.getAppUrl()}/run-groups/${S}`);let l=new Set,u=[],d=S=>(S.status==="FAILED"||S.status==="PASSED"||S.status==="CANCELLED")&&S.runs.every(E=>E.status==="FAILED"&&(E.failureReason||E.finishedAt&&Date.now()-E.finishedAt.getTime()>30*1e3)||E.status==="PASSED"||E.status==="CANCELLED"),p=await Sh({name:"suites",getResults:async()=>{let S=s.filter(y=>!u.some(b=>b.id===y)),g=await t.bulkGetRunGroupStatus(S),E=[];for(let y of g)d(y)?u.push(y):E.push(y);return[...u,...E]},timeoutMs:o?o*1e3:void 0,checkDone:S=>(S.forEach(g=>{g.status==="RUNNING"&&(l.has(g.id)||(l.add(g.id),v.log(`${l.size}/${s.length} ${PH(g.suite?.name)}`)))}),S.every(d))}),m=t.getAppUrl(),h=Ac({results:p,startTime:c,onFailed:S=>{let g=PH(S.suite?.name),E=S.runs.filter(b=>b.status==="FAILED").length,y=S.runs.length;v.error(`${g} (${E}/${y} tests failed):`);for(let b of S.runs)if(b.status==="FAILED"){let R=b.testName||b.test?.name;v.error(` ${R?dt(R):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:S=>` ${S.suite?.name?dt(S.suite.name):"Unknown suite name"} (${m}/run-groups/${S.id})`});process.exit(h.failed>0?1:0)}async function OH({tests:t,client:e,orgId:r,...n}){!n.yes&&!await Tr(`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(le.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 Sh({name:"runs",getResults:async()=>{let m=i.filter(S=>!s.some(g=>g.id===S)),f=await e.bulkGetRunStatus(m),h=[];for(let S of f)c(S)?s.push(S):h.push(S);return[...s,...h]},timeoutMs:n.waitTimeout?n.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(f=>{if(f.status==="RUNNING"&&!a.has(f.id)){a.add(f.id);let h=f.testName||f.test?.name;h&&v.log(`${a.size}/${o.length} ${dt(h)}`)}}),m.every(c))}),p=Ac({results:d,startTime:u,onFailed:m=>{let f=m.testName||m.test?.name;yh(m,f?dt(f):"Unknown test")},getDisplayLine:m=>{let f=m.testName||m.test?.name,h=` ${f?dt(f):"Unknown test"}`;return m.id&&(h+=` (${l}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as Qre}from"crypto";import Zre from"fs";import{existsSync as xre,mkdirSync as _re,statSync as Ire}from"fs";import{randomUUID as cl}from"crypto";import su,{writeFileSync as LH}from"fs";import{hostname as are}from"os";import ai from"path";import{z as DS}from"zod";async function US(t,e,r,n){if(n){let o=await e.getScreenshot(t,n);if(o){let i=`screenshot-${n}.jpeg`,a=ai.join(r,i);return su.writeFileSync(a,o),i}}}async function sre(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??cl(),historyId:n.runId??cl(),testCaseId:n.test.id,fullName:n.test.name,name:dt(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:are()},{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 vC(t,e,r.folder,i.steps,n.results);let a=lre(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;su.writeFileSync(ai.join(o,s),JSON.stringify(i,void 0,2))}async function kS(t,e,r,n){let o={name:GN(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 US(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await US(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(Ru.safeParse(n.data).success){let s=Ru.parse(n.data),c=s.request,l={...s,request:void 0},u=`output-attachment-api-request-${cl()}.json`,d=`output-attachment-api-response-${cl()}.json`,p=ai.join(r,u),m=ai.join(r,d);su.writeFileSync(p,JSON.stringify(c,null,2)),su.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=DS.union([DS.object({}).passthrough(),DS.array(DS.any())]).safeParse(n.data).success,c=`output-attachment-${cl()}.json`,l=ai.join(r,c);su.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 vC(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await kS(t,e,r,i);break}case"CONDITIONAL":{a=await kS(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await kS(t,e,r,i.assertionResult)),await vC(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await kS(t,e,r,i),await vC(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-${cl()}.json`,c=ai.join(r,s);LH(c,NH(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${cl()}.json`,c=ai.join(r,s);LH(c,NH(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function DH(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 sre(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function NH(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 lre(t,e,r){let n=t.listVideoAssetPaths();if(n.length===0)return[];let o=[];for(let i of n){let a=ai.basename(i),s=a,c=ai.join(e,s);try{su.copyFileSync(i,c)}catch{continue}let l,u=ai.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{randomUUID as FH}from"crypto";import cre from"fs";import BS from"path";function FS(t){if(t.status!=="FAILED")return"none";switch(t.failureReason){case"SetupFailureError":return"setup";case"TeardownFailureError":return"teardown";default:return"main"}}function ure(t){switch(t){case"PASSED":return"passed";case"FAILED":return"failed";case"CANCELLED":return"skipped";case"RETRYING":case"WAITING_FOR_USER":case"PENDING":case"RUNNING":return"unknown";default:return z_(t)}}function BH(t){let e=BS.relative(".",t);return e===""?t:e}function kH(t,e){return Math.max(0,(t.getTime()-e.getTime())/1e3)}function dre(t,e,r){let n=kH(e,t),o=kH(r,t);return{start_at:n,end_at:o,duration:Math.max(0,o-n)}}function zH(t){let e=t.reduce((r,[n,o])=>(!o||Object.keys(r).length>=10||(r[n]=o),r),{});return Object.keys(e).length>0?e:void 0}function pre(t){if(t.status!=="FAILED"||!t.failureReason)return;let e=t.failureDetails?.classification,r=Pl[e?.reason||t.failureReason],n=e?.summary||t.failureDetails?.errorMessage||$i[t.failureReason];return`${r}: ${n}`}function mre(t){if(t.status!=="FAILED")return;let e=[t.failureDetails?.classification?.summary,t.failureDetails?.classification?.rootCause,t.failureDetails?.errorMessage].filter(n=>!!n),r=t.failureDetails?.errorStack?.split(`
6008
6008
  `).map(n=>n.trim()).filter(Boolean)||[];if(!(e.length===0&&r.length===0))return[{expanded:e,backtrace:r}]}function fre(t){let e=t.status==="FAILED"?FS(t):void 0;return zH([["failure_section",e],["quarantined",t.quarantined?"true":"false"],["failure_recovery",t.failureRecoveryDetails?.attempts?"true":"false"]])}function hre(t,e,r){let n=BH(r.filePath);return{id:r.runId||FH(),scope:t,name:r.testName,location:n,file_name:BS.basename(n),result:ure(r.status),failure_reason:pre(r),failure_expanded:mre(r),history:dre(e,r.lastAttemptStartedAt,r.finishedAt),tags:fre(r)}}function UH(t,e,r,n,o){let i=BH(e);return{id:FH(),scope:t,name:r,location:i,file_name:BS.basename(i),result:"skipped",history:{start_at:0,end_at:0,duration:0},tags:zH([["quarantined",o?.quarantined||"false"],["failure_recovery","false"]])}}function gre(t,e){let r=e.map(i=>hre(t.suiteName,t.startedAt,i)),n=t.testsToSkip.map(i=>UH(t.suiteName,i.relativeFilePath,i.name,i.id,void 0)),o=t.quarantinedTestsToSkip.map(i=>UH(t.suiteName,i.relativeFilePath,i.name,i.id,{quarantined:"true"}));return[...r,...n,...o]}function HH(t,e,r){let n=gre(e,r);cre.writeFileSync(BS.join(t,`${e.suiteName}.buildkite.json`),JSON.stringify(n,null,2))}import Sre from"junit-report-builder";import zS from"path";function GH(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 yre(t,e){let r=FS(t);if(e.name(t.testName).className(t.testName).file(zS.relative(".",t.filePath)).property("id",t.testId).property("dd_tags[id]",t.testId),t.labels&&(e.property("labels",t.labels.join(",")),t.labels.forEach(n=>{e.property("dd_tags[label]",n)})),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&&GH(e,t.quarantinedMetadata),r==="setup"&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r==="main"&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r==="teardown"&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),t.status==="FAILED"){if(t.failureReason){let n=Pl[t.failureDetails?.classification?.reason||t.failureReason],o=t.failureDetails?.classification?.summary||$i[t.failureReason];t.runId&&(o+=` Visit https://app.momentic.ai/runs/${t.runId} for more details.`),e.failure(o,n)}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 Ere(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();yre(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(zS.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(zS.relative(".",d.relativeFilePath)).property("id",d.id);let m=l[d.id];m&&GH(p,m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(f=>{p.property("dd_tags[label]",f)})),p.skipped()}return u}function jH(t,e,r){let n=Sre.newBuilder();Ere(n,e,r),n.writeTo(zS.join(t,`${e.suiteName}.xml`))}import Tre from"fs";import bre from"path";function VH(t){return{title:Jn(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(VH):[]}}async function vre(t,e,r,n){if(n.results?.length){let o=await US(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function Are(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||$i[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(VH)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await vre(t,e,r,n)}}async function Cre(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await Are(t,e,r,n)]}}async function Rre(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await Cre(t,e,r,n)],id:n.runId,file:n.filePath}}function AC(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function wre(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 md;try{return await Rre(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:AC(o,i=>i.status==="PASSED"),unexpected:AC(o,i=>i.status!=="PASSED"),flaky:AC(o,i=>!!i.isFlake),skipped:0}}}async function $H(t,e,r,n,o){let i=await wre(t,e,r,n,o);Tre.writeFileSync(bre.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function WH(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,failureRecoveryDetails:t.failureRecoveryDetails,failureDetails:t.failureDetails,failureReason:t.failureReason,finishedAt:t.finishedAt,lastAttemptStartedAt:t.lastAttemptStartedAt,attempts:t.attempts,parameters:t.parameters}}async function qH({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(xre(i)?Ire(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...`),_re(i,{recursive:!0})),r){case"junit":{let a=o.map(WH);jH(i,n,a);return}case"buildkite-json":{let a=o.map(WH);HH(i,n,a);return}case"allure":case"allure-json":await DH(t,e,i,n,o);return;case"playwright-json":await $H(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import ene from"wait-on";import{execSync as Pre}from"child_process";import{platform as Mre}from"os";function HS(){return KH()?(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.
6009
6009
  `),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.
6010
- `),1)}function KH(){return Mre()==="darwin"&&Pre("system_profiler SPDisplaysDataType").toString().includes("Retina")}function GS(t){KH()&&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 Ore from"@actions/exec";import Lre from"@actions/io";import Nre from"quote";import Dre from"string-argv";async function YH(t,e=!0){let r=Dre(t),n=await Lre.which(r[0],!0),o=r.slice(1),i=Ore.exec(Nre(n),o,{delay:100});if(e)return i}import kre from"csv-parser";import{createReadStream as Ure}from"fs";function CC(t){return new Promise((e,r)=>{let n=[];Ure(t).pipe(kre()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import lu from"semver";import{z as jS}from"zod";var en="2.77.0",Fre="https://registry.npmjs.org/momentic",Bre=jS.object({versions:jS.record(jS.string(),jS.unknown()).optional()});async function Io(t){try{await zre(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function RC(){let t=await J(fetch(Fre),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=Bre.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=en;for(let o of Object.keys(r))lu.valid(o)&&lu.major(o)===lu.major(en)&&lu.gt(o,n)&&lu.prerelease(o)===null&&(n=o);return n}async function zre(t){let e;for(let r=0;r<2;r++)try{e=await RC()}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}lu.eq(en,e)||(v.warn(`Update available: v${en} -> 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 Bi(){try{await J(Promise.all([yf(),Kt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Hre}from"lodash-es";function VS(t){return t.length===1?"test":"tests"}function XH(t){return t===1?"1 worker":`${t} workers`}function JH(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${VS(t)}:`),t.forEach(e=>{v.info(`${Pt}- ${[e.relativeFilePath]}`)}),v.log(""))}function QH(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${VS(t)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function Gre(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${VS(t)} with ${XH(e)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function jre(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${VS(e)} with ${XH(r)}:`),e.forEach(n=>{v.info(`${Pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function ZH({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]=Hre(e,s=>s.quarantined);Gre(i,r),jre(i,a,r)}import{randomUUID as Vre}from"crypto";import{cloneDeep as cu}from"lodash-es";import{dirname as $re}from"path";async function e1({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 Rr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function t1({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:f,aiSettings:h,visualDiffScreenshotStorage:S,tracer:g,browserTypeOverride:E}){let y=await Xc({settings:f,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),b={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:le,mode:"runner"},R=wm({browserTypeOverride:E,configuredBrowserType:y.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(y.browserType=R,!zL(R)){let O=`Browser ${R} 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(O),le.warn(O)}let I=await ao.init({baseUrl:t,logger:d,userBrowserSettings:y,storage:a,enricher:new Ra(b,c),contextArgs:{viewport:i.advanced.viewport??Pr,locale:i.advanced.locale??Xi,geolocation:i.advanced.geolocation??Qi,timezoneId:i.advanced.timezone??Ji,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:O=>g.onNetworkPage(O),onNetworkLogs:O=>g.onNetworkLogs(O)},iconKnowledgeBase:null,videoOptions:g.videoOutputPath?{videoOutputPath:g.videoOutputPath,onVideoPageChange:({videoName:O,timestamp:P})=>{g.setActiveVideo(O,P)}}:void 0}),_=new La({browser:I,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:S}),A=new Kr({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async O=>{let{name:P,defaultValue:F,required:D}=O,z=m?.[P];D&&z===void 0&&(v.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let H=await Rr({orgId:l,s:z??F,localTools:s,logger:d,context:Kr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(P,H)})),{controller:_,context:A}}async function r1({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!Ts){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 n1({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 f={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},S={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await r1({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await tS({fixtures:f,inputs:h,options:S,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function o1(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await Wre(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 Wre(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:f}=t,h=new Bc(n,o),S=wo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,isolateCachesByEnvironment:r.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:l.bustOldestCachePercentage}),{envName:g,resolvedEnv:E,environmentVariables:y,baseUrl:b}=hg({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:D=>Bs(D,r,s)}),R=await Ph({cacheStorage:S,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id,environment:g}),I=R.steps,_=R.beforeSteps??void 0,A=R.afterSteps??void 0,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:$re(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:b,environmentName:g,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),P=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([D,z])=>{y[D]=z});let F=await qre({...t,variables:y,envName:g,resolvedEnv:E,baseUrl:b,storageClient:h,tracer:O,logger:P,cacheStorage:S,stepsWithCaches:I,beforeStepsWithCaches:_,afterStepsWithCaches:A,usageTracker:f});return await O.finish({logger:s,status:F.status,finishedAt:F.finishedAt,failureDetails:F.failureDetails,failureReason:F.failureReason,isFlake:F.isFlake,failureRecoveryDetails:F.failureRecoveryDetails}),{runId:O.runId,...F}}async function qre(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:f,testInputs:h,variables:S,resolvedEnv:g,retriesOverride:E,devicePixelRatio:y,logUpdate:b,tracer:R,logger:I,cacheStorage:_,gitMetadata:A,quarantined:O,quarantinedMetadata:P,usageTracker:F}=t,D=i.config.ai?.aiFailureAnalysis??!1,z=new Date,H=new Dc(i,s,a),ie={...i.config},$={envName:p,urlOverride:m,customHeaders:f,testInputs:h},K,X=Math.abs(E??e.retries??i.config.retries??0),oe=[];I.info({...A,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let pe=0;pe<=X;pe++){let Te=Vre(),te=await R.startAttempt(Te),be=I.child(te.loggerBindings||{}),Pe={...e,steps:cu(r),beforeSteps:cu(n),afterSteps:cu(o)};pe!==0&&b("RETRY",`attempt ${pe+1}/${X+1}`);let ve=new Date,x=ie.advanced?.fakerConstantSeed,se=new Xo({httpClient:new br({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:be,mode:"runner"}),fakerSeed:x?rc:void 0}),Ae=te;try{let{controller:mn,context:Po}=await t1({tracer:te,baseUrl:l,envName:p,testName:Pe.name,apiClient:s,devicePixelRatio:y,logger:be,storageClient:u,codeEvalTools:se,test:Pe,generator:c,orgId:d,variables:S,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...g?.browser||{},...Pe.advanced},browserTypeOverride:t.browserTypeOverride,aiSettings:{...i.config.ai||{},...Pe.advanced||{}},visualDiffScreenshotStorage:H});K=await n1({attemptMetadata:{attemptNumber:pe+1,orgId:d,runId:R.runId},attemptFixtures:{logger:be,storageClient:u,usageTracker:F,codeEvalTools:se,apiClient:s,context:Po,controller:mn,tracer:te},attemptInputs:{test:Pe,orgSettings:ie}});let Mn=new Date,Mo={logger:I,cacheStorage:_,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:cu(r),beforeSteps:cu(n),afterSteps:cu(o)},updatedStepsWithCaches:{steps:Pe.steps,beforeSteps:Pe.beforeSteps,afterSteps:Pe.afterSteps}};K?.status==="PASSED"?await Ls(Mo):K?.status==="FAILED"&&pe===X&&await Pc(Mo),await te.finish({logger:be,result:K}),oe.unshift(K.status);let ue=await e1({orgId:d,codeEvalTools:se,logger:be,outputDefinitions:e.outputs??[],testContext:Po}),li=ox(oe),Wp=pe+1;if(K.status!=="FAILED")return{...K,runAttemptId:Te,parameters:$,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:Mn,attempts:Wp,baseUrl:l,outputs:ue,isFlake:li,quarantined:O,quarantinedMetadata:P};let Ha=K.failedStepResult,uo=Ha?.message||"Unknown failure",zi=Ha?.failureReason??QR(uo)??"UnknownError",pl=be.child({failureReason:zi,errorMessage:uo,numAttempts:(X+1).toString(),name:Pe.name});if(pe<X){pl.warn(`Retrying failed execution attempt for run: ${uo}`);continue}pl.error(`Test failed after all exhausting attempts: ${uo}`);let uu=new Error(uo),ml={errorMessage:uo,errorStack:uu.stack},Hi;if(D){let qp;try{if(K.results&&K.results.length>0){let{classification:du,aiFailureReason:nt}=await lD({logger:be,browserStateStorage:Ae,generator:c,fullResults:K,failureReason:zi,error:uu,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});qp=du,Hi=nt}}catch(du){be.warn({err:du},"Failed to classify test results")}qp&&(ml.classification=qp,zi=Hi??zi)}return{...K,runAttemptId:Te,parameters:$,failureDetails:ml,failureReason:zi,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:Mn,attempts:pe+1,baseUrl:l,outputs:ue,quarantined:O,quarantinedMetadata:P}}catch(mn){let Po=`Encountered fatal platform error while running test '${Pe.name}': ${mn}`,Mn=new Date,Mo=pe+1;be.error({err:mn},Po),v.error(Po);let ue={errorMessage:mn.message,errStack:mn.stack},li={status:"FAILED",failureDetails:ue,failureReason:"InternalPlatformError",finishedAt:Mn};return await te.finish({logger:be,result:{status:"FAILED",results:[]}}),{...li,runAttemptId:Te,results:[],parameters:$,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:new Date,attempts:Mo,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:P}}}throw new Error("This code should not be reachable")}import Xre from"adm-zip";import Jre from"path";function Kre(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 ul=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(`${yr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${yr}/${r}.html`)?.toString()}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))Kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new wC(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:Kre(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Yre(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var wC=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 Ni(void 0,a=>this.storeTraceAsset(a)),Li.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";Kt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){if(!Sf(e.step))return;let r=gf(e.step);Kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}storeTraceAsset(e){this.diskStorage.storeFile({name:`${yr}/${e.snapshotId}.jpeg`,contents:e.data})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:Yre(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new ul(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var jp=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(yr),this.harPagesStream=this.diskStorage.createFileStream(`${yr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${yr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${yr}/resource-usage.ndjson`),this.resourceUsageSampler=AP({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
6010
+ `),1)}function KH(){return Mre()==="darwin"&&Pre("system_profiler SPDisplaysDataType").toString().includes("Retina")}function GS(t){KH()&&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 Ore from"@actions/exec";import Lre from"@actions/io";import Nre from"quote";import Dre from"string-argv";async function YH(t,e=!0){let r=Dre(t),n=await Lre.which(r[0],!0),o=r.slice(1),i=Ore.exec(Nre(n),o,{delay:100});if(e)return i}import kre from"csv-parser";import{createReadStream as Ure}from"fs";function CC(t){return new Promise((e,r)=>{let n=[];Ure(t).pipe(kre()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import lu from"semver";import{z as jS}from"zod";var en="2.78.0",Fre="https://registry.npmjs.org/momentic",Bre=jS.object({versions:jS.record(jS.string(),jS.unknown()).optional()});async function Io(t){try{await zre(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function RC(){let t=await J(fetch(Fre),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=Bre.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=en;for(let o of Object.keys(r))lu.valid(o)&&lu.major(o)===lu.major(en)&&lu.gt(o,n)&&lu.prerelease(o)===null&&(n=o);return n}async function zre(t){let e;for(let r=0;r<2;r++)try{e=await RC()}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}lu.eq(en,e)||(v.warn(`Update available: v${en} -> 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 Bi(){try{await J(Promise.all([yf(),Kt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Hre}from"lodash-es";function VS(t){return t.length===1?"test":"tests"}function XH(t){return t===1?"1 worker":`${t} workers`}function JH(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${VS(t)}:`),t.forEach(e=>{v.info(`${Pt}- ${[e.relativeFilePath]}`)}),v.log(""))}function QH(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${VS(t)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function Gre(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${VS(t)} with ${XH(e)}:`),t.forEach(r=>{v.info(`${Pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function jre(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${VS(e)} with ${XH(r)}:`),e.forEach(n=>{v.info(`${Pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function ZH({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]=Hre(e,s=>s.quarantined);Gre(i,r),jre(i,a,r)}import{randomUUID as Vre}from"crypto";import{cloneDeep as cu}from"lodash-es";import{dirname as $re}from"path";async function e1({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 Rr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function t1({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:f,aiSettings:h,visualDiffScreenshotStorage:S,tracer:g,browserTypeOverride:E}){let y=await Xc({settings:f,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),b={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:le,mode:"runner"},R=wm({browserTypeOverride:E,configuredBrowserType:y.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(y.browserType=R,!zL(R)){let O=`Browser ${R} 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(O),le.warn(O)}let I=await ao.init({baseUrl:t,logger:d,userBrowserSettings:y,storage:a,enricher:new Ra(b,c),contextArgs:{viewport:i.advanced.viewport??Pr,locale:i.advanced.locale??Xi,geolocation:i.advanced.geolocation??Qi,timezoneId:i.advanced.timezone??Ji,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:O=>g.onNetworkPage(O),onNetworkLogs:O=>g.onNetworkLogs(O)},iconKnowledgeBase:null,videoOptions:g.videoOutputPath?{videoOutputPath:g.videoOutputPath,onVideoPageChange:({videoName:O,timestamp:P})=>{g.setActiveVideo(O,P)}}:void 0}),_=new La({browser:I,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:S}),A=new Kr({baseUrl:t,currentUrl:_.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async O=>{let{name:P,defaultValue:F,required:D}=O,z=m?.[P];D&&z===void 0&&(v.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let H=await Rr({orgId:l,s:z??F,localTools:s,logger:d,context:Kr.dummyContext(A.getEnvName())});A.setMomenticSystemVariable(P,H)})),{controller:_,context:A}}async function r1({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!Ts){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 n1({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 f={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},S={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await r1({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await tS({fixtures:f,inputs:h,options:S,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function o1(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await Wre(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 Wre(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:f}=t,h=new Bc(n,o),S=wo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,isolateCachesByEnvironment:r.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:l.bustOldestCachePercentage}),{envName:g,resolvedEnv:E,environmentVariables:y,baseUrl:b}=hg({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:D=>Bs(D,r,s)}),R=await Ph({cacheStorage:S,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id,environment:g}),I=R.steps,_=R.beforeSteps??void 0,A=R.afterSteps??void 0,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:$re(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:b,environmentName:g,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),P=s.child(O.loggerBindings||{});Object.entries(O.envVarBindings||{}).forEach(([D,z])=>{y[D]=z});let F=await qre({...t,variables:y,envName:g,resolvedEnv:E,baseUrl:b,storageClient:h,tracer:O,logger:P,cacheStorage:S,stepsWithCaches:I,beforeStepsWithCaches:_,afterStepsWithCaches:A,usageTracker:f});return await O.finish({logger:s,status:F.status,finishedAt:F.finishedAt,failureDetails:F.failureDetails,failureReason:F.failureReason,isFlake:F.isFlake,failureRecoveryDetails:F.failureRecoveryDetails}),{runId:O.runId,...F}}async function qre(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:f,testInputs:h,variables:S,resolvedEnv:g,retriesOverride:E,devicePixelRatio:y,logUpdate:b,tracer:R,logger:I,cacheStorage:_,gitMetadata:A,quarantined:O,quarantinedMetadata:P,usageTracker:F}=t,D=i.config.ai?.aiFailureAnalysis??!1,z=new Date,H=new Dc(i,s,a),ie={...i.config},$={envName:p,urlOverride:m,customHeaders:f,testInputs:h},K,X=Math.abs(E??e.retries??i.config.retries??0),oe=[];I.info({...A,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let pe=0;pe<=X;pe++){let Te=Vre(),te=await R.startAttempt(Te),be=I.child(te.loggerBindings||{}),Pe={...e,steps:cu(r),beforeSteps:cu(n),afterSteps:cu(o)};pe!==0&&b("RETRY",`attempt ${pe+1}/${X+1}`);let ve=new Date,x=ie.advanced?.fakerConstantSeed,se=new Xo({httpClient:new br({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:be,mode:"runner"}),fakerSeed:x?rc:void 0}),Ae=te;try{let{controller:mn,context:Po}=await t1({tracer:te,baseUrl:l,envName:p,testName:Pe.name,apiClient:s,devicePixelRatio:y,logger:be,storageClient:u,codeEvalTools:se,test:Pe,generator:c,orgId:d,variables:S,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...g?.browser||{},...Pe.advanced},browserTypeOverride:t.browserTypeOverride,aiSettings:{...i.config.ai||{},...Pe.advanced||{}},visualDiffScreenshotStorage:H});K=await n1({attemptMetadata:{attemptNumber:pe+1,orgId:d,runId:R.runId},attemptFixtures:{logger:be,storageClient:u,usageTracker:F,codeEvalTools:se,apiClient:s,context:Po,controller:mn,tracer:te},attemptInputs:{test:Pe,orgSettings:ie}});let Mn=new Date,Mo={logger:I,cacheStorage:_,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:cu(r),beforeSteps:cu(n),afterSteps:cu(o)},updatedStepsWithCaches:{steps:Pe.steps,beforeSteps:Pe.beforeSteps,afterSteps:Pe.afterSteps}};K?.status==="PASSED"?await Ls(Mo):K?.status==="FAILED"&&pe===X&&await Pc(Mo),await te.finish({logger:be,result:K}),oe.unshift(K.status);let ue=await e1({orgId:d,codeEvalTools:se,logger:be,outputDefinitions:e.outputs??[],testContext:Po}),li=ox(oe),Wp=pe+1;if(K.status!=="FAILED")return{...K,runAttemptId:Te,parameters:$,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:Mn,attempts:Wp,baseUrl:l,outputs:ue,isFlake:li,quarantined:O,quarantinedMetadata:P};let Ha=K.failedStepResult,uo=Ha?.message||"Unknown failure",zi=Ha?.failureReason??QR(uo)??"UnknownError",pl=be.child({failureReason:zi,errorMessage:uo,numAttempts:(X+1).toString(),name:Pe.name});if(pe<X){pl.warn(`Retrying failed execution attempt for run: ${uo}`);continue}pl.error(`Test failed after all exhausting attempts: ${uo}`);let uu=new Error(uo),ml={errorMessage:uo,errorStack:uu.stack},Hi;if(D){let qp;try{if(K.results&&K.results.length>0){let{classification:du,aiFailureReason:nt}=await lD({logger:be,browserStateStorage:Ae,generator:c,fullResults:K,failureReason:zi,error:uu,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});qp=du,Hi=nt}}catch(du){be.warn({err:du},"Failed to classify test results")}qp&&(ml.classification=qp,zi=Hi??zi)}return{...K,runAttemptId:Te,parameters:$,failureDetails:ml,failureReason:zi,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:Mn,attempts:pe+1,baseUrl:l,outputs:ue,quarantined:O,quarantinedMetadata:P}}catch(mn){let Po=`Encountered fatal platform error while running test '${Pe.name}': ${mn}`,Mn=new Date,Mo=pe+1;be.error({err:mn},Po),v.error(Po);let ue={errorMessage:mn.message,errStack:mn.stack},li={status:"FAILED",failureDetails:ue,failureReason:"InternalPlatformError",finishedAt:Mn};return await te.finish({logger:be,result:{status:"FAILED",results:[]}}),{...li,runAttemptId:Te,results:[],parameters:$,test:Pe,filePath:Pe.relativeFilePath,startedAt:z,lastAttemptStartedAt:ve,finishedAt:new Date,attempts:Mo,baseUrl:l,outputs:{},quarantined:O,quarantinedMetadata:P}}}throw new Error("This code should not be reachable")}import Xre from"adm-zip";import Jre from"path";function Kre(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 ul=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(`${yr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${yr}/${r}.html`)?.toString()}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))Kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new wC(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:Kre(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Yre(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var wC=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 Ni(void 0,a=>this.storeTraceAsset(a)),Li.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${yr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";Kt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){if(!Sf(e.step))return;let r=gf(e.step);Kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}storeTraceAsset(e){this.diskStorage.storeFile({name:`${yr}/${e.snapshotId}.jpeg`,contents:e.data})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(r=>r.finish({status:Yre(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new ul(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var jp=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(yr),this.harPagesStream=this.diskStorage.createFileStream(`${yr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${yr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${yr}/resource-usage.ndjson`),this.resourceUsageSampler=AP({keepSamples:!1,onSample:c=>{this.resourceUsageStream.write(`${JSON.stringify(c)}
6011
6011
  `),c.system.cpu&&(this.cpuUsageSum+=c.system.cpu.total,this.cpuSampleCount++);let l=c.system.memory.total-c.system.memory.free;this.memoryUsageSum+=l,this.memorySampleCount++}})}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;resourceUsageStream;resourceUsageSampler;cpuUsageSum=0;cpuSampleCount=0;memoryUsageSum=0;memorySampleCount=0;get loggerBindings(){return{runAttemptId:this.runAttemptId}}getResourceUsageAverages(){return{avgCpuUsage:this.cpuSampleCount>0?this.cpuUsageSum/this.cpuSampleCount:0,avgMemoryUsage:this.memorySampleCount>0?this.memoryUsageSum/this.memorySampleCount:0}}get videoOutputPath(){if(this.recordVideo)return Jre.resolve(this.diskStorage.cwd(),yr)}setActiveVideo(e,r){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:r}))}onNetworkPage(e){this.finished||this.harPagesStream.write(`${JSON.stringify(e)}
6012
6012
  `)}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)}
6013
6013
  `)):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 Xre;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${yr}/${KE}`,contents:i.toBuffer()}),n.info({browserCrashZipName:KE},"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:kh(n.results,r),beforeResults:n.beforeResults?kh(n.beforeResults,r):void 0,afterResults:n.afterResults?kh(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)}
@@ -6017,4 +6017,4 @@ ${t.map(p=>`${Pt}- ${p}`).join(`
6017
6017
  ${o}`),v.success(`Initialized Momentic project file at ${si.resolve(Ea)}`);let i=si.join("swag-labs");dl.mkdirSync(i,{recursive:!0});let a=Q(),s=Q(),c=Q(),l=[{fileName:"log-in-username-password.module.yaml",data:{fileType:ye.MODULE,moduleId:a,name:"log-in-username-password",description:"log in using username and password",enabled:!0,parameters:[],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:De,steps:[{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,delay:50,type:"TYPE",target:{type:"description",elementDescriptor:"username input"},value:"{{env.USERNAME}}"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"password input"},value:"{{env.PASSWORD}}"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"login button"}}}]}},{fileName:"add-item-to-cart.module.yaml",data:{fileType:ye.MODULE,moduleId:s,name:"add-item-to-cart",description:"Add the specified item to cart",enabled:!0,parameters:["ITEM"],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:De,steps:[{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"add to cart for the {{env.ITEM}} item"}}}]}},{fileName:"fill-out-personal-info.module.yaml",data:{fileType:ye.MODULE,moduleId:c,name:"fill-out-personal-info",description:"Fill out name and zip code",enabled:!0,parameters:[],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:De,steps:[{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"first name input"},value:"{{faker.person.firstName()}}"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"last name input"},value:"{{faker.person.lastName()}}"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"zip code input"},value:"{{faker.location.zipCode()}}"}}]}}],u=[{fileName:"standard-user-purchases.test.yaml",data:{fileType:ye.TEST,id:Q(),name:"standard-user-purchases",baseUrl:"",description:"End-to-end checkout flow",schemaVersion:De,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,envs:[{name:"swag-labs",default:!0}],disabled:!1,labels:[],steps:[{id:Q(),type:"MODULE",moduleId:a},{id:Q(),inputs:{ITEM:'"sauce labs backpack"'},type:"MODULE",moduleId:s},{id:Q(),inputs:{ITEM:'"sauce labs onesie"'},type:"MODULE",moduleId:s},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Cart icon on the top right of the page"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify that both the backpack and the onesie is in the cart"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Checkout button"}}},{id:Q(),type:"MODULE",moduleId:c},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Continue button"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify the item total matches the amount listed for each item"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify the total matches item total + tax"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Finish button"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify there is a thank you message"}}]}},{fileName:"problem-user-adds-tshirt.test.yaml",data:{fileType:ye.TEST,id:Q(),name:"problem-user-adds-tshirt",baseUrl:"https://saucedemo.com",description:"Test that problem_user can add a t-shirt to cart",schemaVersion:De,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,steps:[{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"username input"},value:"problem_user"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"password input"},value:"secret_sauce"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Login button"}}},{id:Q(),inputs:{ITEM:"'Sauce Labs Bolt T-Shirt'"},type:"MODULE",moduleId:s},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"shopping cart icon in the top right"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"The Sauce Labs Bolt T-Shirt should be listed as an item in the cart",timeout:5}}]}},{fileName:"cart-and-sorting-behavior.test.yaml",data:{fileType:ye.TEST,id:Q(),name:"cart-and-sorting-behavior",baseUrl:"",description:"Sorting changes view, not state; cart remains consistent",schemaVersion:De,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,envs:[{name:"swag-labs",default:!0}],disabled:!1,labels:[],steps:[{id:Q(),type:"MODULE",moduleId:a},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:"sort dropdown"},choice:{type:"LABEL",label:"Price (low to high)"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify the first item is the cheapest one on the page"}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"AI_ASSERTION",assertion:"Verify the last item on the page is the most expensive one",timeout:5}},{id:Q(),inputs:{ITEM:'"cheapest item"'},type:"MODULE",moduleId:s},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Cart icon on the top right"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Checkout button"}}},{id:Q(),type:"MODULE",moduleId:c},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Continue button"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"CLICK",target:{type:"description",elementDescriptor:"Finish button"}}},{id:Q(),type:"PRESET_ACTION",command:{id:Q(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:"Back home button"},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}}}]}}];for(let{fileName:d,data:p}of l)pD(p,si.join(i,d));for(let{fileName:d,data:p}of u)hD(p,si.join(i,d));v.success(`Created sample Swag Labs tests and modules in ${si.resolve(i)}/`)});ir.command("app").addOption(In).addOption(Pn).addOption(Ba).addOption(_S).addOption(Hr).addOption(tH).addOption(hC).addOption(MS).addOption(OS).action(async t=>{await Io(le),le.setApp("desktop-server");let{apiKey:e,yes:r,server:n,pixelRatio:o,port:i,disableCache:a,saveCache:s,regenerateCache:c}=t;Th({disableCache:a,saveCache:s,regenerateCache:c});let l=await Ct({configFilePath:t.config,nameFilter:void 0}),{errors:u,parsingErrors:d,failedTestFilePaths:p,failedModuleFilePaths:m,parsingErrorDetails:f}=await Hp({project:l,fix:!1});d>0?(Cc({parsingErrors:d,parsingErrorDetails:f,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)),CP(le);let h=new ut({baseUrl:n,apiKey:e,logger:le});await cg({client:h,skipPrompts:r});let S=u1(import.meta.url),g=si.dirname(S),E=si.resolve(g,"..","static"),y=si.resolve(g,"..","assets"),b=o??HS();GS(b),await kz({momenticServerUrl:n,apiKey:e,serverPort:i,appPort:i,staticDir:E,assetsDir:y,devicePixelRatio:b,regenerateCache:c??!1,noCache:a??!1,alwaysSaveCache:s??!1,initialProject:l});let R=`http://localhost:${i}`;await cne(R)});ir.command("mcp").description("Start the MCP server over stdio.").addOption(In).addOption(Pn).addOption(Hr).addOption(MS).addOption(OS).addOption(rH).addOption(_S).addOption(TH).action(async t=>{le.setApp("mcp"),v.setMinLevel(Number.POSITIVE_INFINITY);let{apiKey:e,server:r,saveCache:n,disableCache:o,headfulBrowser:i,pixelRatio:a,sessionIdleTimeoutMinutes:s}=t;Th({disableCache:o,saveCache:n});let c=i!==void 0?i:tc(process.env.MOMENTIC_HEADFUL_BROWSER)??!0,l=a??HS();GS(l);let u=await Ct({configFilePath:t.config,nameFilter:void 0}),{errors:d,parsingErrors:p,failedTestFilePaths:m,failedModuleFilePaths:f,parsingErrorDetails:h}=await Hp({project:u,fix:!1});p>0?(Cc({parsingErrors:p,parsingErrorDetails:h,failedTestFilePaths:m,failedModuleFilePaths:f}),process.exit(1)):d>0&&(v.error(`Found ${d} 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 S=new ut({baseUrl:r,apiKey:e,logger:le});if(await cg({client:S,skipPrompts:!0}),!en)throw new Error("CLI_VERSION is not set");await XA({project:u,logger:le,apiKey:e,serverUrl:r,cliVersion:en,supportsFileOutput:!0,alwaysSaveCache:n??!1,noCache:o??!1,headfulBrowserDefault:c,devicePixelRatio:l,sessionIdleTimeoutMinutes:s})});var f1=ir.command("queue").description("Queue tests or suites to run on Momentic Cloud");f1.command("suites").description("Run one or more suites on Momentic Cloud").addOption(In).addOption(Pn).addOption(cC).addOption(uC).addOption(Ba).addArgument(gH).addOption(PS).addOption(IS).addOption(xS).action(async(t,e)=>{await Io(le);let{apiKey:r,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=wS(e.customHeaders),l=new ut({baseUrl:n,apiKey:r,logger:le});(!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 MH({client:l,orgId:u,wait:o,suitePaths:t,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await Bi()});f1.command("tests").description("Run one or more tests on Momentic Cloud").addOption(In).addOption(Pn).addOption(Ba).addOption(xS).addOption(fC).addOption(PS).addOption(IS).addOption(new Gr("--all","Run all tests.").default(!1)).addOption(cC).addOption(uC).addArgument(fH).action(async(t,e)=>{await Io(le);let{all:r,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=wS(e.customHeaders);for(let h of t)(h.endsWith(".yaml")||dl.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 ut({baseUrl:i,apiKey:n,logger:le}),{orgId:m}=await p.getAuthInfo(),f;a&&(f=await CC(a)),await OH({client:p,orgId:m,tests:t,all:r,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:f,yes:u}),await Bi(),process.exit(0)});var une=ir.command("list").description("List test paths");une.addOption(Hr).addOption(za).addOption(pC).addOption(mC).addOption(new Gr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(gC).action(async(t,e)=>{let r=await Ct({configFilePath:e.config,nameFilter:e.filter}),n=await fe(r),o=await au({tests:t,momenticFiles:n,yes:!0,project:r,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Es(40,{})});v.info(o.map(i=>i.relativeFilePath).join(`
6018
6018
  `)),process.exit(0)});var dne=ir.command("run").alias("test").description("Run tests on the local machine");dne.addOption(In).addOption(Pn).addOption(Hr).addOption(za).addOption(Ba).addOption(xS).addOption(fC).addOption(hC).addOption(MS).addOption(OS).addOption(cH).addOption(mH).addOption(uH).addOption(dH).addOption(pH).addOption(IS).addOption(PS).addOption(_S).addOption(new Gr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new Gr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new Gr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new Gr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(_n)).addOption(new Gr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(_n)).addOption(new Gr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(_n)).addOption(new Gr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(EH).addOption(new Gr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(nH).addOption(oH).addOption(dC).addOption(iH).addOption(sH).addOption(aH).addOption(pC).addOption(mC).addOption(yH).addOption(bH).addArgument(gC).action(async(t,e)=>{await Io(le);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;Th({disableCache:r,saveCache:n,regenerateCache:o}),VL({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=wS(e.customHeaders),s=await Ct({configFilePath:e.config,nameFilter:e.filter}),c=e.parallel??s.config.parallel??1;c1().length<c*2&&v.warn(`You requested to run tests in parallel ${c} at a time on a machine with ${c1().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 Hp({project:s,fix:!1});u>0?(Cc({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 f=new ut({baseUrl:e.server,apiKey:e.apiKey,logger:le});v.debug("Checking API key and dependencies");let{orgId:h,userId:S}=await cg({client:f,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let g=e.outputDir??s.config.outputDir,E=e.reporterDir??s.config.reporterDir,y=sne(),b=le.child({cliVersion:en,orgId:h,userId:S,runGroupId:y}),R=await cr(le,f,s);b.info({gitMetadata:R,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let I;e.inputCsv&&(I=await CC(e.inputCsv));let _=e.pixelRatio??HS();GS(_);try{let A=await a1({...e,suiteName:i,parallel:c,retriesOverride:e.retries,devicePixelRatio:_,tests:t,project:s,client:f,outputDir:g,uploadResults:e.uploadResults,reporterDir:E,customHeaders:a,envName:e.env,orgId:h,testInputMatrix:I,logger:b,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:R,cacheOptions:{regenerateCache:o??!1,alwaysSaveCache:n??!1,noCache:r??!1,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??s.config.recordVideo,runGroupId:y,timeoutMinutes:e.timeoutMinutes,browserTypeOverride:e.browser});await Bi(),A.failed>0?process.exit(1):process.exit(0)}catch(A){v.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),v.error(A),await Bi(),process.exit(1)}});var pne=ir.command("apply").description("Apply an operation to local resources");pne.command("patch").addOption(In).addOption(Pn).addOption(Hr).addOption(za).addOption(Ba).addOption(new Gr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new Gr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async t=>{let{apiKey:e,server:r,config:n,yes:o}=t,i=await Ct({configFilePath:n}),a=le,s=new ut({baseUrl:r,apiKey:e,logger:a}),c=await fe(i),l=c.tests[t.to]??Object.values(c.tests).find(d=>dt(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 jz({client:s,test:l,fragment:u,yes:o,entities:c,logger:le}),process.exit(0)});var _C=ir.command("results").description("Merge and upload test results.");_C.command("merge").description("Merge test results files.").addOption(dC).addArgument(SH).action(async(t,e)=>{let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),dl.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),dl.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),DD(le,r,t)});_C.command("upload").description("Upload test results to Momentic cloud.").addOption(In).addOption(Pn).addArgument(SC).action(async(t,e)=>{let{apiKey:r,server:n}=e,o=le,i=new ut({baseUrl:n,apiKey:r,logger:o});await mg({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});_C.command("view").description("Launch the run viewer to view test results in your current directory.").addOption(new Gr("--port <port>",`Port to run the backend server on. Defaults to ${cf}.`).argParser(_n)).addArgument(SC).addArgument(new one("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await Io(le),le.setApp("local-run-viewer");let n=u1(import.meta.url),o=si.dirname(n),i=si.resolve(o,"..","run-viewer-static");await sC({logger:le,staticDir:i,resultsPath:t,runId:e,port:r.port})});var IC=ir.command("quarantine").description("Manage test quarantines");IC.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(In).addOption(Pn).addOption(Hr).addOption(za).addOption(yC).addArgument(EC).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=le,s=await Ct({configFilePath:o}),c=new ut({baseUrl:n,apiKey:r,logger:a}),l=await cr(le,c,s);await CH({test:t,reason:i,apiClient:c,project:s,logger:a,identity:l})});IC.command("list").description("List quarantined tests.").addOption(In).addOption(Pn).addOption(Hr).addOption(za).action(async t=>{let{apiKey:e,server:r,config:n}=t,o=le,i=await Ct({configFilePath:n}),a=new ut({baseUrl:r,apiKey:e,logger:o});await _H({apiClient:a,project:i})});IC.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(In).addOption(Pn).addOption(Hr).addOption(za).addOption(yC).addArgument(EC).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=le,s=await Ct({configFilePath:o}),c=new ut({baseUrl:n,apiKey:r,logger:a}),l=await cr(le,c,s);await IH({test:t,reason:i,apiClient:c,project:s,identity:l})});ir.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(Hr).addOption(za).action(async t=>{let e=await Ct({configFilePath:t.config,nameFilter:t.filter});v.info("Updating Momentic version in package.json..."),await s1(),v.info("Updating project configuration..."),l1(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 mne(){p1("Main program started");try{await ir.parseAsync(process.argv),await Bi()}catch(t){let e={};try{e.playwrightVersion=ane("npx playwright --version").toString()}catch(r){le.error({err:r},"Error fetching debug information")}le.error({err:t,debugInfo:e},"Uncaught error in CLI"),v.error(t),await Bi(),process.exit(1)}}lne.setMaxListeners(25);process.on("warning",t=>{le.warn({err:t},`Node warning received on CLI: ${t.message}`)});p1("CLI parsing setup complete");mne();
6019
6019
  //# sourceMappingURL=cli.js.map
6020
- //# debugId=3e47fa1a-671a-5b3f-9e6b-e337a95a9d37
6020
+ //# debugId=4910b9de-c772-5d99-bef6-4375233c2bc2