momentic 2.83.2 → 2.83.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +10 -10
- package/npm-shrinkwrap.json +5 -5
- package/package.json +1 -1
- package/run-viewer-static/assets/{index-7cQpxihL.js → index-jn7Jznkg.js} +1 -1
- package/run-viewer-static/index.html +1 -1
- package/static/assets/{index-UzDG_iTx.js → index-vWYFbIC0.js} +3 -3
- package/static/index.html +1 -1
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]="
|
|
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]="475dfda5-4aab-5735-9dd6-af66b5faac94")}catch(e){}}();
|
|
4
4
|
var kj=Object.create;var RE=Object.defineProperty;var Uj=Object.getOwnPropertyDescriptor;var Fj=Object.getOwnPropertyNames;var Bj=Object.getPrototypeOf,zj=Object.prototype.hasOwnProperty;var Ut=(t,e)=>()=>(t&&(e=t(t=0)),e);var Vj=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Hj=(t,e)=>{for(var r in e)RE(t,r,{get:e[r],enumerable:!0})},Gj=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Fj(e))!zj.call(t,o)&&o!==r&&RE(t,o,{get:()=>e[o],enumerable:!(n=Uj(e,o))||n.enumerable});return t};var Dw=(t,e,r)=>(r=t!=null?kj(Bj(t)):{},Gj(e||!t||!t.__esModule?RE(r,"default",{value:t,enumerable:!0}):r,t));var rL,nL=Ut(()=>{"use strict";rL=typeof globalThis=="object"?globalThis:global});var oL=Ut(()=>{"use strict";nL()});var iL=Ut(()=>{"use strict";oL()});var ra,Kb=Ut(()=>{"use strict";ra="1.9.0"});function QX(t){var e=new Set([t]),r=new Set,n=t.match(aL);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(l){return l===t};function i(s){return r.add(s),!1}function a(s){return e.add(s),!0}return function(l){if(e.has(l))return!0;if(r.has(l))return!1;var c=l.match(aL);if(!c)return i(l);var u={major:+c[1],minor:+c[2],patch:+c[3],prerelease:c[4]};return u.prerelease!=null||o.major!==u.major?i(l):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(l):i(l):o.minor<=u.minor?a(l):i(l)}}var aL,sL,lL=Ut(()=>{"use strict";Kb();aL=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;sL=QX(ra)});function iu(t,e,r,n){var o;n===void 0&&(n=!1);var i=wp[Rp]=(o=wp[Rp])!==null&&o!==void 0?o:{version:ra};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!==ra){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+ra);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+ra+"."),!0}function na(t){var e,r,n=(e=wp[Rp])===null||e===void 0?void 0:e.version;if(!(!n||!sL(n)))return(r=wp[Rp])===null||r===void 0?void 0:r[t]}function au(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+ra+".");var r=wp[Rp];r&&delete r[t]}var ZX,Rp,wp,xp=Ut(()=>{"use strict";iL();Kb();lL();ZX=ra.split(".")[0],Rp=Symbol.for("opentelemetry.js.api."+ZX),wp=rL});function Ip(t,e,r){var n=na("diag");if(n)return r.unshift(e),n[t].apply(n,t3([],e3(r),!1))}var e3,t3,cL,uL=Ut(()=>{"use strict";xp();e3=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},t3=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))},cL=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 Ip("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ip("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ip("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ip("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ip("verbose",this._namespace,e)},t}()});var It,Fh=Ut(()=>{"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"})(It||(It={}))});function dL(t,e){t<It.NONE?t=It.NONE:t>It.ALL&&(t=It.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",It.ERROR),warn:r("warn",It.WARN),info:r("info",It.INFO),debug:r("debug",It.DEBUG),verbose:r("verbose",It.VERBOSE)}}var pL=Ut(()=>{"use strict";Fh()});var r3,n3,o3,Ti,_p=Ut(()=>{"use strict";uL();pL();Fh();xp();r3=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},n3=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))},o3="diag",Ti=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=na("diag");if(s)return s[o].apply(s,n3([],r3(i),!1))}}var r=this,n=function(o,i){var a,s,l;if(i===void 0&&(i={logLevel:It.INFO}),o===r){var c=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=c.stack)!==null&&a!==void 0?a:c.message),!1}typeof i=="number"&&(i={logLevel:i});var u=na("diag"),d=dL((s=i.logLevel)!==null&&s!==void 0?s:It.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(l=new Error().stack)!==null&&l!==void 0?l:"<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 iu("diag",d,r,!0)};r.setLogger=n,r.disable=function(){au(o3,r)},r.createComponentLogger=function(o){return new cL(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 mL,fL=Ut(()=>{"use strict";mL=Symbol("BaggageEntryMetadata")});function Yb(t){return typeof t!="string"&&(i3.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:mL,toString:function(){return t}}}var i3,hL=Ut(()=>{"use strict";_p();fL();i3=Ti.instance()});function Xb(t){return Symbol.for(t)}var a3,Jb,Qb=Ut(()=>{"use strict";a3=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}(),Jb=new a3});function tv(){return ev}var ml,s3,Bh,l3,c3,u3,d3,Zb,p3,m3,f3,ev,h3,g3,S3,y3,E3,T3,b3,rv=Ut(()=>{"use strict";ml=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)}}(),s3=function(){function t(){}return t.prototype.createGauge=function(e,r){return g3},t.prototype.createHistogram=function(e,r){return S3},t.prototype.createCounter=function(e,r){return h3},t.prototype.createUpDownCounter=function(e,r){return y3},t.prototype.createObservableGauge=function(e,r){return T3},t.prototype.createObservableCounter=function(e,r){return E3},t.prototype.createObservableUpDownCounter=function(e,r){return b3},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),Bh=function(){function t(){}return t}(),l3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Bh),c3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Bh),u3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Bh),d3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Bh),Zb=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),p3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Zb),m3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Zb),f3=function(t){ml(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Zb),ev=new s3,h3=new l3,g3=new u3,S3=new d3,y3=new c3,E3=new p3,T3=new m3,b3=new f3});var Bn,gL=Ut(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(Bn||(Bn={}))});var v3,C3,SL,yL=Ut(()=>{"use strict";Qb();v3=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},C3=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))},SL=function(){function t(){}return t.prototype.active=function(){return Jb},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,C3([n],v3(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var A3,R3,nv,w3,EL,TL=Ut(()=>{"use strict";yL();xp();_p();A3=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},R3=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))},nv="context",w3=new SL,EL=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return iu(nv,e,Ti.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,R3([e,r,n],A3(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return na(nv)||w3},t.prototype.disable=function(){this._getContextManager().disable(),au(nv,Ti.instance())},t}()});var su,bL=Ut(()=>{"use strict";TL();su=EL.getInstance()});var ue,vL=Ut(()=>{"use strict";_p();ue=Ti.instance()});var x3,CL,AL=Ut(()=>{"use strict";rv();x3=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return ev},t}(),CL=new x3});var ov,RL,wL=Ut(()=>{"use strict";AL();xp();_p();ov="metrics",RL=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return iu(ov,e,Ti.instance())},t.prototype.getMeterProvider=function(){return na(ov)||CL},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){au(ov,Ti.instance())},t}()});var zh,xL=Ut(()=>{"use strict";wL();zh=RL.getInstance()});var At=Ut(()=>{"use strict";hL();Qb();Fh();rv();gL();bL();vL();xL()});var pR=Vj((xm,dR)=>{"use strict";(function(t,e){if(typeof xm=="object"&&typeof dR=="object")dR.exports=e();else if(typeof define=="function"&&define.amd)define([],e);else{var r=e();for(var n in r)(typeof xm=="object"?xm:t)[n]=r[n]}})(typeof self<"u"?self:xm,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(S){S[S.Empty=0]="Empty",S[S.InsideToken=1]="InsideToken",S[S.InsideSingleQuotedToken=2]="InsideSingleQuotedToken",S[S.InsideDoubleQuotedToken=3]="InsideDoubleQuotedToken",S[S.AfterEscapeInsideToken=4]="AfterEscapeInsideToken",S[S.AfterEscapeInsideSingleQuotedToken=5]="AfterEscapeInsideSingleQuotedToken",S[S.AfterEscapeInsideDoubleQuotedToken=6]="AfterEscapeInsideDoubleQuotedToken"}(n||(n={}));var o=function(S){return[null,null]},i={onCharacter:o,onWhitespace:o,onDoubleQuote:o,onSingleQuote:o,onEscape:o},a=function(){return(a=Object.assign||function(S){for(var y,E=1,b=arguments.length;E<b;E++)for(var A in y=arguments[E])Object.prototype.hasOwnProperty.call(y,A)&&(S[A]=y[A]);return S}).apply(this,arguments)},s=a({},i,{stateHandle:n.AfterEscapeInsideDoubleQuotedToken,onCharacter:function(S){return["\\"+S,n.InsideDoubleQuotedToken]},onWhitespace:function(S){return["\\"+S,n.InsideDoubleQuotedToken]},onSingleQuote:function(S){return["\\"+S,n.InsideDoubleQuotedToken]},onDoubleQuote:function(S){return[S,n.InsideDoubleQuotedToken]},onEscape:function(S){return[S,n.InsideDoubleQuotedToken]}}),l=a({},i,{stateHandle:n.AfterEscapeInsideSingleQuotedToken,onCharacter:function(S){return["\\"+S,n.InsideSingleQuotedToken]},onWhitespace:function(S){return["\\"+S,n.InsideSingleQuotedToken]},onSingleQuote:function(S){return[S,n.InsideSingleQuotedToken]},onDoubleQuote:function(S){return["\\"+S,n.InsideSingleQuotedToken]},onEscape:function(S){return[S,n.InsideSingleQuotedToken]}}),c=a({},i,{stateHandle:n.AfterEscapeInsideToken,onCharacter:function(S){return[S,n.InsideToken]},onWhitespace:function(S){return[S,n.InsideToken]},onSingleQuote:function(S){return[S,n.InsideToken]},onDoubleQuote:function(S){return[S,n.InsideToken]},onEscape:function(S){return[S,n.InsideToken]}}),u=a({},i,{stateHandle:n.Empty,onCharacter:function(S){return[S,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(S){return[S,null]},onWhitespace:function(S){return[S,null]},onSingleQuote:function(S){return[S,null]},onDoubleQuote:function(){return["",n.Empty]},onEscape:function(){return["",n.AfterEscapeInsideDoubleQuotedToken]}}),p=a({},i,{stateHandle:n.InsideSingleQuotedToken,onCharacter:function(S){return[S,null]},onWhitespace:function(S){return[S,null]},onSingleQuote:function(){return["",n.Empty]},onDoubleQuote:function(S){return[S,null]},onEscape:function(){return["",n.AfterEscapeInsideSingleQuotedToken]}}),m=[u,a({},i,{stateHandle:n.InsideToken,onCharacter:function(S){return[S,null]},onWhitespace:function(){return[null,n.Empty]},onSingleQuote:function(){return["",n.InsideSingleQuotedToken]},onDoubleQuote:function(){return["",n.InsideDoubleQuotedToken]},onEscape:function(){return["",n.AfterEscapeInsideToken]}}),p,d,c,l,s];function f(S){for(var y=0,E=m;y<E.length;y++){var b=E[y];if(b.stateHandle===S)return b}throw new Error("State with handle = "+S+" cannot be found")}var h=function(){function S(){this.currentState=f(n.Empty)}return S.prototype.handleCharacter=function(y){var E=this.performTransition(y),b=E[0],A=E[1];return A!==null&&(this.currentState=f(A)),b},S.prototype.performTransition=function(y){var E=this.currentState;switch(y){case" ":return E.onWhitespace(y);case"'":return E.onSingleQuote(y);case'"':return E.onDoubleQuote(y);case"\\":return E.onEscape(y);default:return E.onCharacter(y)}},S}();function g(S){for(var y=new h,E=[],b=0,A=0,M=S;A<M.length;A++){var I=M[A],R=y.handleCharacter(I);R!==null?E[b]=E[b]?E[b]+R:R:E[b]&&b++}return E}r.d(e,"default",function(){return g}),g.default=g}]).default})});import ENe,{multistream as bNe}from"pino";import CNe from"pino-pretty";import{z as wE}from"zod";var lce=wE.object({input:wE.string(),agentConfigVersion:wE.string().optional()}),dd="finish";import{z as lr}from"zod";var kw=lr.object({srcs:lr.array(lr.string()),urls:lr.array(lr.string()),desiredSrc:lr.string().optional(),desiredUrl:lr.string().optional()}),Uw=lr.object({srcRegex:lr.string().optional(),urlRegex:lr.string().optional()}),Fw=lr.object({x:lr.number(),y:lr.number(),correlation:lr.number()}),dce=lr.object({searchImageBase64String:lr.string(),pageImageBase64String:lr.string(),id:lr.string().uuid(),timeoutMs:lr.number().max(1e4).min(0).optional()});import{z as U}from"zod";import*as j from"zod";import{extendZodWithOpenApi as jj}from"zod-openapi";import pd from"zod";var Us=pd.object({updatedAt:pd.coerce.date().optional()}),$i=pd.object({contentType:pd.enum(["image/jpeg","image/png"]),id:pd.string()});jj(j);var ai=(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))(ai||{}),$j=j.object({mPathSelectorTokens:j.string().array(),frameSrcRegex:j.string().optional(),frameUrlRegex:j.string().optional(),indices:j.number().array()}),md=j.object({result:j.number(),traceId:j.string()}).array(),Mo=j.object({type:j.literal("GCS_TRACES"),traces:md}),bn=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(bn||{}),Bw=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(bn)}).optional(),shape:j.object({width:j.number(),height:j.number(),tolerance:j.nativeEnum(bn)}).optional(),boundingBox:j.object({x:j.number(),y:j.number(),width:j.number(),height:j.number()}).optional()}),Wj=j.object({selectors:j.string().array(),requirements:Bw.optional(),relativeAngleRadians:j.number().min(0).max(2*Math.PI).optional(),relativeDistance:j.number().optional()}),Wi=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:Bw.optional(),additionalElements:Wj.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($i.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:$j.optional(),inputDescription:j.string().optional().describe("the description that generated this cache"),targetSource:j.nativeEnum(ai).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:Mo.optional()}).openapi({ref:"ElementTargetCache"});function oc(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var qj=j.object({type:j.literal("description"),elementDescriptor:j.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),Kj=j.object({x:j.number(),y:j.number()}),Yj=j.object({type:j.literal("coordinates"),pixels:Kj}).openapi({ref:"CoordinatesTarget"});function wa(t){return t.type==="description"}function si(t){return t.type==="coordinates"}var Hr=j.discriminatedUnion("type",[qj,Yj]).openapi({ref:"ElementTarget"});function xE(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function Gr(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function of(t){return Mo.safeParse(t).success}import{v4 as mt}from"uuid";import*as w from"zod";import{extendZodWithOpenApi as s$}from"zod-openapi";import{z as je}from"zod";import{extendZodWithOpenApi as Xj}from"zod-openapi";import{z as fd}from"zod";var hd=fd.object({result:fd.boolean(),traceId:fd.string()}).array(),Fs=fd.object({type:fd.literal("GCS_TRACES"),traces:hd}),IE=Us.extend({memory:Fs.optional()});var ic=(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))(ic||{});Xj(je);var zw=je.object({thoughts:je.string(),result:je.boolean(),relevantElements:je.array(je.number()).optional(),updatedMemory:hd.optional()}),Ir=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Ir||{}),Vw=["EQUALS","CONTAINS","STARTS_WITH","EXISTS"];var _E=["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"],Jj=je.object({type:je.literal("ELEMENT_NAME"),negated:je.boolean().optional(),operation:je.nativeEnum(Ir),value:je.string()}).openapi({ref:"ElementNameAssertion"}),Qj=je.object({type:je.literal("ELEMENT_STYLE"),negated:je.boolean().optional(),operation:je.nativeEnum(Ir),property:je.string(),value:je.string()}).openapi({ref:"ElementStyleAssertion"}),Zj=je.object({type:je.literal("ELEMENT_CONTENT"),negated:je.boolean().optional(),operation:je.nativeEnum(Ir),value:je.string()}).openapi({ref:"ElementContentAssertion"}),e$=je.object({type:je.literal("ELEMENT_ATTRIBUTE"),negated:je.boolean().optional(),operation:je.nativeEnum(Ir),attr:je.string(),value:je.string()}).openapi({ref:"ElementAttributeValueAssertion"}),jr=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(jr||{});var Hw=["EXISTS","VISIBLE","ENABLED","EDITABLE","FOCUSED"],t$=je.object({type:je.literal("ELEMENT_EXISTENCE"),negated:je.boolean().optional(),condition:je.nativeEnum(jr).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),af=je.discriminatedUnion("type",[Zj,e$,t$,Jj,Qj]).openapi({ref:"ManualElementAssertion"});var r$=je.object({type:je.literal("CONTENT"),negated:je.boolean().optional(),value:je.string()}).openapi({ref:"PageContentAssertion"}),Gw=je.discriminatedUnion("type",[r$]).openapi({ref:"ManualPageAssertion"});import nn from"zod";var gd=nn.discriminatedUnion("type",[nn.object({type:nn.literal("SUBSTRING"),url:nn.string()}),nn.object({type:nn.literal("GLOB"),glob:nn.string()}),nn.object({type:nn.literal("REGEX"),regex:nn.string()}),nn.object({type:nn.literal("DOMAIN"),domain:nn.string()})]),Sd=nn.object({urlMatcher:gd,method:nn.string().optional()});import{z as it}from"zod";var li=(r=>(r.JSON="json",r.FORM_URLENCODED="form-urlencoded",r))(li||{}),n$=it.object({type:it.literal("json"),content:it.string().describe("The JSON content to send in the request body")}),o$=it.object({type:it.literal("form-urlencoded"),content:it.record(it.string(),it.string()).describe("The form fields to send in the request body")}),i$=it.discriminatedUnion("type",[n$,o$]),a$=["GET","POST","PUT","DELETE","PATCH"],yd=it.enum(a$),Bs=it.object({url:it.string(),method:yd,headers:it.record(it.string(),it.string()).optional(),params:it.record(it.string(),it.string()).optional(),body:i$.optional(),timeout:it.number().int().optional().describe("Max seconds to wait for the request to complete")}),jw=it.object({url:it.string(),headers:it.record(it.string(),it.string()).optional(),query:it.string(),variables:it.string().optional(),timeout:it.number().int().optional().describe("Max seconds to wait for the request to complete")}),sf=it.object({code:it.string(),fragment:it.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:it.union([it.literal("NODE"),it.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:it.number().int().max(60).optional().describe("Max seconds for the code to complete")});var ze=(pe=>(pe.AI_EXTRACT="AI_EXTRACT",pe.AI_ASSERTION="AI_ASSERTION",pe.AUTH_LOAD="AUTH_LOAD",pe.AUTH_SAVE="AUTH_SAVE",pe.BLUR="BLUR",pe.CAPTCHA="CAPTCHA",pe.CLICK="CLICK",pe.COOKIE="COOKIE",pe.COPY="COPY",pe.DIALOG="DIALOG",pe.DRAG="DRAG",pe.ELEMENT_CHECK="ELEMENT_CHECK",pe.FILE_UPLOAD="FILE_UPLOAD",pe.FOCUS="FOCUS",pe.GO_BACK="GO_BACK",pe.GO_FORWARD="GO_FORWARD",pe.HOVER="HOVER",pe.JAVASCRIPT="JAVASCRIPT",pe.LOCAL_STORAGE="LOCAL_STORAGE",pe.MOUSE_DRAG="MOUSE_DRAG",pe.NAVIGATE="NAVIGATE",pe.NEW_TAB="NEW_TAB",pe.PAGE_CHECK="PAGE_CHECK",pe.PASTE="PASTE",pe.PRESS="PRESS",pe.KEY_DOWN="KEY_DOWN",pe.KEY_UP="KEY_UP",pe.REFRESH="REFRESH",pe.REQUEST="REQUEST",pe.GRAPHQL_REQUEST="GRAPHQL_REQUEST",pe.SCROLL_DOWN="SCROLL_DOWN",pe.SCROLL_UP="SCROLL_UP",pe.SCROLL_LEFT="SCROLL_LEFT",pe.SCROLL_RIGHT="SCROLL_RIGHT",pe.SELECT_OPTION="SELECT_OPTION",pe.SWITCH_TAB="TAB",pe.TYPE="TYPE",pe.VISUAL_DIFF="VISUAL_DIFF",pe.WAIT="WAIT",pe.WAIT_FOR_URL="WAIT_FOR_URL",pe.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",pe.AWAIT_LISTENER="AWAIT_LISTENER",pe.RECORD_REQUESTS="RECORD_REQUESTS",pe.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",pe.SET_HEADER="SET_HEADER",pe.MOCK_ROUTE="MOCK_ROUTE",pe.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",pe.OFFLINE_MODE="OFFLINE_MODE",pe.SUCCESS="SUCCESS",pe))(ze||{});s$(w);var Ee=w.object({thoughts:w.string().optional(),id:w.string().uuid().describe("unique identifier to this step, used for step cache")}),Zn=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"}),Dn=Us.extend({target:Wi}).optional().openapi({ref:"SingleTargetCache"});function lf(t){return!!t&&Dn.safeParse(t).success}var cf=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),$w=Ee.merge(cf).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),uf=Zn.merge(w.object({cache:Dn})),zs=Ee.merge(uf.merge(w.object({target:Hr.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Vs=Ee.merge(uf.merge(w.object({target:Hr.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),sc=Ee.merge(uf.merge(w.object({target:Hr.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),lc=Ee.merge(uf.merge(w.object({target:Hr.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),Wce=w.discriminatedUnion("type",[zs,Vs,sc,lc]).openapi({ref:"AllScrollCommands"}),l$=Ee.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Ww=Ee.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),c$=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")}),qw=Ee.extend({type:w.literal("WAIT_FOR_URL"),matcher:gd}).merge(c$).openapi({ref:"WaitUrlCommand"}),Kw=Ee.merge(cf).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Yw=Ee.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Xw=Ee.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),u$=Ee.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),d$=Ee.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"}),ME=Ee.merge(Zn).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Jw=Ee.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),Qw=Ee.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),Zw=Ee.merge(sf).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),cc=Ee.merge(Zn).extend({type:w.literal("CLICK"),target:Hr,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:Dn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()}).openapi({ref:"ClickCommand"}),PE=Us.extend({fromTarget:Wi.optional(),toTarget:Wi.optional()}),uc=Ee.merge(Zn).merge(w.object({type:w.literal("DRAG"),fromTarget:Hr,toTarget:Hr,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:PE.optional()})).openapi({ref:"DragCommand"}),dc=Ee.merge(Zn).merge(w.object({type:w.literal("MOUSE_DRAG"),target:Hr.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:Dn})).openapi({ref:"MouseDragCommand"}),pc=Ee.merge(Zn).merge(w.object({type:w.literal("HOVER"),target:Hr,cache:Dn})).openapi({ref:"HoverCommand"}),Ed=Ee.merge(Zn).merge(w.object({type:w.literal("FOCUS"),target:Hr,cache:Dn})).openapi({ref:"FocusCommand"}),Td=Ee.merge(Zn).extend({type:w.literal("BLUR"),target:Hr.optional(),cache:Dn}).openapi({ref:"BlurCommand"}),p$=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),m$=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),f$=Ee.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[p$,m$]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),ex=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()})]),mc=Ee.merge(Zn).extend({type:w.literal("SELECT_OPTION"),target:Hr,cache:Dn,choice:ex.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),OE=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),bd=Ee.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:OE.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:IE.optional(),source:w.string().optional()})).openapi({ref:"AIAssertionCommand"}),eo=5,Hs=600,fc=Ee.merge(Zn).extend({type:w.literal("ELEMENT_CHECK"),target:Hr,assertion:af,cache:Dn.or(IE).optional(),timeout:w.number().int().min(0).max(Hs).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),tx=Ee.extend({type:w.literal("PAGE_CHECK"),assertion:Gw,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(Hs).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),rx=Ee.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"}),h$=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()}),nx=25,hc=Ee.merge(Zn).merge(h$).extend({type:w.literal("TYPE"),target:Hr.optional(),value:w.string(),cache:Dn}).openapi({ref:"TypeCommand"}),ox=Ee.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"}),ix=Ee.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),ax=Ee.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),g$=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),S$=w.object({type:w.literal("REGEX"),pattern:w.string()}),y$=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),E$=w.discriminatedUnion("type",[g$,S$,y$]),T$=Ee.merge(cf).merge(w.object({type:w.literal("TAB"),action:E$})).openapi({ref:"TabCommand"}),sx=Ee.merge(cf).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),b$=Ee.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),lx=Ee.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),cx=Ee.extend({type:w.literal("REQUEST")}).merge(Bs).openapi({ref:"RequestCommand"}),vd=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()})}),ux=Ee.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(jw).openapi({ref:"GraphQLRequestCommand"}),dx=Ee.merge(w.object({type:w.literal("SUCCESS"),condition:bd.optional()})).openapi({ref:"SuccessCommand"}),px=Ee.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),v$=w.object({data:w.union([w.string().describe("location at which to find a jpg - public URL or local"),$i]),width:w.number(),height:w.number()});function mx(t){return t?$i.safeParse(t).success:!1}var Cd=Ee.merge(Zn).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:Hr.optional(),screenshot:v$.optional(),cache:Dn})).openapi({ref:"VisualDiffCommand"}),fx=Ee.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Sd,key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),C$=Ee.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),hx=Ee.merge(w.object({type:w.literal("RECORD_REQUESTS"),requestMatcher:Sd,key:w.string()})).openapi({ref:"RecordRequestsCommand"}),A$=Ee.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),gx=Ee.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),requestMatcher:Sd.optional()})).openapi({ref:"SetHeaderCommand"}),Sx=Ee.merge(w.object({type:w.literal("MOCK_ROUTE"),requestMatcher:Sd,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"})),R$=Ee.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"})),w$=Ee.merge(w.object({type:w.literal("OFFLINE_MODE"),enable:w.boolean()})).openapi({ref:"OfflineModeCommand"}),x$=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],qce=[...x$,"DRAG"],I$=w.discriminatedUnion("type",[cc,hc,ox,ix,ax,mc,$w,Vs,zs,bd,Yw,pc,Ww]),_$=w.discriminatedUnion("type",[...I$.options,uc]),M$=w.discriminatedUnion("type",[..._$.options]),yx=w.discriminatedUnion("type",[...M$.options,dx]),LE=w.discriminatedUnion("type",[dx,cc,hc,ox,ix,ax,mc,$w,Vs,zs,bd,Yw,pc,Ww,Zw,fc,tx,sx,qw,rx,Jw,Xw,lx,uc,dc,Qw,Kw,cx,ux,gx,fx,hx,Sx]),P$=w.discriminatedUnion("type",[rx,d$,u$,ME,b$,Jw,l$,fc,f$,Xw,Zw,lx,dc,sx,tx,Qw,Kw,cx,ux,sc,lc,T$,Cd,Ed,Td,qw,fx,C$,hx,A$,gx,Sx,R$,w$]),gc=w.discriminatedUnion("type",[...yx.options,...P$.options]).openapi({ref:"Command"}),df=w.discriminatedUnion("type",[...yx.options,px]),Kce=w.discriminatedUnion("type",[...LE.options,px]);function qi(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:mt(),type:t};break;case"AUTH_LOAD":{e={id:mt(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:mt(),type:t,goal:""};break;case"DIALOG":e={id:mt(),type:t,action:"DISMISS"};break;case"DRAG":e={id:mt(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:mt(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:mt(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:mt(),type:t,delay:1};break;case"BLUR":e={id:mt(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:mt(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:mt(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:mt(),type:t,value:""};break;case"SELECT_OPTION":e={id:mt(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":e={id:mt(),type:t,url:""};break;case"TAB":e={id:mt(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:mt(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:mt(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:mt(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:mt(),type:t,code:""};break;case"AI_ASSERTION":e={id:mt(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:mt(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:mt(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"VISIBLE"}};break}case"PAGE_CHECK":{e={id:mt(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:mt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:mt(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:mt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:mt(),type:t,key:""};break}case"SET_HEADER":{e={id:mt(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:mt(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:mt(),type:t};break}case"OFFLINE_MODE":{e={id:mt(),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 Qce={AI_ASSERTION:"AI check",ELEMENT_CHECK:"Element check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page check"};import{z as O$}from"zod";var nue=O$.discriminatedUnion("type",[Td,ME,cc,uc,Ed,pc,dc,zs,Vs,sc,lc,mc,hc,Cd,fc]);function Ex(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as mf}from"zod";import{z as on}from"zod";function Sc(t){return on.object({key:on.string(),testId:on.string().optional(),environment:on.string().optional(),moduleId:on.string().optional(),organizationId:on.string(),value:t})}function Gs(t){return on.object({key:on.string(),testId:on.string().optional(),environment:on.string().optional(),moduleId:on.string().optional(),organizationId:on.string(),value:t,uniqueKey:on.string()})}function Tx(t){return on.record(on.string(),Gs(t))}import{v4 as vx}from"uuid";import{z as Ia}from"zod";import{extendZodWithOpenApi as D$}from"zod-openapi";import{z as bx}from"zod";import{extendZodWithOpenApi as L$}from"zod-openapi";import{z as xa}from"zod";var to=xa.object({index:xa.number().optional().describe("global index within a test (in-order traversal)"),id:xa.string(),skipped:xa.boolean().optional(),comment:xa.string().optional(),envKey:xa.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:xa.boolean().optional(),retries:xa.number().optional()});var ge=(a=>(a.PRESET_ACTION="PRESET_ACTION",a.MODULE="MODULE",a.AI_ACTION="AI_ACTION",a.AI_ACTION_DYNAMIC="AI_ACTION_DYNAMIC",a.CONDITIONAL="CONDITIONAL",a.SECTION="SECTION",a))(ge||{});L$(bx);var N$=to.extend({type:bx.literal("PRESET_ACTION")}),$r=N$.extend({command:gc}).openapi({ref:"PresetAction"});D$(Ia);var Ad=30,yc=(r=>(r.V2="2",r.V3="3",r))(yc||{}),NE=Ia.nativeEnum(yc),DE=Us.extend({resolvedGoal:Ia.string(),steps:$r.array()}),Ec=to.extend({type:Ia.literal("AI_ACTION_DYNAMIC"),text:Ia.string(),retries:Ia.number().optional(),version:NE.optional(),cache:DE.optional(),precondition:Ia.string().optional(),postcondition:Ia.string().optional()}).openapi({ref:"AIActionDynamic"});function Cx(t){return{id:vx(),type:"PRESET_ACTION",command:{id:vx(),type:"AI_ASSERTION",assertion:t,timeout:5}}}function pf(t){return{preconditionStep:t.precondition?.trim()?Cx(t.precondition):void 0,generatedSteps:t.cache?.steps??[],postconditionStep:t.postcondition?.trim()?Cx(t.postcondition):void 0}}var an={type:!0,cache:!0},ci=mf.discriminatedUnion("type",[bd.pick(an),Td.pick(an),cc.pick(an),uc.pick(an),fc.pick(an),Ed.pick(an),pc.pick(an),dc.pick(an),zs.pick(an),Vs.pick(an),sc.pick(an),lc.pick(an),mc.pick(an),hc.pick(an),Cd.pick(an)]),k$=mf.object({type:mf.literal("AI_ACTION_DYNAMIC"),cache:DE}),Tc=mf.union([ci,k$]),ff=Object.values(ze).filter(t=>ci.options.some(e=>e.shape.type.safeParse(t).success));gc.options.forEach(t=>{if("target"in t.shape&&!ff.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function ro(t){return ff.includes(t.type)}var Ax=Sc(Tc),Rx=Gs(Tc),Lue=Tx(Tc);import{v4 as Dme}from"uuid";import{z as O}from"zod";var xx=Symbol("Let zodToJsonSchema decide on which parser to use");var wx={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"},Ix=t=>typeof t=="string"?{...wx,name:t}:{...wx,...t};var _x=t=>{let e=Ix(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 kE(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function Ze(t,e,r,n,o){t[e]=r,kE(t,e,n,o)}var hf=(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 Ye}from"zod";function Pt(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?hf(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as U$}from"zod";function Mx(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==U$.ZodAny&&(r.items=be(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&Ze(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&Ze(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(Ze(r,"minItems",t.exactLength.value,t.exactLength.message,e),Ze(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function Px(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?Ze(r,"minimum",n.value,n.message,e):Ze(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),Ze(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?Ze(r,"maximum",n.value,n.message,e):Ze(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),Ze(r,"maximum",n.value,n.message,e));break;case"multipleOf":Ze(r,"multipleOf",n.value,n.message,e);break}return r}function Ox(){return{type:"boolean"}}function gf(t,e){return be(t.type._def,e)}var Lx=(t,e)=>be(t.innerType._def,e);function UE(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>UE(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 F$(t,e)}}var F$=(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":Ze(r,"minimum",n.value,n.message,e);break;case"max":Ze(r,"maximum",n.value,n.message,e);break}return r};function Nx(t,e){return{...be(t.innerType._def,e),default:t.defaultValue()}}function Dx(t,e){return e.effectStrategy==="input"?be(t.schema._def,e):Pt(e)}function kx(t){return{type:"string",enum:Array.from(t.values)}}var B$=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function Ux(t,e){let r=[be(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),be(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(B$(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,...l}=i;a=l}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function Fx(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 Rd}from"zod";var FE,Po={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:()=>(FE===void 0&&(FE=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),FE),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 Sf(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":Ze(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":Ze(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":Oo(r,"email",n.message,e);break;case"format:idn-email":Oo(r,"idn-email",n.message,e);break;case"pattern:zod":sn(r,Po.email,n.message,e);break}break;case"url":Oo(r,"uri",n.message,e);break;case"uuid":Oo(r,"uuid",n.message,e);break;case"regex":sn(r,n.regex,n.message,e);break;case"cuid":sn(r,Po.cuid,n.message,e);break;case"cuid2":sn(r,Po.cuid2,n.message,e);break;case"startsWith":sn(r,RegExp(`^${BE(n.value,e)}`),n.message,e);break;case"endsWith":sn(r,RegExp(`${BE(n.value,e)}$`),n.message,e);break;case"datetime":Oo(r,"date-time",n.message,e);break;case"date":Oo(r,"date",n.message,e);break;case"time":Oo(r,"time",n.message,e);break;case"duration":Oo(r,"duration",n.message,e);break;case"length":Ze(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),Ze(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{sn(r,RegExp(BE(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Oo(r,"ipv4",n.message,e),n.version!=="v4"&&Oo(r,"ipv6",n.message,e);break}case"base64url":sn(r,Po.base64url,n.message,e);break;case"jwt":sn(r,Po.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&sn(r,Po.ipv4Cidr,n.message,e),n.version!=="v4"&&sn(r,Po.ipv6Cidr,n.message,e);break}case"emoji":sn(r,Po.emoji(),n.message,e);break;case"ulid":{sn(r,Po.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Oo(r,"binary",n.message,e);break}case"contentEncoding:base64":{Ze(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{sn(r,Po.base64,n.message,e);break}}break}case"nanoid":sn(r,Po.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function BE(t,e){return e.patternStrategy==="escape"?V$(t):t}var z$=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function V$(t){let e="";for(let r=0;r<t.length;r++)z$.has(t[r])||(e+="\\"),e+=t[r];return e}function Oo(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}}})):Ze(t,"format",e,r,n)}function sn(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:Bx(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):Ze(t,"pattern",Bx(e,n),r,n)}function Bx(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 l=0;l<n.length;l++){if(i){o+=n[l],i=!1;continue}if(r.i){if(a){if(n[l].match(/[a-z]/)){s?(o+=n[l],o+=`${n[l-2]}-${n[l]}`.toUpperCase(),s=!1):n[l+1]==="-"&&n[l+2]?.match(/[a-z]/)?(o+=n[l],s=!0):o+=`${n[l]}${n[l].toUpperCase()}`;continue}}else if(n[l].match(/[a-z]/)){o+=`[${n[l]}${n[l].toUpperCase()}]`;continue}}if(r.m){if(n[l]==="^"){o+=`(^|(?<=[\r
|
|
5
5
|
]))`;continue}else if(n[l]==="$"){o+=`($|(?=[\r
|
|
6
6
|
]))`;continue}}if(r.s&&n[l]==="."){o+=a?`${n[l]}\r
|
|
@@ -24,13 +24,13 @@ ${this.decisions.map(e=>e.toString()).join(`
|
|
|
24
24
|
To resolve the conflict:`,Wv(c,e))),i=l):ue.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
|
`,$v(c,e),`To resolve the conflict:
|
|
27
|
-
`,Wv(c,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 zD=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}();At();At();var VD=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new Go}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){ue.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Bn.INT&&!Number.isInteger(e)&&(ue.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 HD=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!qp(e)){var o=this._buffer.get(e);if(o==null&&(o=new Go,this._buffer.set(e,o)),typeof r!="number"){ue.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===Bn.INT&&!Number.isInteger(r)&&(ue.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 Kv=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},Yv=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},GD=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},jD=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))},$D=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(qp));if(n.size===0){ue.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(qp)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return Kv(this,void 0,void 0,function(){var n,o,i,a;return Yv(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,GN(jD(jD([],GD(n),!1),GD(o),!1))];case 1:return i=s.sent(),a=i.filter(jN).map(function(l){return l.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 Kv(n,void 0,void 0,function(){var s,l;return Yv(this,function(c){switch(c.label){case 0:return s=new VD(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),r!=null&&(l=Ja(l,r)),[4,l];case 1:return c.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 Kv(n,void 0,void 0,function(){var s,l;return Yv(this,function(c){switch(c.label){case 0:return s=new HD,l=Promise.resolve(i(s)),r!=null&&(l=Ja(l,r)),[4,l];case 1:return c.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&&$N(n.instruments,r)})},t}();var QJ=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)}}(),WD=function(t){QJ(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 Tg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new bg(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}(Eg);var qD=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)}}(),Su=function(){function t(){}return t.Noop=function(){return eQ},t}();var ZJ=function(t){qD(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(Su);var KD=function(t){qD(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}(Su);var eQ=new ZJ;var tQ=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},rQ=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},nQ=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},YD=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new BD,this.observableRegistry=new $D,this.meter=new DD(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,WD);return r.length===1?r[0]:new zD(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,FD);return r},t.prototype.collect=function(e,r,n){return tQ(this,void 0,void 0,function(){var o,i,a;return rQ(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(l){return l.collect(e,r)}).filter(VN),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(l){var c=KN(l,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(c);if(u!=null)return u;var d=l.aggregation.createAggregator(c),p=new r(c,d,l.attributesProcessor,n._meterProviderSharedState.metricCollectors,l.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(l){var c=nQ(l,2),u=c[0],d=c[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,Su.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var oQ=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.")},XD=function(){function t(e){this.resource=e,this.viewRegistry=new xD,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=HN(e),n=this.meterSharedStates.get(r);return n==null&&(n=new YD(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=oQ(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(l){r={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var vg=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},Cg=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},iQ=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},aQ=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))},JD=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return vg(this,void 0,void 0,function(){var r,n,o,i,a=this;return Cg(this,function(s){switch(s.label){case 0:return r=yl(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return vg(a,void 0,void 0,function(){var c;return Cg(this,function(u){switch(u.label){case 0:return[4,l.collect(this,r,e)];case 1:return c=u.sent(),c?.scopeMetrics!=null&&n.push(c.scopeMetrics),c?.errors!=null&&o.push.apply(o,aQ([],iQ(c.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 vg(this,void 0,void 0,function(){return Cg(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 vg(this,void 0,void 0,function(){return Cg(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 QD=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},ZD=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},ek=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 sQ(t,e){var r=e??gg.empty();return t?gg.default().merge(r):r}var Xv=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new XD(sQ((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=ek(e.views),l=s.next();!l.done;l=s.next()){var c=l.value;this._sharedState.viewRegistry.addView(c)}}catch(m){r={error:m}}finally{try{l&&!l.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=ek(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?(ue.warn("A shutdown MeterProvider cannot provide a Meter"),tv()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new JD(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return QD(this,void 0,void 0,function(){return ZD(this,function(r){switch(r.label){case 0:return this._shutdown?(ue.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 QD(this,void 0,void 0,function(){return ZD(this,function(r){switch(r.label){case 0:return this._shutdown?(ue.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 lQ=/[\^$\\.+?()[\]{}|]/g,Ag=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(lQ,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var yu=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 tk=function(){function t(e){var r;this._nameFilter=new Ag((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new yu(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 rk=function(){function t(e){this._nameFilter=new yu(e?.name),this._versionFilter=new yu(e?.version),this._schemaUrlFilter=new yu(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 cQ(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var Rg=function(){function t(e){var r;if(cQ(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Ag.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 KD(e.attributeKeys):this.attributesProcessor=Su.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:ho.Default(),this.instrumentSelector=new tk({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new rk({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var hHe=process.env.APP||"unknown";At();import{v4 as dQ}from"uuid";function pQ(){return new FN({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:gl.DELTA})}var mQ=[new Rg({instrumentName:"test_event_duration",instrumentType:tt.HISTOGRAM,aggregation:new Wp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Rg({instrumentName:"test_step_duration",instrumentType:tt.HISTOGRAM,aggregation:new Wp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],wg=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 Ev({[jh]:e.serviceName,[NL]:r,[kL]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:dQ()}),o=pQ(),i=new Gv({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Xv({resource:n,readers:[i],views:mQ}),zh.setGlobalMeterProvider(this.provider),this.meter=zh.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Uh(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=Uh(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 Zt=new kh;function nk(t){t.disabled||(Zt=new wg(t))}var Jv=!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.83.2",tracesSampleRate:0,sendDefaultPii:!0}),HO(t.captureException),Jv=!0}catch{}import{Argument as Kle,Command as Yle,Option as gr}from"@commander-js/extra-typings";import{execSync as Xle}from"child_process";import{existsSync as fQ,statSync as hQ}from"fs";function ok(t){try{return fQ(t)&&hQ(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as gQ,input as SQ}from"@inquirer/prompts";import{existsSync as yQ,mkdirSync as EQ,statSync as TQ}from"fs";import{dirname as bQ}from"path";var vQ=!1,ak=(()=>{try{return TQ("/.dockerenv"),!0}catch{return!1}})();async function Lr(t){return dl||vQ||ak?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await gQ({message:t}))}async function Qv(t){let e=bQ(t);return ok(e)?yQ(t)?Lr(`File '${ik(t)}' already exists. Overwrite existing content?`):!0:await Lr(`Directory '${ik(e)}' doesn't exist. Create it now?`)?(EQ(e,{recursive:!0}),!0):!1}function ik(t){return t.replace(/(\s+)/g,"\\$1")}async function sk(t,e){return dl||ak?e:(await SQ({message:t,default:e})).trim()||e}import Ai,{supportsColor as AQ}from"chalk";import{Console as lk}from"console";import{format as Yp}from"util";var Zv=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}},xg=class t extends lk{_buffer=[];_groupDepth=0;Console=lk;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Zv(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
27
|
+
`,Wv(c,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 zD=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}();At();At();var VD=function(){function t(e,r){this._instrumentName=e,this._valueType=r,this._buffer=new Go}return t.prototype.observe=function(e,r){if(r===void 0&&(r={}),typeof e!="number"){ue.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Bn.INT&&!Number.isInteger(e)&&(ue.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 HD=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!qp(e)){var o=this._buffer.get(e);if(o==null&&(o=new Go,this._buffer.set(e,o)),typeof r!="number"){ue.warn("non-number value provided to metric "+e._descriptor.name+": "+r);return}e._descriptor.valueType===Bn.INT&&!Number.isInteger(r)&&(ue.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 Kv=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},Yv=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},GD=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},jD=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))},$D=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(qp));if(n.size===0){ue.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(qp)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return Kv(this,void 0,void 0,function(){var n,o,i,a;return Yv(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,GN(jD(jD([],GD(n),!1),GD(o),!1))];case 1:return i=s.sent(),a=i.filter(jN).map(function(l){return l.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 Kv(n,void 0,void 0,function(){var s,l;return Yv(this,function(c){switch(c.label){case 0:return s=new VD(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),r!=null&&(l=Ja(l,r)),[4,l];case 1:return c.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 Kv(n,void 0,void 0,function(){var s,l;return Yv(this,function(c){switch(c.label){case 0:return s=new HD,l=Promise.resolve(i(s)),r!=null&&(l=Ja(l,r)),[4,l];case 1:return c.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&&$N(n.instruments,r)})},t}();var QJ=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)}}(),WD=function(t){QJ(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 Tg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new bg(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}(Eg);var qD=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)}}(),Su=function(){function t(){}return t.Noop=function(){return eQ},t}();var ZJ=function(t){qD(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(Su);var KD=function(t){qD(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}(Su);var eQ=new ZJ;var tQ=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},rQ=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},nQ=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},YD=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new BD,this.observableRegistry=new $D,this.meter=new DD(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,WD);return r.length===1?r[0]:new zD(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,FD);return r},t.prototype.collect=function(e,r,n){return tQ(this,void 0,void 0,function(){var o,i,a;return rQ(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(l){return l.collect(e,r)}).filter(VN),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(l){var c=KN(l,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(c);if(u!=null)return u;var d=l.aggregation.createAggregator(c),p=new r(c,d,l.attributesProcessor,n._meterProviderSharedState.metricCollectors,l.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(l){var c=nQ(l,2),u=c[0],d=c[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,Su.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var oQ=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.")},XD=function(){function t(e){this.resource=e,this.viewRegistry=new xD,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=HN(e),n=this.meterSharedStates.get(r);return n==null&&(n=new YD(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=oQ(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(l){r={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},t}();var vg=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},Cg=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},iQ=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},aQ=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))},JD=function(){function t(e,r){this._sharedState=e,this._metricReader=r}return t.prototype.collect=function(e){return vg(this,void 0,void 0,function(){var r,n,o,i,a=this;return Cg(this,function(s){switch(s.label){case 0:return r=yl(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return vg(a,void 0,void 0,function(){var c;return Cg(this,function(u){switch(u.label){case 0:return[4,l.collect(this,r,e)];case 1:return c=u.sent(),c?.scopeMetrics!=null&&n.push(c.scopeMetrics),c?.errors!=null&&o.push.apply(o,aQ([],iQ(c.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 vg(this,void 0,void 0,function(){return Cg(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 vg(this,void 0,void 0,function(){return Cg(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 QD=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{c(n.next(u))}catch(d){a(d)}}function l(u){try{c(n.throw(u))}catch(d){a(d)}}function c(u){u.done?i(u.value):o(u.value).then(s,l)}c((n=n.apply(t,e||[])).next())})},ZD=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(c){return function(u){return l([c,u])}}function l(c){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return r.label++,{value:c[1],done:!1};case 5:r.label++,o=c[1],c=[0];continue;case 7:c=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){r.label=c[1];break}if(c[0]===6&&r.label<i[1]){r.label=i[1],i=c;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(c);break}i[2]&&r.ops.pop(),r.trys.pop();continue}c=e.call(t,r)}catch(u){c=[6,u],o=0}finally{n=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},ek=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 sQ(t,e){var r=e??gg.empty();return t?gg.default().merge(r):r}var Xv=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new XD(sQ((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=ek(e.views),l=s.next();!l.done;l=s.next()){var c=l.value;this._sharedState.viewRegistry.addView(c)}}catch(m){r={error:m}}finally{try{l&&!l.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=ek(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?(ue.warn("A shutdown MeterProvider cannot provide a Meter"),tv()):this._sharedState.getMeterSharedState({name:e,version:r,schemaUrl:n.schemaUrl}).meter},t.prototype.addMetricReader=function(e){var r=new JD(this._sharedState,e);e.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},t.prototype.shutdown=function(e){return QD(this,void 0,void 0,function(){return ZD(this,function(r){switch(r.label){case 0:return this._shutdown?(ue.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 QD(this,void 0,void 0,function(){return ZD(this,function(r){switch(r.label){case 0:return this._shutdown?(ue.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 lQ=/[\^$\\.+?()[\]{}|]/g,Ag=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(lQ,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var yu=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 tk=function(){function t(e){var r;this._nameFilter=new Ag((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new yu(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 rk=function(){function t(e){this._nameFilter=new yu(e?.name),this._versionFilter=new yu(e?.version),this._schemaUrlFilter=new yu(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 cQ(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var Rg=function(){function t(e){var r;if(cQ(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Ag.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 KD(e.attributeKeys):this.attributesProcessor=Su.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:ho.Default(),this.instrumentSelector=new tk({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new rk({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var hHe=process.env.APP||"unknown";At();import{v4 as dQ}from"uuid";function pQ(){return new FN({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:gl.DELTA})}var mQ=[new Rg({instrumentName:"test_event_duration",instrumentType:tt.HISTOGRAM,aggregation:new Wp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Rg({instrumentName:"test_step_duration",instrumentType:tt.HISTOGRAM,aggregation:new Wp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],wg=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 Ev({[jh]:e.serviceName,[NL]:r,[kL]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:dQ()}),o=pQ(),i=new Gv({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Xv({resource:n,readers:[i],views:mQ}),zh.setGlobalMeterProvider(this.provider),this.meter=zh.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Uh(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=Uh(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 Zt=new kh;function nk(t){t.disabled||(Zt=new wg(t))}var Jv=!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.83.3",tracesSampleRate:0,sendDefaultPii:!0}),HO(t.captureException),Jv=!0}catch{}import{Argument as Kle,Command as Yle,Option as gr}from"@commander-js/extra-typings";import{execSync as Xle}from"child_process";import{existsSync as fQ,statSync as hQ}from"fs";function ok(t){try{return fQ(t)&&hQ(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as gQ,input as SQ}from"@inquirer/prompts";import{existsSync as yQ,mkdirSync as EQ,statSync as TQ}from"fs";import{dirname as bQ}from"path";var vQ=!1,ak=(()=>{try{return TQ("/.dockerenv"),!0}catch{return!1}})();async function Lr(t){return dl||vQ||ak?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await gQ({message:t}))}async function Qv(t){let e=bQ(t);return ok(e)?yQ(t)?Lr(`File '${ik(t)}' already exists. Overwrite existing content?`):!0:await Lr(`Directory '${ik(e)}' doesn't exist. Create it now?`)?(EQ(e,{recursive:!0}),!0):!1}function ik(t){return t.replace(/(\s+)/g,"\\$1")}async function sk(t,e){return dl||ak?e:(await SQ({message:t,default:e})).trim()||e}import Ai,{supportsColor as AQ}from"chalk";import{Console as lk}from"console";import{format as Yp}from"util";var Zv=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}},xg=class t extends lk{_buffer=[];_groupDepth=0;Console=lk;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Zv(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",Yp(e,...r))}error(e,...r){this._log("error",Yp(e,...r))}info(e,...r){this._log("info",Yp(e,...r))}log(e,...r){this._log("log",Yp(e,...r))}warn(e,...r){this._log("warn",Yp(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function ck(t){let e=globalThis.console,r=new xg;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 kt=" ".repeat(6);function uk(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 l=s;for(;l.length>o;){let u=l.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(e+l.slice(0,d)),l=l.slice(d).trimStart()}a.push(e+l)}else{let l=s.split(" "),c="";for(let u of l){if(!c.length){c=u;continue}let d=`${c} ${u}`;d.length<=o?c=d:(a.push(e+c),c=u)}a.push(e+c)}return a.join(`
|
|
33
|
-
`)}import{hostname as CQ}from"os";var se=nu({app:"cli",hostname:CQ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.83.
|
|
33
|
+
`)}import{hostname as CQ}from"os";var se=nu({app:"cli",hostname:CQ(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.83.3"});var RQ=5;async function _g({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>RQ&&(v.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(c){i++,se.warn({err:c},"Failed to fetch run status, retrying..."),v.warn({err:c},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let l=Math.max(1e4,Math.floor(n/100));await new Promise(c=>setTimeout(c,l))}v.error(`Timeout elapsed waiting for ${r} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Eu({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),l=t.filter(u=>u.status==="FAILED"&&!u.quarantined),c=t.filter(u=>u.status==="CANCELLED");return ck(()=>{if(l.forEach(u=>{v.log(""),o(u)}),l.length){v.log("");let u=l.length===1?"":"s";v.error(`${l.length} ${r}${u} failed:`),l.forEach(d=>{v.dimmed(n(d))})}if(c.length){v.log("");let u=c.length===1?"":"s";v.warn(`${c.length} ${r}${u} cancelled:`),c.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:l.length,cancelled:c.length}}var Mg=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=bc[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||_a[t.failureReason],o=t.failureDetails.classification?.rootCause;if(v.error(e),o){v.log(`${kt}- Error type: ${Ai.dim(r)}`);let i="- Root cause analysis:",a=uk(`${i} ${o}`,`${kt} `,!1),s=a.indexOf(":");v.log(`${kt}${i} ${Ai.dim(a.slice(s+1))}`)}else v.log(`${kt}Reason: ${Ai.red(r)}`),v.log(`${kt}Description: ${Ai.red(n)}`)},Xp=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Ai.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Ai.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Ai.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Ai.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Ai.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Ai.bgMagenta.white("RUNNING"),a=0):(v.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),AQ||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import wQ from"fs";import{platform as xQ,tmpdir as IQ}from"os";import _Q from"path";import{program as MQ}from"playwright-core/lib/cli/program";import{registry as Jp}from"playwright-core/lib/server";import dk from"proper-lockfile";var pk=_Q.join(IQ(),"momenticBrowserInstallation");var Pg=["chrome","chromium","chrome-for-testing","ffmpeg"],eC=[...Pg.filter(t=>t!=="ffmpeg")],PQ={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function mk(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 fk={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function hk(t){if(t==="Org Default")return!1;let e=fk[PQ[t]??""]??"",r=Jp.findExecutable(e);return!r||r.installType==="none"?!1:tC(r)}function tC(t){let e=t.executablePath();return wQ.existsSync(e)}function OQ(t,e){let r=fk[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=Jp.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&tC(n)))return n}async function LQ({browser:t,force:e}){let r=OQ(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await Jp.installDeps([r],!1),await Jp.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=Jp.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!tC(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function NQ(){if(xQ()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await MQ.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function gk({rawBrowsers:t,force:e=!1,all:r=!1}){await NQ();let n=r?Pg:Array.from(new Set(t));try{await dk.lock(pk,{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 LQ({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await dk.unlock(pk,{realpath:!1})}if(o)throw o}import{createServer as DQ}from"http";async function Sk(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await kQ(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function kQ(t){return new Promise((e,r)=>{let n=DQ();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 UQ from"blocked-at";import FQ from"why-is-node-running";function yk(t){BQ(t),zQ()}function BQ(t){UQ((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 zQ(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}FQ(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function Ek(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 VQ(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,l)=>n(s).localeCompare(n(l))):[...t].sort()).filter((s,l)=>l>=o&&l<i)}function Tk(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?VQ(e,r,n,o):e}function Og({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 rC(t,e,r){return t instanceof $s?(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 Tu({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:l,issue:c})=>{let u=s!==void 0?`Step ${s}`:"File",d=l?`, field "${l}"`:"";v.error(` ${u}${d}:`),v.error(` \u2192 ${c}`)})})}else r.size>0&&v.error(`Failed test files:
|
|
@@ -58,7 +58,7 @@ ${Au(`Number of sub-steps: ${e}`,2)}`}default:return(r=>{throw new Error("You mi
|
|
|
58
58
|
${n}`}function aS(t,e={}){let{includeCache:r=!0}=e,n=w6(t);return Pn({steps:n,earlyStop:!1,onPresetAction:(o,i)=>{let a=o;a.parentStepIdChain=i.parentChain.map(c=>c.id),TC(o);let s;if(r&&ro(o.command)&&o.command.cache!==void 0){let c=I6(o.command.cache);c&&"target"in c&&(s=c.target)}let l=o.command;return s!==void 0?l.cache=s:delete l.cache,l.thoughts&&delete l.thoughts,delete l.id,"index"in o&&delete o.index,!1},onConditional:(o,i)=>{let a=o;return a.parentStepIdChain=i.parentChain.map(s=>s.id),TC(o),!1},onSimpleStepContainer:(o,i)=>{let a=i.parentChain.map(l=>l.id);if(o.type==="AI_ACTION"){let l=o,c=o.text,u=o.id;return Object.keys(l).forEach(d=>{delete l[d]}),l.type="AI_ACTION_DYNAMIC",l.text=c,l.id=u,l.parentStepIdChain=a,!1}let s=o;if(s.parentStepIdChain=a,TC(o),o.type==="RESOLVED_MODULE"){let l=o;delete l.cacheConfig,delete l.enabled,delete l.defaultCacheKey,delete l.defaultCacheTtl,delete l.defaultCacheAllInvocations,delete l.autoAuth,delete l.advanced}return!1}}),n}function TC(t){let e=t;delete e.aiSuggested,delete e.retries,delete e.skipped}function x6(t){return t.selector?t.selector:t.generatedSelectors?.[0]}function bC(t){let e=x6(t),r=t.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),r&&(n.nodeOnlySerializedHtml=r),Object.keys(n).length?n:void 0}function I6(t){if(!t)return;let e={};if("target"in t)return{target:bC(t.target)};if("fromTarget"in t||"toTarget"in t){let r=t.fromTarget?bC(t.fromTarget):void 0,n=t.toTarget?bC(t.toTarget):void 0;return r&&(e.fromTarget=r),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}import dS from"zod";import{v4 as vC}from"uuid";var _6=new Set(["AI_ACTION","SECTION"]);function K0({stepTypeByStepMatchKeyV2:t,stepMatchersV2:e}){let r=Object.values(ge).filter(n=>_6.has(n)?!1:!e.some(o=>t[o.matchKey]===n));if(r.length>0)throw new Error(`Missing v2 matcher coverage for step type(s): ${r.join(", ")}`)}import{v4 as Q0}from"uuid";var M6=new Set(["SUCCESS","ELEMENT_CHECK"]);function Y0({commandMatchersV2:t}){let e=(a,s)=>{if(a.length!==0)throw new Error(`${s}: ${a.join(", ")}`)},r=t.map(a=>a.matchKey).filter((a,s,l)=>l.indexOf(a)!==s);e(r,"Duplicate command matcher key(s)");let n=t.map(a=>a.commandType).filter((a,s,l)=>l.indexOf(a)!==s);e(n,"Duplicate command matcher type(s)");let o=new Set(t.map(a=>a.commandType)),i=Object.values(ze).filter(a=>!M6.has(a)&&!o.has(a));e(i,"Missing v2 matcher coverage for command type(s)")}function xi(t){return typeof t=="string"?{type:"description",elementDescriptor:t}:{type:"coordinates",pixels:{x:t.x,y:t.y}}}function go(t){if(t!==void 0)return Math.max(0,Math.ceil(t/1e3))}function X0({selectorType:t,selectorValue:e}){switch(t?.toLowerCase()){case"index":return{type:"INDEX",index:String(e)};case"regex":return{type:"REGEX",pattern:String(e)};case"substring":default:return{type:"SUBSTRING",substring:String(e)}}}function ca(t){if(t!=null)return xi(t)}function xe(t){return{matchKey:t.matchKey,commandType:t.commandType,toCommand:({step:e,commandId:r})=>{if(!tU(e,t.matchKey))throw new Error(`Cannot convert step without '${t.matchKey}' using this matcher.`);return t.toCommand({step:e,commandId:r??Q0()})}}}function fn(t){return{useSelector:t.useSelector,force:t.force,disableCache:t.disableCache,iframeUrl:t.iframeUrl}}var Rl=[xe({matchKey:"click",commandType:"CLICK",toCommand:({step:t,commandId:e})=>({id:e,type:"CLICK",target:xi(t.click),...fn(t),doubleClick:t.doubleClick,rightClick:t.rightClick,waitForDownload:t.waitForDownload,delayMs:t.delayMs,downloadTimeoutMs:t.downloadTimeout??t.downloadTimeoutMs,relativePosition:t.relativePosition})}),xe({matchKey:"switchTab",commandType:"TAB",toCommand:({step:t,commandId:e})=>({id:e,type:"TAB",action:X0({selectorType:t.type,selectorValue:t.switchTab}),loadTimeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"type",commandType:"TYPE",toCommand:({step:t,commandId:e})=>{let r=t.clear,n,o;return r===!1||r==="never"?(n=!1,o=!1):r===!0||r==="always"?(n=!0,o=!0):r==="inputs"&&(n=!0),{id:e,type:"TYPE",...fn(t),target:ca(t.target),value:t.type,clearContent:n,forceClearContent:o,pressEnter:t.pressEnter,delay:t.delayMs,relativePosition:t.relativePosition}}}),xe({matchKey:"selectOption",commandType:"SELECT_OPTION",toCommand:({step:t,commandId:e})=>{let r=t.selectOption.optionType,n={type:"VALUE",value:t.selectOption.optionValue};switch(r){case void 0:case"value":break;case"index":n={type:"INDEX",index:t.selectOption.optionValue};break;case"label":n={type:"LABEL",label:t.selectOption.optionValue};break;default:return xn(r)}return{id:e,type:"SELECT_OPTION",...fn(t),target:xi(t.selectOption.dropdown),choice:n}}}),xe({matchKey:"hover",commandType:"HOVER",toCommand:({step:t,commandId:e})=>({id:e,type:"HOVER",...fn(t),target:xi(t.hover)})}),xe({matchKey:"blur",commandType:"BLUR",toCommand:({step:t,commandId:e})=>({id:e,type:"BLUR",...fn(t),target:ca(t.blur)})}),xe({matchKey:"focus",commandType:"FOCUS",toCommand:({step:t,commandId:e})=>({id:e,type:"FOCUS",...fn(t),target:xi(t.focus)})}),xe({matchKey:"dragAndDrop",commandType:"DRAG",toCommand:({step:t,commandId:e})=>{let r;return t.dragAndDrop.hoverMs!==void 0&&(r=t.dragAndDrop.hoverMs/1e3),{id:e,type:"DRAG",...fn(t),fromTarget:xi(t.dragAndDrop.from),toTarget:xi(t.dragAndDrop.to),steps:t.dragAndDrop.movements,hoverSeconds:r}}}),xe({matchKey:"mouseDrag",commandType:"MOUSE_DRAG",toCommand:({step:t,commandId:e})=>({id:e,type:"MOUSE_DRAG",...fn(t),target:ca(t.mouseDrag.container),deltaX:`${t.mouseDrag.deltaX??0}`,deltaY:`${t.mouseDrag.deltaY??0}`,steps:t.mouseDrag.movements})}),xe({matchKey:"press",commandType:"PRESS",toCommand:({step:t,commandId:e})=>({id:e,type:"PRESS",value:t.press,repeat:t.repeat,delayMs:t.delayMs,convertMeta:t.convertMeta})}),xe({matchKey:"keyDown",commandType:"KEY_DOWN",toCommand:({step:t,commandId:e})=>({id:e,type:"KEY_DOWN",value:t.keyDown,convertMeta:t.convertMeta})}),xe({matchKey:"keyUp",commandType:"KEY_UP",toCommand:({step:t,commandId:e})=>({id:e,type:"KEY_UP",value:t.keyUp,convertMeta:t.convertMeta})}),xe({matchKey:"navigate",commandType:"NAVIGATE",toCommand:({step:t,commandId:e})=>({id:e,type:"NAVIGATE",url:t.navigate,loadTimeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"newTab",commandType:"NEW_TAB",toCommand:({step:t,commandId:e})=>({id:e,type:"NEW_TAB",url:t.newTab,loadTimeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"goBack",commandType:"GO_BACK",toCommand:({commandId:t})=>({id:t,type:"GO_BACK"})}),xe({matchKey:"goForward",commandType:"GO_FORWARD",toCommand:({commandId:t})=>({id:t,type:"GO_FORWARD"})}),xe({matchKey:"refresh",commandType:"REFRESH",toCommand:({commandId:t})=>({id:t,type:"REFRESH"})}),xe({matchKey:"scrollUp",commandType:"SCROLL_UP",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_UP",...fn(t),target:ca(t.container),deltaY:t.scrollUp})}),xe({matchKey:"scrollDown",commandType:"SCROLL_DOWN",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_DOWN",...fn(t),target:ca(t.container),deltaY:t.scrollDown})}),xe({matchKey:"scrollLeft",commandType:"SCROLL_LEFT",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_LEFT",...fn(t),target:ca(t.container),deltaX:t.scrollLeft})}),xe({matchKey:"scrollRight",commandType:"SCROLL_RIGHT",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_RIGHT",...fn(t),target:ca(t.container),deltaX:t.scrollRight})}),xe({matchKey:"wait",commandType:"WAIT",toCommand:({step:t,commandId:e})=>({id:e,type:"WAIT",delay:t.wait})}),xe({matchKey:"checkAI",commandType:"AI_ASSERTION",toCommand:({step:t,commandId:e})=>({id:e,type:"AI_ASSERTION",assertion:t.checkAI,disableCache:t.disableCache,iframeUrl:t.iframeUrl,contextChoice:t.contextChoice,source:t.source,timeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"checkPageContent",commandType:"PAGE_CHECK",toCommand:({step:t,commandId:e})=>({id:e,type:"PAGE_CHECK",iframeUrl:t.iframeUrl,timeout:go(t.timeout??t.timeoutMs),assertion:{type:"CONTENT",value:t.checkPageContent,negated:t.not}})}),xe({matchKey:"extract",commandType:"AI_EXTRACT",toCommand:({step:t,commandId:e})=>({id:e,type:"AI_EXTRACT",goal:t.extract,schema:t.schema,disableCache:t.disableCache,iframeUrl:t.iframeUrl})}),xe({matchKey:"cookie",commandType:"COOKIE",toCommand:({step:t,commandId:e})=>({id:e,type:"COOKIE",value:t.cookie})}),xe({matchKey:"localStorage",commandType:"LOCAL_STORAGE",toCommand:({step:t,commandId:e})=>({id:e,type:"LOCAL_STORAGE",key:t.localStorage.key,value:t.localStorage.value})}),xe({matchKey:"request",commandType:"REQUEST",toCommand:({step:t,commandId:e})=>({id:e,type:"REQUEST",url:t.request.url,method:t.request.method,headers:t.request.headers,params:t.request.params,body:N6(t.request),timeout:go(t.request.timeout??t.request.timeoutMs)})}),xe({matchKey:"graphqlRequest",commandType:"GRAPHQL_REQUEST",toCommand:({step:t,commandId:e})=>({id:e,type:"GRAPHQL_REQUEST",url:t.graphqlRequest.url,query:t.graphqlRequest.query,variables:t.graphqlRequest.variables,headers:t.graphqlRequest.headers,timeout:go(t.graphqlRequest.timeout??t.graphqlRequest.timeoutMs)})}),xe({matchKey:"javascript",commandType:"JAVASCRIPT",toCommand:({step:t,commandId:e})=>({id:e,type:"JAVASCRIPT",code:t.javascript,environment:t.environment,fragment:t.fragment,timeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"setHeader",commandType:"SET_HEADER",toCommand:({step:t,commandId:e})=>({id:e,type:"SET_HEADER",name:t.setHeader.name,value:t.setHeader.value,requestMatcher:D6(t.setHeader)})}),xe({matchKey:"mockRoute",commandType:"MOCK_ROUTE",toCommand:({step:t,commandId:e})=>({id:e,type:"MOCK_ROUTE",requestMatcher:lS({urlMatcherType:t.mockRoute.urlMatcherType,urlMatcherValue:t.mockRoute.urlMatcherValue,requestMethod:t.mockRoute.requestMethod}),responseGenerator:t.mockRoute.responseGenerator,fetchOriginalResponse:t.mockRoute.fetchOriginalResponse,key:t.mockRoute.key})}),xe({matchKey:"removeRouteMock",commandType:"REMOVE_ROUTE_MOCK",toCommand:({step:t,commandId:e})=>({id:e,type:"REMOVE_ROUTE_MOCK",key:t.removeRouteMock??void 0})}),xe({matchKey:"waitForUrl",commandType:"WAIT_FOR_URL",toCommand:({step:t,commandId:e})=>({id:e,type:"WAIT_FOR_URL",matcher:eU({type:t.urlMatcherType,value:t.waitForUrl}),caseInsensitive:t.caseInsensitive,negated:t.not,timeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"dialog",commandType:"DIALOG",toCommand:({step:t,commandId:e})=>({id:e,type:"DIALOG",action:t.dialog})}),xe({matchKey:"fileUpload",commandType:"FILE_UPLOAD",toCommand:({step:t,commandId:e})=>({id:e,type:"FILE_UPLOAD",fileSource:typeof t.fileUpload=="string"?{type:"URL",url:t.fileUpload}:{type:"USER_FILE",name:t.fileUpload.name},filename:t.filename})}),xe({matchKey:"copy",commandType:"COPY",toCommand:({step:t,commandId:e})=>({id:e,type:"COPY",value:typeof t.copy=="string"?t.copy:""})}),xe({matchKey:"paste",commandType:"PASTE",toCommand:({commandId:t})=>({id:t,type:"PASTE"})}),xe({matchKey:"visualDiff",commandType:"VISUAL_DIFF",toCommand:({step:t,commandId:e})=>({id:e,type:"VISUAL_DIFF",...fn(t),threshold:t.threshold,target:ca(t.visualDiff),screenshot:k6(t)})}),xe({matchKey:"captcha",commandType:"CAPTCHA",toCommand:({step:t,commandId:e})=>({id:e,type:"CAPTCHA",...fn(t)})}),xe({matchKey:"offlineMode",commandType:"OFFLINE_MODE",toCommand:({step:t,commandId:e})=>({id:e,type:"OFFLINE_MODE",enable:t.offlineMode})}),xe({matchKey:"registerRequestListener",commandType:"REGISTER_REQUEST_LISTENER",toCommand:({step:t,commandId:e})=>({id:e,type:"REGISTER_REQUEST_LISTENER",requestMatcher:lS({urlMatcherType:t.registerRequestListener.urlMatcherType,urlMatcherValue:t.registerRequestListener.urlMatcherValue,requestMethod:t.registerRequestListener.requestMethod}),key:t.registerRequestListener.key})}),xe({matchKey:"awaitListener",commandType:"AWAIT_LISTENER",toCommand:({step:t,commandId:e})=>({id:e,type:"AWAIT_LISTENER",key:t.awaitListener,timeout:go(t.timeout??t.timeoutMs)})}),xe({matchKey:"recordRequests",commandType:"RECORD_REQUESTS",toCommand:({step:t,commandId:e})=>({id:e,type:"RECORD_REQUESTS",requestMatcher:lS({urlMatcherType:t.recordRequests.urlMatcherType,urlMatcherValue:t.recordRequests.urlMatcherValue,requestMethod:t.recordRequests.requestMethod}),key:t.recordRequests.key})}),xe({matchKey:"getRecordedRequests",commandType:"GET_RECORDED_REQUESTS",toCommand:({step:t,commandId:e})=>({id:e,type:"GET_RECORDED_REQUESTS",key:t.getRecordedRequests})}),xe({matchKey:"authLoad",commandType:"AUTH_LOAD",toCommand:({step:t,commandId:e})=>({id:e,type:"AUTH_LOAD",storageState:t.authLoad})}),xe({matchKey:"authSave",commandType:"AUTH_SAVE",toCommand:({commandId:t})=>({id:t,type:"AUTH_SAVE"})})];Y0({commandMatchersV2:Rl});function Z0({command:t,commandId:e}){if(!P6(t))return;let r=Wa(t);if(r!==void 0)return{id:e??Q0(),type:"ELEMENT_CHECK",...fn(t),target:L6(t[r.alias],r.alias),assertion:O6({command:t,parsedAlias:r}),timeout:go(t.timeout)}}function P6(t){return Wa(t)!==void 0}function O6(t){let{command:e,parsedAlias:r}=t;switch(r.subject){case"content":return{type:"ELEMENT_CONTENT",operation:vp(r.condition),value:sS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"attribute":return{type:"ELEMENT_ATTRIBUTE",operation:vp(r.condition),attr:J0(e.name,r.alias),value:sS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"tag_name":return{type:"ELEMENT_NAME",operation:vp(r.condition),value:sS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"style":return{type:"ELEMENT_STYLE",operation:vp(r.condition),property:J0(e.name,r.alias),value:sS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"element":return{type:"ELEMENT_EXISTENCE",condition:LO(r.condition),negated:r.negated};default:return xn(r.subject)}}function L6(t,e){if(typeof t=="string")return xi(t);if(typeof t=="object"&&t!==null&&"x"in t&&typeof t.x=="number"&&"y"in t&&typeof t.y=="number")return xi({x:t.x,y:t.y});throw new Error(`Cannot deserialize element check alias '${e}' without a valid target.`)}function J0(t,e){if(t!==void 0)return t;throw new Error(`Cannot deserialize element check alias '${e}' without a name.`)}function sS({alias:t,requiresValue:e,value:r}){if(!e)return"";if(r!==void 0)return r;throw new Error(`Cannot deserialize element check alias '${t}' without a value.`)}function N6(t){if(t.body===void 0)return;let e=t.bodyType??"json";switch(e){case"form-urlencoded":if(typeof t.body=="string")throw new Error("V2 request steps with bodyType=form-urlencoded require the body to be an object.");return{type:"form-urlencoded",content:t.body};case"json":return typeof t.body=="string"?{type:"json",content:t.body}:{type:"json",content:JSON.stringify(t.body)};default:return xn(e)}}function D6(t){if(t.urlMatcherValue!==void 0)return lS({urlMatcherType:t.urlMatcherType,urlMatcherValue:t.urlMatcherValue,requestMethod:t.requestMethod})}function eU({type:t,value:e}){switch(t){case"regex":return{type:"REGEX",regex:e};case"glob":return{type:"GLOB",glob:e};case"domain":return{type:"DOMAIN",domain:e};case"substring":case void 0:return{type:"SUBSTRING",url:e};default:return xn(t)}}function lS({urlMatcherType:t,urlMatcherValue:e,requestMethod:r}){return{urlMatcher:eU({type:t,value:e}),method:r}}function k6(t){if(t.screenshot!==void 0)return t.screenshot;if(!(t.screenshotUrl===void 0||t.screenshotWidth===void 0||t.screenshotHeight===void 0))return{data:t.screenshotUrl,width:t.screenshotWidth,height:t.screenshotHeight}}function tU(t,e){return e in t}function rU({command:t,commandId:e,matcher:r}){if(tU(t,r.matchKey))return r.toCommand({step:t,commandId:e})}function cS({command:t,commandId:e}){for(let n of Rl){let o=rU({command:t,commandId:e,matcher:n});if(o)return o}let r=Z0({command:t,commandId:e});if(r)return r;throw new Error(`Unsupported v2 step action '${JSON.stringify(t)}' while mapping to resolved command.`)}var U6={dynamicAction:"AI_ACTION_DYNAMIC",module:"MODULE",if:"CONDITIONAL"},F6=Object.fromEntries(Rl.map(({matchKey:t})=>[t,"PRESET_ACTION"])),nU={...F6,...U6};function uS(t){return{matchKey:t.matchKey,toStep:({step:e,stepId:r})=>{if(!iU(e,t.matchKey))throw new Error(`Cannot convert step without '${t.matchKey}' using this matcher.`);let n=r??vC();return t.toStep({step:e,stepId:n})}}}var oU=[...Rl.map(({matchKey:t})=>B6(t)),uS({matchKey:"dynamicAction",toStep:({step:t,stepId:e})=>({id:e,type:"AI_ACTION_DYNAMIC",text:t.dynamicAction,version:t.version,...lm(t)})}),uS({matchKey:"module",toStep:({step:t,stepId:e})=>({id:e,type:"MODULE",moduleId:t.module,inputs:t.inputs,...lm(t)})}),uS({matchKey:"if",toStep:({step:t,stepId:e})=>{let r=lm(t),n={id:vC(),type:"PRESET_ACTION",...r,command:cS({command:t.if})};return{id:e,type:"CONDITIONAL",...r,blocks:[{assertion:n,steps:t.then.map(Iu)}],elseSteps:t.else?.map(Iu)}}})];K0({stepTypeByStepMatchKeyV2:nU,stepMatchersV2:oU});function B6(t){return uS({matchKey:t,toStep:({step:e,stepId:r})=>({id:r,type:"PRESET_ACTION",...lm(e),command:cS({command:e})})})}function lm(t){return{envKey:t.envKey,retries:t.retries,skipped:t.skipped,comment:t.comment}}function iU(t,e){return e in t}function z6({step:t,stepId:e,matcher:r}){if(iU(t,r.matchKey))return r.toStep({step:t,stepId:e})}function Iu(t){for(let r of oU){let n=z6({step:t,matcher:r});if(n)return n}let e=V6(t);if(e)return e;throw new Error(`Unsupported v2 step action '${JSON.stringify(t)}' while mapping to resolved step.`)}function V6(t){if(H6(t))return{id:vC(),type:"PRESET_ACTION",...lm(t),command:cS({command:t})}}function H6(t){return Wa(t)!==void 0}function CC(t){return{steps:t.steps.map(Iu),beforeSteps:t.before?.map(Iu),afterSteps:t.after?.map(Iu)}}async function pS(t){let e=tu.parse(t.testV2),r={id:e.id,schemaVersion:e.schemaVersion??Te},n=CC(e);return{metadata:r,stepLists:n}}async function _u(t){let e=_h.parse(t.moduleV2),r=rr.omit({moduleId:!0}).parse(e),n=CC({before:[],steps:VO(e),after:[]});return{module:{...r,moduleId:e.moduleId,schemaVersion:e.schemaVersion,steps:n.steps??[]}}}function wl(t){return dS.object({fileType:dS.literal(re.TEST_V2)}).safeParse(t).success}function Vn(t){return dS.object({fileType:dS.literal(re.MODULE_V2)}).safeParse(t).success}function hn(t){return t===void 0?void 0:t*1e3}function ua(t){if(t)return t.type==="description"?t.elementDescriptor:{x:t.pixels.x,y:t.pixels.y}}function AC(t){let e=ua(t);return e===void 0?null:e}function rs({target:t,commandType:e}){let r=ua(t);if(r!==void 0)return r;throw new Error(`Cannot serialize ${e} command without a target.`)}function aU(t){if(t.forceClearContent)return"always";if(t.clearContent===!0)return"inputs";if(t.clearContent===!1)return"never"}function br(t){return{useSelector:t.useSelector,force:t.force,disableCache:t.disableCache,iframeUrl:t.iframeUrl}}function Mu({requestMatcher:t}){if(!t)return{};switch(t.urlMatcher.type){case"SUBSTRING":return{urlMatcherType:"substring",urlMatcherValue:t.urlMatcher.url,requestMethod:t.method};case"GLOB":return{urlMatcherType:"glob",urlMatcherValue:t.urlMatcher.glob,requestMethod:t.method};case"REGEX":return{urlMatcherType:"regex",urlMatcherValue:t.urlMatcher.regex,requestMethod:t.method};case"DOMAIN":return{urlMatcherType:"domain",urlMatcherValue:t.urlMatcher.domain,requestMethod:t.method};default:return xn(t.urlMatcher)}}function RC(t){switch(t.type){case"CLICK":return{click:rs({target:t.target,commandType:t.type}),...br(t),doubleClick:t.doubleClick,rightClick:t.rightClick,waitForDownload:t.waitForDownload,delayMs:t.delayMs,downloadTimeout:t.downloadTimeoutMs,relativePosition:t.relativePosition};case"TYPE":return{type:t.value,...br(t),target:ua(t.target),pressEnter:t.pressEnter,clear:aU(t),delayMs:t.delay,relativePosition:t.relativePosition};case"SELECT_OPTION":{let e=rs({target:t.target,commandType:t.type});switch(t.choice.type){case"LABEL":return{selectOption:{dropdown:e,optionType:"label",optionValue:t.choice.label},...br(t)};case"VALUE":return{selectOption:{dropdown:e,optionType:"value",optionValue:t.choice.value},...br(t)};case"INDEX":return{selectOption:{dropdown:e,optionType:"index",optionValue:t.choice.index},...br(t)};default:return xn(t.choice)}}case"HOVER":return{hover:rs({target:t.target,commandType:t.type}),...br(t)};case"BLUR":return{blur:AC(t.target),...br(t)};case"FOCUS":return{focus:rs({target:t.target,commandType:t.type}),...br(t)};case"DRAG":{let e=rs({target:t.fromTarget,commandType:t.type}),r=rs({target:t.toTarget,commandType:t.type});return{dragAndDrop:{from:e,to:r,movements:t.steps,hoverMs:hn(t.hoverSeconds)},...br(t)}}case"MOUSE_DRAG":return{mouseDrag:{container:ua(t.target),deltaX:t.deltaX,deltaY:t.deltaY,movements:t.steps},...br(t)};case"PRESS":return{press:t.value,repeat:t.repeat,delayMs:t.delayMs,convertMeta:t.convertMeta};case"KEY_DOWN":return{keyDown:t.value,convertMeta:t.convertMeta};case"KEY_UP":return{keyUp:t.value,convertMeta:t.convertMeta};case"NAVIGATE":return{navigate:t.url,timeout:hn(t.loadTimeout)};case"NEW_TAB":return{newTab:t.url,timeout:hn(t.loadTimeout)};case"TAB":switch(t.action.type){case"SUBSTRING":return{switchTab:t.action.substring,type:"substring",timeout:hn(t.loadTimeout)};case"REGEX":return{switchTab:t.action.pattern,type:"regex",timeout:hn(t.loadTimeout)};case"INDEX":{let e=Number(t.action.index);return{switchTab:Number.isNaN(e)?t.action.index:e,type:"index",timeout:hn(t.loadTimeout)}}default:return xn(t.action)}case"GO_BACK":return{goBack:!0};case"GO_FORWARD":return{goForward:!0};case"REFRESH":return{refresh:!0};case"SCROLL_DOWN":return{scrollDown:t.deltaY,container:ua(t.target),...br(t)};case"SCROLL_UP":return{scrollUp:t.deltaY,container:ua(t.target),...br(t)};case"SCROLL_RIGHT":return{scrollRight:t.deltaX,container:ua(t.target),...br(t)};case"SCROLL_LEFT":return{scrollLeft:t.deltaX,container:ua(t.target),...br(t)};case"WAIT":return{wait:t.delay};case"AI_ASSERTION":return{checkAI:t.assertion,disableCache:t.disableCache,iframeUrl:t.iframeUrl,contextChoice:t.contextChoice,source:t.source,timeout:hn(t.timeout)};case"PAGE_CHECK":return{checkPageContent:t.assertion.value,iframeUrl:t.iframeUrl,timeout:hn(t.timeout),not:t.assertion.negated};case"ELEMENT_CHECK":{let e=rs({target:t.target,commandType:t.type}),r=OO(t.assertion),n=Ub(r),o=hn(t.timeout);if(n===void 0)throw new Error(`Cannot serialize unsupported element check alias '${r}'.`);let i;switch(t.assertion.type){case"ELEMENT_ATTRIBUTE":i=t.assertion.attr;break;case"ELEMENT_STYLE":i=t.assertion.property;break;case"ELEMENT_EXISTENCE":case"ELEMENT_CONTENT":case"ELEMENT_NAME":i=void 0;break;default:return xn(t.assertion)}if(n.requiresName&&i===void 0)throw new Error(`Cannot serialize element check alias '${r}' without a name.`);return{[r]:e,...br(t),timeout:o,...n.requiresName?{name:i}:{},...n.requiresValue&&t.assertion.type!=="ELEMENT_EXISTENCE"?{value:t.assertion.value}:{}}}case"AI_EXTRACT":return{extract:t.goal,schema:t.schema,disableCache:t.disableCache,iframeUrl:t.iframeUrl};case"COOKIE":return{cookie:t.value};case"LOCAL_STORAGE":return{localStorage:{key:t.key,value:t.value}};case"REQUEST":{let e,r;return t.body&&(e=t.body.type,r=t.body.content),{request:{url:t.url,method:t.method,headers:t.headers,params:t.params,bodyType:e,body:r,timeout:hn(t.timeout)}}}case"GRAPHQL_REQUEST":return{graphqlRequest:{url:t.url,query:t.query,variables:t.variables,headers:t.headers,timeout:hn(t.timeout)}};case"JAVASCRIPT":return{javascript:t.code,environment:t.environment,fragment:t.fragment,timeout:hn(t.timeout)};case"SET_HEADER":{let e=Mu({requestMatcher:t.requestMatcher});return{setHeader:{name:t.name,value:t.value,urlMatcherType:e.urlMatcherType,urlMatcherValue:e.urlMatcherValue,requestMethod:e.requestMethod}}}case"MOCK_ROUTE":{let e=Mu({requestMatcher:t.requestMatcher});return{mockRoute:{urlMatcherType:e.urlMatcherType,urlMatcherValue:e.urlMatcherValue,requestMethod:e.requestMethod,responseGenerator:t.responseGenerator,fetchOriginalResponse:t.fetchOriginalResponse,key:t.key}}}case"REMOVE_ROUTE_MOCK":return{removeRouteMock:t.key??null};case"WAIT_FOR_URL":{let e=Mu({requestMatcher:{urlMatcher:t.matcher,method:void 0}});return{waitForUrl:e.urlMatcherValue,urlMatcherType:e.urlMatcherType,caseInsensitive:t.caseInsensitive,not:t.negated,timeout:hn(t.timeout)}}case"DIALOG":return{dialog:t.action};case"FILE_UPLOAD":return t.fileSource.type==="URL"?{fileUpload:t.fileSource.url,filename:t.filename}:{fileUpload:{type:"USER_FILE",name:t.fileSource.name},filename:t.filename};case"COPY":return{copy:t.value};case"PASTE":return{paste:!0};case"CAPTCHA":return{captcha:!0,...br(t)};case"VISUAL_DIFF":return{visualDiff:AC(t.target),...br(t),threshold:t.threshold,screenshot:t.screenshot};case"OFFLINE_MODE":return{offlineMode:t.enable};case"REGISTER_REQUEST_LISTENER":{let e=Mu({requestMatcher:t.requestMatcher});return{registerRequestListener:{urlMatcherValue:e.urlMatcherValue,key:t.key,requestMethod:e.requestMethod,urlMatcherType:e.urlMatcherType}}}case"AWAIT_LISTENER":return{awaitListener:t.key,timeout:hn(t.timeout)};case"RECORD_REQUESTS":{let e=Mu({requestMatcher:t.requestMatcher});return{recordRequests:{urlMatcherValue:e.urlMatcherValue,key:t.key,requestMethod:e.requestMethod,urlMatcherType:e.urlMatcherType}}}case"GET_RECORDED_REQUESTS":return{getRecordedRequests:t.key};case"AUTH_LOAD":return{authLoad:t.storageState};case"AUTH_SAVE":return{authSave:!0};case"SUCCESS":throw new Error("SUCCESS command is not supported in v2 serialization.");default:return xn(t)}}function xl(t){let e={envKey:t.envKey,retries:t.retries,skipped:t.skipped,comment:t.comment};switch(t.type){case"PRESET_ACTION":return{...RC(t.command),...e};case"AI_ACTION_DYNAMIC":return{dynamicAction:t.text,version:t.version,...e};case"AI_ACTION":return{dynamicAction:t.text,...e};case"MODULE":return{module:t.moduleId,inputs:t.inputs,...e};case"CONDITIONAL":{let[r,...n]=t.blocks;if(!r)throw new Error("Conditional step cannot be serialized without blocks.");if(n.length>0)throw new Error("Cannot serialize v2 conditionals with multiple blocks. Only 'if' and 'else' are supported.");let o,i=RC(r.assertion.command);if(["checkAI","checkPageContent","javascript","elementCheck"].some(a=>a in i))o=i;else throw new Error(`Unsupported assertion command type: ${JSON.stringify(i)}`);return{if:o,then:r.steps.map(a=>xl(a)),else:t.elseSteps?.map(a=>xl(a)),...e}}case"SECTION":throw new Error("SECTION steps are not supported in v2 serialization. Remove SECTION steps before converting.")}}function sU(t){return{before:t.beforeSteps&&t.beforeSteps.length>0?t.beforeSteps.map(xl):void 0,steps:t.steps.map(xl),after:t.afterSteps&&t.afterSteps.length>0?t.afterSteps.map(xl):void 0}}function lU({metadata:t,stepLists:e,idOverride:r}){let n=Tr.parse(t),o=sU(Pd.parse(e)),i=n.advanced&&Object.keys(n.advanced).length>0?n.advanced:{};return zn({fileType:re.TEST_V2,id:r??n.id,schemaVersion:n.schemaVersion===Te?void 0:n.schemaVersion,url:n.baseUrl||void 0,description:n.description??void 0,retries:n.retries??void 0,envs:n.envs??void 0,parameters:n.parameters??void 0,disabled:n.disabled,labels:n.labels&&n.labels.length>0?n.labels:void 0,...i,...o})}import um from"yaml";import{z as dU}from"zod";import{execSync as G6}from"child_process";function Pu(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{G6(n,{encoding:"utf-8"})}catch(o){v.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as j6}from"deep-object-diff";import ns from"fs";import{cloneDeep as $6}from"lodash-es";import cm from"path";import{v4 as W6}from"uuid";import wC from"yaml";function Il({module:t,filePath:e,projectConfig:r,opts:n}){let o=zn({fileType:re.MODULE,...Th.parse(t),steps:t.steps});if(n?.existingModule&&!n?.forceSaveOnNoDiffs){let a=j6(o,n.existingModule);if(a&&Object.keys(a).length===0){v.debug(`Skipping save for module ${e} since there are no changes`);return}}v.debug(`Saving module ${t.name} to ${e}`);let i=wC.stringify(o);ns.writeFileSync(e,i,"utf-8"),Pu(e,r)}function So({content:t,schemaVersion:e,momenticFiles:r,project:n,forceSaveOnNoDiffs:o}){let i=r.modules[t.moduleId]?.fullFilePath;if(!i||!ns.existsSync(i))throw new Error(`Tried to update module ${t.moduleId} that could not be found on disk`);let a=ns.readFileSync(i,"utf-8"),s=wC.parse(a),l;if(t.name&&t.name!==s.name){let d=`${ht(t.name)}.module.yaml`;if(l=cm.join(cm.dirname(i),d),ns.existsSync(l))throw new Error(`A conflicting file '${t.name}' already exists at path '${l}'`)}let c={...t,schemaVersion:e},u={fileType:re.MODULE,...Th.parse(c),steps:t.steps};Il({module:u,filePath:i,projectConfig:n.config,opts:{forceSaveOnNoDiffs:o,existingModule:s}}),l&&ns.renameSync(i,l)}function uU({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=qo(i,o);if(Vn(a))throw new Error("Updating v2 modules through this path is not supported yet.");let s={...a,...e},l={fileType:re.MODULE,...Th.parse(s),steps:a.steps};Il({module:l,filePath:i,projectConfig:n.config,opts:{existingModule:a}});let c;if(e.name){let u=`${ht(e.name)}.module.yaml`;if(c=cm.join(cm.dirname(i),u),ns.existsSync(c))throw new Error(`Module with name '${e.name}' already exists at path '${c}'`);ns.renameSync(i,c)}}async function mS({name:t,description:e,enabled:r,steps:n,folder:o,project:i}){let a=ht(t),s=cm.join(o,`${a}.module.yaml`),l=W6(),{stepsToSave:c}=await jt({stepLists:{steps:n}}),u={fileType:re.MODULE,schemaVersion:Te,moduleId:l,name:t,description:e,enabled:r,steps:c.steps};return Il({module:u,filePath:s,projectConfig:i.config}),{moduleId:l,name:t,description:e,enabled:r,steps:n}}function qo(t,e){let r=ns.readFileSync(t,"utf-8"),n=wC.parse(r);if(Vn(n))try{return zO.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:t,moduleContents:r},`${t} does not parse as a valid V2 module`),o}try{return L_.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 cU({module:t}){return Vn(t)?(await _u({moduleV2:t})).module:t}async function pa(t,e,r,n){let o=qo(t.fullFilePath,r),i=await cU({module:o}),{resolvedSteps:a}=await Qg({rawSteps:i.steps,migrationMetadata:{id:i.moduleId,schemaVersion:i.schemaVersion},resolvedModuleCache:n,logger:r,callbacks:{onFetchModule:async({id:l})=>{let c=e.modules[l]?.fullFilePath;if(!c)return;let u=qo(c,r);return cU({module:u})}}}),s={...i,steps:a};return n&&(n[t.id]=$6(s)),s}async function fS(t,e){let r={};return await Promise.all(Object.values(t.modules).map(async n=>{await pa(n,t,e,r)})),Array.from(Object.values(r))}function is({test:t,filePath:e,projectConfig:r,opts:n}){let o=zn({fileType:re.TEST,...dn.parse(t),beforeSteps:t.beforeSteps??void 0,steps:t.steps,afterSteps:t.afterSteps??void 0});if(n?.existingTest&&!n?.forceSaveOnNoDiffs){let a=q6(o,n.existingTest);if(a&&Object.keys(a).length===0){v.debug(`Skipping save for test ${e} since there are no changes`);return}}v.debug(`Saving test ${t.name} to ${e}`);let i=um.stringify(o);Ii.writeFileSync(e,i,"utf-8"),Pu(e,r)}async function pU({test:t,name:e,folder:r}){let n=await G0({test:t});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${ht(e)}.test.yaml`,a=os.join(r,i);return Ii.writeFileSync(a,n.test,"utf-8"),a}function xC(t,e,r){let n=os.join(r.rootDir,t);if(!Ii.existsSync(n))throw new Error(`Test not found at path '${t}' in project '${r.rootDir}'`);let o=Ii.readFileSync(n,"utf-8"),i=um.parse(o),a,s;if(e.name&&e.name!==i.name){let u=`${ht(e.name)}.test.yaml`;if(a=os.join(os.dirname(t),u),s=os.join(r.rootDir,a),Ii.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let l={...i,...e},c=dn.parse(l);return is({test:{fileType:re.TEST,...c,beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},filePath:n,projectConfig:r.config}),s&&Ii.renameSync(n,s),{newRelativeTestPath:a}}function Hn({relativeTestPath:t,steps:e,schemaVersion:r,project:n,forceSaveOnNoDiffs:o}){let i=os.join(n.rootDir,t);if(!Ii.existsSync(i))throw new Error(`Test not found at path '${t}' in project '${n.rootDir}'`);let a=Ii.readFileSync(i,"utf-8"),s=um.parse(a),l=dn.parse({...s,schemaVersion:r}),c=xt.array().or(dU.undefined()).parse(e.beforeSteps),u=xt.array().parse(e.steps),d=xt.array().or(dU.undefined()).parse(e.afterSteps),p={fileType:re.TEST,...l,beforeSteps:c&&c.length>0?c:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0};is({test:p,filePath:i,projectConfig:n.config,opts:{forceSaveOnNoDiffs:o,existingTest:s}})}function dm(t,e){let r=os.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=Ii.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=um.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return Tr.parse(o)}function ma(t,e,r){let n=r.project.rootDir,o;try{o=Ii.readFileSync(t,"utf-8")}catch(s){throw e.error({err:s,projectRoot:n},s.message),new Error(s.message)}let a=um.parse(o);if(!wl(a)&&(!a.steps||!Array.isArray(a.steps)))throw new Error(`Test ${t} is missing steps`);return a}function IC({testV2:t,fullFilePath:e}){let r=os.basename(e,".test.yaml"),n={id:t.id,name:r,baseUrl:t.url??"",description:t.description??void 0,schemaVersion:t.schemaVersion??Te,advanced:ko.parse(t),retries:t.retries??void 0,envs:t.env?[{name:t.env,default:!0}]:void 0,parameters:t.parameters??void 0,disabled:t.disabled,labels:t.labels??[]};return dn.parse(n)}async function $t(t,e,r){let n=ma(t,e,r),o,i;if(wl(n)){let s=tu.parse(n);o=IC({testV2:s,fullFilePath:t});let{stepLists:l}=await pS({testV2:s});i=l}else{try{o=dn.parse(n)}catch(s){throw new Error(`Test ${t} is missing metadata or has invalid metadata: ${s}`)}i={steps:n.steps??[],beforeSteps:n.beforeSteps,afterSteps:n.afterSteps}}let{resolvedTest:a}=await V0({rawSteps:i,metadata:o,logger:e,callbacks:{onFetchModule:async({id:s,logger:l})=>{let c=r.modules[s]?.fullFilePath;if(!c)return;let u=qo(c,l);if(!Vn(u))return u;let{module:d}=await _u({moduleV2:u});return d}}});return a}import K6 from"@dotenvx/dotenvx";import Y6 from"fs";import mU from"path";function hS(t,e){return(t.config.environments??[]).map(r=>_l(r.name,t,e))}function fU(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 X6(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=fU(i);s&&(n[o]=s);continue}let a;try{a=Y6.readFileSync(mU.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 J6(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=K6.config({path:mU.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 _l(t,e,r){let n=(e.config.environments??[]).find(l=>l.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={[yr]:fU(n.baseUrl)},i=X6({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=J6({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 Z6,readFileSync as e8,readdirSync as t8,writeFileSync as r8}from"fs";import{glob as n8}from"glob";import Ml,{dirname as hU}from"path";import{cwd as MC}from"process";import gU from"yaml";import{z as bt}from"zod";import Q6 from"zod";var gS=["**/*.test.yaml","**/*.module.yaml"],_C=Q6.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),SS=15;var as="momentic.config.yaml",PC="momentic.workspace.yaml",o8=bt.object({projects:bt.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),i8=bt.union([bt.string(),bt.object({fromFile:bt.string(),json:bt.boolean().optional()})]),a8=bt.object({name:_C,baseUrl:bt.string().optional().describe("Optional for mobile tests"),envFile:bt.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:bt.record(bt.string(),i8).optional(),inheritFromShell:bt.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Qs.optional().describe("NB: most things should use project-level configuration only")}),s8=bt.object({postSave:bt.string().optional()}),l8=bt.object({name:_C,include:bt.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:bt.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:bt.string().optional(),reporterDir:bt.string().optional(),outputDir:bt.string().optional(),recordVideo:bt.boolean().optional(),retries:bt.number().optional().describe("number of retries per test"),parallel:bt.number().optional().describe("degree of parallelism"),environments:bt.array(a8).optional(),gitMainBranch:bt.string().optional().readonly(),gitProtectedBranches:bt.string().array().optional().readonly(),ai:Ji.optional(),browser:Qs.optional(),emulator:mb.optional(),advanced:hT.optional(),displayRoot:bt.string().optional().describe("relative path from project root to use as the Repository root"),hooks:s8.optional()});function SU(t,e){let r;try{r=e8(t,"utf-8")}catch(o){v.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=gU.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 OC(t){let e=SU(t,"project configuration");if(e!==void 0)try{return l8.parse(e)}catch(r){v.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function c8(t){let e=SU(t,"workspace configuration");if(e!==void 0)try{return o8.parse(e)}catch(r){v.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function u8(){let t=[],e=MC(),r=Ml.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Ml.basename(e);if(fh.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 t8(e))if(a.endsWith(as)){let s=Ml.join(e,a),l=OC(s);l&&t.push({configFilePath:s,config:l,rootDir:hU(s)})}if(t.length)return t;if(e=Ml.dirname(e),e===r)break}return t}async function vt(t={}){let{configFilePath:e,nameFilter:r,skipExitOnError:n}=t,o=await LC(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 d8(t){let e=c8(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${as}`)),n=AbortSignal.timeout(2e3),o;try{o=await n8(r,{absolute:!1,cwd:MC(),dotRelative:!1,maxDepth:SS,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 ${PC} is misconfigured.`),a}let i=[];for(let a of o){let s=Ml.join(MC(),a),l=OC(s);l&&i.push({configFilePath:s,config:l,rootDir:hU(s)})}return i}async function LC(t,e){if(t){t=Ml.resolve(t);let n=OC(t);return n?[{config:n,configFilePath:t,rootDir:Ml.dirname(t)}]:(console.error(`No valid Momentic project file found at ${t}.`),e||process.exit(1),[])}if(Z6(PC)){let n=await d8(PC);if(n)return n}return u8()}function ss(t,e){let r=gU.stringify(t);r8(e,r)}import bU from"fs";import{glob as p8}from"glob";import pm from"path";import m8 from"yaml";import{z as yU}from"zod";var vU=!1,f8=yU.object({fileType:yU.nativeEnum(re)});async function fe(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??gS,o=Array.from(t.config.exclude??[]).concat(hh),i=AbortSignal.timeout(5e3),a;try{a=await p8(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:SS,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 l=h8(t.rootDir,s,r,e?In:v);l&&(r.duplicateEntities[l.id]=l.paths)}return vU=!0,r}function h8(t,e,r,n){let o=pm.join(t,e),i=g8(o,n);if(!i)return;let a=S8(i,o,n);if(!a)return;let s=f8.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let l=s.data.fileType,c=y8(o,n);if(!c)return;let u=E8(e,o,c);switch(l){case re.TEST:try{return EU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case re.TEST_V2:try{return EU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic v2 test metadata: ${d}`);return}case re.MODULE:try{return TU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case re.MODULE_V2:try{return TU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic v2 module metadata: ${d}`);return}case re.MOBILE_TEST:try{return b8(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case re.MOBILE_MODULE:try{return T8(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=l;return}}}function g8(t,e){try{return bU.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function S8(t,e,r){try{let n=m8.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 y8(t,e){try{return bU.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function E8(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:pm.sep,fullPathSegments:e.split(pm.sep),relativePathSegments:t.split(pm.sep),fileName:pm.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function EU(t,e,r,n,o,i){let a=n.fileName.replace(".test.yaml",""),s,l;e===re.TEST_V2?(s=Hb.parse(t),l=a):(s=dn.parse(t),l=s.name);let c;if(r.tests[s.id]){let u=r.tests[s.id].fullFilePath;c={id:s.id,paths:[u,o]}}return r.tests[s.id]={type:e,name:l,id:s.id,description:s.description??void 0,labels:s.labels,...n},c}function TU(t,e,r,n,o,i){let a=e===re.MODULE_V2?Ih.parse(t):rr.parse(t),s=a.moduleId,l;if(r.modules[s]){let u=r.modules[s].fullFilePath;l={id:s,paths:[u,o]}}r.modules[s]={type:e,name:a.name,id:s,description:a.description??void 0,...n};let c=n.fileName.replace(".module.yaml","");return!vU&&ht(a.name)!==c&&i.warn(`The module with ID ${a.moduleId} has a name (${a.name}) that does not match its file name (${c}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),l}function T8(t,e,r,n,o){let i=oh.parse(t),a;if(e.mobileModules[i.moduleId]){let l=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[l,n]}}let s=r.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:re.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function b8(t,e,r,n,o){let i=fb.parse(t),a;if(e.mobileTests[i.id]){let l=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[l,n]}}let s=r.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:re.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import Ou from"fs";import NC from"path";import{z as DC}from"zod";var CU="golden/visual-diff",AU="reports",ls="test-results";var v8=DC.object({width:DC.number(),height:DC.number()}),Lu=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=NC.join(e.rootDir,e.config.goldenFileDir??CU);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(mx(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=NC.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Ou.mkdirSync(NC.dirname(o),{recursive:!0}),Ou.writeFileSync(o,n.buffer),Ou.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Ou.existsSync(o)){let a=Ou.readFileSync(o),s=v8.parse(JSON.parse(Ou.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new N("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as C8}from"node:child_process";import{promisify as A8}from"node:util";import R8 from"simple-git";var RU=3e3,yt=R8(),w8=A8(C8);async function yo(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>RU&&!process.env.CI&&e.warn({operation:r,durationMs:a,thresholdMs:RU,...o??{}},"[timing] slow git metadata operation")}}function fa(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function x8(t){let e=await Rt(t,yt.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 I8(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 w8("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 _8(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return I8(t,e,r);if(o)return}catch{}}function yS(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 M8(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function Rt(t,e){try{return(await e).trim()}catch(r){if(M8(r))return;t.error({err:r},"Failed to run git command");return}}function P8(){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 O8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?fa(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 L8(t){let[e,r,n]=await Promise.all([Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?fa(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 N8(t){let[e,r,n,o]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),l=i?yS(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?fa(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?l:void 0,gitlabProjectPath:s?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function D8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?yS(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?fa(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 k8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?yS(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?fa(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 U8(t,e,r){let[n,o,i,a,s,l,c,u,d]=await Promise.all([Rt(t,yt.revparse(["HEAD"])),Rt(t,yt.revparse(["--short","HEAD"])),Rt(t,yt.revparse(["--abbrev-ref","HEAD"])),Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"])),e?Rt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),x8(t)]),p=u||(e?await Rt(t,yt.raw(["merge-base",e,"HEAD"])):void 0),m=p?await Rt(t,yt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?yS(a):void 0,S=d["user.email"]||void 0,y=d["user.name"]||void 0,E=d["user.username"]||void 0,b=d["github.user"]||void 0,I=(r?.includeHostingUsername??!0?await _8(t,a,d):void 0)??E??b??void 0;return{ciProvider:"none",gitCommitSha:n,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?fa(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:I,gitLocalEmail:S,gitLocalName:y,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?fa(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function F8(){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 B8(){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:fa(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:fa(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 z8(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function ha(t,e,r){let n=P8();if(!n)return U8(t,e,r);switch(n){case"GithubActions":return O8(t);case"GitlabCI":return L8(t);case"CircleCI":return N8(t);case"Buildkite":return D8(t);case"AzureDevOps":return k8(t);case"GCPCloudBuild":return F8();case"Custom":return B8()}}async function V8(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 yo({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 yo({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 l=await yo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(r,s,i),context:{projectPath:r,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch})}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab")}}return o}async function H8(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 l=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(r,n,s,a),context:{owner:r,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date}}catch(l){t.warn({err:l},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(r,n,a),context:{owner:r,repo:n,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message})}catch(l){t.warn({err:l},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(r,n,l,a),context:{owner:r,repo:n,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch})}catch(c){t.warn({err:c},"Failed to get merged branch from GitHub")}}return i}async function G8(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>H8(t,e,n,o,r),context:{githubRepository:r.githubRepository}})}else if(r.gitlabProjectPath){let n=r.gitlabProjectPath;return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>V8(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function vr(t,e,r,n){let o={},i={gitMainBranch:r.config.gitMainBranch};return yo({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([yo({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>z8(r),context:{projectConfigPath:r.configFilePath}}),yo({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await ha(t,r.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await yo({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>G8(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return{...a,...s,...c}},context:o})}async function wU(){try{let t=await yt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function xU(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as DJe}from"deep-object-diff";import{cloneDeep as UJe}from"lodash-es";import{v4 as QJe}from"uuid";import eQe from"yaml";import fQe from"yaml";import dr from"zod";var yQe=dr.discriminatedUnion("platform",[uh.extend({beforeSteps:dr.record(dr.string(),dr.unknown()).array().optional(),steps:dr.record(dr.string(),dr.unknown()).array(),afterSteps:dr.record(dr.string(),dr.unknown()).array().optional()}),dh.extend({beforeSteps:dr.record(dr.string(),dr.unknown()).array().optional(),steps:dr.record(dr.string(),dr.unknown()).array(),afterSteps:dr.record(dr.string(),dr.unknown()).array().optional()})]);import{randomUUID as j8}from"crypto";import cs from"fs";import Nu from"path";var _U=new Set([".DS_Store","__MACOSX"]),MU={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 $8(t,e,r){if(MU[r]){let i=MU[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 kC=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 PU(t,e){try{let r=Nu.join(e,"metadata.json");return yi.parse(JSON.parse(cs.readFileSync(r,"utf-8")))}catch{throw new kC(t,e)}}function OU(t,e,r){let n=j8(),o=t.child({runGroupId:n});cs.rmSync(e,{recursive:!0,force:!0});let i=cs.readdirSync(r).filter(l=>!_U.has(l)).map(l=>Nu.join(r,l));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);cs.mkdirSync(e,{recursive:!0});let a={...PU(r,i[0]),id:n};for(let l of i){let c=Nu.join(l,"runs");if(!cs.existsSync(c))continue;let u=PU(r,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=$8(a,u,m)}let d=cs.readdirSync(c);for(let p of d){if(_U.has(p))continue;let m=Nu.join(c,p),f=Nu.join(e,"runs",p);cs.cpSync(m,f,{recursive:!0})}}let s=Nu.join(e,"metadata.json");cs.writeFileSync(s,JSON.stringify(a,null,2))}import gF from"adm-zip";import oA from"fs";import{z as O7}from"zod";var J="v1",UC="cli",Pl="2.83.2";var W8=9e4,q8=3,K8=1500,Y8=15e3,Ko=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function X8(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var FC=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Pl&&(e[vh]=Pl),UC&&(e[CP]=UC),e}async sendRequest(e,r){let{retries:n=q8,requestTimeoutMs:o=W8,initialRetryDelayMs:i=K8,maxRetryDelayMs:a=Y8,onFailedRequest:s}=r,l=n,c=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof Ko&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new qa),l===0)throw u;let m=c-l,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 l=Date.now(),c={...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:c,signal:i.signal});if(!u.ok){let m=await X8(u);throw new Ko(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()-l,...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)}}},Nr=class extends FC{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vP]:this.mode??""}}};import{createAnthropic as P7}from"@ai-sdk/anthropic";import{InvalidArgumentError as Q8}from"@ai-sdk/provider";import{APICallError as VQe}from"@ai-sdk/provider";import{APICallError as eZ}from"@ai-sdk/provider";import{LoadAPIKeyError as bS}from"@ai-sdk/provider";import{LoadSettingError as $Qe}from"@ai-sdk/provider";import{JSONParseError as RS,TypeValidationError as aZ}from"@ai-sdk/provider";import{TypeValidationError as GC}from"@ai-sdk/provider";import{TypeValidationError as uZ}from"@ai-sdk/provider";var ES=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 BC(t){}function LU(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=BC,onError:r=BC,onRetry:n=BC,onComment:o}=t,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,y]=J8(`${i}${g}`);for(let E of S)d(E);i=y,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),y=h[g+1]===" "?2:1,E=h.slice(g+y);p(S,E,h);return}p(h,"",h)}function p(h,g,S){switch(h){case"event":c=g;break;case"data":l=`${l}${g}
|
|
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 I8(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 w8("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 _8(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return I8(t,e,r);if(o)return}catch{}}function yS(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 M8(t){if(!(t instanceof Error))return!1;let e=t.message;return e.includes("not a git repository")||e.includes("ENOENT")}async function Rt(t,e){try{return(await e).trim()}catch(r){if(M8(r))return;t.error({err:r},"Failed to run git command");return}}function P8(){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 O8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?fa(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 L8(t){let[e,r,n]=await Promise.all([Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?fa(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 N8(t){let[e,r,n,o]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),l=i?yS(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?fa(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?l:void 0,gitlabProjectPath:s?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function D8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?yS(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?fa(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 k8(t){let[e,r,n]=await Promise.all([Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?yS(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?fa(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 U8(t,e,r){let[n,o,i,a,s,l,c,u,d]=await Promise.all([Rt(t,yt.revparse(["HEAD"])),Rt(t,yt.revparse(["--short","HEAD"])),Rt(t,yt.revparse(["--abbrev-ref","HEAD"])),Rt(t,yt.listRemote(["--get-url","origin"])),Rt(t,yt.show(["--no-patch","--format=%ci"])),Rt(t,yt.show(["-s","--pretty=%B"])),Rt(t,yt.show(["-s","--pretty=%an"])),e?Rt(t,yt.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),x8(t)]),p=u||(e?await Rt(t,yt.raw(["merge-base",e,"HEAD"])):void 0),m=p?await Rt(t,yt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?yS(a):void 0,S=d["user.email"]||void 0,y=d["user.name"]||void 0,E=d["user.username"]||void 0,b=d["github.user"]||void 0,I=(r?.includeHostingUsername??!0?await _8(t,a,d):void 0)??E??b??void 0;return{ciProvider:"none",gitCommitSha:n,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?fa(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:I,gitLocalEmail:S,gitLocalName:y,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?fa(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function F8(){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 B8(){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:fa(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:fa(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 z8(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function ha(t,e,r){let n=P8();if(!n)return U8(t,e,r);switch(n){case"GithubActions":return O8(t);case"GitlabCI":return L8(t);case"CircleCI":return N8(t);case"Buildkite":return D8(t);case"AzureDevOps":return k8(t);case"GCPCloudBuild":return F8();case"Custom":return B8()}}async function V8(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 yo({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 yo({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 l=await yo({logger:t,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>e.getMergedBranchFromGitlab(r,s,i),context:{projectPath:r,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch})}catch(l){t.warn({err:l},"Failed to get merged branch from Gitlab")}}return o}async function H8(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 l=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>e.getMergeBaseCommitFromGithub(r,n,s,a),context:{owner:r,repo:n,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date}}catch(l){t.warn({err:l},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>e.getCommitFromGithub(r,n,a),context:{owner:r,repo:n,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message})}catch(l){t.warn({err:l},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await yo({logger:t,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>e.getMergedBranchFromGithub(r,n,l,a),context:{owner:r,repo:n,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch})}catch(c){t.warn({err:c},"Failed to get merged branch from GitHub")}}return i}async function G8(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>H8(t,e,n,o,r),context:{githubRepository:r.githubRepository}})}else if(r.gitlabProjectPath){let n=r.gitlabProjectPath;return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>V8(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function vr(t,e,r,n){let o={},i={gitMainBranch:r.config.gitMainBranch};return yo({logger:t,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([yo({logger:t,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>z8(r),context:{projectConfigPath:r.configFilePath}}),yo({logger:t,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await ha(t,r.config.gitMainBranch,n);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await yo({logger:t,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>G8(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return{...a,...s,...c}},context:o})}async function wU(){try{let t=await yt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function xU(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as DJe}from"deep-object-diff";import{cloneDeep as UJe}from"lodash-es";import{v4 as QJe}from"uuid";import eQe from"yaml";import fQe from"yaml";import dr from"zod";var yQe=dr.discriminatedUnion("platform",[uh.extend({beforeSteps:dr.record(dr.string(),dr.unknown()).array().optional(),steps:dr.record(dr.string(),dr.unknown()).array(),afterSteps:dr.record(dr.string(),dr.unknown()).array().optional()}),dh.extend({beforeSteps:dr.record(dr.string(),dr.unknown()).array().optional(),steps:dr.record(dr.string(),dr.unknown()).array(),afterSteps:dr.record(dr.string(),dr.unknown()).array().optional()})]);import{randomUUID as j8}from"crypto";import cs from"fs";import Nu from"path";var _U=new Set([".DS_Store","__MACOSX"]),MU={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 $8(t,e,r){if(MU[r]){let i=MU[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 kC=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 PU(t,e){try{let r=Nu.join(e,"metadata.json");return yi.parse(JSON.parse(cs.readFileSync(r,"utf-8")))}catch{throw new kC(t,e)}}function OU(t,e,r){let n=j8(),o=t.child({runGroupId:n});cs.rmSync(e,{recursive:!0,force:!0});let i=cs.readdirSync(r).filter(l=>!_U.has(l)).map(l=>Nu.join(r,l));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);cs.mkdirSync(e,{recursive:!0});let a={...PU(r,i[0]),id:n};for(let l of i){let c=Nu.join(l,"runs");if(!cs.existsSync(c))continue;let u=PU(r,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=$8(a,u,m)}let d=cs.readdirSync(c);for(let p of d){if(_U.has(p))continue;let m=Nu.join(c,p),f=Nu.join(e,"runs",p);cs.cpSync(m,f,{recursive:!0})}}let s=Nu.join(e,"metadata.json");cs.writeFileSync(s,JSON.stringify(a,null,2))}import gF from"adm-zip";import oA from"fs";import{z as O7}from"zod";var J="v1",UC="cli",Pl="2.83.3";var W8=9e4,q8=3,K8=1500,Y8=15e3,Ko=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function X8(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var FC=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Pl&&(e[vh]=Pl),UC&&(e[CP]=UC),e}async sendRequest(e,r){let{retries:n=q8,requestTimeoutMs:o=W8,initialRetryDelayMs:i=K8,maxRetryDelayMs:a=Y8,onFailedRequest:s}=r,l=n,c=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof Ko&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new qa),l===0)throw u;let m=c-l,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 l=Date.now(),c={...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:c,signal:i.signal});if(!u.ok){let m=await X8(u);throw new Ko(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()-l,...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)}}},Nr=class extends FC{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vP]:this.mode??""}}};import{createAnthropic as P7}from"@ai-sdk/anthropic";import{InvalidArgumentError as Q8}from"@ai-sdk/provider";import{APICallError as VQe}from"@ai-sdk/provider";import{APICallError as eZ}from"@ai-sdk/provider";import{LoadAPIKeyError as bS}from"@ai-sdk/provider";import{LoadSettingError as $Qe}from"@ai-sdk/provider";import{JSONParseError as RS,TypeValidationError as aZ}from"@ai-sdk/provider";import{TypeValidationError as GC}from"@ai-sdk/provider";import{TypeValidationError as uZ}from"@ai-sdk/provider";var ES=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 BC(t){}function LU(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=BC,onError:r=BC,onRetry:n=BC,onComment:o}=t,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,y]=J8(`${i}${g}`);for(let E of S)d(E);i=y,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),y=h[g+1]===" "?2:1,E=h.slice(g+y);p(S,E,h);return}p(h,"",h)}function p(h,g,S){switch(h){case"event":c=g;break;case"data":l=`${l}${g}
|
|
62
62
|
`;break;case"id":s=g.includes("\0")?void 0:g;break;case"retry":/^\d+$/.test(g)?n(parseInt(g,10)):r(new ES(`Invalid \`retry\` value: "${g}"`,{type:"invalid-retry",value:g,line:S}));break;default:r(new ES(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:g,line:S}));break}}function m(){l.length>0&&e({id:s,event:c||void 0,data:l.endsWith(`
|
|
63
63
|
`)?l.slice(0,-1):l}),s=void 0,l="",c=""}function f(h={}){i&&h.consume&&d(i),a=!0,s=void 0,l="",c="",i=""}return{feed:u,reset:f}}function J8(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]===`
|
|
@@ -77,9 +77,9 @@ ${a}
|
|
|
77
77
|
`;break}case"tool":throw new ZU({functionality:"tool messages"});default:{let a=o;throw new Error(`Unsupported role: ${a}`)}}return n+=`${r}:
|
|
78
78
|
`,{prompt:n,stopSequences:[`
|
|
79
79
|
${e}:`]}}function eF({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 tF(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 A9=wt(()=>ve(Oe.object({id:Oe.string().nullish(),created:Oe.number().nullish(),model:Oe.string().nullish(),choices:Oe.array(Oe.object({text:Oe.string(),finish_reason:Oe.string(),logprobs:Oe.object({tokens:Oe.array(Oe.string()),token_logprobs:Oe.array(Oe.number()),top_logprobs:Oe.array(Oe.record(Oe.string(),Oe.number())).nullish()}).nullish()})),usage:Oe.object({prompt_tokens:Oe.number(),completion_tokens:Oe.number(),total_tokens:Oe.number()}).nullish()}))),R9=wt(()=>ve(Oe.union([Oe.object({id:Oe.string().nullish(),created:Oe.number().nullish(),model:Oe.string().nullish(),choices:Oe.array(Oe.object({text:Oe.string(),finish_reason:Oe.string().nullish(),index:Oe.number(),logprobs:Oe.object({tokens:Oe.array(Oe.string()),token_logprobs:Oe.array(Oe.number()),top_logprobs:Oe.array(Oe.record(Oe.string(),Oe.number())).nullish()}).nullish()})),usage:Oe.object({prompt_tokens:Oe.number(),completion_tokens:Oe.number(),total_tokens:Oe.number()}).nullish()}),eA]))),rF=wt(()=>ve(Mi.object({echo:Mi.boolean().optional(),logitBias:Mi.record(Mi.string(),Mi.number()).optional(),suffix:Mi.string().optional(),user:Mi.string().optional(),logprobs:Mi.union([Mi.boolean(),Mi.number()]).optional()}))),w9=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:l,tools:c,toolChoice:u,seed:d,providerOptions:p}){let m=[],f={...await Sn({provider:"openai",providerOptions:p,schema:rF}),...await Sn({provider:this.providerOptionsName,providerOptions:p,schema:rF})};o!=null&&m.push({type:"unsupported-setting",setting:"topK"}),c?.length&&m.push({type:"unsupported-setting",setting:"tools"}),u!=null&&m.push({type:"unsupported-setting",setting:"toolChoice"}),l!=null&&l.type!=="text"&&m.push({type:"unsupported-setting",setting:"responseFormat",details:"JSON response format is not supported."});let{prompt:h,stopSequences:g}=C9({prompt:t}),S=[...g??[],...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:S.length>0?S:void 0},warnings:m}}async doGenerate(t){var e,r,n;let{args:o,warnings:i}=await this.getArgs(t),{responseHeaders:a,value:s,rawValue:l}=await yn({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),body:o,failedResponseHandler:Pi,successfulResponseHandler:To(A9),abortSignal:t.abortSignal,fetch:this.config.fetch}),c=s.choices[0],u={openai:{}};return c.logprobs!=null&&(u.openai.logprobs=c.logprobs),{content:[{type:"text",text:c.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:tF(c.finish_reason),request:{body:o},response:{...eF(s),headers:a,body:l},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 yn({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),body:n,failedResponseHandler:Pi,successfulResponseHandler:ku(R9),abortSignal:t.abortSignal,fetch:this.config.fetch}),a="unknown",s={openai:{}},l={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},c=!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}c&&(c=!1,d.enqueue({type:"response-metadata",...eF(p)}),d.enqueue({type:"text-start",id:"0"})),p.usage!=null&&(l.inputTokens=p.usage.prompt_tokens,l.outputTokens=p.usage.completion_tokens,l.totalTokens=p.usage.total_tokens);let m=p.choices[0];m?.finish_reason!=null&&(a=tF(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){c||u.enqueue({type:"text-end",id:"0"}),u.enqueue({type:"finish",finishReason:a,providerMetadata:s,usage:l})}})),request:{body:n},response:{headers:o}}}},I9=wt(()=>ve(JC.object({dimensions:JC.number().optional(),user:JC.string().optional()}))),_9=wt(()=>ve(Ol.object({data:Ol.array(Ol.object({embedding:Ol.array(Ol.number())})),usage:Ol.object({prompt_tokens:Ol.number()}).nullish()}))),M9=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 x9({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Sn({provider:"openai",providerOptions:n,schema:I9}))!=null?o:{},{responseHeaders:a,value:s,rawValue:l}=await yn({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:Dr(this.config.headers(),e),body:{model:this.modelId,input:t,encoding_format:"float",dimensions:i.dimensions,user:i.user},failedResponseHandler:Pi,successfulResponseHandler:To(_9),abortSignal:r,fetch:this.config.fetch});return{embeddings:s.data.map(c=>c.embedding),usage:s.usage?{tokens:s.usage.prompt_tokens}:void 0,response:{headers:a,body:l}}}},P9=wt(()=>ve(kr.object({created:kr.number().nullish(),data:kr.array(kr.object({b64_json:kr.string(),revised_prompt:kr.string().nullish()})),background:kr.string().nullish(),output_format:kr.string().nullish(),size:kr.string().nullish(),quality:kr.string().nullish(),usage:kr.object({input_tokens:kr.number().nullish(),output_tokens:kr.number().nullish(),total_tokens:kr.number().nullish(),input_tokens_details:kr.object({image_tokens:kr.number().nullish(),text_tokens:kr.number().nullish()}).nullish()}).nullish()}))),O9={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},L9=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),N9=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=O9[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 l,c,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=(c=(l=this.config._internal)==null?void 0:l.currentDate)==null?void 0:c.call(l))!=null?u:new Date,{value:f,responseHeaders:h}=await yn({url:this.config.url({path:"/images/generations",modelId:this.modelId}),headers:Dr(this.config.headers(),a),body:{model:this.modelId,prompt:t,n:e,size:r,...(d=i.openai)!=null?d:{},...L9.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Pi,successfulResponseHandler:To(P9),abortSignal:s,fetch:this.config.fetch});return{images:f.data.map(g=>g.b64_json),warnings:p,response:{timestamp:m,modelId:this.modelId,headers:h},providerMetadata:{openai:{images:f.data.map(g=>({...g.revised_prompt?{revisedPrompt:g.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}:{}}))}}}}},D9=Wt(()=>ve(Cr.object({code:Cr.string().nullish(),containerId:Cr.string()}))),k9=Wt(()=>ve(Cr.object({outputs:Cr.array(Cr.discriminatedUnion("type",[Cr.object({type:Cr.literal("logs"),logs:Cr.string()}),Cr.object({type:Cr.literal("image"),url:Cr.string()})])).nullish()}))),U9=Wt(()=>ve(Cr.object({container:Cr.union([Cr.string(),Cr.object({fileIds:Cr.array(Cr.string()).optional()})]).optional()}))),F9=Eo({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:D9,outputSchema:k9}),B9=(t={})=>F9(t),cF=rt.object({key:rt.string(),type:rt.enum(["eq","ne","gt","gte","lt","lte","in","nin"]),value:rt.union([rt.string(),rt.number(),rt.boolean(),rt.array(rt.string())])}),uF=rt.object({type:rt.enum(["and","or"]),filters:rt.array(rt.union([cF,rt.lazy(()=>uF)]))}),z9=Wt(()=>ve(rt.object({vectorStoreIds:rt.array(rt.string()),maxNumResults:rt.number().optional(),ranking:rt.object({ranker:rt.string().optional(),scoreThreshold:rt.number().optional()}).optional(),filters:rt.union([cF,uF]).optional()}))),V9=Wt(()=>ve(rt.object({queries:rt.array(rt.string()),results:rt.array(rt.object({attributes:rt.record(rt.string(),rt.unknown()),fileId:rt.string(),filename:rt.string(),score:rt.number(),text:rt.string()})).nullable()}))),H9=Eo({id:"openai.file_search",name:"file_search",inputSchema:rt.object({}),outputSchema:V9}),G9=Wt(()=>ve(Jr.object({background:Jr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:Jr.enum(["low","high"]).optional(),inputImageMask:Jr.object({fileId:Jr.string().optional(),imageUrl:Jr.string().optional()}).optional(),model:Jr.string().optional(),moderation:Jr.enum(["auto"]).optional(),outputCompression:Jr.number().int().min(0).max(100).optional(),outputFormat:Jr.enum(["png","jpeg","webp"]).optional(),partialImages:Jr.number().int().min(0).max(3).optional(),quality:Jr.enum(["auto","low","medium","high"]).optional(),size:Jr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),j9=Wt(()=>ve(Jr.object({}))),$9=Wt(()=>ve(Jr.object({result:Jr.string()}))),W9=Eo({id:"openai.image_generation",name:"image_generation",inputSchema:j9,outputSchema:$9}),q9=(t={})=>W9(t),dF=Wt(()=>ve($n.object({action:$n.object({type:$n.literal("exec"),command:$n.array($n.string()),timeoutMs:$n.number().optional(),user:$n.string().optional(),workingDirectory:$n.string().optional(),env:$n.record($n.string(),$n.string()).optional()})}))),pF=Wt(()=>ve($n.object({output:$n.string()}))),K9=Eo({id:"openai.local_shell",name:"local_shell",inputSchema:dF,outputSchema:pF}),Y9=Wt(()=>ve(dt.object({externalWebAccess:dt.boolean().optional(),filters:dt.object({allowedDomains:dt.array(dt.string()).optional()}).optional(),searchContextSize:dt.enum(["low","medium","high"]).optional(),userLocation:dt.object({type:dt.literal("approximate"),country:dt.string().optional(),city:dt.string().optional(),region:dt.string().optional(),timezone:dt.string().optional()}).optional()}))),X9=Wt(()=>ve(dt.object({}))),J9=Wt(()=>ve(dt.object({action:dt.discriminatedUnion("type",[dt.object({type:dt.literal("search"),query:dt.string().optional()}),dt.object({type:dt.literal("openPage"),url:dt.string().nullish()}),dt.object({type:dt.literal("findInPage"),url:dt.string().nullish(),pattern:dt.string().nullish()})]),sources:dt.array(dt.discriminatedUnion("type",[dt.object({type:dt.literal("url"),url:dt.string()}),dt.object({type:dt.literal("api"),name:dt.string()})])).optional()}))),Q9=Eo({id:"openai.web_search",name:"web_search",inputSchema:X9,outputSchema:J9}),Z9=(t={})=>Q9(t),e7=Wt(()=>ve(er.object({searchContextSize:er.enum(["low","medium","high"]).optional(),userLocation:er.object({type:er.literal("approximate"),country:er.string().optional(),city:er.string().optional(),region:er.string().optional(),timezone:er.string().optional()}).optional()}))),t7=Wt(()=>ve(er.object({}))),r7=Wt(()=>ve(er.object({action:er.discriminatedUnion("type",[er.object({type:er.literal("search"),query:er.string().optional()}),er.object({type:er.literal("openPage"),url:er.string().nullish()}),er.object({type:er.literal("findInPage"),url:er.string().nullish(),pattern:er.string().nullish()})])}))),n7=Eo({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:t7,outputSchema:r7}),o7={codeInterpreter:B9,fileSearch:H9,imageGeneration:q9,localShell:K9,webSearchPreview:n7,webSearch:Z9};function nF(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function s7({prompt:t,systemMessageMode:e,fileIdPrefixes:r,store:n,hasLocalShellTool:o=!1}){var i,a,s,l;let c=[],u=[];for(let{role:d,content:p}of t)switch(d){case"system":{switch(e){case"system":{c.push({role:"system",content:p});break}case"developer":{c.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":{c.push({role:"user",content:p.map((m,f)=>{var h,g,S;switch(m.type){case"text":return{type:"input_text",text:m.text};case"file":if(m.mediaType.startsWith("image/")){let y=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&nF(m.data,r)?{file_id:m.data}:{image_url:`data:${y};base64,${us(m.data)}`},detail:(g=(h=m.providerOptions)==null?void 0:h.openai)==null?void 0:g.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"&&nF(m.data,r)?{file_id:m.data}:{filename:(S=m.filename)!=null?S:`part-${f}.pdf`,file_data:`data:application/pdf;base64,${us(m.data)}`}};throw new a7({functionality:`file part media type ${m.mediaType}`})}}})});break}case"assistant":{let m={},f={};for(let h of p)switch(h.type){case"text":{let g=(a=(i=h.providerOptions)==null?void 0:i.openai)==null?void 0:a.itemId;if(n&&g!=null){c.push({type:"item_reference",id:g});break}c.push({role:"assistant",content:[{type:"output_text",text:h.text}],id:g});break}case"tool-call":{if(f[h.toolCallId]=h,h.providerExecuted)break;let g=(l=(s=h.providerOptions)==null?void 0:s.openai)==null?void 0:l.itemId;if(n&&g!=null){c.push({type:"item_reference",id:g});break}if(o&&h.toolName==="local_shell"){let S=await _i({value:h.input,schema:dF});c.push({type:"local_shell_call",call_id:h.toolCallId,id:g,action:{type:"exec",command:S.action.command,timeout_ms:S.action.timeoutMs,user:S.action.user,working_directory:S.action.workingDirectory,env:S.action.env}});break}c.push({type:"function_call",call_id:h.toolCallId,name:h.toolName,arguments:JSON.stringify(h.input),id:g});break}case"tool-result":{n?c.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 g=await Sn({provider:"openai",providerOptions:h.providerOptions,schema:l7}),S=g?.itemId;if(S!=null){let y=m[S];if(n)y===void 0&&(c.push({type:"item_reference",id:S}),m[S]={type:"reasoning",id:S,summary:[]});else{let E=[];h.text.length>0?E.push({type:"summary_text",text:h.text}):y!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),y===void 0?(m[S]={type:"reasoning",id:S,encrypted_content:g?.reasoningEncryptedContent,summary:E},c.push(m[S])):(y.summary.push(...E),g?.reasoningEncryptedContent!=null&&(y.encrypted_content=g.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 g=await _i({value:f.value,schema:pF});c.push({type:"local_shell_call_output",call_id:m.toolCallId,output:g.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(g=>{switch(g.type){case"text":return{type:"input_text",text:g.text};case"media":return g.mediaType.startsWith("image/")?{type:"input_image",image_url:`data:${g.mediaType};base64,${g.data}`}:{type:"input_file",filename:"data",file_data:`data:${g.mediaType};base64,${g.data}`}}});break}c.push({type:"function_call_output",call_id:m.toolCallId,output:h})}break}default:{let m=d;throw new Error(`Unsupported role: ${m}`)}}return{input:c,warnings:u}}var l7=QC.object({itemId:QC.string().nullish(),reasoningEncryptedContent:QC.string().nullish()});function oF({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 c7=wt(()=>ve(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}))]))),u7=wt(()=>ve(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()}))),mF=20,d7=["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"],Q6e=["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",...d7],p7=wt(()=>ve(Bt.object({conversation:Bt.string().nullish(),include:Bt.array(Bt.enum(["reasoning.encrypted_content","file_search_call.results","message.output_text.logprobs"])).nullish(),instructions:Bt.string().nullish(),logprobs:Bt.union([Bt.boolean(),Bt.number().min(1).max(mF)]).optional(),maxToolCalls:Bt.number().nullish(),metadata:Bt.any().nullish(),parallelToolCalls:Bt.boolean().nullish(),previousResponseId:Bt.string().nullish(),promptCacheKey:Bt.string().nullish(),promptCacheRetention:Bt.enum(["in_memory","24h"]).nullish(),reasoningEffort:Bt.string().nullish(),reasoningSummary:Bt.string().nullish(),safetyIdentifier:Bt.string().nullish(),serviceTier:Bt.enum(["auto","flex","priority","default"]).nullish(),store:Bt.boolean().nullish(),strictJsonSchema:Bt.boolean().nullish(),textVerbosity:Bt.enum(["low","medium","high"]).nullish(),truncation:Bt.enum(["auto","disabled"]).nullish(),user:Bt.string().nullish()})));async function f7({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 _i({value:a.args,schema:z9});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 _i({value:a.args,schema:e7});o.push({type:"web_search_preview",search_context_size:s.searchContextSize,user_location:s.userLocation});break}case"openai.web_search":{let s=await _i({value:a.args,schema:Y9});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 _i({value:a.args,schema:U9});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 _i({value:a.args,schema:G9});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 m7({functionality:`tool choice type: ${a}`})}}}var h7=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:l,providerOptions:c,tools:u,toolChoice:d,responseFormat:p}){var m,f,h,g;let S=[],y=lF(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),s!=null&&S.push({type:"unsupported-setting",setting:"seed"}),i!=null&&S.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&S.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&S.push({type:"unsupported-setting",setting:"stopSequences"});let E=await Sn({provider:"openai",providerOptions:c,schema:p7});E?.conversation&&E?.previousResponseId&&S.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:b,warnings:A}=await s7({prompt:l,systemMessageMode:y.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=E?.store)!=null?m:!0,hasLocalShellTool:_("openai.local_shell")});S.push(...A);let M=(f=E?.strictJsonSchema)!=null?f:!1,I=E?.include;function R(Y){I==null?I=[Y]:I.includes(Y)||(I=[...I,Y])}function _(Y){return u?.find(Z=>Z.type==="provider-defined"&&Z.id===Y)!=null}let L=typeof E?.logprobs=="number"?E?.logprobs:E?.logprobs===!0?mF:void 0;L&&R("message.output_text.logprobs");let V=(h=u?.find(Y=>Y.type==="provider-defined"&&(Y.id==="openai.web_search"||Y.id==="openai.web_search_preview")))==null?void 0:h.name;V&&R("web_search_call.action.sources"),_("openai.code_interpreter")&&R("code_interpreter_call.outputs");let k=E?.store;k===!1&&y.isReasoningModel&&R("reasoning.encrypted_content");let H={model:this.modelId,input:b,temperature:e,top_p:n,max_output_tokens:t,...(p?.type==="json"||E?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:M,name:(g=p.name)!=null?g:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...E?.textVerbosity&&{verbosity:E.textVerbosity}}},conversation:E?.conversation,max_tool_calls:E?.maxToolCalls,metadata:E?.metadata,parallel_tool_calls:E?.parallelToolCalls,previous_response_id:E?.previousResponseId,store:k,user:E?.user,instructions:E?.instructions,service_tier:E?.serviceTier,include:I,prompt_cache_key:E?.promptCacheKey,prompt_cache_retention:E?.promptCacheRetention,safety_identifier:E?.safetyIdentifier,top_logprobs:L,truncation:E?.truncation,...y.isReasoningModel&&(E?.reasoningEffort!=null||E?.reasoningSummary!=null)&&{reasoning:{...E?.reasoningEffort!=null&&{effort:E.reasoningEffort},...E?.reasoningSummary!=null&&{summary:E.reasoningSummary}}}};y.isReasoningModel?E?.reasoningEffort==="none"&&y.supportsNonReasoningParameters||(H.temperature!=null&&(H.temperature=void 0,S.push({type:"unsupported-setting",setting:"temperature",details:"temperature is not supported for reasoning models"})),H.top_p!=null&&(H.top_p=void 0,S.push({type:"unsupported-setting",setting:"topP",details:"topP is not supported for reasoning models"}))):(E?.reasoningEffort!=null&&S.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),E?.reasoningSummary!=null&&S.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),E?.serviceTier==="flex"&&!y.supportsFlexProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"flex processing is only available for o3, o4-mini, and gpt-5 models"}),delete H.service_tier),E?.serviceTier==="priority"&&!y.supportsPriorityProcessing&&(S.push({type:"unsupported-setting",setting:"serviceTier",details:"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported"}),delete H.service_tier);let{tools:z,toolChoice:le,toolWarnings:W}=await f7({tools:u,toolChoice:d,strictJsonSchema:M});return{webSearchToolName:V,args:{...H,tools:z,tool_choice:le},warnings:[...S,...W],store:k}}async doGenerate(t){var e,r,n,o,i,a,s,l,c,u,d,p,m,f,h,g,S,y,E,b,A,M,I,R,_,L,V,k;let{args:H,warnings:z,webSearchToolName:le}=await this.getArgs(t),W=this.config.url({path:"/responses",modelId:this.modelId}),Y=this.config.provider.replace(".responses",""),{responseHeaders:Z,value:ce,rawValue:ye}=await yn({url:W,headers:Dr(this.config.headers(),t.headers),body:H,failedResponseHandler:Pi,successfulResponseHandler:To(u7),abortSignal:t.abortSignal,fetch:this.config.fetch});if(ce.error)throw new i7({message:ce.error.message,url:W,requestBodyValues:H,statusCode:400,responseHeaders:Z,responseBody:ye,isRetryable:!1});let Me=[],ie=[],Ce=!1;for(let x of ce.output)switch(x.type){case"reasoning":{x.summary.length===0&&x.summary.push({type:"summary_text",text:""});for(let de of x.summary)Me.push({type:"reasoning",text:de.text,providerMetadata:{[Y]:{itemId:x.id,reasoningEncryptedContent:(e=x.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{Me.push({type:"tool-call",toolCallId:x.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),Me.push({type:"tool-result",toolCallId:x.id,toolName:"image_generation",result:{result:x.result},providerExecuted:!0});break}case"local_shell_call":{Me.push({type:"tool-call",toolCallId:x.call_id,toolName:"local_shell",input:JSON.stringify({action:x.action}),providerMetadata:{[Y]:{itemId:x.id}}});break}case"message":{for(let de of x.content){(n=(r=t.providerOptions)==null?void 0:r.openai)!=null&&n.logprobs&&de.logprobs&&ie.push(de.logprobs),Me.push({type:"text",text:de.text,providerMetadata:{[Y]:{itemId:x.id}}});for(let Re of de.annotations)Re.type==="url_citation"?Me.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:jn(),url:Re.url,title:Re.title}):Re.type==="file_citation"?Me.push({type:"source",sourceType:"document",id:(c=(l=(s=this.config).generateId)==null?void 0:l.call(s))!=null?c:jn(),mediaType:"text/plain",title:(d=(u=Re.quote)!=null?u:Re.filename)!=null?d:"Document",filename:(p=Re.filename)!=null?p:Re.file_id,...Re.file_id?{providerMetadata:{[Y]:{fileId:Re.file_id}}}:{}}):Re.type==="container_file_citation"?Me.push({type:"source",sourceType:"document",id:(h=(f=(m=this.config).generateId)==null?void 0:f.call(m))!=null?h:jn(),mediaType:"text/plain",title:(S=(g=Re.filename)!=null?g:Re.file_id)!=null?S:"Document",filename:(y=Re.filename)!=null?y:Re.file_id,providerMetadata:{[Y]:{fileId:Re.file_id,containerId:Re.container_id,...Re.index!=null?{index:Re.index}:{}}}}):Re.type==="file_path"&&Me.push({type:"source",sourceType:"document",id:(A=(b=(E=this.config).generateId)==null?void 0:b.call(E))!=null?A:jn(),mediaType:"application/octet-stream",title:Re.file_id,filename:Re.file_id,providerMetadata:{[Y]:{fileId:Re.file_id,...Re.index!=null?{index:Re.index}:{}}}})}break}case"function_call":{Ce=!0,Me.push({type:"tool-call",toolCallId:x.call_id,toolName:x.name,input:x.arguments,providerMetadata:{[Y]:{itemId:x.id}}});break}case"web_search_call":{Me.push({type:"tool-call",toolCallId:x.id,toolName:le??"web_search",input:JSON.stringify({}),providerExecuted:!0}),Me.push({type:"tool-result",toolCallId:x.id,toolName:le??"web_search",result:aF(x.action),providerExecuted:!0});break}case"computer_call":{Me.push({type:"tool-call",toolCallId:x.id,toolName:"computer_use",input:"",providerExecuted:!0}),Me.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":{Me.push({type:"tool-call",toolCallId:x.id,toolName:"file_search",input:"{}",providerExecuted:!0}),Me.push({type:"tool-result",toolCallId:x.id,toolName:"file_search",result:{queries:x.queries,results:(I=(M=x.results)==null?void 0:M.map(de=>({attributes:de.attributes,fileId:de.file_id,filename:de.filename,score:de.score,text:de.text})))!=null?I:null},providerExecuted:!0});break}case"code_interpreter_call":{Me.push({type:"tool-call",toolCallId:x.id,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:x.container_id}),providerExecuted:!0}),Me.push({type:"tool-result",toolCallId:x.id,toolName:"code_interpreter",result:{outputs:x.outputs},providerExecuted:!0});break}}let Le={[Y]:{...ce.id!=null?{responseId:ce.id}:{}}};ie.length>0&&(Le[Y].logprobs=ie),typeof ce.service_tier=="string"&&(Le[Y].serviceTier=ce.service_tier);let Ae=ce.usage;return{content:Me,finishReason:oF({finishReason:(R=ce.incomplete_details)==null?void 0:R.reason,hasFunctionCall:Ce}),usage:{inputTokens:Ae.input_tokens,outputTokens:Ae.output_tokens,totalTokens:Ae.input_tokens+Ae.output_tokens,reasoningTokens:(L=(_=Ae.output_tokens_details)==null?void 0:_.reasoning_tokens)!=null?L:void 0,cachedInputTokens:(k=(V=Ae.input_tokens_details)==null?void 0:V.cached_tokens)!=null?k:void 0},request:{body:H},response:{id:ce.id,timestamp:new Date(ce.created_at*1e3),modelId:ce.model,headers:Z,body:ye},providerMetadata:Le,warnings:z}}async doStream(t){let{args:e,warnings:r,webSearchToolName:n,store:o}=await this.getArgs(t),{responseHeaders:i,value:a}=await yn({url:this.config.url({path:"/responses",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),body:{...e,stream:!0},failedResponseHandler:Pi,successfulResponseHandler:ku(c7),abortSignal:t.abortSignal,fetch:this.config.fetch}),s=this,l=this.config.provider.replace(".responses",""),c="unknown",u={inputTokens:void 0,outputTokens:void 0,totalTokens:void 0},d=[],p=null,m={},f=[],h=!1,g={},S;return{stream:a.pipeThrough(new TransformStream({start(y){y.enqueue({type:"stream-start",warnings:r})},transform(y,E){var b,A,M,I,R,_,L,V,k,H,z,le,W,Y,Z,ce,ye,Me,ie,Ce,Le,Ae;if(t.includeRawChunks&&E.enqueue({type:"raw",rawValue:y.rawValue}),!y.success){c="error",E.enqueue({type:"error",error:y.error});return}let x=y.value;if(iF(x))x.item.type==="function_call"?(m[x.output_index]={toolName:x.item.name,toolCallId:x.item.call_id},E.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},E.enqueue({type:"tool-input-start",id:x.item.id,toolName:n??"web_search",providerExecuted:!0}),E.enqueue({type:"tool-input-end",id:x.item.id}),E.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},E.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}},E.enqueue({type:"tool-input-start",id:x.item.id,toolName:"code_interpreter",providerExecuted:!0}),E.enqueue({type:"tool-input-delta",id:x.item.id,delta:`{"containerId":"${x.item.container_id}","code":"`})):x.item.type==="file_search_call"?E.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):x.item.type==="image_generation_call"?E.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):x.item.type==="message"?(f.splice(0,f.length),E.enqueue({type:"text-start",id:x.item.id,providerMetadata:{[l]:{itemId:x.item.id}}})):iF(x)&&x.item.type==="reasoning"&&(g[x.item.id]={encryptedContent:x.item.encrypted_content,summaryParts:{0:"active"}},E.enqueue({type:"reasoning-start",id:`${x.item.id}:0`,providerMetadata:{[l]:{itemId:x.item.id,reasoningEncryptedContent:(b=x.item.encrypted_content)!=null?b:null}}}));else if(S7(x)){if(x.item.type==="message")E.enqueue({type:"text-end",id:x.item.id,providerMetadata:{[l]:{itemId:x.item.id,...f.length>0&&{annotations:f}}}});else if(x.item.type==="function_call")m[x.output_index]=void 0,h=!0,E.enqueue({type:"tool-input-end",id:x.item.call_id}),E.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:x.item.name,input:x.item.arguments,providerMetadata:{[l]:{itemId:x.item.id}}});else if(x.item.type==="web_search_call")m[x.output_index]=void 0,E.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:n??"web_search",result:aF(x.item.action),providerExecuted:!0});else if(x.item.type==="computer_call")m[x.output_index]=void 0,E.enqueue({type:"tool-input-end",id:x.item.id}),E.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),E.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,E.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"file_search",result:{queries:x.item.queries,results:(M=(A=x.item.results)==null?void 0:A.map(de=>({attributes:de.attributes,fileId:de.file_id,filename:de.filename,score:de.score,text:de.text})))!=null?M:null},providerExecuted:!0});else if(x.item.type==="code_interpreter_call")m[x.output_index]=void 0,E.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")E.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,E.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:{[l]:{itemId:x.item.id}}});else if(x.item.type==="reasoning"){let de=g[x.item.id],Re=Object.entries(de.summaryParts).filter(([Nn,ni])=>ni==="active"||ni==="can-conclude").map(([Nn])=>Nn);for(let Nn of Re)E.enqueue({type:"reasoning-end",id:`${x.item.id}:${Nn}`,providerMetadata:{[l]:{itemId:x.item.id,reasoningEncryptedContent:(I=x.item.encrypted_content)!=null?I:null}}});delete g[x.item.id]}}else if(T7(x)){let de=m[x.output_index];de!=null&&E.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:x.delta})}else if(b7(x)){let de=m[x.output_index];de!=null&&E.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:JSON.stringify(x.delta).slice(1,-1)})}else if(v7(x)){let de=m[x.output_index];de!=null&&(E.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:'"}'}),E.enqueue({type:"tool-input-end",id:de.toolCallId}),E.enqueue({type:"tool-call",toolCallId:de.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:de.codeInterpreter.containerId}),providerExecuted:!0}))}else if(E7(x))p=x.response.id,E.enqueue({type:"response-metadata",id:x.response.id,timestamp:new Date(x.response.created_at*1e3),modelId:x.response.model});else if(g7(x))E.enqueue({type:"text-delta",id:x.item_id,delta:x.delta}),(_=(R=t.providerOptions)==null?void 0:R.openai)!=null&&_.logprobs&&x.logprobs&&d.push(x.logprobs);else if(x.type==="response.reasoning_summary_part.added"){if(x.summary_index>0){let de=g[x.item_id];de.summaryParts[x.summary_index]="active";for(let Re of Object.keys(de.summaryParts))de.summaryParts[Re]==="can-conclude"&&(E.enqueue({type:"reasoning-end",id:`${x.item_id}:${Re}`,providerMetadata:{[l]:{itemId:x.item_id}}}),de.summaryParts[Re]="concluded");E.enqueue({type:"reasoning-start",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[l]:{itemId:x.item_id,reasoningEncryptedContent:(V=(L=g[x.item_id])==null?void 0:L.encryptedContent)!=null?V:null}}})}}else x.type==="response.reasoning_summary_text.delta"?E.enqueue({type:"reasoning-delta",id:`${x.item_id}:${x.summary_index}`,delta:x.delta,providerMetadata:{[l]:{itemId:x.item_id}}}):x.type==="response.reasoning_summary_part.done"?o?(E.enqueue({type:"reasoning-end",id:`${x.item_id}:${x.summary_index}`,providerMetadata:{[l]:{itemId:x.item_id}}}),g[x.item_id].summaryParts[x.summary_index]="concluded"):g[x.item_id].summaryParts[x.summary_index]="can-conclude":y7(x)?(c=oF({finishReason:(k=x.response.incomplete_details)==null?void 0:k.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=(z=(H=x.response.usage.output_tokens_details)==null?void 0:H.reasoning_tokens)!=null?z:void 0,u.cachedInputTokens=(W=(le=x.response.usage.input_tokens_details)==null?void 0:le.cached_tokens)!=null?W:void 0,typeof x.response.service_tier=="string"&&(S=x.response.service_tier)):C7(x)?(f.push(x.annotation),x.annotation.type==="url_citation"?E.enqueue({type:"source",sourceType:"url",id:(ce=(Z=(Y=s.config).generateId)==null?void 0:Z.call(Y))!=null?ce:jn(),url:x.annotation.url,title:x.annotation.title}):x.annotation.type==="file_citation"&&E.enqueue({type:"source",sourceType:"document",id:(ie=(Me=(ye=s.config).generateId)==null?void 0:Me.call(ye))!=null?ie:jn(),mediaType:"text/plain",title:(Le=(Ce=x.annotation.quote)!=null?Ce:x.annotation.filename)!=null?Le:"Document",filename:(Ae=x.annotation.filename)!=null?Ae:x.annotation.file_id,...x.annotation.file_id?{providerMetadata:{[l]:{fileId:x.annotation.file_id}}}:{}})):A7(x)&&E.enqueue({type:"error",error:x})},flush(y){let E={[l]:{responseId:p}};d.length>0&&(E[l].logprobs=d),S!==void 0&&(E[l].serviceTier=S),y.enqueue({type:"finish",finishReason:c,usage:u,providerMetadata:E})}})),request:{body:e},response:{headers:i}}}};function g7(t){return t.type==="response.output_text.delta"}function S7(t){return t.type==="response.output_item.done"}function y7(t){return t.type==="response.completed"||t.type==="response.incomplete"}function E7(t){return t.type==="response.created"}function T7(t){return t.type==="response.function_call_arguments.delta"}function b7(t){return t.type==="response.code_interpreter_call_code.delta"}function v7(t){return t.type==="response.code_interpreter_call_code.done"}function iF(t){return t.type==="response.output_item.added"}function C7(t){return t.type==="response.output_text.annotation.added"}function A7(t){return t.type==="error"}function aF(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 R7=wt(()=>ve(ZC.object({instructions:ZC.string().nullish(),speed:ZC.number().min(.25).max(4).default(1).nullish()}))),w7=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=[],l=await Sn({provider:"openai",providerOptions:a,schema:R7}),c={model:this.modelId,input:t,voice:e,response_format:"mp3",speed:n,instructions:o};if(r&&(["mp3","opus","aac","flac","wav","pcm"].includes(r)?c.response_format=r:s.push({type:"unsupported-setting",setting:"outputFormat",details:`Unsupported output format: ${r}. Using mp3 instead.`})),l){let u={};for(let d in u){let p=u[d];p!==void 0&&(c[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:c,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:l,rawValue:c}=await yn({url:this.config.url({path:"/audio/speech",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),body:i,failedResponseHandler:Pi,successfulResponseHandler:jU(),abortSignal:t.abortSignal,fetch:this.config.fetch});return{audio:s,warnings:a,request:{body:JSON.stringify(i)},response:{timestamp:o,modelId:this.modelId,headers:l,body:c}}}},x7=wt(()=>ve(qt.object({text:qt.string(),language:qt.string().nullish(),duration:qt.number().nullish(),words:qt.array(qt.object({word:qt.string(),start:qt.number(),end:qt.number()})).nullish(),segments:qt.array(qt.object({id:qt.number(),seek:qt.number(),start:qt.number(),end:qt.number(),text:qt.string(),tokens:qt.array(qt.number()),temperature:qt.number(),avg_logprob:qt.number(),compression_ratio:qt.number(),no_speech_prob:qt.number()})).nullish()}))),I7=wt(()=>ve(ps.object({include:ps.array(ps.string()).optional(),language:ps.string().optional(),prompt:ps.string().optional(),temperature:ps.number().min(0).max(1).default(0).optional(),timestampGranularities:ps.array(ps.enum(["word","segment"])).default(["segment"]).optional()}))),sF={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"},_7=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 Sn({provider:"openai",providerOptions:r,schema:I7}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([XU(t)]);i.append("model",this.modelId);let s=BU(e);if(i.append("file",new File([a],"audio",{type:e}),`audio.${s}`),o){let l={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[c,u]of Object.entries(l))if(u!=null)if(Array.isArray(u))for(let d of u)i.append(`${c}[]`,String(d));else i.append(c,String(u))}return{formData:i,warnings:n}}async doGenerate(t){var e,r,n,o,i,a,s,l;let c=(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 VU({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),formData:u,failedResponseHandler:Pi,successfulResponseHandler:To(x7),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in sF?sF[p.language]:void 0;return{text:p.text,segments:(s=(a=(o=p.segments)==null?void 0:o.map(g=>({text:g.text,startSecond:g.start,endSecond:g.end})))!=null?a:(i=p.words)==null?void 0:i.map(g=>({text:g.word,startSecond:g.start,endSecond:g.end})))!=null?s:[],language:h,durationInSeconds:(l=p.duration)!=null?l:void 0,warnings:d,response:{timestamp:c,modelId:this.modelId,headers:m,body:f}}}},M7="2.0.89";function tA(t={}){var e,r;let n=(e=JU(FU({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>$C({Authorization:`Bearer ${UU({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${M7}`),a=h=>new b9(h,{provider:`${o}.chat`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),s=h=>new w9(h,{provider:`${o}.completion`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),l=h=>new M9(h,{provider:`${o}.embedding`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),c=h=>new N9(h,{provider:`${o}.image`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),u=h=>new _7(h,{provider:`${o}.transcription`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),d=h=>new w7(h,{provider:`${o}.speech`,url:({path:g})=>`${n}${g}`,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 h7(h,{provider:`${o}.responses`,url:({path:g})=>`${n}${g}`,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=l,f.textEmbedding=l,f.textEmbeddingModel=l,f.image=c,f.imageModel=c,f.transcription=u,f.transcriptionModel=u,f.speech=d,f.speechModel=d,f.tools=o7,f}var c8e=tA();function fF(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[vh]:Pl??"",...r&&{[RP]:r},...n||{}};return o&&(i[AP]=JSON.stringify(o)),i}var _S=t=>e=>{let r=fF(t);return P7({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},MS=t=>e=>{let r=fF(t);return tA({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var Qr=class extends Nr{agentConfig;constructor(e,r){let n={...Nc,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return g_.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${J}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Pl,...e},signal:r.abortSignal});return h_.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${J}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return O7.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(`/${J}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return PP.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(`/${J}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return Rb.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return MP.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return xP.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return IP.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return _P.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(`/${J}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return Rb.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${J}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return wP.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${J}/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(`/${J}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return sT.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${J}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return OP.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${J}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return Pf.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return HI.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${J}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return GI.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${J}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return zE.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${J}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return P_.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${J}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return FI.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${J}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return zI.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${J}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return BI.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${J}/web-agent/iframe-regex`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Uw.parse(n)}getAnthropicModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return _S({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Xe(n),promptType:o},sessionId:r})}getOpenAIModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return MS({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Xe(n),promptType:o},sessionId:r})}};import{z as rA}from"zod";var ct=class extends Nr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return Zc(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${J}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return WP.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${J}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return VP.parse(r)}async getRunExport(e){let r=await this.sendRequest(`/${J}/runs/${encodeURIComponent(e)}/export`,{method:"GET",retries:3,requestTimeoutMs:1e4});return GP.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${J}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return NP.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${J}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${J}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return kP.parse(n)}async deleteStepCacheEntry(e,r){await this.sendRequest(`/${J}/cache/entry`,{method:"DELETE",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4})}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${J}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return wb.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(`/${J}/${this.cacheRouteForPlatform(e)}/traces`,{method:"POST",body:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return wb.parse(n)}async updateMobileStepCaches(e){await this.sendRequest(`/${J}/${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(`/${J}/${this.cacheRouteForPlatform(e)}`,{method:"POST",body:r,extraHeaders:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return UP(sh(e)).parse(o)}async queueTests(e){let r=await this.sendRequest(`/${J}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return LP.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${J}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return $P.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${J}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${J}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${J}/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(`/${J}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return qP.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${J}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return dO.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${J}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${J}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${J}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${J}/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(`/${J}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return KP.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${J}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return c_.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${J}/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(`/${J}/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(`/${J}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return YP.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${J}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${J}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return XP.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${J}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return JP.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${J}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return QP.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${J}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return SO.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${J}/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(`/${J}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ep.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${J}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ep.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${J}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Mb.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(`/${J}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ep.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${J}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ep.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${J}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Mb.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${J}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return rA.record(rA.string(),rA.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${J}/quarantine`,{method:"GET"});return ZP.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${J}/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(`/${J}/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(`/${J}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return eO.parse(r)}async extendEmulatorTtl(e,r){try{await this.sendRequest(`/${J}/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(`/${J}/limbar/${this.platformRoute(o)}/upload-url`,{method:"POST",retries:3,body:i,requestTimeoutMs:15e3,logResponse:!0});return rO.parse(a)}async deleteAndroidEmulator(e){await this.sendRequest(`/${J}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getMobileAssets(){let e=await this.sendRequest(`/${J}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return nO.parse(e)}async getLimbarAssetDownloadUrl(e,r,n){let o=await this.sendRequest(`/${J}/limbar/assets/${e}/${r}/${this.platformRoute(n)}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return oO.parse(o)}async deleteAsset(e,r,n){await this.sendRequest(`/${J}/limbar/assets/${e}/${r}/${this.platformRoute(n)}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${J}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return tO.parse(r)}async deleteIosEmulator(e){await this.sendRequest(`/${J}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${J}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return FM.parse(r)}async generateMcpSessionTraceUploadUrl(e){let r=await this.sendRequest(`/${J}/mcp/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return xb.parse(r)}};async function PS(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 OS=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var ms=class extends Nr{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${J}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return Fw.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal,loggerTags:r.loggerTags})}};var Uu=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return Zc(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 L7,en as N7}from"@faker-js/faker";var Fu="v1",Oi=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 L7({locale:N7}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Fu}/tools/ai/generate`,{method:"POST",body:r}).catch(n=>{throw n instanceof Ko?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Fu}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof Ko?new Error(r.rawError):new Error(`Failed to send sms: ${r.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Fu}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof Ko?new Error(r.rawError):r})}async sendEmail(e){return this.httpClient.sendRequest(`/${Fu}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof Ko?new Error(r.rawError):new Error(`Failed to send email: ${r.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Fu}/tools/email/fetchAll`,{method:"POST",body:e}).catch(r=>{throw r instanceof Ko?new Error(r.rawError):new Error(`Failed to fetch all emails: ${r.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Fu}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof Ko?new Error(r.rawError):new Error(`Failed to fetch latest emails: ${r.message}`)})}};function hF(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var LS=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await hF(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 Jo({logger:t,orgId:e,client:r,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a,isolateCachesByEnvironment:s=!1,bustOldestCachePercentage:l}){return a?new Ch:new nA(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:l,isolateCachesByEnvironment:s})}var nA=class{constructor(e,r,n,o,i){this.orgId=r;this.client=n;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:l,isolateCachesByEnvironment:c}=i,{gitBranchName:u,gitProtectedBranches:d}=o;e.info({options:i,gitBranchName:u,gitProtectedBranches:d},"Cache storage initialization options"),this.cacheHeaders=yp(o),this.isolateCachesByEnvironment=c,this.readCaches=!a;let p=u&&d.includes(u);s||!p?this.writeCaches=!0:this.writeCaches=!1,p||(this.bustOldestCachePercentage=l)}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:Pb(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 l=s.length,c=Math.max(1,Math.floor(l*this.bustOldestCachePercentage/100));s.slice(0,c).forEach(({key:u})=>{delete i[u]}),e.logger.info({nCachesToBust:c,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:l},"Busted oldest caches")}for(let s of[r,n,o])s&&aa({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 jt({stepLists:e.stepLists,cacheCreationParams:{environment:e.environment,testId:e.testId,orgId:this.orgId}});this.saveStepCacheEntries({entries:a,logger:e.logger})}};import NS from"path";function D7(t){let e=new gF,r=NS.join(t,"metadata.json"),n=yi.parse(JSON.parse(oA.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of oA.readdirSync(NS.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new gF(NS.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(NS.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function DS(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!oA.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new LS(e);try{let{runGroupId:i,buffer:a}=D7(n),s=await o.uploadResultsArchive(i,a),l=`${e.getAppUrl()}/run-groups/${s}`;r.success(`Successfully uploaded test results. Once processed, your results can be found at ${l}`);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 k7 from"adm-zip";import Zr from"fs";import bo from"path";var fm=class t{constructor(e){this.filePath=e;Zr.rmSync(this.filePath,{recursive:!0,force:!0}),Zr.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(bo.join(this.filePath,e));return this.children.push(r),r}cwd(){return this.filePath}mkdir(e){Zr.mkdirSync(bo.join(this.filePath,e),{recursive:!0})}readFile(e){let r=bo.join(this.filePath,e);if(Zr.existsSync(r))return Zr.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=bo.join(this.filePath,r);try{Zr.writeFileSync(o,n)}catch{}}createFileStream(e){let r=bo.join(this.filePath,e),n=Zr.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new iA(bo.join(this.filePath,"runs"),e);return this.children.push(r),r}},iA=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=bo.join(e,`temp-storage-${r}`),this.finalPath=bo.join(e,`${r}.zip`),Zr.rmSync(this.tempPath,{recursive:!0,force:!0}),Zr.rmSync(this.finalPath,{recursive:!0,force:!0}),Zr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=bo.join(this.tempPath,e);if(Zr.existsSync(r))return Zr.readFileSync(r)}mkdir(e){Zr.mkdirSync(bo.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new fm(bo.join(this.tempPath,e));return this.children.push(r),r}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=bo.join(this.tempPath,r);Zr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new k7;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Zr.writeFileSync(this.finalPath,r),Zr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import U7 from"adm-zip";import{randomUUID as F7}from"crypto";import pr from"fs";import Ur from"path";function TF(t){try{return pr.existsSync(t)?JSON.parse(pr.readFileSync(t,"utf-8")):void 0}catch{return}}function SF(t){return pr.existsSync(t)?pr.readFileSync(t,"utf-8").split(`
|
|
80
|
-
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function B7(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Ur.join(t.inflatedPath,"attempts",r);let n=Ur.join(t.inflatedPath,"attempts");if(!pr.existsSync(n))return;let o=pr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Ur.join(n,i,"metadata.json"),s=TF(a);if(typeof s!="object"||s===null)continue;let l=s.id;if(typeof l=="string"&&l===e)return t.attemptIdToAttemptNumber.set(e,i),Ur.join(n,i)}}function yF(t,e,r){let n=Ur.join(t,"attempts");if(!pr.existsSync(n))return;let o=pr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Ur.join(n,i,"assets",`${e}.${r}`);if(pr.existsSync(a))return a}}var kS=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Ur.join(e,"runs"),this.zipPath=Ur.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||!pr.existsSync(this.zipPath))return;let n=Ur.join(this.runsDir,`temp-unzipped-${e}-${F7()}`);pr.mkdirSync(n,{recursive:!0}),new U7(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())pr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return B7(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Ur.join(e,"assets");return pr.existsSync(r)?pr.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Ur.join(r,o.name)).filter(o=>{let i=Ur.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Ur.join(n,"assets",`${e}.${r}`);if(pr.existsSync(o))try{return pr.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=TF(Ur.join(o,"console.json")),a=gb.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=Ur.join(o,"assets","har-pages.log"),a=Ur.join(o,"assets","har-entries.log"),s={};for(let u of SF(i)){let d=mp.safeParse(EF(u));d.success&&(s[d.data.id]=d.data)}let l={},c=SF(a);for(let u=0;u<c.length;u++){let d=c[u],p=fp.safeParse(EF(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;l[m]=p.data}if(Object.keys(l).length!==0)return yb(s,l)}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=yF(o.inflatedPath,r,"html");if(i)try{return pr.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=yF(o.inflatedPath,r,"xml");if(i)try{return pr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),
|
|
80
|
+
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function B7(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Ur.join(t.inflatedPath,"attempts",r);let n=Ur.join(t.inflatedPath,"attempts");if(!pr.existsSync(n))return;let o=pr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Ur.join(n,i,"metadata.json"),s=TF(a);if(typeof s!="object"||s===null)continue;let l=s.id;if(typeof l=="string"&&l===e)return t.attemptIdToAttemptNumber.set(e,i),Ur.join(n,i)}}function yF(t,e,r){let n=Ur.join(t,"attempts");if(!pr.existsSync(n))return;let o=pr.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Ur.join(n,i,"assets",`${e}.${r}`);if(pr.existsSync(a))return a}}var kS=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Ur.join(e,"runs"),this.zipPath=Ur.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||!pr.existsSync(this.zipPath))return;let n=Ur.join(this.runsDir,`temp-unzipped-${e}-${F7()}`);pr.mkdirSync(n,{recursive:!0}),new U7(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())pr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return B7(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Ur.join(e,"assets");return pr.existsSync(r)?pr.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Ur.join(r,o.name)).filter(o=>{let i=Ur.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Ur.join(n,"assets",`${e}.${r}`);if(pr.existsSync(o))try{return pr.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=TF(Ur.join(o,"console.json")),a=gb.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=Ur.join(o,"assets","har-pages.log"),a=Ur.join(o,"assets","har-entries.log"),s={};for(let u of SF(i)){let d=mp.safeParse(EF(u));d.success&&(s[d.data.id]=d.data)}let l={},c=SF(a);for(let u=0;u<c.length;u++){let d=c[u],p=fp.safeParse(EF(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;l[m]=p.data}if(Object.keys(l).length!==0)return yb(s,l)}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=yF(o.inflatedPath,r,"html");if(i)try{return pr.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=yF(o.inflatedPath,r,"xml");if(i)try{return pr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir();if(o)for(let i of["png","jpeg"])try{return pr.readFileSync(Ur.join(o,"assets",`${r}.${i}`))}catch{continue}}};function EF(t){try{return JSON.parse(t)}catch{return}}function US({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??z7(t),i,a={};if(o){try{i=n(o)}catch(l){throw new Error(`Failed to resolve environment ${o} for test ${t.name}: ${String(l)}`)}a=i.variables}let s=t.baseUrl;if(r)s=r;else if(!s){let l=a[yr];typeof l=="string"&&(s=l)}if(!s)throw new Error(`Cannot run test with no base URL and no ${yr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function z7(t){for(let e of t.envs??[])if(e.default)return e.name}var V7={test:"tests",module:"modules",mobileTest:"mobileTests",mobileModule:"mobileModules"};async function fs(t,e,r){let n=await fe(t),o=n[V7[r]],i=H7(o,e);if(e.id){if(i.length===0)throw new Sr(`No ${r} found with id '${e.id}' in project '${t.rootDir}'.`);return FS(i,n)}if(e.name){if(i.length===0)throw new Sr(`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 Sr([`Multiple ${r}s found with exact name '${e.name}'. Please disambiguate by id or path.`,JSON.stringify(a,null,2)].join(`
|
|
81
81
|
`))}return FS(i,n)}if(e.path){let a=e.path;if(i.length===0)throw new Sr(`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(c=>c.fullFilePath===a||c.relativePath===a||c.fullFilePath.endsWith(`/${a}`)||c.relativePath.endsWith(`/${a}`));if(s.length===1)return FS(s,n);let l=i.map(c=>({id:c.id,path:c.fullFilePath}));throw new Sr([`Multiple ${r}s matched the provided path '${a}'. Please pass the absolute path.`,JSON.stringify(l,null,2)].join(`
|
|
82
|
-
`))}return FS(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function FS(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 H7(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 BS from"fs";import G7 from"path";var j7=new Gg(30,60*1e3),HS="https://api.momentic.ai",aA,bF,GS=t=>{HS=t},Kt=()=>HS,vF=()=>Zc(HS),jS=t=>{bF=t},Ll=()=>bF,hs=()=>aA;var Bu,sA,zS,$S=async t=>{if(aA&&Bu&&zS)return Bu;let e=new ct({baseUrl:HS,apiKey:t,logger:v});aA=e;try{let r=await e.getAuthInfo();return Bu=r.orgId,sA=r.userId,zS=t,Bu}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},tr=()=>{if(!Bu)throw new Error("Your organization ID is invalid.");return Bu},Li=()=>{if(!sA)throw new Error("Your user ID is invalid.");return sA},Ar=()=>{if(!zS)throw new Error("Your API key is invalid.");return zS},lA,VS,hm=()=>{VS?.abort(),VS=void 0},zu=(t,e)=>{lA=t,hm(),VS=new AbortController;let r=VS.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=G7.resolve(t.rootDir,o.envFile);try{if(BS.lstatSync(i).isSymbolicLink())return;BS.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{$7({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Ie=()=>lA;function $7({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,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(j7.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.`),lA=await Promise.resolve(e(n.configFilePath)))};BS.watchFile(o,{persistent:!1},i);let a=()=>{BS.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a)})}function We(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as W7}from"os";var q7="2.83.2",Nl=nu({app:"desktop-server",hostname:W7(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:q7});(async()=>{try{let t=await ha(Nl);t.gitBranchName&&Nl.addBinding("branch",t.gitBranchName)}catch{}})();var CF=K7();CF.get("/",async(t,e)=>{let r=Ie(),n=hs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await vr(Nl,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ll(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName})});var cA=CF;import{Router as Y7}from"express";import en from"fs";import{glob as X7}from"glob";import Rr from"path";var J7=5e3;function uA(t={}){let e=Y7();function r(i){let a=Ie(),s=Rr.dirname(a.configFilePath);return Rr.join(s,...i)}function n(i){let a=Ie(),s=Rr.dirname(a.configFilePath),l=Rr.relative(s,i);return l?l.split(Rr.sep):[]}function o(i,a){let s=en.statSync(i),l=n(i);return bb.parse({name:a,absolutePath:i,relativePath:l.join(Rr.sep),pathSegments:l,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return e.post("/",We(async(i,a,s)=>{let l;try{l=iP.parse(i.body).pathSegments}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=r(l);if(!en.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(Rr.sep)}`});return}if(!en.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Rr.sep)}`});return}let d=Ie(),p=Array.from(d.config.exclude??[]).concat(hh),m=AbortSignal.timeout(J7),f;try{f=await X7("*",{absolute:!1,cwd:c,ignore:p,dotRelative:!1,maxDepth:1,nodir:!1,signal:m})}catch(S){if(S instanceof Error&&S.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw S}let h=f.map(S=>{let y=Rr.join(c,S);return o(y,S)});if(t.allowedFileTypes){let S=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async y=>{if(y.isDirectory||!(y.name.endsWith(".test.yaml")||y.name.endsWith(".module.yaml")))return y;let b=await Q7(y.absolutePath);return b!==void 0&&S.has(b)?y:null}))).filter(y=>y!==null)}let g={absolutePath:c,pathSegments:l,contents:h};a.status(200).json(g)})),e.put("/",We(async(i,a,s)=>{let l;try{l=aP.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=r(l);if(en.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(Rr.sep)}`,pathSegments:l});return}en.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(Rr.sep)}`,pathSegments:l};a.status(201).json(u)})),e.patch("/",We(async(i,a,s)=>{let l,c;try{let f=sP.parse(i.body);l=f.pathSegments,c=f.newPathSegments}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=r(l),d=r(c);if(!en.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(Rr.sep)}`});return}if(en.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(Rr.sep)}`});return}let p=Rr.dirname(d);en.existsSync(p)||en.mkdirSync(p,{recursive:!0}),en.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(Rr.sep)} to ${c.join(Rr.sep)}`,pathSegments:c};a.status(200).json(m)})),e.delete("/",We(async(i,a,s)=>{let l,c=!0;try{let m=lP.parse(i.body);l=m.pathSegments,c=m.recursive??!0}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=r(l);if(!en.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(Rr.sep)}`,pathSegments:l});return}if(!en.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Rr.sep)}`});return}if(c)en.rmSync(u,{recursive:!0,force:!0});else{if(en.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}en.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p)})),e}async function Q7(t){try{let e=await en.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 Z7}from"express";var AF=Z7();AF.get("/",async(t,e)=>{let r=Ie(),n=hs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await vr(Nl,n,r);e.status(200).json(o)});var dA=AF;import Ase from"events";import eG,{Router as Rse}from"express";import wse from"http";import xse from"path";import{Server as Hie}from"socket.io";var eee=({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{}}},RF={event:"cancel",createHandler:eee};var tee=({metadata:t,logger:e,cacheStorageFactory:r})=>{let{testId:n,orgId:o}=t;return async(i,a)=>{let{stepId:s,environment:l}=i;e.info({testId:n,stepId:s},"Clearing AI action cache");try{await(await r(o)).deleteStepCacheEntry({logger:e,testId:n,key:s,environment:l}),a({ok:!0})}catch(c){e.error({testId:n,stepId:s,err:c},"Failed to clear AI action cache"),a({ok:!1,error:c instanceof Error?c.message:String(c)})}}},wF={event:"clearAIActionCache",createHandler:tee};var ree=({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.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:c},"Fetched a11y tree from the browser"),i({a11yTree:c})}catch(l){e.error({err:l},"Error fetching a11y tree from the browser"),i({err:l.message})}}},xF={event:"fetchA11yTree",createHandler:ree};var nee=({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.html();i({html:l})}catch(l){e.error({err:l},"Error fetching DOM from the browser"),l.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:l.message})}}},IF={event:"fetchDom",createHandler:nee};var oee=({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)}},_F={event:"disconnect",createHandler:oee};function vo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=iee(r);aee(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await see(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function iee(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":case"CONDITIONAL":r=e;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 aee(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 see(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as yee}from"crypto";import{faker as lee}from"@faker-js/faker";import cee from"assert";import uee from"axios";import*as dee from"child_process";import pee from"moment";import*as mee from"otpauth";import fee from"pg";async function MF(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=ih(n,e);r.push(...o)}),r}function hee(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 gee(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 See=Object.getPrototypeOf(async function(){}).constructor;async function PF(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,l=e.tools,c={},u=(E,b)=>{o[E]=b,c[E]=b},d={},p=(E,b)=>{o[E]=b,d[E]=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 See("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(uee,pee,l.fakerInstance??lee,cee,fee,m,f,mee,dee,MF,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>l.sms.send(b),b=>l.sms.fetchLatest(b),l.email,l.sms,l.ai,hee(a,s),...Object.values(i??{}))),g=!0,S,y;try{let E=await ee(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await gee(e.options.responseSerialization??"RAW",E)}catch(E){r.error({err:E,env:o,evalCode:n},`[${t}] Error executing code: ${E}`),g=!1,E instanceof qa?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=E instanceof Error?E.message:`${E}`}return{result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:y}}async function OF({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Ha,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=yee(),p=await PF(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:c},bindings:{...r.toObjectCopy(),...u,additionalBindings:l},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as Eee,randomUUID as Tee}from"crypto";import bee from"fetch-retry";var vee=bee(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}}),LF=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,NF=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function DF({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Ha,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!LF)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!NF)throw new Error("Missing lambda auth secret.");let h=Eee("sha256",NF).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:Tee(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await ee(vee(LF,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=VM.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(g.error)throw new Error(`Code evaluation error: ${g.error}`);return g}async function gs(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await DF(t);else if(t.localTools)e=await OF({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
82
|
+
`))}return FS(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function FS(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 H7(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 BS from"fs";import G7 from"path";var j7=new Gg(30,60*1e3),HS="https://api.momentic.ai",aA,bF,GS=t=>{HS=t},Kt=()=>HS,vF=()=>Zc(HS),jS=t=>{bF=t},Ll=()=>bF,hs=()=>aA;var Bu,sA,zS,$S=async t=>{if(aA&&Bu&&zS)return Bu;let e=new ct({baseUrl:HS,apiKey:t,logger:v});aA=e;try{let r=await e.getAuthInfo();return Bu=r.orgId,sA=r.userId,zS=t,Bu}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},tr=()=>{if(!Bu)throw new Error("Your organization ID is invalid.");return Bu},Li=()=>{if(!sA)throw new Error("Your user ID is invalid.");return sA},Ar=()=>{if(!zS)throw new Error("Your API key is invalid.");return zS},lA,VS,hm=()=>{VS?.abort(),VS=void 0},zu=(t,e)=>{lA=t,hm(),VS=new AbortController;let r=VS.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=G7.resolve(t.rootDir,o.envFile);try{if(BS.lstatSync(i).isSymbolicLink())return;BS.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{$7({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},Ie=()=>lA;function $7({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,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(j7.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.`),lA=await Promise.resolve(e(n.configFilePath)))};BS.watchFile(o,{persistent:!1},i);let a=()=>{BS.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a)})}function We(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as W7}from"os";var q7="2.83.3",Nl=nu({app:"desktop-server",hostname:W7(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:q7});(async()=>{try{let t=await ha(Nl);t.gitBranchName&&Nl.addBinding("branch",t.gitBranchName)}catch{}})();var CF=K7();CF.get("/",async(t,e)=>{let r=Ie(),n=hs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await vr(Nl,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ll(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName})});var cA=CF;import{Router as Y7}from"express";import en from"fs";import{glob as X7}from"glob";import Rr from"path";var J7=5e3;function uA(t={}){let e=Y7();function r(i){let a=Ie(),s=Rr.dirname(a.configFilePath);return Rr.join(s,...i)}function n(i){let a=Ie(),s=Rr.dirname(a.configFilePath),l=Rr.relative(s,i);return l?l.split(Rr.sep):[]}function o(i,a){let s=en.statSync(i),l=n(i);return bb.parse({name:a,absolutePath:i,relativePath:l.join(Rr.sep),pathSegments:l,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return e.post("/",We(async(i,a,s)=>{let l;try{l=iP.parse(i.body).pathSegments}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=r(l);if(!en.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(Rr.sep)}`});return}if(!en.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Rr.sep)}`});return}let d=Ie(),p=Array.from(d.config.exclude??[]).concat(hh),m=AbortSignal.timeout(J7),f;try{f=await X7("*",{absolute:!1,cwd:c,ignore:p,dotRelative:!1,maxDepth:1,nodir:!1,signal:m})}catch(S){if(S instanceof Error&&S.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw S}let h=f.map(S=>{let y=Rr.join(c,S);return o(y,S)});if(t.allowedFileTypes){let S=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async y=>{if(y.isDirectory||!(y.name.endsWith(".test.yaml")||y.name.endsWith(".module.yaml")))return y;let b=await Q7(y.absolutePath);return b!==void 0&&S.has(b)?y:null}))).filter(y=>y!==null)}let g={absolutePath:c,pathSegments:l,contents:h};a.status(200).json(g)})),e.put("/",We(async(i,a,s)=>{let l;try{l=aP.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=r(l);if(en.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(Rr.sep)}`,pathSegments:l});return}en.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(Rr.sep)}`,pathSegments:l};a.status(201).json(u)})),e.patch("/",We(async(i,a,s)=>{let l,c;try{let f=sP.parse(i.body);l=f.pathSegments,c=f.newPathSegments}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=r(l),d=r(c);if(!en.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(Rr.sep)}`});return}if(en.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(Rr.sep)}`});return}let p=Rr.dirname(d);en.existsSync(p)||en.mkdirSync(p,{recursive:!0}),en.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(Rr.sep)} to ${c.join(Rr.sep)}`,pathSegments:c};a.status(200).json(m)})),e.delete("/",We(async(i,a,s)=>{let l,c=!0;try{let m=lP.parse(i.body);l=m.pathSegments,c=m.recursive??!0}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=r(l);if(!en.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(Rr.sep)}`,pathSegments:l});return}if(!en.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Rr.sep)}`});return}if(c)en.rmSync(u,{recursive:!0,force:!0});else{if(en.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}en.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p)})),e}async function Q7(t){try{let e=await en.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 Z7}from"express";var AF=Z7();AF.get("/",async(t,e)=>{let r=Ie(),n=hs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await vr(Nl,n,r);e.status(200).json(o)});var dA=AF;import Ase from"events";import eG,{Router as Rse}from"express";import wse from"http";import xse from"path";import{Server as Hie}from"socket.io";var eee=({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{}}},RF={event:"cancel",createHandler:eee};var tee=({metadata:t,logger:e,cacheStorageFactory:r})=>{let{testId:n,orgId:o}=t;return async(i,a)=>{let{stepId:s,environment:l}=i;e.info({testId:n,stepId:s},"Clearing AI action cache");try{await(await r(o)).deleteStepCacheEntry({logger:e,testId:n,key:s,environment:l}),a({ok:!0})}catch(c){e.error({testId:n,stepId:s,err:c},"Failed to clear AI action cache"),a({ok:!1,error:c instanceof Error?c.message:String(c)})}}},wF={event:"clearAIActionCache",createHandler:tee};var ree=({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.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:c},"Fetched a11y tree from the browser"),i({a11yTree:c})}catch(l){e.error({err:l},"Error fetching a11y tree from the browser"),i({err:l.message})}}},xF={event:"fetchA11yTree",createHandler:ree};var nee=({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.html();i({html:l})}catch(l){e.error({err:l},"Error fetching DOM from the browser"),l.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:l.message})}}},IF={event:"fetchDom",createHandler:nee};var oee=({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)}},_F={event:"disconnect",createHandler:oee};function vo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=iee(r);aee(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await see(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function iee(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":case"CONDITIONAL":r=e;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 aee(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 see(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as yee}from"crypto";import{faker as lee}from"@faker-js/faker";import cee from"assert";import uee from"axios";import*as dee from"child_process";import pee from"moment";import*as mee from"otpauth";import fee from"pg";async function MF(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=ih(n,e);r.push(...o)}),r}function hee(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 gee(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 See=Object.getPrototypeOf(async function(){}).constructor;async function PF(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,l=e.tools,c={},u=(E,b)=>{o[E]=b,c[E]=b},d={},p=(E,b)=>{o[E]=b,d[E]=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 See("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(uee,pee,l.fakerInstance??lee,cee,fee,m,f,mee,dee,MF,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>l.sms.send(b),b=>l.sms.fetchLatest(b),l.email,l.sms,l.ai,hee(a,s),...Object.values(i??{}))),g=!0,S,y;try{let E=await ee(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await gee(e.options.responseSerialization??"RAW",E)}catch(E){r.error({err:E,env:o,evalCode:n},`[${t}] Error executing code: ${E}`),g=!1,E instanceof qa?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=E instanceof Error?E.message:`${E}`}return{result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:y}}async function OF({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Ha,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=yee(),p=await PF(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:c},bindings:{...r.toObjectCopy(),...u,additionalBindings:l},tools:n,signal:i},o);return v.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as Eee,randomUUID as Tee}from"crypto";import bee from"fetch-retry";var vee=bee(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}}),LF=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,NF=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function DF({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Ha,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!LF)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!NF)throw new Error("Missing lambda auth secret.");let h=Eee("sha256",NF).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:Tee(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await ee(vee(LF,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=VM.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(g.error)throw new Error(`Code evaluation error: ${g.error}`);return g}async function gs(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await DF(t);else if(t.localTools)e=await OF({...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 Cee}from"lodash-es";async function Fr(t){let{orgId:e,s:r,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Ha,allowUndefined:l=!1}=t,c=/{{(.*?)}}/g,u=r.matchAll(c),d=r;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),f;try{f=await gs({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:t.localTools,signal:i})}catch(g){throw o.error({err:g,value:r},"Error evaluating template string"),g}if(f===void 0&&!l)throw new N("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 WS(t){return kF(t)}async function kF({obj:t,bannedKeys:e,allowList:r,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in t){if(e.includes(s))continue;let l=!1;if(r)if(r.includes(s))l=!0;else continue;let c=t[s],u=[...o,s];if(typeof c=="string"&&c.includes("{{")){let d=await Fr({s:c,context:n,...a});if(c===d)continue;i.push({path:u,original:c}),t[s]=d}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await kF({obj:c,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:l?void 0:r,...a})}return i}function UF(t,e){for(let{path:r,original:n}of e)Cee(t,r,n)}import Aee from"fetch-retry";var hnt=process.env.MAILINATOR_API_KEY,gnt=Aee(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 gne}from"os";var pA={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:`(() => {
|
|
@@ -4958,7 +4958,7 @@ ${t}`;case"ELEMENT_CHECK":return`${Az}
|
|
|
4958
4958
|
${t}`;default:return t}}async function Ro({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 Fre=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function xz({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(Fre.includes(n.type))return;await Br().startAsyncSpan("AUTO_FOLLOW_NEW_TABS",async a=>{let c=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,u=Date.now(),d=0;for(o.info({command:n.type,beforePages:e,beforeUrl:t,timeout:c},"Checking for new tabs to auto-follow");d===0||Date.now()-u<c;){await _e(250),d++;let p=(await r.getOpenPages()).map(f=>f.url),m=r.url();if(p.length!==e.length)for(let f=p.length-1;f>=e.length;f--){let h=p[f];if(Al(h,o)&&h!==t&&h!==m){o.info({beforePages:e,afterPages:p,beforeUrl:t},"Auto-following new tab after preset action"),await r.switchToPage({type:"INDEX",index:String(f)}),a.result={followed:!0};return}}}a.result={followed:!1}})}async function Ui(t,e={}){let r=await t.getBrowserState(e);return{serializedTree:r.serialize(e.serializationOpts),tree:r}}var Iz=t=>!!t&&oc(t),_z=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&&!Rz(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 $re}from"crypto";var Pz={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},Oz={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},Mz=/<(\S+) id="(\d+)".*?>/g,zre=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,Lz=["h1","h2","section","footer","nav","aside","form","label","dialog"],Vre=[...Lz,"span","div","h3"],Hre=["table","select","form","ul","ol","menu","pre","code","dialog"],Gre=["table","form","dialog","nav","section","ul","select"];function ly(t){return jre(t)}function jre({logger:t,serializedTree:e,options:r}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=r,s=[],l=e.split(`
|
|
4959
4959
|
`),c=0,u=[],d=0,p=[],m=[],f=!1;for(;c<l.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=l[c],g=lt(h);d+=g,h.length>a&&(h=h.slice(0,a));let E=Array.from(h.matchAll(Mz)).map(z=>z&&z.length>=3?{tagName:z[1],id:z[2]}:void 0).filter(z=>!!z),A=Array.from(h.matchAll(zre)).map(z=>z&&(z[2]||z[4])).filter(z=>!!z);A.reverse();let M=h.replace(/ id="[0-9]+"/g,"");u.push(M);for(let z of E)p.push(z.id),m.push(z);for(let z of A){let le=m[m.length-1];le&&le.tagName===z&&m.pop()}let I=m.some(z=>Hre.includes(z.tagName)),R=l[c+1]??"",_=lt(R),V=Array.from(R.matchAll(Mz)).map(z=>z&&z.length>2?z[1]:void 0).filter(z=>!!z),k=V.some(z=>Lz.includes(z)),H=V.some(z=>Vre.includes(z));d+_>=i&&(f=!0),d>=n&&(k&&!I||A.some(z=>Gre.includes(z)))&&(f=!0),d>=o&&H&&!I&&(f=!0),c++}return u.length&&s.push({ids:p,content:u.join(`
|
|
4961
|
-
`),tokenLength:d}),s.forEach((h,g)=>{let S=h.ids[0],y=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:y},`Chunk for page filtering (index ${g+1}/${s.length})`)}),{chunks:s}}var Wre=75e4,cy=3e5;async function Bl(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:l}=r,c=t.tree,u=t.serializedTree,d=lt(u);if(d>Wre)try{let p=ly({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});c=await Kre({...t,tokenLimit:cy-1e4,chunks:p.chunks}),u=c.serialize();let m=lt(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"),c=c.pruneToSerializedCharLimit(cy*es),u=c.serialize();let m=lt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>cy)try{if(o){let p=ly({serializedTree:u,options:Oz,logger:i}),m=$re();c=await ee(qre({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:l}),u=c.serialize();let f=lt(u);i.info({oldTokens:d,newTokens:f,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=f}else{let p=ly({serializedTree:u,options:Pz,logger:i});c=await ee(Yre({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:l}),u=c.serialize();let m=lt(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"),c=c.pruneToSerializedCharLimit(cy*es),u=c.serialize(),i.info("Filtered page using naive truncation")}return u}async function qre({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:l,loggerTags:Xe(l)}),u=[];return r.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function Kre(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:Xe(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let l of s.keywords){let c=t.chunks.filter(m=>m.content.toLowerCase().includes(l.toLowerCase()));if(!c.length||c.reduce((m,f)=>m+f.tokenLength,0)>t.tokenLimit&&c.length>1)continue;let d=c.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function Yre(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:l}=r,c=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:l,logger:s,loggerTags:Xe(s)});if(c.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(c.ids.map(d=>`${d}`)))}async function eR(t,e){if(!t.description)throw new N("UserConfigurationError","Cannot locate element with empty description");return Ro({action:async()=>Jre(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function Jre(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:l,logger:c,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d,isAutoHeal:p,cacheBustReason:m}=t,{orgId:f,browser:h,localCodeEvalTools:g,generator:S,abortSignal:y}=e,E=t.description,b=Br(),A=t.useMemory&&!r;n&&(E=await Fr({orgId:f,s:E,context:n,localTools:g,signal:y,logger:c})),a&&(E=wz(E,a));let{serializedTree:M,tree:I}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Ui(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:y,skipWait:i,logger:c}),{}),R=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let Z,ce=Date.now(),ye;for(;!Z&&Date.now()-ce<3e3;){y.throwIfAborted();try{Z=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Me){ye=Me}}if(!Z)throw new N("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ye?.message}`);return Z}),_=M,L=!1,k=`data:image/jpeg;base64,${R.toString("base64")}`;_=await Bl({type:"locator",description:E,screenshot:k,serializedTree:M,options:{aiPageFiltering:l},tree:I,fixtures:{generator:S,signal:y,logger:c,orgId:f}}),_!==M&&(L=!0);let H=await b.startAsyncSpan("AI_LOCATOR_CALL",async Z=>{p&&(Z.attributes.isAutoHeal=!0),m&&(Z.attributes.cacheBustReason=m);let ce=await S.getElementLocation({browserState:_,goal:E,screenshot:k,source:a,memory:A?s:void 0},{disableCache:r,abortSignal:y,loggerTags:Xe(c),useMemory:A});if(Z.result=ce,b.storeTraceAsset){let ye=Xre();b.storeTraceAsset({snapshotId:ye,data:R}),Z.screenshotSnapshotId=ye}return ce});if(c.debug({usedRag:L,result:H},"Got locator result"),!(H.id>0))throw new vc(`Could not find any relevant element: ${H.thoughts}`,H.updatedMemory?{type:"GCS_TRACES",traces:H.updatedMemory}:void 0);let{resolution:le,target:W,frameConfig:Y}=await b.startAsyncSpan("TARGET_RESOLUTION",async Z=>{let ce=await h.createTargetFromA11yId({id:H.id,requirements:H.requirements,additionalElements:H.additionalElements,description:E,targetSource:"AI",logger:c,skipSavingVisualAttributes:d});return Z.result={serializedElement:ce.target.nodeOnlySerializedHtml??"Unknown HTML element"},ce});if(le.a11yNode?.properties?.hidden&&le.a11yNode?.properties?.hidden!=="false")throw new N("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: ${le.displayString}`);return A&&(H.updatedMemory?W.memory={type:"GCS_TRACES",traces:H.updatedMemory}:s&&(W.memory=s)),{thoughts:H.thoughts,target:W,resolution:le,frameConfig:Y,screenshot:k}}import{randomUUID as Nz}from"crypto";var Qre=15;async function uy({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=Qre}){if(!t.assertion.trim())throw new N("ActionFailureError","Assertion command is missing the assertion content");let a=yT.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Br();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=j0(u,i-1),p=0,m=Date.now(),f=m+u,h=m,g,S,y;try{await Ro({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:r})}catch(A){r.warn({err:A},"Failed to clear highlights before AI check, continuing...")}for(;p<i;){n.abortSignal.throwIfAborted();let A=Date.now();if(p>0){if(A>=f)break;let R=f-A,_=h-A,L=Math.min(_,R);L>0&&await _e(L,n.abortSignal)}let M=Date.now();if(p>0&&M>=f)break;let I=!1;try{if(g=await Ro({action:async()=>{let _=await Dz(c,r,n.abortSignal);return S&&S.serializedTree===_.serializedTree&&S.screenshotBuff.equals(_.screenshotBuff)?(I=!0,g):(S=_,kz({command:t,state:_,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:c}),g?.success){g?.updatedMemory&&rm(t,g.updatedMemory,r);break}else throw g?.thoughts?new N("AssertionFailureError",g.thoughts):new N("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(R){n.abortSignal.throwIfAborted(),y=R instanceof Error?R:new Error(`${R}`),I?r.info(`AI check attempt ${p} failed (re-used previous result)`):r.info({err:R},`AI check assert attempt ${p} failed, retrying...`)}finally{p++,h=M+d}}if(!g?.success){let A=f-Date.now();A>0&&await _e(A,n.abortSignal)}if(!g?.success)try{g=await Ro({action:async()=>kz({command:t,state:await Dz(c,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:c})}catch(A){n.abortSignal.throwIfAborted(),y=A instanceof Error?A:new Error(`${A}`)}finally{p++}g?.updatedMemory&&rm(t,g.updatedMemory,r);let E=g?.afterScreenshotOverride;if(E&&s.storeTraceAsset){let A=Nz();s.storeTraceAsset({snapshotId:A,data:E}),l.screenshotSnapshotId=A}let b=g?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let A=Nz();s.storeTraceAsset({snapshotId:A,data:b}),l.elementScreenshotSnapshotId=A}if(!g?.success){l.result={thoughts:y?.message??"AI check failed after all attempts",result:!1};let A=`AI check still failing after ${p} attempts.`;throw y&&(A+=` Latest result: ${y.message}`),new N("AssertionFailureError",A)}return l.result={thoughts:g.thoughts,result:!0},{...g,succeedImmediately:!1,urlAfterCommand:c.url()}})}async function Dz(t,e,r){await t.waitForPageLoad({signal:r});let[n,o]=await Promise.all([Ui(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function kz({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:l,logger:c}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:f,tree:h}=e,g=e.screenshotBuff,S=g.toString("base64"),y=u.url(),E=t.contextChoice??"MULTIMODAL",b=f;E!=="VISION_ONLY"&&(b=await Bl({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:c,orgId:r.orgId}}),b!==f&&(m.ragUsed=!0),m.pageState=b);let A={goal:t.assertion,url:y,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:S,contextChoice:E,source:l},I=await(E==="VISION_ONLY"?(_,L)=>d.getVisualAssertionResult(_,L):(_,L)=>d.getAssertionResult(_,L))(A,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:c,loggerTags:Xe(c)}),R;if((I.result||i)&&I.relevantElements?.length){m.relevantElementsSerialized=I.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_);try{let _=I.relevantElements[0],{resolution:L}=await u.createTargetFromA11yId({id:_,description:null,targetSource:"AI",skipSaveToCache:!0});R=await u.screenshot({locator:L.locator,clearHighlights:!0,respectActiveFrame:!0})}catch(_){c.debug({err:_},"Failed to capture element screenshot for trace, continuing...")}await Zre(I.relevantElements,u,c)}return{success:I.result,thoughts:I.thoughts,afterScreenshotOverride:g,elementScreenshotOverride:R,updatedMemory:o?I.updatedMemory:void 0}}async function Zre(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 ee(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 ene=1e5,dy=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Uz(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await tne(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof dy?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 _e(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function tne(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await _e(o.smartWaitingTimeout,n);return}if(!e.description)throw new N("UserConfigurationError","Cannot locate element with empty description");await ee(rne(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function rne(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Ro({action:async()=>nne(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function nne(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:l,orgId:c,generator:u}=e,d=t.description;r&&(d=await Fr({orgId:c,s:d,context:r,localTools:l,signal:s,logger:n}));let{serializedTree:p}=await Ui(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(lt(p)>ene)throw new dy;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(y){throw new N("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${y instanceof Error?y.message:y}`)}let g=`data:image/jpeg;base64,${f.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:g},{abortSignal:s,loggerTags:Xe(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Bz}from"lodash-es";async function zz(t){return Br().startAsyncSpan("ELEMENT_ASSERTION",async r=>one(t,r),{name:"Element check"})}async function one(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>lf(r.cache)?r.cache:void 0,l=s(),c=!i&&!!l?.target&&oc(l.target),u=Bz(l),d=(y=!1)=>{if(l=s(),!!l)if(y){let E=sC(u,l);l.target=E.target,l.updatedAt=E.updatedAt}else{if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt}},p=Date.now(),m=0,f,h=500,g=!1;for(;m<2||Date.now()-p<n;){m++,m>1&&await _e(h,a),a?.throwIfAborted(),l=s();let y=m===1,{result:E,elementWasFound:b}=await Fz({cacheToUse:l,skipAISmartWaiting:!y,useAIIfCacheFails:!c,params:t});if(f=E,g=g||b,E.success)break;d(),h=Math.min(h*1.25,1e4)}if(!f)throw new N("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!f.success){let y=s(),E=y?.target?.memory?{target:{id:-1,memory:y.target.memory}}:void 0,{result:b,elementWasFound:A}=await Fz({cacheToUse:E,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:t});f=b,g=g||A,f.success||d(!0)}let S=s();return f.success&&S?.target&&!g&&(S.target=tm(S.target),S.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function Fz({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:r,params:n}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=n,{logger:c}=a;if(o.target&&!wa(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=xk(o.assertion),d,p=!1,m=Bz(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:g}=await l({tracer:s,command:o,target:o.target,cache:m?.target,action:async S=>ine(S.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:Js(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:r?1:0});return d={success:h.success,data:h.data,err:h.err,elementInteractedDisplayString:f,thoughts:g},p=!0,h.success||(c.warn({aiThoughts:g,elementString:f,err:h.err},"Element check found an element but failed"),d={...h,thoughts:g}),{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 N)||f.reason!="ActionFailureError")throw f;return d={success:!1,err:f,data:void 0,thoughts:void 0},c.warn({err:f},"Element check did not find an element and failed"),{result:d,elementWasFound:p}}}async function ine(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await ane(t,e.assertion)}async function ane(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:_t(a,500,!0)},!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,n=new N("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:_t(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 N("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,e.operation==="EXISTS"?n=new N("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new N("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){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},eo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:eo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:eo*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=vu(e);n=new N("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=vu(e);r=!1,n=new N("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),e.property);if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,e.operation==="EXISTS"?n=new N("AssertionFailureError",`The style property ${e.property} ${s}`):n=new N("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 Vz(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as sne}from"jimp";async function ym(t,e){let r=await t.screenshot(e),n=await sne.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Hz}from"jimp";import tR from"jpeg-js";import lne from"pixelmatch";async function Gz({tracer:t,command:e,disableCache:r,browser:n,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!wa(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},l;e.target?.elementDescriptor?l=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async L=>ym(n,{locator:L.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await ym(n,s);let c=await a.prepareGoldenScreenshotForComparison(i,e,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let _=`${l.width}x${l.height}`,L=`${c.width}x${c.height}`;return{fail:!0,thoughts:`Current screenshot (${_}) does not match saved screenshot dimensions (${L}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:n.url()}}let u=await Hz.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Hz.fromBuffer(c.buffer),m={width:c.width,height:c.height},f,h=d.width*d.height,g=m.width*m.height,S=Math.abs(d.height-m.height),y=Math.abs(d.width-m.width);if(h>g){let _=u.cover({w:m.width,h:m.height});l.buffer=await _.getBuffer("image/jpeg"),f="current",l.width=m.width,l.height=m.height}else if(g>h){let _=p.cover({w:d.width,h:d.height});c.buffer=await _.getBuffer("image/jpeg"),f="saved"}let E={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=e.threshold??.1,M=lne(tR.decode(c.buffer).data,tR.decode(l.buffer).data,E.data,l.width,l.height,{threshold:b,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=M>b*100,R=`Visual diff of ${M.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${b*100}%.`;if(f&&(R+=` The ${f} screenshot was cropped since it was taller by ${S} pixels and wider by ${y} pixels.`),I)throw new N("ActionFailureError",R);return{fail:I,thoughts:R,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:tR.encode(E,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var cne=3e4;function une(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 jz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??cne/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(),l;if(wu(t.url)&&(l=t.url),r&&xu(t.url,r)&&(l=new URL(t.url,r).toString()),!l)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=l;e.info({url:c,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await ee((async()=>{let f=s?`${c}?${s}`:c;try{let h=une(t),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await n(f,{headers:g,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 N("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 N("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 dne=5e3;async function py({timeout:t=eo,...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 l=Date.now();i=await $z(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await _e(s,e.signal),s=Math.min(Math.floor(s*1.5),dne);else return i}return i=await $z(e),i}async function $z({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let l=await e.evaluateFunctionInAllFrames(Wz,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(Wz,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?oa.CONTAINS:ia.CONTAINS;a=new N("AssertionFailureError",`The page ${l} '${t.value}'.`),o=s}}catch(s){a=new N("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 Wz({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 pne=3e4;async function qz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??pne/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(wu(t.url)&&(s=t.url),r&&xu(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=await ee((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(!c)throw new N("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,p=await c.text();try{d=JSON.parse(p)}catch{throw new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}let u={};return c.headers.forEach((d,p)=>{u[p]=d}),{status:c.status,headers:u,json:await c.json()}}var vs=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:l,options:c}){this.orgId=i,this.options=c,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,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[l,c]=await Promise.all([Ui(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await Bl({type:"ai-action",description:e,screenshot:u,serializedTree:l.serializedTree,tree:l.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:{...Xe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Ui(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 Bl({type:"ai-action",description:e,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:l,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:{...Xe(a)},langfuseSessionId:s})}catch(f){throw new N("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return Ui(this.browser,e)}async locateElement(e){return await eR({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return Ro({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:l=1}){let c=[];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]}});c.push(p)}try{let u=await a(...c.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=c.map((m,f)=>m.thoughts?`${d(n[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return{result:u,elementInteractedDisplayStrings:c.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),l>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:l-1});throw new N("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 N("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=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()-l<500&&await _e(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Br(),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 l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(r,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=mne();(async()=>{try{let p=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:p})}catch(p){o.debug({err:p},"Failed to capture element screenshot for redirect trace")}})(),l.elementScreenshotSnapshotId=d}return c})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:he}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await Br().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=r.targetSource;try{let c=await this.browser.resolveTarget(r,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...n.resolveTargetOptions});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof vn&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:o});return await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await Ro({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:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:p}=i,m=Br(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=Kz(e.cache);if((!g||u)&&!xE(n))throw new N("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let S=!1,y;u&&(f.info("Cache explicitly disabled for this step"),S=!0,y="Cache explicitly disabled",g=void 0);let E=_z({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=E.cache,S=S||E.cacheBustedBeforeAction,!y&&E.cacheBustReason&&(y=E.cacheBustReason);let b=!0;if(!Iz(g))return c--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:r,target:n,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:S,cacheBustReason:y});try{let{resolutionResult:A,finalTarget:M}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),I=await o(M);if(Zt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.83.2"]),zg({cmd:a,key:p,newTarget:g,logger:f,updatedWithAI:!1}),b){let R=A.decisions.filter(_=>_.matched);if(R.length!==1)f.warn({decisions:A.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let _=R[0].type;r.recordTargetAutoHeal({healType:_})}}return{result:I,elementInteractedDisplayString:A.displayString}}catch(A){this.throwIfClosed();let M=HE(A);if(M&&!s)return f.warn({err:A},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:i});if(A instanceof N&&!M)throw f.warn({err:A},"Failed to execute command with target (fatal)"),A;if(c>0&&n){f.info({err:A},"Failed to execute action with cached target, retrying with AI"),Zt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.83.2",`missReason:${A instanceof vn?A.cacheMissReason:"unknown"}`]);let I;return g.memory&&of(g.memory)&&(I=g.memory),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:{...i,memory:I,targetHealingInProgress:!0}})}throw new N("ActionFailureError",`Failed to execute interactive command: ${A instanceof Error?A.message:`${A}`}`,{errOptions:{cause:A}})}}async executeTargetingCommandWithAI(e){let{tracer:r,stepTracer:n,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=e;c.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let m=!1;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await r.startAsyncSpan("SMART_WAITING",async()=>await Uz({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),m=!0):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let f=2;for(let h=1;h<=f;h++){let g=!1,S=this.browser.getActiveFrameConfig();try{let y;try{y=await eR({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:c,skipWait:m,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(A){if(A instanceof vc&&A.updatedLocatorMemory){let M={id:-1,...l,memory:A.updatedLocatorMemory};zg({cmd:a,key:i.targetName,newTarget:M,logger:c,updatedWithAI:!0})}throw A}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),g=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),b=await s(E);return zg({cmd:a,key:i.targetName,newTarget:y.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=Xe(c)),{result:b,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(g&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),h<f&&HE(y)){c.warn({err:y,aiAttempt:h},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof N?y:new N("ActionFailureError",y.message)}}throw new N("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return ym(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await _e(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(r,n)}catch(l){throw this.throwIfClosed(),new N("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o);return this.options?.autoFollowNewTabs&&await xz({beforeUrl:a,command:r,beforePages:i.map(c=>c.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{UF(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>CA(e)}}async traceBrowserInteraction(e,r,n){return Br().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return WS({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()?uy({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 N("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new N("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return uy({command:r,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i})}case"AI_EXTRACT":{if(!r.goal.trim())throw new N("ActionFailureError","Cannot perform AI extraction without goal");if(r.schema){let l=yO(r.schema);if(l)throw new N("UserConfigurationError",l)}let a=await this.browser.getCondensedHtml(),s=await this.browser.screenshot({retries:2});try{let l=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:Xe(i)});if(l.result==="NOT_FOUND")throw new N("ActionFailureError","No relevant data found for extraction goal on this page");if(l.thoughts?.includes("MaxGenerationLengthExceededError"))throw new N("UserConfigurationError",l.thoughts);return{thoughts:l.thoughts||void 0,data:l.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(l){let c=l.message;throw c.includes("MaxGenerationLengthExceededError")?new N("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."):c.includes("AIProviderError")&&c.includes("time")?new N("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:l}}):l}}case"NAVIGATE":if(!wu(r.url)&&!xu(r.url,this.browser.baseUrl))throw new N("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 N("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&&si(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 l=this.browser.getViewport()?.height??Wr.height,c=this.browser.getViewport()?.width??Wr.width;switch(r.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(r.deltaY??l)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(r.deltaY??l));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(r.deltaX??c)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(r.deltaX??c));break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new N("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 N("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=r.delay*1e3;await _e(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(si(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:l,thoughts:c}=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:c,data:l.downloadedFile?{downloadedFile:l.downloadedFile}:void 0};return rS(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(si(r.fromTarget)&&si(r.toTarget)){let l=r.fromTarget.pixels,c=r.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(l,c,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0}),{coordinates:l});break}if(si(r.fromTarget)||si(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:(l,c)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(l,c,{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),l=r.steps??5;if(isNaN(a)||isNaN(s))throw new N("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&si(r.target)){let d=r.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:l,fromTarget:d}),{coordinates:d});break}let c,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,l,m.locator,{force:r.force})),options:{disableCache:o,targetName:"target",...r}});c=d,u=p}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,void 0,{force:r.force}));return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case"SELECT_OPTION":{if(!wa(r.target))throw new Error("Select with x/y is not supported yet");let a=r.target.elementDescriptor,s=r.choice,{elementInteractedDisplayString:l,thoughts:c}=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:Js(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:c}}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 gs({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 N("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a)}catch(s){throw new N("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&&si(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,l,c=Kz(r.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(c){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:c,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:Js(r)}});s=p,l=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:l};return rS(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(si(r.target)){let{pixels:l}=r.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(l),{coordinates:l});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:l=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(l),{selector:l.locator.toString()}),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!wa(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:l=>this.browser.focus(l),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(r.target&&!wa(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:l=>this.browser.blur(l),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 rS(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 hne,s=fne(fetch,a),l;try{l=new URL(r.url).hostname}catch{}let c=await jz({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:vd.parse({...c,cookies:gM(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await qz({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Gz({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 ZF({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 N("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 gs({orgId:this.orgId,code:r.storageState,fragment:!1,context:n,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new N("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=ah.optional().parse(a)}catch(l){throw new N("ActionFailureError",`Credentials provided do not follow the required format: ${l}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(r.timeout??eo)*1e3,s=this.generator.getAgentConfig()?.assertion;if(Vz(r.assertion)&&!r.useSelector&&r.target.type==="description"&&s&&s!=="v1"){let c={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 uy({command:c,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{c.cache?.memory&&rm(r,c.cache?.memory.traces,i)}}let l=await zz({command:r,tracer:e,timeoutMs:a,targetingWrapper:c=>this.wrapElementTargetingCommand(c),fixtures:this.getControllerFixtures(),disableCache:o});return{fail:!l.success,data:l.data,elementInteracted:l.elementInteractedDisplayString,thoughts:l.err?.message??l.thoughts??`Element assertion ${l.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await Ro({action:async()=>py({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 Es(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async l=>await IA(l)).catch(l=>{i.error({err:l},"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 N("ActionFailureError",`No listener registered with key: ${r.key}`);let s=r.timeout??10;return{data:await ee(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new Es(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,l)=>{this.recordedRequests[r.key][s]=JS(l)},onRequestComplete:(s,l)=>{this.recordedRequests[r.key]?.[s]&&(this.recordedRequests[r.key][s]=JS(l))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[r.key];if(!a)throw new N("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 Es(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 Es(r.requestMatcher),async(s,l)=>{let c=await gs({orgId:this.orgId,code:r.responseGenerator,fragment:!1,context:n,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:l},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=zM.parse(c);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:Xe(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 ny({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:Xe(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Xe(r??this.logger)})}};var rR=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,l=s.browser,{orgId:c,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(wi({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let g=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Fr({orgId:c,s:g,context:o,logger:n,localTools:a,signal:d});h={orgId:c,cacheKeys:[S,...Object.entries(r).map(([E,b])=>`${E}:${b}`)]},n.info({original:g,keyParams:h},"Module cache key params");let y=Date.now();for(;Date.now()-y<EP;){d?.throwIfAborted();let E=await i.getCacheResult(h);if(E){n.info({cacheResult:_t(E,1e3,!0)},"Got result from module execution cache"),p=my(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(E),m=!0;break}else n.info({cacheKey:g,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${gne()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Failed to acquire cache lock, retrying...");await _e(2500+Math.random()*1e4,d)}}try{if(!p)p=await Sne(t);else if(e.autoAuth){let g=ah.safeParse(p.data);if(!g.success)throw new N("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${g.error.message}`);n.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(g.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let E={type:"CONTENT",value:y.substring},b=await py({timeout:eo,assertion:E,browser:l,logger:n,signal:d,autoExpandIframes:!!l.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"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),rR(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await yne({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},Sne=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=my(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,vo({asyncTasks:t.work.asyncTasks,nestedResults:s,result:o,logger:t.fixtures.logger}),o};function my(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 Yz({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let l=e.inputs?.[s]??e.defaultParameters?.[s];if(!l){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await gs({orgId:t,code:l,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new N("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function yne({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===pO)&&(a=t.defaultCacheTtl??mO);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:wi({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function zl(t,e,r){return Ene(t,e,r)}async function Ene(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 N?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let l=my(t,{},"FAILED");return l.message=s,l.startedAt=n,l.finishedAt=i,l}return{...eS(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Qo(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 Sie}from"lodash-es";import{randomUUID as Xz}from"crypto";import{diff as Tne}from"deep-object-diff";import{cloneDeep as Jz}from"lodash-es";var fy=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,l=e.command.type,c=n.child({commandType:l,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?Jz(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=Xz(),h=Xz();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let E=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:E})}}catch(E){c.debug({err:E},"Failed to take before screenshot, continuing...")}let g,S,y;try{let E=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);E.beforeScreenshotOverride&&(m=E.beforeScreenshotOverride),y=E.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:E.fail?"FAILED":"SUCCESS",elementInteracted:E.elementInteracted},g={...e,message:E.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:E.fail?"FAILED":"SUCCESS",data:E.data,results:[S]},"assertion"in e.command&&(g.message=E.thoughts||"Assertion passed.")}catch(E){c.error({message:E.message,stack:E.stack},`Failed executing preset step ${$o(e.command)}`);let b=o.browser.url(),A=new Date,M=E instanceof Error?E.message:`${E}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:M},g={...e,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:M,failureReason:E instanceof N?E.reason:void 0,results:[S]}}finally{let E="cache"in e.command&&e.command.cache?Jz(e.command.cache):{},b=Tne(u,E);b&&Object.keys(b).length>0&&c.info({diffs:Yf(b)},"Updated cache")}if(a)try{if(y||(y=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let E=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:E})}}catch(E){c.debug({err:E},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),y&&r.attachAfterScreenshot({snapshotId:h,screenshot:y}),g};async function bne(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 Qo(t.work,()=>fy({...t,presetParams:{tracer:n,step:e.assertion}})),l=a.type;switch(l){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 c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(l)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let l=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:l,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function vne(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}=vl(a.steps,e,o);if(s)return i}return-1}async function Qz(t){let e=new Date,{currentParentIdChain:r}=t,{step:n}=t.conditionalParams,{logger:o}=t.fixtures,{fromStep:i}=t.inputs,a=eS(n),s=!!i&&em(r,i.parentStepIdChain),l=n.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=vne(n,i.fromStepId,r,i.parentStepIdChain);S>=0&&(l=n.blocks[S].steps,c=!1,p=!0,o.info(`Skipping conditional assertion (execution starts from step within block ${S}), running ${l.length} steps`))}if(!p)for(let S=0;S<n.blocks.length;S++){o.info(`Evaluating condition ${S} in conditional step`);let y=n.blocks[S],E=await bne(t,y,S);if(u.push(E.conditionResult),d=E.conditionResult,E.type==="execution_error"){let b={...a,assertionResult:E.conditionResult,status:"FAILED",startedAt:e,finishedAt:new Date,message:E.conditionResult.message,results:[]};return vo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(E.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${E.steps.length} steps`),c=!1,l=E.steps;break}}if(l)c&&o.info("No conditions resolved to true, executing the else block steps");else{o.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let S={...a,assertionResult:d,status:"SUCCESS",startedAt:e,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return vo({asyncTasks:t.work.asyncTasks,nestedResults:[...u],result:S,logger:o}),S}o.info(`Executing ${l.length} steps in the selected conditional block`);let m=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:m,currentParentIdChain:r}}),g={...a,assertionResult:d,...f,startedAt:e,finishedAt:new Date};return vo({asyncTasks:t.work.asyncTasks,nestedResults:[...u,...f.results],result:g,logger:o}),g}import{randomUUID as Zz}from"crypto";var eV=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await Cne(t);o.finishedAt=new Date,vo({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=Zz();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=Zz();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},Cne=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 N("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await n.startSubSteps(),{status:u}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:"AI action",results:s.results,tracer:c,currentParentIdChain:e}});return s.finishedAt=new Date,s.status=u,s}catch(c){a.warn({err:c},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=c instanceof Error?c.message:`${c}`,s.status=u?"CANCELLED":"FAILED"}return s};import{randomUUID as TR}from"crypto";var tV=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as Qoe}from"ai";import{streamText as soe}from"ai";import{randomUUID as loe}from"crypto";import{stepCountIs as ooe}from"ai";function hy(t){let{tool:e,name:r,logger:n,agentName:o}=t,i=e.execute;return i?{...e,execute:async(a,s)=>{n.info({toolName:r,input:a,agentName:o},"Tool started");try{let l=await i(a,s);return n.info({toolName:r,result:l,agentName:o},"Tool completed"),l}catch(l){throw n.warn({toolName:r,err:l,agentName:o},"Tool failed"),l}}}:e}import Rne from"dedent";import{tool as Ane}from"ai";import{z as iR}from"zod";import nR from"path";function Q({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,g)=>{let S=h.ids[0],y=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:y},`Chunk for page filtering (index ${g+1}/${s.length})`)}),{chunks:s}}var Wre=75e4,cy=3e5;async function Bl(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:l}=r,c=t.tree,u=t.serializedTree,d=lt(u);if(d>Wre)try{let p=ly({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});c=await Kre({...t,tokenLimit:cy-1e4,chunks:p.chunks}),u=c.serialize();let m=lt(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"),c=c.pruneToSerializedCharLimit(cy*es),u=c.serialize();let m=lt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>cy)try{if(o){let p=ly({serializedTree:u,options:Oz,logger:i}),m=$re();c=await ee(qre({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:l}),u=c.serialize();let f=lt(u);i.info({oldTokens:d,newTokens:f,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=f}else{let p=ly({serializedTree:u,options:Pz,logger:i});c=await ee(Yre({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:l}),u=c.serialize();let m=lt(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"),c=c.pruneToSerializedCharLimit(cy*es),u=c.serialize(),i.info("Filtered page using naive truncation")}return u}async function qre({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:l,loggerTags:Xe(l)}),u=[];return r.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function Kre(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:Xe(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let l of s.keywords){let c=t.chunks.filter(m=>m.content.toLowerCase().includes(l.toLowerCase()));if(!c.length||c.reduce((m,f)=>m+f.tokenLength,0)>t.tokenLimit&&c.length>1)continue;let d=c.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function Yre(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:l}=r,c=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:l,logger:s,loggerTags:Xe(s)});if(c.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(c.ids.map(d=>`${d}`)))}async function eR(t,e){if(!t.description)throw new N("UserConfigurationError","Cannot locate element with empty description");return Ro({action:async()=>Jre(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function Jre(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:l,logger:c,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d,isAutoHeal:p,cacheBustReason:m}=t,{orgId:f,browser:h,localCodeEvalTools:g,generator:S,abortSignal:y}=e,E=t.description,b=Br(),A=t.useMemory&&!r;n&&(E=await Fr({orgId:f,s:E,context:n,localTools:g,signal:y,logger:c})),a&&(E=wz(E,a));let{serializedTree:M,tree:I}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Ui(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:y,skipWait:i,logger:c}),{}),R=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let Z,ce=Date.now(),ye;for(;!Z&&Date.now()-ce<3e3;){y.throwIfAborted();try{Z=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Me){ye=Me}}if(!Z)throw new N("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${ye?.message}`);return Z}),_=M,L=!1,k=`data:image/jpeg;base64,${R.toString("base64")}`;_=await Bl({type:"locator",description:E,screenshot:k,serializedTree:M,options:{aiPageFiltering:l},tree:I,fixtures:{generator:S,signal:y,logger:c,orgId:f}}),_!==M&&(L=!0);let H=await b.startAsyncSpan("AI_LOCATOR_CALL",async Z=>{p&&(Z.attributes.isAutoHeal=!0),m&&(Z.attributes.cacheBustReason=m);let ce=await S.getElementLocation({browserState:_,goal:E,screenshot:k,source:a,memory:A?s:void 0},{disableCache:r,abortSignal:y,loggerTags:Xe(c),useMemory:A});if(Z.result=ce,b.storeTraceAsset){let ye=Xre();b.storeTraceAsset({snapshotId:ye,data:R}),Z.screenshotSnapshotId=ye}return ce});if(c.debug({usedRag:L,result:H},"Got locator result"),!(H.id>0))throw new vc(`Could not find any relevant element: ${H.thoughts}`,H.updatedMemory?{type:"GCS_TRACES",traces:H.updatedMemory}:void 0);let{resolution:le,target:W,frameConfig:Y}=await b.startAsyncSpan("TARGET_RESOLUTION",async Z=>{let ce=await h.createTargetFromA11yId({id:H.id,requirements:H.requirements,additionalElements:H.additionalElements,description:E,targetSource:"AI",logger:c,skipSavingVisualAttributes:d});return Z.result={serializedElement:ce.target.nodeOnlySerializedHtml??"Unknown HTML element"},ce});if(le.a11yNode?.properties?.hidden&&le.a11yNode?.properties?.hidden!=="false")throw new N("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: ${le.displayString}`);return A&&(H.updatedMemory?W.memory={type:"GCS_TRACES",traces:H.updatedMemory}:s&&(W.memory=s)),{thoughts:H.thoughts,target:W,resolution:le,frameConfig:Y,screenshot:k}}import{randomUUID as Nz}from"crypto";var Qre=15;async function uy({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=Qre}){if(!t.assertion.trim())throw new N("ActionFailureError","Assertion command is missing the assertion content");let a=yT.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=Br();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=j0(u,i-1),p=0,m=Date.now(),f=m+u,h=m,g,S,y;try{await Ro({action:()=>c.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:c,logger:r})}catch(A){r.warn({err:A},"Failed to clear highlights before AI check, continuing...")}for(;p<i;){n.abortSignal.throwIfAborted();let A=Date.now();if(p>0){if(A>=f)break;let R=f-A,_=h-A,L=Math.min(_,R);L>0&&await _e(L,n.abortSignal)}let M=Date.now();if(p>0&&M>=f)break;let I=!1;try{if(g=await Ro({action:async()=>{let _=await Dz(c,r,n.abortSignal);return S&&S.serializedTree===_.serializedTree&&S.screenshotBuff.equals(_.screenshotBuff)?(I=!0,g):(S=_,kz({command:t,state:_,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:c}),g?.success){g?.updatedMemory&&rm(t,g.updatedMemory,r);break}else throw g?.thoughts?new N("AssertionFailureError",g.thoughts):new N("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(R){n.abortSignal.throwIfAborted(),y=R instanceof Error?R:new Error(`${R}`),I?r.info(`AI check attempt ${p} failed (re-used previous result)`):r.info({err:R},`AI check assert attempt ${p} failed, retrying...`)}finally{p++,h=M+d}}if(!g?.success){let A=f-Date.now();A>0&&await _e(A,n.abortSignal)}if(!g?.success)try{g=await Ro({action:async()=>kz({command:t,state:await Dz(c,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:c})}catch(A){n.abortSignal.throwIfAborted(),y=A instanceof Error?A:new Error(`${A}`)}finally{p++}g?.updatedMemory&&rm(t,g.updatedMemory,r);let E=g?.afterScreenshotOverride;if(E&&s.storeTraceAsset){let A=Nz();s.storeTraceAsset({snapshotId:A,data:E}),l.screenshotSnapshotId=A}let b=g?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let A=Nz();s.storeTraceAsset({snapshotId:A,data:b}),l.elementScreenshotSnapshotId=A}if(!g?.success){l.result={thoughts:y?.message??"AI check failed after all attempts",result:!1};let A=`AI check still failing after ${p} attempts.`;throw y&&(A+=` Latest result: ${y.message}`),new N("AssertionFailureError",A)}return l.result={thoughts:g.thoughts,result:!0},{...g,succeedImmediately:!1,urlAfterCommand:c.url()}})}async function Dz(t,e,r){await t.waitForPageLoad({signal:r});let[n,o]=await Promise.all([Ui(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function kz({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:l,logger:c}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:f,tree:h}=e,g=e.screenshotBuff,S=g.toString("base64"),y=u.url(),E=t.contextChoice??"MULTIMODAL",b=f;E!=="VISION_ONLY"&&(b=await Bl({type:"assertion",serializedTree:f,tree:h,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:c,orgId:r.orgId}}),b!==f&&(m.ragUsed=!0),m.pageState=b);let A={goal:t.assertion,url:y,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:S,contextChoice:E,source:l},I=await(E==="VISION_ONLY"?(_,L)=>d.getVisualAssertionResult(_,L):(_,L)=>d.getAssertionResult(_,L))(A,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:c,loggerTags:Xe(c)}),R;if((I.result||i)&&I.relevantElements?.length){m.relevantElementsSerialized=I.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_);try{let _=I.relevantElements[0],{resolution:L}=await u.createTargetFromA11yId({id:_,description:null,targetSource:"AI",skipSaveToCache:!0});R=await u.screenshot({locator:L.locator,clearHighlights:!0,respectActiveFrame:!0})}catch(_){c.debug({err:_},"Failed to capture element screenshot for trace, continuing...")}await Zre(I.relevantElements,u,c)}return{success:I.result,thoughts:I.thoughts,afterScreenshotOverride:g,elementScreenshotOverride:R,updatedMemory:o?I.updatedMemory:void 0}}async function Zre(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 ee(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 ene=1e5,dy=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Uz(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await tne(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof dy?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 _e(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function tne(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await _e(o.smartWaitingTimeout,n);return}if(!e.description)throw new N("UserConfigurationError","Cannot locate element with empty description");await ee(rne(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function rne(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Ro({action:async()=>nne(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function nne(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:l,orgId:c,generator:u}=e,d=t.description;r&&(d=await Fr({orgId:c,s:d,context:r,localTools:l,signal:s,logger:n}));let{serializedTree:p}=await Ui(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(lt(p)>ene)throw new dy;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(y){throw new N("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${y instanceof Error?y.message:y}`)}let g=`data:image/jpeg;base64,${f.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:g},{abortSignal:s,loggerTags:Xe(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Bz}from"lodash-es";async function zz(t){return Br().startAsyncSpan("ELEMENT_ASSERTION",async r=>one(t,r),{name:"Element check"})}async function one(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>lf(r.cache)?r.cache:void 0,l=s(),c=!i&&!!l?.target&&oc(l.target),u=Bz(l),d=(y=!1)=>{if(l=s(),!!l)if(y){let E=sC(u,l);l.target=E.target,l.updatedAt=E.updatedAt}else{if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt}},p=Date.now(),m=0,f,h=500,g=!1;for(;m<2||Date.now()-p<n;){m++,m>1&&await _e(h,a),a?.throwIfAborted(),l=s();let y=m===1,{result:E,elementWasFound:b}=await Fz({cacheToUse:l,skipAISmartWaiting:!y,useAIIfCacheFails:!c,params:t});if(f=E,g=g||b,E.success)break;d(),h=Math.min(h*1.25,1e4)}if(!f)throw new N("InternalPlatformError",`Failed to evaluate manual element assertion in ${n}ms.`);if(a?.throwIfAborted(),!f.success){let y=s(),E=y?.target?.memory?{target:{id:-1,memory:y.target.memory}}:void 0,{result:b,elementWasFound:A}=await Fz({cacheToUse:E,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:t});f=b,g=g||A,f.success||d(!0)}let S=s();return f.success&&S?.target&&!g&&(S.target=tm(S.target),S.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function Fz({cacheToUse:t,skipAISmartWaiting:e,useAIIfCacheFails:r,params:n}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=n,{logger:c}=a;if(o.target&&!wa(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=xk(o.assertion),d,p=!1,m=Bz(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:g}=await l({tracer:s,command:o,target:o.target,cache:m?.target,action:async S=>ine(S.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:Js(o),skipAISmartWaiting:e,targetName:"target"},retriesWithAI:r?1:0});return d={success:h.success,data:h.data,err:h.err,elementInteractedDisplayString:f,thoughts:g},p=!0,h.success||(c.warn({aiThoughts:g,elementString:f,err:h.err},"Element check found an element but failed"),d={...h,thoughts:g}),{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 N)||f.reason!="ActionFailureError")throw f;return d={success:!1,err:f,data:void 0,thoughts:void 0},c.warn({err:f},"Element check did not find an element and failed"),{result:d,elementWasFound:p}}}async function ine(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await ane(t,e.assertion)}async function ane(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:_t(a,500,!0)},!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,n=new N("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:_t(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 N("AssertionFailureError",s instanceof Error?s.message:String(s)),r=!1;break}if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,e.operation==="EXISTS"?n=new N("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new N("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){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},eo*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:eo*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:eo*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=vu(e);n=new N("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=vu(e);r=!1,n=new N("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),e.property);if(!Zp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=vu(e);r=!1,e.operation==="EXISTS"?n=new N("AssertionFailureError",`The style property ${e.property} ${s}`):n=new N("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 Vz(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as sne}from"jimp";async function ym(t,e){let r=await t.screenshot(e),n=await sne.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Hz}from"jimp";import tR from"jpeg-js";import lne from"pixelmatch";async function Gz({tracer:t,command:e,disableCache:r,browser:n,targetingWrapper:o,logger:i,screenshotStorage:a}){if(e.target&&!wa(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},l;e.target?.elementDescriptor?l=(await o({tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async L=>ym(n,{locator:L.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await ym(n,s);let c=await a.prepareGoldenScreenshotForComparison(i,e,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let _=`${l.width}x${l.height}`,L=`${c.width}x${c.height}`;return{fail:!0,thoughts:`Current screenshot (${_}) does not match saved screenshot dimensions (${L}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:n.url()}}let u=await Hz.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Hz.fromBuffer(c.buffer),m={width:c.width,height:c.height},f,h=d.width*d.height,g=m.width*m.height,S=Math.abs(d.height-m.height),y=Math.abs(d.width-m.width);if(h>g){let _=u.cover({w:m.width,h:m.height});l.buffer=await _.getBuffer("image/jpeg"),f="current",l.width=m.width,l.height=m.height}else if(g>h){let _=p.cover({w:d.width,h:d.height});c.buffer=await _.getBuffer("image/jpeg"),f="saved"}let E={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=e.threshold??.1,M=lne(tR.decode(c.buffer).data,tR.decode(l.buffer).data,E.data,l.width,l.height,{threshold:b,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=M>b*100,R=`Visual diff of ${M.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${b*100}%.`;if(f&&(R+=` The ${f} screenshot was cropped since it was taller by ${S} pixels and wider by ${y} pixels.`),I)throw new N("ActionFailureError",R);return{fail:I,thoughts:R,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:tR.encode(E,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var cne=3e4;function une(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 jz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??cne/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(),l;if(wu(t.url)&&(l=t.url),r&&xu(t.url,r)&&(l=new URL(t.url,r).toString()),!l)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=l;e.info({url:c,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await ee((async()=>{let f=s?`${c}?${s}`:c;try{let h=une(t),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await n(f,{headers:g,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 N("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 N("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 dne=5e3;async function py({timeout:t=eo,...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 l=Date.now();i=await $z(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await _e(s,e.signal),s=Math.min(Math.floor(s*1.5),dne);else return i}return i=await $z(e),i}async function $z({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let l=await e.evaluateFunctionInAllFrames(Wz,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(Wz,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let l=t.negated?oa.CONTAINS:ia.CONTAINS;a=new N("AssertionFailureError",`The page ${l} '${t.value}'.`),o=s}}catch(s){a=new N("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 Wz({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 pne=3e4;async function qz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??pne/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(wu(t.url)&&(s=t.url),r&&xu(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=await ee((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(!c)throw new N("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,p=await c.text();try{d=JSON.parse(p)}catch{throw new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new N("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}let u={};return c.headers.forEach((d,p)=>{u[p]=d}),{status:c.status,headers:u,json:await c.json()}}var vs=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:l,options:c}){this.orgId=i,this.options=c,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,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[l,c]=await Promise.all([Ui(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await Bl({type:"ai-action",description:e,screenshot:u,serializedTree:l.serializedTree,tree:l.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:{...Xe(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Ui(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 Bl({type:"ai-action",description:e,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:l,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:{...Xe(a)},langfuseSessionId:s})}catch(f){throw new N("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(e){return Ui(this.browser,e)}async locateElement(e){return await eR({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return Ro({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:l=1}){let c=[];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]}});c.push(p)}try{let u=await a(...c.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=c.map((m,f)=>m.thoughts?`${d(n[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return{result:u,elementInteractedDisplayStrings:c.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),l>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:l-1});throw new N("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 N("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=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()-l<500&&await _e(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=Br(),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 l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(r,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=mne();(async()=>{try{let p=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:p})}catch(p){o.debug({err:p},"Failed to capture element screenshot for redirect trace")}})(),l.elementScreenshotSnapshotId=d}return c})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:he}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await Br().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=r.targetSource;try{let c=await this.browser.resolveTarget(r,{allowNotActionableNodesOverride:n.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...n.resolveTargetOptions});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof vn&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:n.disableGlobalLocatorRedirect,logger:o});return await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(e){return await Ro({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:l=e.cache}=e,{retriesWithAI:c=1}=e,{disableCache:u,useSelector:d,targetName:p}=i,m=Br(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=Kz(e.cache);if((!g||u)&&!xE(n))throw new N("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let S=!1,y;u&&(f.info("Cache explicitly disabled for this step"),S=!0,y="Cache explicitly disabled",g=void 0);let E=_z({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=E.cache,S=S||E.cacheBustedBeforeAction,!y&&E.cacheBustReason&&(y=E.cacheBustReason);let b=!0;if(!Iz(g))return c--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:r,target:n,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:S,cacheBustReason:y});try{let{resolutionResult:A,finalTarget:M}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),I=await o(M);if(Zt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.83.3"]),zg({cmd:a,key:p,newTarget:g,logger:f,updatedWithAI:!1}),b){let R=A.decisions.filter(_=>_.matched);if(R.length!==1)f.warn({decisions:A.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let _=R[0].type;r.recordTargetAutoHeal({healType:_})}}return{result:I,elementInteractedDisplayString:A.displayString}}catch(A){this.throwIfClosed();let M=HE(A);if(M&&!s)return f.warn({err:A},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:i});if(A instanceof N&&!M)throw f.warn({err:A},"Failed to execute command with target (fatal)"),A;if(c>0&&n){f.info({err:A},"Failed to execute action with cached target, retrying with AI"),Zt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.83.3",`missReason:${A instanceof vn?A.cacheMissReason:"unknown"}`]);let I;return g.memory&&of(g.memory)&&(I=g.memory),this.wrapElementTargetingCommandHelper({tracer:r,command:a,target:n,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:{...i,memory:I,targetHealingInProgress:!0}})}throw new N("ActionFailureError",`Failed to execute interactive command: ${A instanceof Error?A.message:`${A}`}`,{errOptions:{cause:A}})}}async executeTargetingCommandWithAI(e){let{tracer:r,stepTracer:n,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=e;c.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let m=!1;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await r.startAsyncSpan("SMART_WAITING",async()=>await Uz({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),m=!0):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let f=2;for(let h=1;h<=f;h++){let g=!1,S=this.browser.getActiveFrameConfig();try{let y;try{y=await eR({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:c,skipWait:m,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(A){if(A instanceof vc&&A.updatedLocatorMemory){let M={id:-1,...l,memory:A.updatedLocatorMemory};zg({cmd:a,key:i.targetName,newTarget:M,logger:c,updatedWithAI:!0})}throw A}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),g=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),b=await s(E);return zg({cmd:a,key:i.targetName,newTarget:y.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=Xe(c)),{result:b,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(g&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),h<f&&HE(y)){c.warn({err:y,aiAttempt:h},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof N?y:new N("ActionFailureError",y.message)}}throw new N("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return ym(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await _e(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(r,n)}catch(l){throw this.throwIfClosed(),new N("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o);return this.options?.autoFollowNewTabs&&await xz({beforeUrl:a,command:r,beforePages:i.map(c=>c.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{UF(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>CA(e)}}async traceBrowserInteraction(e,r,n){return Br().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return WS({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()?uy({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 N("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new N("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return uy({command:r,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:i})}case"AI_EXTRACT":{if(!r.goal.trim())throw new N("ActionFailureError","Cannot perform AI extraction without goal");if(r.schema){let l=yO(r.schema);if(l)throw new N("UserConfigurationError",l)}let a=await this.browser.getCondensedHtml(),s=await this.browser.screenshot({retries:2});try{let l=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:Xe(i)});if(l.result==="NOT_FOUND")throw new N("ActionFailureError","No relevant data found for extraction goal on this page");if(l.thoughts?.includes("MaxGenerationLengthExceededError"))throw new N("UserConfigurationError",l.thoughts);return{thoughts:l.thoughts||void 0,data:l.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(l){let c=l.message;throw c.includes("MaxGenerationLengthExceededError")?new N("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."):c.includes("AIProviderError")&&c.includes("time")?new N("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:l}}):l}}case"NAVIGATE":if(!wu(r.url)&&!xu(r.url,this.browser.baseUrl))throw new N("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 N("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&&si(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 l=this.browser.getViewport()?.height??Wr.height,c=this.browser.getViewport()?.width??Wr.width;switch(r.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(r.deltaY??l)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(r.deltaY??l));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(r.deltaX??c)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(r.deltaX??c));break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new N("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 N("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=r.delay*1e3;await _e(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(si(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:l,thoughts:c}=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:c,data:l.downloadedFile?{downloadedFile:l.downloadedFile}:void 0};return rS(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(si(r.fromTarget)&&si(r.toTarget)){let l=r.fromTarget.pixels,c=r.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(l,c,{hoverDurationMs:r.hoverSeconds?r.hoverSeconds*1e3:void 0}),{coordinates:l});break}if(si(r.fromTarget)||si(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:(l,c)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(l,c,{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),l=r.steps??5;if(isNaN(a)||isNaN(s))throw new N("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&si(r.target)){let d=r.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:l,fromTarget:d}),{coordinates:d});break}let c,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,l,m.locator,{force:r.force})),options:{disableCache:o,targetName:"target",...r}});c=d,u=p}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,void 0,{force:r.force}));return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case"SELECT_OPTION":{if(!wa(r.target))throw new Error("Select with x/y is not supported yet");let a=r.target.elementDescriptor,s=r.choice,{elementInteractedDisplayString:l,thoughts:c}=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:Js(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:c}}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 gs({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 N("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a)}catch(s){throw new N("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&&si(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,l,c=Kz(r.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(c){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:c,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:Js(r)}});s=p,l=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:l};return rS(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(si(r.target)){let{pixels:l}=r.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(l),{coordinates:l});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:e,command:r,target:r.target,cache:r.cache?.target,action:l=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(l),{selector:l.locator.toString()}),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!wa(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:l=>this.browser.focus(l),options:{...r,targetName:"target",disableCache:o}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(r.target&&!wa(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:l=>this.browser.blur(l),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 rS(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 hne,s=fne(fetch,a),l;try{l=new URL(r.url).hostname}catch{}let c=await jz({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:vd.parse({...c,cookies:gM(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await qz({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Gz({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 ZF({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 N("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 gs({orgId:this.orgId,code:r.storageState,fragment:!1,context:n,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new N("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=ah.optional().parse(a)}catch(l){throw new N("ActionFailureError",`Credentials provided do not follow the required format: ${l}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(r.timeout??eo)*1e3,s=this.generator.getAgentConfig()?.assertion;if(Vz(r.assertion)&&!r.useSelector&&r.target.type==="description"&&s&&s!=="v1"){let c={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 uy({command:c,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{c.cache?.memory&&rm(r,c.cache?.memory.traces,i)}}let l=await zz({command:r,tracer:e,timeoutMs:a,targetingWrapper:c=>this.wrapElementTargetingCommand(c),fixtures:this.getControllerFixtures(),disableCache:o});return{fail:!l.success,data:l.data,elementInteracted:l.elementInteractedDisplayString,thoughts:l.err?.message??l.thoughts??`Element assertion ${l.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await Ro({action:async()=>py({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 Es(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async l=>await IA(l)).catch(l=>{i.error({err:l},"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 N("ActionFailureError",`No listener registered with key: ${r.key}`);let s=r.timeout??10;return{data:await ee(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new Es(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,l)=>{this.recordedRequests[r.key][s]=JS(l)},onRequestComplete:(s,l)=>{this.recordedRequests[r.key]?.[s]&&(this.recordedRequests[r.key][s]=JS(l))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[r.key];if(!a)throw new N("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 Es(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 Es(r.requestMatcher),async(s,l)=>{let c=await gs({orgId:this.orgId,code:r.responseGenerator,fragment:!1,context:n,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:l},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=zM.parse(c);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:Xe(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 ny({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:Xe(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Xe(r??this.logger)})}};var rR=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,l=s.browser,{orgId:c,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(wi({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let g=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Fr({orgId:c,s:g,context:o,logger:n,localTools:a,signal:d});h={orgId:c,cacheKeys:[S,...Object.entries(r).map(([E,b])=>`${E}:${b}`)]},n.info({original:g,keyParams:h},"Module cache key params");let y=Date.now();for(;Date.now()-y<EP;){d?.throwIfAborted();let E=await i.getCacheResult(h);if(E){n.info({cacheResult:_t(E,1e3,!0)},"Got result from module execution cache"),p=my(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(E),m=!0;break}else n.info({cacheKey:g,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${gne()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Failed to acquire cache lock, retrying...");await _e(2500+Math.random()*1e4,d)}}try{if(!p)p=await Sne(t);else if(e.autoAuth){let g=ah.safeParse(p.data);if(!g.success)throw new N("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${g.error.message}`);n.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(g.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let E={type:"CONTENT",value:y.substring},b=await py({timeout:eo,assertion:E,browser:l,logger:n,signal:d,autoExpandIframes:!!l.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"),S=!0)}if(h&&S)return await i.deleteCacheResult(h),rR(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await yne({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},Sne=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=my(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,vo({asyncTasks:t.work.asyncTasks,nestedResults:s,result:o,logger:t.fixtures.logger}),o};function my(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 Yz({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let l=e.inputs?.[s]??e.defaultParameters?.[s];if(!l){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await gs({orgId:t,code:l,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new N("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function yne({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===pO)&&(a=t.defaultCacheTtl??mO);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:wi({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function zl(t,e,r){return Ene(t,e,r)}async function Ene(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 N?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let l=my(t,{},"FAILED");return l.message=s,l.startedAt=n,l.finishedAt=i,l}return{...eS(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Qo(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 Sie}from"lodash-es";import{randomUUID as Xz}from"crypto";import{diff as Tne}from"deep-object-diff";import{cloneDeep as Jz}from"lodash-es";var fy=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,l=e.command.type,c=n.child({commandType:l,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?Jz(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=Xz(),h=Xz();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let E=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:E})}}catch(E){c.debug({err:E},"Failed to take before screenshot, continuing...")}let g,S,y;try{let E=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);E.beforeScreenshotOverride&&(m=E.beforeScreenshotOverride),y=E.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:E.fail?"FAILED":"SUCCESS",elementInteracted:E.elementInteracted},g={...e,message:E.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:E.fail?"FAILED":"SUCCESS",data:E.data,results:[S]},"assertion"in e.command&&(g.message=E.thoughts||"Assertion passed.")}catch(E){c.error({message:E.message,stack:E.stack},`Failed executing preset step ${$o(e.command)}`);let b=o.browser.url(),A=new Date,M=E instanceof Error?E.message:`${E}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:M},g={...e,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:E instanceof DOMException&&E.name==="AbortError"?"CANCELLED":"FAILED",message:M,failureReason:E instanceof N?E.reason:void 0,results:[S]}}finally{let E="cache"in e.command&&e.command.cache?Jz(e.command.cache):{},b=Tne(u,E);b&&Object.keys(b).length>0&&c.info({diffs:Yf(b)},"Updated cache")}if(a)try{if(y||(y=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let E=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:E})}}catch(E){c.debug({err:E},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),y&&r.attachAfterScreenshot({snapshotId:h,screenshot:y}),g};async function bne(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 Qo(t.work,()=>fy({...t,presetParams:{tracer:n,step:e.assertion}})),l=a.type;switch(l){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 c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(l)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let l=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:l,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}function vne(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}=vl(a.steps,e,o);if(s)return i}return-1}async function Qz(t){let e=new Date,{currentParentIdChain:r}=t,{step:n}=t.conditionalParams,{logger:o}=t.fixtures,{fromStep:i}=t.inputs,a=eS(n),s=!!i&&em(r,i.parentStepIdChain),l=n.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=vne(n,i.fromStepId,r,i.parentStepIdChain);S>=0&&(l=n.blocks[S].steps,c=!1,p=!0,o.info(`Skipping conditional assertion (execution starts from step within block ${S}), running ${l.length} steps`))}if(!p)for(let S=0;S<n.blocks.length;S++){o.info(`Evaluating condition ${S} in conditional step`);let y=n.blocks[S],E=await bne(t,y,S);if(u.push(E.conditionResult),d=E.conditionResult,E.type==="execution_error"){let b={...a,assertionResult:E.conditionResult,status:"FAILED",startedAt:e,finishedAt:new Date,message:E.conditionResult.message,results:[]};return vo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(E.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${E.steps.length} steps`),c=!1,l=E.steps;break}}if(l)c&&o.info("No conditions resolved to true, executing the else block steps");else{o.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let S={...a,assertionResult:d,status:"SUCCESS",startedAt:e,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return vo({asyncTasks:t.work.asyncTasks,nestedResults:[...u],result:S,logger:o}),S}o.info(`Executing ${l.length} steps in the selected conditional block`);let m=await t.conditionalParams.tracer.startSubSteps(),f=await t.executeStepList({...t,listParams:{steps:l,containerName:"conditional block",tracer:m,currentParentIdChain:r}}),g={...a,assertionResult:d,...f,startedAt:e,finishedAt:new Date};return vo({asyncTasks:t.work.asyncTasks,nestedResults:[...u,...f.results],result:g,logger:o}),g}import{randomUUID as Zz}from"crypto";var eV=async t=>{let{tracer:e}=t.aiStepParams,{controller:r}=t.fixtures;await r.browser.waitForStability();let n=await r.browser.screenshot({}),o=await Cne(t);o.finishedAt=new Date,vo({asyncTasks:t.work.asyncTasks,result:o,nestedResults:o.results,logger:t.fixtures.logger});let i=await r.browser.screenshot({}),a=Zz();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=Zz();return o.afterSnapshot=s,e.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},Cne=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 N("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await n.startSubSteps(),{status:u}=await t.executeStepList({...t,listParams:{steps:r.steps,containerName:"AI action",results:s.results,tracer:c,currentParentIdChain:e}});return s.finishedAt=new Date,s.status=u,s}catch(c){a.warn({err:c},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=c instanceof Error?c.message:`${c}`,s.status=u?"CANCELLED":"FAILED"}return s};import{randomUUID as TR}from"crypto";var tV=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as Qoe}from"ai";import{streamText as soe}from"ai";import{randomUUID as loe}from"crypto";import{stepCountIs as ooe}from"ai";function hy(t){let{tool:e,name:r,logger:n,agentName:o}=t,i=e.execute;return i?{...e,execute:async(a,s)=>{n.info({toolName:r,input:a,agentName:o},"Tool started");try{let l=await i(a,s);return n.info({toolName:r,result:l,agentName:o},"Tool completed"),l}catch(l){throw n.warn({toolName:r,err:l,agentName:o},"Tool failed"),l}}}:e}import Rne from"dedent";import{tool as Ane}from"ai";import{z as iR}from"zod";import nR from"path";function Q({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 oR({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 ut(t){if(t.length===0)throw new Sr("No content parts provided to construct the tool response content.");return{type:"content",value:t}}function rV(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(lt(i)>e){r[n]="[too large truncated]";continue}r[n]=o;continue}r[n]=o}return r}function nV(t,e){let r={},n=0,o=Object.entries(t).map(([i,a])=>{let s=JSON.stringify(a,null,2),l=lt(s);return{key:i,value:a,tokens:l}}).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 oV({projectRoot:t,filePath:e,pathLabel:r="path"}){if(!e||!nR.isAbsolute(e))return e;let n=nR.relative(t,e);if(n.startsWith("..")||nR.isAbsolute(n))throw new Error(`Error: ${r} "${e}" must be inside project root "${t}".`);return n}function iV(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)}})}import Em from"dedent";var $u=[{id:"NO_FAILURE",description:"The run had no failures; all attempts passed."},{id:"RELATED_APPLICATION_CHANGE",description:"A failure related to the test's intended behavior."},{id:"RELATED_APPLICATION_BUG",description:"A failure related to the test's intended behavior that is clearly a bug."},{id:"UNRELATED_APPLICATION_CHANGE",description:"A failure unrelated to the test's intended behavior."},{id:"UNRELATED_APPLICATION_BUG",description:Em`
|
|
4963
4963
|
A failure unrelated to the test's intended behavior that is clearly a bug.
|
|
4964
4964
|
Examples:
|
|
@@ -5785,7 +5785,7 @@ to pick which of these modules are relevant:
|
|
|
5785
5785
|
|
|
5786
5786
|
`;let h=aae(p);f+=h;let g=tae({schema:MR,model:m("claude-sonnet-4-5-20250929"),system:iae,messages:[{role:"user",content:f}]}),S=[];for await(let M of g.textStream)S.push(M);let y=S.join(""),E;try{let M=JSON.parse(y);E=MR.parse(M)}catch(M){i.error({rawResponse:y,parseError:M},"Failed to parse AI response as JSON"),r.addError(`Failed to parse AI response: ${gt(M)}. Raw response: ${y}`);return}let b=new Set(p.map(M=>M.moduleId)),A=E.recommendations.filter(M=>b.has(M.moduleId)?!0:(i.warn({moduleId:M.moduleId,moduleName:M.moduleName},"AI recommended a module that doesn't exist"),!1));r.addPartFromText(JSON.stringify({recommendations:A,totalModulesAnalyzed:p.length},null,2))}catch(u){i.error({err:u},"Error in module recommendation"),r.addError(`Failed to recommend modules: ${gt(u)}`)}}}),ky=[lae,nae];var qH=fr({schema:{name:Yi,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=ws(),a=["## Project context","",`- **projectRoot**: \`${n}\``,`- **cwd**: \`${o}\``,"","## Step schema","",i].join(`
|
|
5787
5787
|
`);r.addPartFromText(a)}});import{z as Uy}from"zod";var KH=fr({schema:{name:oT,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:Uy.string().describe("The session id to query."),returnBrowserState:Uy.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:Uy.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=Gl({response:r,sessionId:e.sessionId,toolName:oT});if(!n)return;n.controller.setOpen();let o=await xR({browser:n.controller.browser,supportsFileOutput:t.supportsFileOutput,returnBrowserState:e.returnBrowserState,returnScreenshot:e.returnScreenshot});r.addContentParts(o)}}),YH=fr({schema:{name:iT,description:"Get the current environment variables for a session.",inputSchema:{sessionId:Uy.string()}},handle:async(t,e,r)=>{let n=Gl({response:r,sessionId:e.sessionId,toolName:iT});if(!n)return;let o=await wo({testContext:n.context,supportsFileOutput:t.supportsFileOutput});r.addContentParts(o)}});import{mkdirSync as cae}from"fs";import{z as jl}from"zod";var XH=fr({schema:{name:RI,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:jl.string().describe("The test id to target when starting a session."),envName:jl.string().optional().describe("Optional environment override (matches CLI --env behavior). Defaults to the test's default env when omitted."),projectConfigPath:jl.string().optional().describe("Optional path to a momentic.config.yaml file (matches CLI --config)."),projectNameFilter:jl.string().optional().describe("Optional project name filter for workspace configs (matches CLI --filter)."),headfulBrowser:jl.boolean().optional().describe("Whether to launch a headful browser for the session. When omitted, uses the MCP server default if configured."),video:jl.boolean().optional().describe("Whether to record a video of the browser session. When omitted, uses the MCP server default if configured. When the session is terminated, the response will include the path to the video output directory.")}},handle:async(t,e,r)=>{let{logger:n}=t,o=e.video??t.videoDefault??!1,i;o&&(As(t.project.rootDir),i=Rs({rootDir:t.project.rootDir,entity:"video",ext:"d"}),cae(i,{recursive:!0}));let a;try{a=await ti.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.headfulDefault??!0,customHeaders:t.customHeaders,devicePixelRatio:t.devicePixelRatio,skipExitOnError:!0,videoOutputDir:i})}catch(l){r.addError(gt(l));return}let s=a.controller.browser.getViewport();r.addPartFromText(JSON.stringify({sessionId:a.sessionId,testId:a.testId,testFileAbsolutePath:a.testFileAbsolutePath,createdAt:a.createdAt,expiresAt:a.lastAccessedAt+a.idleTimeoutMs,idleTimeoutMinutes:a.idleTimeoutMs/(60*1e3),envName:a.envName,baseUrl:a.baseUrl,viewport:s},null,2));try{r.addContentParts(await tn({browser:a.controller.browser,supportsFileOutput:t.supportsFileOutput}))}catch(l){n.warn({sessionId:a.sessionId,err:l},"Session started but initial screenshot capture failed"),r.addPartFromText(JSON.stringify({warning:"Session started successfully, but initial screenshot capture failed.",screenshotError:gt(l)},null,2))}i&&r.addContentParts(Q({text:Zo({filePath:i,title:"Video output directory"}),section:"Video Output"}))}}),JH=fr({schema:{name:wI,description:"Kill a granular browser session by sessionId. Returns available session ids if the target is missing.",inputSchema:{sessionId:jl.string().describe("The session id to terminate.")}},handle:async(t,e,r)=>{let{sessionId:n}=e;try{let o=ti.getSession(n),i=o?.videoOutputDir,a=await ti.killSession(e.sessionId,"explicit kill");if(!a.killed){o?r.addError(`Failed to terminate session '${e.sessionId}'.`):r.addError(JSON.stringify({message:`No active session found for id '${e.sessionId}'.`,availableSessionIds:ti.listSessionIds()},null,2));return}r.addPartFromText(JSON.stringify({sessionId:e.sessionId,killed:!0},null,2));let s=await uV({killResult:a,rootDir:t.project.rootDir});s&&r.addContentParts(Q({text:Zo({filePath:s.filePath,title:"Session span report"}),section:"Session Spans"})),i&&r.addContentParts(Q({text:Zo({filePath:i,title:"Video output directory"}),section:"Video Output"}))}catch(o){r.addError(String(o))}}});import{z as xo}from"zod";import QH from"path";import{v4 as uae}from"uuid";async function Nm({project:t,input:e}){try{No(e.name)}catch(c){throw new Sr(`${c} when validating the test entity name`)}if(!e.baseUrl&&!e.environment)throw new Sr("Either 'baseUrl' or 'environment' must be provided when creating a test.");let r=await fe(t);if(Object.values(r.tests).find(c=>c.name===e.name))throw new Sr(`A test with the name "${e.name}" already exists. Please use a different name.`);let i={id:uae(),name:e.name,description:e.description,baseUrl:e.baseUrl,schemaVersion:Te,advanced:{browserType:e.browserType??"Chromium",viewport:e.viewport??Wr},steps:[]};e.environment&&(i.envs=[{name:e.environment,default:!0}]);let a=QH.join(t.rootDir,...e.pathSegments||[]),s=await pU({test:i,name:e.name,folder:a});return{...i,relativeFilePath:QH.relative(t.rootDir,s)}}import{randomUUID as pae}from"crypto";import{cloneDeep as mae}from"lodash-es";import{randomUUID as dae}from"crypto";var Zu=async({step:t,controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l})=>{let{results:c}=await PR({steps:[t],controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l});return c[0]},PR=async({steps:t,fromStep:e,toStep:r,tracer:n,controller:o,executionOptions:i,storage:a,codeEvalTools:s,logger:l,socket:c,testContext:u,orgId:d})=>{let p={controller:o,storage:a,codeEvalTools:s,logger:l,context:u,usageTracker:new Wc},m=n??(c?new Ta({orgId:d,parentStep:null,parentTracer:null,socket:c}):new Tp);o.setOpen();let f={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0,failureRecoveryAttempts:0},...e&&{fastForwardingToStep:!0}},h=()=>ei({listParams:{containerName:"agent-step-list",steps:t,tracer:m},fixtures:p,options:{collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},inputs:{orgId:d,runId:dae(),steps:t,testMetadata:null,orgSettings:{},fromStep:e,toStep:r},callbacks:{test:{},step:{}},work:f});return i?o.withExecutionOptions(i,h):h()};async function Fy({step:t,project:e,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,tempCaches:u}){let d=await vy(t,{project:e,logger:r,tempCaches:u});switch(d.type){case"PRESET_ACTION":return fae({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,tempCaches:u});case"AI_ACTION_DYNAMIC":return hae({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c});case"RESOLVED_MODULE":return gae({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c});default:{let[p,m]=await Promise.all([tn({browser:o.browser,supportsFileOutput:c}),wo({testContext:l,supportsFileOutput:c})]);return[...Q({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 fae({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l,tempCaches:c}){let u=await Zu({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),d=[];u?u.status==="SUCCESS"?(Sae({logger:e,tempCaches:c,command:t.command,parts:d}),d.push(...Q({text:`Step Execution successful: ${u.message}`,section:"Successful Result"}))):d.push(...Q({text:`Step Execution failed: ${u.message}`,section:"Error"})):d.push(...Q({text:"Step Execution errored for an unknown reason.",section:"Error"}));let[p,m]=await Promise.all([tn({browser:n.browser,supportsFileOutput:l}),wo({testContext:s,supportsFileOutput:l})]);return d.push(...p,...m),d}async function hae({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l}){let c=await Zu({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),u=[];c?c.status==="SUCCESS"?u.push(...Q({text:`AI action completed successfully: ${c.message??"Goal achieved"}`,section:"Successful Result"})):u.push(...Q({text:`AI action failed: ${c.message??"Unknown error while previewing AI action"}`,section:"Error"})):u.push(...Q({text:"AI action executed with unknown result.",section:"Error"}));let[d,p]=await Promise.all([tn({browser:n.browser,supportsFileOutput:l}),wo({testContext:s,supportsFileOutput:l})]);return u.push(...d,...p),u}async function gae({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l}){let c=await Zu({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),u=[];c?c.status==="SUCCESS"?u.push(...Q({text:`Module executed successfully: ${c.message}`,section:"Successful Result"})):u.push(...Q({text:`Module execution failed: ${c.message}`,section:"Error"})):u.push(...Q({text:"Module execution errored for an unknown reason.",section:"Error"}));let[d,p]=await Promise.all([tn({browser:n.browser,supportsFileOutput:l}),wo({testContext:s,supportsFileOutput:l})]);return u.push(...d,...p),u}function Sae({logger:t,tempCaches:e,command:r,parts:n}){if(e&&ro(r)&&r.cache)try{let o=pae();e[o]=ci.parse(mae({type:r.type,cache:r.cache})),n.push(...Q({text:o,section:"CacheId"}))}catch(o){t.warn({err:o},"Failed to save temp cache for step. Continuing...")}}import{cloneDeep as jR}from"lodash-es";import m1 from"path";var VR=Symbol.for("immer-nothing"),Dm=Symbol.for("immer-draftable"),qn=Symbol.for("immer-state");function rn(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var Wl=Object.getPrototypeOf;function ql(t){return!!t&&!!t[qn]}function Ms(t){return t?n1(t)||Array.isArray(t)||!!t[Dm]||!!t.constructor?.[Dm]||zm(t)||Vm(t):!1}var yae=Object.prototype.constructor.toString();function n1(t){if(!t||typeof t!="object")return!1;let e=Wl(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)===yae}function km(t,e){Kl(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function Kl(t){let e=t[qn];return e?e.type_:Array.isArray(t)?1:zm(t)?2:Vm(t)?3:0}function Um(t,e){return Kl(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function OR(t,e){return Kl(t)===2?t.get(e):t[e]}function o1(t,e,r){let n=Kl(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function Eae(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function zm(t){return t instanceof Map}function Vm(t){return t instanceof Set}function $l(t){return t.copy_||t.base_}function DR(t,e){if(zm(t))return new Map(t);if(Vm(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=n1(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[qn];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(Wl(t),n)}else{let n=Wl(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function HR(t,e=!1){return Vy(t)||ql(t)||!Ms(t)||(Kl(t)>1&&(t.set=t.add=t.clear=t.delete=Tae),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>HR(n,!0))),t}function Tae(){rn(2)}function Vy(t){return Object.isFrozen(t)}var kR={};function Yl(t){let e=kR[t];return e||rn(0,t),e}function bae(t,e){kR[t]||(kR[t]=e)}var Fm;function i1(){return Fm}function vae(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function ZH(t,e){e&&(Yl("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function UR(t){FR(t),t.drafts_.forEach(Cae),t.drafts_=null}function FR(t){t===Fm&&(Fm=t.parent_)}function e1(t){return Fm=vae(Fm,t)}function Cae(t){let e=t[qn];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function t1(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[qn].modified_&&(UR(e),rn(4)),Ms(t)&&(t=By(e,t),e.parent_||zy(e,t)),e.patches_&&Yl("Patches").generateReplacementPatches_(r[qn].base_,t,e.patches_,e.inversePatches_)):t=By(e,r,[]),UR(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==VR?t:void 0}function By(t,e,r){if(Vy(e))return e;let n=e[qn];if(!n)return km(e,(o,i)=>r1(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return zy(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),km(i,(s,l)=>r1(t,n,o,s,l,r,a)),zy(t,o,!1),r&&t.patches_&&Yl("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function r1(t,e,r,n,o,i,a){if(ql(o)){let s=i&&e&&e.type_!==3&&!Um(e.assigned_,n)?i.concat(n):void 0,l=By(t,o,s);if(o1(r,n,l),ql(l))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(Ms(o)&&!Vy(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;By(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&zy(t,o)}}function zy(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&HR(e,r)}function Aae(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:i1(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=GR;r&&(o=[n],i=Bm);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var GR={get(t,e){if(e===qn)return t;let r=$l(t);if(!Um(r,e))return Rae(t,r,e);let n=r[e];return t.finalized_||!Ms(n)?n:n===LR(t.base_,e)?(NR(t),t.copy_[e]=zR(n,t)):n},has(t,e){return e in $l(t)},ownKeys(t){return Reflect.ownKeys($l(t))},set(t,e,r){let n=a1($l(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=LR($l(t),e),i=o?.[qn];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(Eae(r,o)&&(r!==void 0||Um(t.base_,e)))return!0;NR(t),BR(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 LR(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,NR(t),BR(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=$l(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){rn(11)},getPrototypeOf(t){return Wl(t.base_)},setPrototypeOf(){rn(12)}},Bm={};km(GR,(t,e)=>{Bm[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});Bm.deleteProperty=function(t,e){return Bm.set.call(this,t,e,void 0)};Bm.set=function(t,e,r){return GR.set.call(this,t[0],e,r,t[0])};function LR(t,e){let r=t[qn];return(r?$l(r):t)[e]}function Rae(t,e,r){let n=a1(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function a1(t,e){if(!(e in t))return;let r=Wl(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=Wl(r)}}function BR(t){t.modified_||(t.modified_=!0,t.parent_&&BR(t.parent_))}function NR(t){t.copy_||(t.copy_=DR(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var wae=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(l=i,...c){return a.produce(l,u=>r.call(this,u,...c))}}typeof r!="function"&&rn(6),n!==void 0&&typeof n!="function"&&rn(7);let o;if(Ms(e)){let i=e1(this),a=zR(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?UR(i):FR(i)}return ZH(i,n),t1(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===VR&&(o=void 0),this.autoFreeze_&&HR(o,!0),n){let i=[],a=[];Yl("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else rn(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,l=>e(l,...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){Ms(t)||rn(8),ql(t)&&(t=xae(t));let e=e1(this),r=zR(t,void 0);return r[qn].isManual_=!0,FR(e),r}finishDraft(t,e){let r=t&&t[qn];(!r||!r.isManual_)&&rn(9);let{scope_:n}=r;return ZH(n,e),t1(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=Yl("Patches").applyPatches_;return ql(t)?n(t,e):this.produce(t,o=>n(o,e))}};function zR(t,e){let r=zm(t)?Yl("MapSet").proxyMap_(t,e):Vm(t)?Yl("MapSet").proxySet_(t,e):Aae(t,e);return(e?e.scope_:i1()).drafts_.push(r),r}function xae(t){return ql(t)||rn(10,t),s1(t)}function s1(t){if(!Ms(t)||Vy(t))return t;let e=t[qn],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=DR(t,e.scope_.immer_.useStrictShallowCopy_)}else r=DR(t,!0);return km(r,(n,o)=>{o1(r,n,s1(o))}),e&&(e.finalized_=!1),r}function l1(){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_:g,assigned_:S}=p,y=p.copy_;y.length<g.length&&([g,y]=[y,g],[f,h]=[h,f]);for(let E=0;E<g.length;E++)if(S[E]&&y[E]!==g[E]){let b=m.concat([E]);f.push({op:e,path:b,value:d(y[E])}),h.push({op:e,path:b,value:d(g[E])})}for(let E=g.length;E<y.length;E++){let b=m.concat([E]);f.push({op:r,path:b,value:d(y[E])})}for(let E=y.length-1;g.length<=E;--E){let b=m.concat([E]);h.push({op:n,path:b})}}function a(p,m,f,h){let{base_:g,copy_:S}=p;km(p.assigned_,(y,E)=>{let b=OR(g,y),A=OR(S,y),M=E?Um(g,y)?e:r:n;if(b===A&&M===e)return;let I=m.concat(y);f.push(M===n?{op:M,path:I}:{op:M,path:I,value:A}),h.push(M===r?{op:n,path:I}:M===n?{op:r,path:I,value:d(b)}:{op:e,path:I,value:d(b)})})}function s(p,m,f,h){let{base_:g,copy_:S}=p,y=0;g.forEach(E=>{if(!S.has(E)){let b=m.concat([y]);f.push({op:n,path:b,value:E}),h.unshift({op:r,path:b,value:E})}y++}),y=0,S.forEach(E=>{if(!g.has(E)){let b=m.concat([y]);f.push({op:r,path:b,value:E}),h.unshift({op:n,path:b,value:E})}y++})}function l(p,m,f,h){f.push({op:e,path:[],value:m===VR?void 0:m}),h.push({op:e,path:[],value:p})}function c(p,m){return m.forEach(f=>{let{path:h,op:g}=f,S=p;for(let A=0;A<h.length-1;A++){let M=Kl(S),I=h[A];typeof I!="string"&&typeof I!="number"&&(I=""+I),(M===0||M===1)&&(I==="__proto__"||I==="constructor")&&rn(19),typeof S=="function"&&I==="prototype"&&rn(19),S=OR(S,I),typeof S!="object"&&rn(18,h.join("/"))}let y=Kl(S),E=u(f.value),b=h[h.length-1];switch(g){case e:switch(y){case 2:return S.set(b,E);case 3:rn(16);default:return S[b]=E}case r:switch(y){case 1:return b==="-"?S.push(E):S.splice(b,0,E);case 2:return S.set(b,E);case 3:return S.add(E);default:return S[b]=E}case n:switch(y){case 1:return S.splice(b,1);case 2:return S.delete(b);case 3:return S.delete(f.value);default:return delete S[b]}default:rn(17,g)}}),p}function u(p){if(!Ms(p))return p;if(Array.isArray(p))return p.map(u);if(zm(p))return new Map(Array.from(p.entries()).map(([f,h])=>[f,u(h)]));if(Vm(p))return new Set(Array.from(p).map(u));let m=Object.create(Wl(p));for(let f in p)m[f]=u(p[f]);return Um(p,Dm)&&(m[Dm]=p[Dm]),m}function d(p){return ql(p)?u(p):p}bae("Patches",{applyPatches_:c,generatePatches_:o,generateReplacementPatches_:l})}var Kn=new wae,q_t=Kn.produce,c1=Kn.produceWithPatches.bind(Kn),K_t=Kn.setAutoFreeze.bind(Kn),Y_t=Kn.setUseStrictShallowCopy.bind(Kn),X_t=Kn.applyPatches.bind(Kn),J_t=Kn.createDraft.bind(Kn),Q_t=Kn.finishDraft.bind(Kn);import{v4 as Iae}from"uuid";l1();function Hy({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=c1(r,n),l={id:Iae(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",l),t.info({patchJson:JSON.stringify(l)},"Immer patch representation of tool's effect on test"),{patch:l,newState:i}}var u1=({steps:t,fromStep:e,toStep:r})=>{let n={total:0,fastForwardingToStep:!0},o=(i,a)=>{if(i.skipped)return!1;let s=a.map(c=>c.id),l=Im(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!l)return!1;n.fastForwardingToStep=!1}return n.total+=1,!!(r&&Im(i.id,s,r.toStepId,r.parentStepIdChain))};return Pn({steps:t,earlyStop:!0,onPresetAction:(i,a)=>o(i,a.parentChain),onConditional:(i,a)=>{if(i.skipped)return!1;let s=a.parentChain.map(c=>c.id),l=Im(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!l)return!1;n.fastForwardingToStep=!1}return!!(r&&Im(i.id,s,r.toStepId,r.parentStepIdChain))},onSimpleStepContainer:(i,a)=>o(i,a.parentChain)}),n.total};var _ae=t=>{throw new Error(`Unknown test section: ${t}`)};function $R(t,e){switch(e){case"setup":return t.beforeSteps??[];case"teardown":return t.afterSteps??[];case"main":return t.steps;default:return _ae(e)}}function d1(t,e,r){let n=$R(t,e);if(!r?.length)return n;let o=Mk(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 p1(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??[]])Pn({steps:o,onPresetAction:n,onConditional:n,onSimpleStepContainer:n})}async function Gy({project:t,orgId:e,logger:r,testPath:n,socket:o,saveChangesToDisk:i,supportsFileOutput:a,tempCaches:s,params:l,envName:c}){let u=await fe(t),d=await $t(m1.join(t.rootDir,n),r,u),p={steps:d.steps??[],beforeSteps:d.beforeSteps??[],afterSteps:d.afterSteps??[]},m=await Promise.all(l.steps.map(I=>vy(I,{project:t,logger:r,tempCaches:s}))),f=l.parentStepIdChain,h;try{h=d1(p,l.targetSection,f)}catch(I){return ut(Q({text:`Error: ${I.message}`,section:"Error"}))}if(l.startIndex<0||l.startIndex>h.length)return ut(Q({text:`Error: Invalid startIndex ${l.startIndex} for splicing ${l.targetSection} section with ${h.length} steps (must be 0-${h.length})`,section:"Error"}));let g=l.steps.length,S=l.deleteCount,y=jR(h.slice(l.startIndex,l.startIndex+S)),E=jR(m),b="Cannot add a module step inside another module. Modules cannot be nested.",A;try{A=Hy({logger:r,socket:o,baseState:p,recipe:_=>{let L;if(f?.length&&(L=Pk($R(_,l.targetSection),f,l.targetSection),L.some(H=>H.type==="RESOLVED_MODULE")&&m.some(H=>H.type==="RESOLVED_MODULE")))throw new Error(b);d1(_,l.targetSection,f).splice(l.startIndex,l.deleteCount,...m);for(let k of m)k.type==="RESOLVED_MODULE"&&p1(_,k);if(L)for(let k of L)k.type==="RESOLVED_MODULE"&&p1(_,k)},description:`Splice ${g} step(s) at index ${l.startIndex} in ${l.targetSection}, removing ${S}`}).newState}catch(I){if(I instanceof Error&&I.message===b)return ut(Q({text:`Error: ${I.message}`,section:"Error"}));throw I}if(i){let{stepsToSave:I,moduleUpdates:R}=await jt({stepLists:A});R.forEach(_=>{So({content:_,schemaVersion:Te,momenticFiles:u,project:t})}),Hn({relativeTestPath:n,steps:I,schemaVersion:Te,project:t})}let M=[...Q({text:`Successfully spliced ${g} step(s) at index ${l.startIndex} in the ${l.targetSection} section, removing ${S} step(s).`,section:"Result"})];return M.push(...await Mae({logger:r,project:t,orgId:e,testId:d.id,environment:c,originalSteps:p,updatedSteps:A})),M.push(...await XV({rootDir:t.rootDir,supportsFileOutput:a,deletedStepRefs:y.map((I,R)=>({id:I.id,index:l.startIndex+R})),insertedStepRefs:E.map((I,R)=>({id:I.id,index:l.startIndex+R})),deletedSteps:aS(y,{includeCache:!1}),insertedSteps:aS(E,{includeCache:!1}),metadata:{section:l.targetSection,parentStepIdChain:f??[],startIndex:l.startIndex,deleteCount:S,insertedCount:g},artifactEntity:"splice-restoration-payload"})),l.returnTest&&M.push(...Q({text:JSON.stringify(await Ly({project:t,testPath:n,envName:c,logger:r}),null,2),section:"Test Content"})),ut(M)}async function jy({project:t,logger:e,testPath:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,envName:l,testContext:c,tracer:u,params:d,tokenLimit:p,supportsFileOutput:m}){let{fromStep:f,toStep:h,targetSection:g}=d,S=await fe(t),y=await $t(m1.join(t.rootDir,r),e,S),E=new ct({baseUrl:Kt(),apiKey:Ar(),logger:e}),b=await vr(e,E,t),{alwaysSaveCache:A,noCache:M}=Ll(),I=Jo({logger:e,orgId:s,client:E,gitMetadata:b,regenerateCache:!1,alwaysSaveCache:A,noCache:M,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:void 0});try{await I.resolveStepCacheEntries({logger:e,schemaVersion:y.schemaVersion,stepLists:{beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[],steps:y.steps},testId:y.id,environment:l})}catch(ie){e.warn({err:ie},"Failed to resolve step cache entries, continuing without cache")}let R=$R(y,g),_=jR({steps:y.steps,beforeSteps:y.beforeSteps,afterSteps:y.afterSteps}),{result:L}=vl(R,f.fromStepId,f.parentStepIdChain);if(!L)return ut(Q({text:`Error: No step found with id "${f.fromStepId}" and parent chain [${f.parentStepIdChain.join(", ")}] in ${g} section.`,section:"Error"}));if(h){let{result:ie}=vl(R,h.toStepId,h.parentStepIdChain);if(!ie)return ut(Q({text:`Error: No step found with id "${h.toStepId}" and parent chain [${h.parentStepIdChain.join(", ")}] in ${g} section.`,section:"Error"}))}if(u?.setProgressTotal){let ie=u1({steps:R,fromStep:f,toStep:h});u.setProgressTotal(ie)}o.setOpen();let{results:V}=await PR({steps:R,controller:o,storage:n,codeEvalTools:i,logger:e,socket:a,orgId:s,testContext:c,fromStep:f,toStep:h,tracer:u});if(!V||V.length===0)return ut(Q({text:"Error: No steps were executed.",section:"Error"}));let k=V.at(-1);if(!k)return ut(Q({text:"Error: No steps were executed.",section:"Error"}));let H={logger:e,cacheStorage:I,orgId:s,testId:y.id,environment:l,originalStepsWithCaches:_,updatedStepsWithCaches:{steps:y.steps,beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[]}},z=k.status!=="SUCCESS";if(z)k.status==="FAILED"&&await Ru(H);else try{await Cl(H)}catch(ie){e.warn({err:ie},"Failed to save step cache after execution, future runs may be slower")}let le=g==="main"?"":` in ${g}`,W=ie=>{let Ce="fromStepId"in ie?ie.fromStepId:ie.toStepId;return ie.parentStepIdChain.length>0?`id "${Ce}" (parent chain [${ie.parentStepIdChain.join(", ")}])`:`id "${Ce}"`},Y=f?W(f):"beginning",Z=h?`Steps from ${Y} through ${W(h)}${le}`:`Steps from ${Y} to end${le}`,ce=[];if(z)ce.push(...Q({text:`Error: step with id ${k.id} failed: ${k.message}`,section:"Error"}));else{o.setOpen();let ie=`${Z} executed successfully.`;ce.push(...Q({text:ie,section:"Result"})),k.data&&ce.push(...Q({text:`Data: ${JSON.stringify(k.data,null,2)}`,section:"Result Data"}))}let[ye,Me]=await Promise.all([tn({browser:o.browser,supportsFileOutput:m}),wo({testContext:c,supportsFileOutput:m,limits:{tokenLimit:p}})]);return ut([...ce,...ye,...Me])}async function Mae({logger:t,project:e,orgId:r,testId:n,environment:o,originalSteps:i,updatedSteps:a}){let s=[];try{let l=new ct({baseUrl:Kt(),apiKey:Ar(),logger:t}),c=await vr(t,l,e),{alwaysSaveCache:u,noCache:d}=Ll(),p=Jo({logger:t,orgId:r,client:l,gitMetadata:c,regenerateCache:!1,alwaysSaveCache:u,noCache:d,isolateCachesByEnvironment:e.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:void 0});await Cl({logger:t,cacheStorage:p,orgId:r,testId:n,environment:o,originalStepsWithCaches:i,updatedStepsWithCaches:a})}catch(l){t.warn({err:l},"Failed to save step caches after execution, future runs may be slower"),s.push(...Q({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 WR=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 $y(this.reporter,this.parentStepIdChain.concat(this.step.id),this.setTotal)}},$y=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 WR(this.reporter,e.step,this.parentStepIdChain,this.setTotal)}};function f1(t,e,r,n){let o=mR(t),i={completed:0,total:0},a=new AbortController,s=!1,l=p=>{o&&GV(t,i,p,e,a,r)},c=()=>{o&&(s||(s=!0,l("Starting step execution...")))},u=p=>{!Number.isFinite(p)||p<0||(i.total=p)},d={onStepStart:p=>{c(),i.total===i.completed&&(i.total+=1),l(`Starting: ${mn(p)}`)},onStepComplete:p=>{n(),c(),i.completed+=1,i.total<i.completed&&(i.total=i.completed),l(`Completed: ${mn(p)}`)}};return new $y(d,[],u)}var Pae=fr({schema:{name:AI,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:Tb},handle:async(t,e,r,n)=>{let{project:o}=t;try{let i=await Nm({project:o,input:e});r.addPartFromText(JSON.stringify(i,null,2))}catch(i){r.addError(gt(i));return}}}),Oae=fr({schema:{name:If,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 l=await fe(o),c=Object.values(l.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:c}});let u=Object.values(l.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(l){s.push(`Tests and modules discovery failed: ${gt(l)}`)}try{let l=hS(o,i);a.push({title:"Environments",entity:"environment-list",payload:{environments:l}})}catch(l){s.push(`Environments discovery failed: ${gt(l)}`)}if(a.length>0){let l=await dV({artifacts:a,rootDir:o.rootDir,supportsFileOutput:t.supportsFileOutput});r.addContentParts(l)}s.length>0&&r.addContentParts(Q({section:"Discovery Errors",text:s.map(l=>`- ${l}`).join(`
|
|
5788
|
-
`)}))}}),h1=fr({schema:{name:_f,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:xo.string(),step:xo.string().describe(`CLI-style step definition. Use data returned from the ${Yi} tool to get the full step schema.`)}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=Gl({response:r,sessionId:o,toolName:_f});if(!a)return;a.controller.setOpen();let s=await Fy({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)}}),g1=fr({schema:{name:rT,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:xo.string(),startIndex:xo.number(),deleteCount:xo.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:xo.array(xo.string()).describe(`CLI-style definition of steps to insert. Use data returned from the ${Yi} tool to get the full step schema.`),targetSection:Xs.default("main"),parentStepIdChain:xo.array(xo.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:xo.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=Gl({response:r,sessionId:e.sessionId,toolName:rT});if(!o)return;let a=(await Gy({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)}}),S1=fr({schema:{name:nT,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:xo.string(),fromStep:Hf,toStep:Gf.optional(),targetSection:Xs.default("main"),resetSession:xo.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=Gl({response:r,sessionId:e.sessionId,toolName:nT});if(!o)return;o.controller.setOpen(),e.resetSession&&await Ny({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:Ar(),baseUrl:Kt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=f1(n,t.logger,r,()=>{ti.touchSession(o.sessionId)}),s=(await jy({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(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);r.addContentParts(s)}}),y1=[Oae,Pae];var E1=[qH,KH,YH,XH,JH,h1,S1,g1];import{z as zr}from"zod";import Nae from"fs";import Hm from"path";import Lae from"fs";import ed from"path";function T1(t){let e=t.subDir?ed.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${ht(t.name)}.module.yaml`,n=ed.join(e,r),o=ed.relative(t.project.rootDir,n),i=Lae.statSync(n);return{type:re.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:ed.sep,fullPathSegments:n.split(ed.sep),relativePathSegments:o.split(ed.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function Dae({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await jt({stepLists:{steps:e}});So({content:{...t,steps:o.steps},schemaVersion:Te,momenticFiles:r,project:n})}async function Wy({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){No(i.name);let a=await fe(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Hm.isAbsolute(r)?r:Hm.join(t.rootDir,r);s=(await $t(f,e,a)).steps}let{stepsToExtract:l,startIndex:c,endIndex:u}=JV({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:_k}),d=i.subDir?Hm.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Nae.mkdirSync(d,{recursive:!0});let p=await mS({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:l,folder:d,project:t}),m=T1({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 Dae({moduleMetadata:f,steps:l,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=Hm.isAbsolute(r)?r:Hm.join(t.rootDir,r),h=await $t(f,e,a),g={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},S=await wm({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,A])=>`${b}=${A}`)},{project:t,logger:e}),y=b=>{b.steps.splice(c,u-c,S)},{newState:E}=Hy({logger:e,socket:n,baseState:g,recipe:y,description:`Create module "${i.name}" from steps ${c}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:A}=await jt({stepLists:E});A.forEach(M=>{So({content:M,schemaVersion:Te,momenticFiles:a,project:t})}),Hn({relativeTestPath:r,steps:b,schemaVersion:Te,project:t})}}return{module:p}}var b1=fr({schema:{name:CI,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:zr.string().describe($a),description:zr.string(),enabled:zr.boolean().default(!0),parameters:zr.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:zr.record(zr.string(),zr.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:zr.record(zr.string(),zr.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:zr.record(zr.string(),zr.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:zr.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:zr.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:zr.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:zr.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=oV({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await Wy({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(gt(a))}}});var qy=[...y1,...ky,...E1,b1,wV,PV];var qR=async(t,e)=>{try{let{killed:r,failed:n}=await ti.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 KR({project:t,logger:e,apiKey:r,serverUrl:n,apiClient:o,cliVersion:i,applicationName:a="momentic-mcp-stdio-server",supportsFileOutput:s=!0,alwaysSaveCache:l=!1,noCache:c=!1,videoDefault:u=!1,headfulDefault:d=!0,customHeaders:p,devicePixelRatio:m,sessionIdleTimeoutMinutes:f}){bu(e,!0),GS(n),jS({alwaysSaveCache:l,noCache:c}),await $S(r),zu(t,E=>vt({configFilePath:E}));let h={serverId:kae(),applicationName:a,cliVersion:i},g=e.child({orgId:tr(),userId:Li(),...h}),S=new Qr(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:g,mode:"interactive"}),y={project:t,orgId:tr(),logger:g,generator:S,serverId:h.serverId,saveChangesToDisk:!0,supportsFileOutput:s,videoDefault:u,headfulDefault:d,apiClient:o,sessionIdleTimeoutMs:(f&&f>=1?f:Is)*60*1e3,customHeaders:p,devicePixelRatio:m};return $V({context:y,info:h,tools:qy,shutdownHandlers:[qR,hm]})}import{Router as zae}from"express";import{Router as Fae}from"express";import Ky from"fs";import jm from"path";import{v4 as Bae}from"uuid";import{hostname as Uae}from"os";var Gm="2.83.2",ot=nu({app:"desktop-server",hostname:Uae(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Gm});(async()=>{try{let t=await ha(ot);t.gitBranchName&&ot.addBinding("branch",t.gitBranchName)}catch{}})();var Xl=Fae();async function Yy(t){return(await fS(t,ot)).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)}Xl.get("/",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=await Yy(n);e.status(200).json(o)}));Xl.get("/tests-join",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=await Yy(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 $t(s.fullFilePath,ot,n)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)Pn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{JE(f)&&d.add(f.moduleId)}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:l,relativePath:c})}}e.status(200).json(i)}));Xl.post("/",We(async(t,e)=>{let r;try{r=tP.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{No(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Ie(),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=jm.join(n.rootDir,r.folderPath??"");if(!Ky.existsSync(i)||!Ky.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await mS({...r,folder:i,project:n});e.status(201).json(a)}));Xl.get("/:moduleId",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await fe(Ie()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await pa(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Xl.post("/:moduleId/duplicate",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=eP.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{No(r.name)}catch(f){e.status(400).json({error:f.message});return}let n=Ie(),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(f=>f.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 pa(i,o,v),s=jm.join(n.rootDir,jm.dirname(i.relativePath));if(!Ky.existsSync(s)||!Ky.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let l=ht(r.name),c=jm.join(s,`${l}.module.yaml`),u=Bae(),{stepsToSave:d}=await jt({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:re.MODULE,schemaVersion:Te,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};Il({module:p,filePath:c,projectConfig:n.config});let m={relativeFilePath:jm.relative(n.rootDir,c)};e.status(201).json(m)}));Xl.patch("/:moduleId/metadata",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=rP.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Ie(),o=await fe(n);uU({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var v1=Xl;var C1=zae();C1.get("/",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(c=>{c.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await Yy(n),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var A1=C1;import{Router as Vae}from"express";var YR=Vae();YR.get("/",We((t,e)=>{let r=hS(Ie(),ot);e.status(200).json(r)}));YR.get("/names",We((t,e)=>{let n=Ie().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var R1=YR;import{Router as Hae}from"express";var w1=Hae();w1.get("/",We((t,e)=>{let r={userId:Li(),orgId:tr(),cliVersion:Gm??"0.0.0"};e.status(200).json(r)}));var x1=w1;import{StreamableHTTPServerTransport as Gae}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as jae}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as _1}from"crypto";import{Router as $ae}from"express";var XR="mcp-session-id",I1="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",Xy=$ae();function Wae(){let t=process.env[I1];if(!t)return Is*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(ot.warn({envVar:I1,rawValue:t,fallback:Is},"Invalid MCP session idle timeout env var; falling back to default"),Is*60*1e3):e*60*1e3}function qae(t){let{headfulDefault:e,supportsFileOutput:r}=t??{},n={serverId:_1(),applicationName:"momentic-mcp-desktop-server",cliVersion:Gm??"0.0.0"},o=Ie(),i=Ar(),a=Kt(),s=ot.child({orgId:tr(),userId:Li(),...n}),l=new ct({baseUrl:a,apiKey:i,logger:s}),c=dp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Qr(o.config.ai?.agentConfig,{baseUrl:a,apiKey:i,logger:s,mode:"interactive"});return{context:{project:o,orgId:tr(),logger:s,generator:u,apiClient:l,serverId:n.serverId,saveChangesToDisk:!0,supportsFileOutput:r??!0,sessionIdleTimeoutMs:Wae(),headfulDefault:e??c??!0},info:n}}var ba={};Xy.post("/",async(t,e)=>{let r=String(t.headers[XR]??"");try{if(r&&ba[r]){await ba[r].handleRequest(t,e,t.body);return}if(!r&&jae(t.body)){let{context:n,info:o}=qae(),i=fR(n,o,qy),a=new Gae({sessionIdGenerator:()=>_1(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{ba[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&ba[s]&&delete ba[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})}});Xy.get("/",async(t,e)=>{let r=String(t.headers[XR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}await ba[r].handleRequest(t,e)});Xy.delete("/",async(t,e)=>{let r=String(t.headers[XR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}let n=ba[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var M1=Xy;import{Router as Kae}from"express";var P1=Kae();P1.get("/:id",We(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=hs();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){ot.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var O1=P1;import{Router as Yae}from"express";var Jy=Yae();Jy.get("/",We(async(t,e)=>{let r=(await LC()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Jy.get("/current",We((t,e)=>{let r=Ie();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)}));Jy.post("/set",We(async(t,e)=>{let r;try{r=oP.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ot.info("Setting local project");try{let n=await vt({configFilePath:r.configFilePath});zu(n,o=>vt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var L1=Jy;import{Router as Xae}from"express";var N1=Xae();N1.get("/",We((t,e)=>{let r=Ie(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var D1=N1;import{streamText as Ese}from"ai";import{Router as Tse}from"express";import qm from"fs";import Jl from"path";import{v4 as bse}from"uuid";import{convertToModelMessages as ise,pruneMessages as ase,stepCountIs as sse}from"ai";import Qy from"dedent";var td="3",Jae=Qy`
|
|
5788
|
+
`)}))}}),h1=fr({schema:{name:_f,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:xo.string(),step:xo.string().describe(`CLI-style step definition. Use data returned from the ${Yi} tool to get the full step schema.`)}},handle:async(t,e,r,n)=>{let{sessionId:o,step:i}=e,a=Gl({response:r,sessionId:o,toolName:_f});if(!a)return;a.controller.setOpen();let s=await Fy({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)}}),g1=fr({schema:{name:rT,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:xo.string(),startIndex:xo.number(),deleteCount:xo.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:xo.array(xo.string()).describe(`CLI-style definition of steps to insert. Use data returned from the ${Yi} tool to get the full step schema.`),targetSection:Xs.default("main"),parentStepIdChain:xo.array(xo.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:xo.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=Gl({response:r,sessionId:e.sessionId,toolName:rT});if(!o)return;let a=(await Gy({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)}}),S1=fr({schema:{name:nT,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:xo.string(),fromStep:Hf,toStep:Gf.optional(),targetSection:Xs.default("main"),resetSession:xo.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(t,e,r,n)=>{let o=Gl({response:r,sessionId:e.sessionId,toolName:nT});if(!o)return;o.controller.setOpen(),e.resetSession&&await Ny({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:Ar(),baseUrl:Kt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=f1(n,t.logger,r,()=>{ti.touchSession(o.sessionId)}),s=(await jy({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(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);r.addContentParts(s)}}),y1=[Oae,Pae];var E1=[qH,KH,YH,XH,JH,h1,S1,g1];import{z as zr}from"zod";import Nae from"fs";import Hm from"path";import Lae from"fs";import ed from"path";function T1(t){let e=t.subDir?ed.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${ht(t.name)}.module.yaml`,n=ed.join(e,r),o=ed.relative(t.project.rootDir,n),i=Lae.statSync(n);return{type:re.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:ed.sep,fullPathSegments:n.split(ed.sep),relativePathSegments:o.split(ed.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function Dae({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await jt({stepLists:{steps:e}});So({content:{...t,steps:o.steps},schemaVersion:Te,momenticFiles:r,project:n})}async function Wy({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){No(i.name);let a=await fe(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Hm.isAbsolute(r)?r:Hm.join(t.rootDir,r);s=(await $t(f,e,a)).steps}let{stepsToExtract:l,startIndex:c,endIndex:u}=JV({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:_k}),d=i.subDir?Hm.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Nae.mkdirSync(d,{recursive:!0});let p=await mS({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:l,folder:d,project:t}),m=T1({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 Dae({moduleMetadata:f,steps:l,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=Hm.isAbsolute(r)?r:Hm.join(t.rootDir,r),h=await $t(f,e,a),g={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},S=await wm({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,A])=>`${b}=${A}`)},{project:t,logger:e}),y=b=>{b.steps.splice(c,u-c,S)},{newState:E}=Hy({logger:e,socket:n,baseState:g,recipe:y,description:`Create module "${i.name}" from steps ${c}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:A}=await jt({stepLists:E});A.forEach(M=>{So({content:M,schemaVersion:Te,momenticFiles:a,project:t})}),Hn({relativeTestPath:r,steps:b,schemaVersion:Te,project:t})}}return{module:p}}var b1=fr({schema:{name:CI,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:zr.string().describe($a),description:zr.string(),enabled:zr.boolean().default(!0),parameters:zr.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:zr.record(zr.string(),zr.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:zr.record(zr.string(),zr.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:zr.record(zr.string(),zr.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:zr.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:zr.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:zr.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:zr.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=oV({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await Wy({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(gt(a))}}});var qy=[...y1,...ky,...E1,b1,wV,PV];var qR=async(t,e)=>{try{let{killed:r,failed:n}=await ti.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 KR({project:t,logger:e,apiKey:r,serverUrl:n,apiClient:o,cliVersion:i,applicationName:a="momentic-mcp-stdio-server",supportsFileOutput:s=!0,alwaysSaveCache:l=!1,noCache:c=!1,videoDefault:u=!1,headfulDefault:d=!0,customHeaders:p,devicePixelRatio:m,sessionIdleTimeoutMinutes:f}){bu(e,!0),GS(n),jS({alwaysSaveCache:l,noCache:c}),await $S(r),zu(t,E=>vt({configFilePath:E}));let h={serverId:kae(),applicationName:a,cliVersion:i},g=e.child({orgId:tr(),userId:Li(),...h}),S=new Qr(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:g,mode:"interactive"}),y={project:t,orgId:tr(),logger:g,generator:S,serverId:h.serverId,saveChangesToDisk:!0,supportsFileOutput:s,videoDefault:u,headfulDefault:d,apiClient:o,sessionIdleTimeoutMs:(f&&f>=1?f:Is)*60*1e3,customHeaders:p,devicePixelRatio:m};return $V({context:y,info:h,tools:qy,shutdownHandlers:[qR,hm]})}import{Router as zae}from"express";import{Router as Fae}from"express";import Ky from"fs";import jm from"path";import{v4 as Bae}from"uuid";import{hostname as Uae}from"os";var Gm="2.83.3",ot=nu({app:"desktop-server",hostname:Uae(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:Gm});(async()=>{try{let t=await ha(ot);t.gitBranchName&&ot.addBinding("branch",t.gitBranchName)}catch{}})();var Xl=Fae();async function Yy(t){return(await fS(t,ot)).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)}Xl.get("/",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=await Yy(n);e.status(200).json(o)}));Xl.get("/tests-join",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=await Yy(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 $t(s.fullFilePath,ot,n)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)Pn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{JE(f)&&d.add(f.moduleId)}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:l,relativePath:c})}}e.status(200).json(i)}));Xl.post("/",We(async(t,e)=>{let r;try{r=tP.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{No(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=Ie(),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=jm.join(n.rootDir,r.folderPath??"");if(!Ky.existsSync(i)||!Ky.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await mS({...r,folder:i,project:n});e.status(201).json(a)}));Xl.get("/:moduleId",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await fe(Ie()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await pa(n,r,v);e.json(o)}catch(o){e.status(400).json({err:o})}}));Xl.post("/:moduleId/duplicate",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=eP.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{No(r.name)}catch(f){e.status(400).json({error:f.message});return}let n=Ie(),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(f=>f.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 pa(i,o,v),s=jm.join(n.rootDir,jm.dirname(i.relativePath));if(!Ky.existsSync(s)||!Ky.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let l=ht(r.name),c=jm.join(s,`${l}.module.yaml`),u=Bae(),{stepsToSave:d}=await jt({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:re.MODULE,schemaVersion:Te,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};Il({module:p,filePath:c,projectConfig:n.config});let m={relativeFilePath:jm.relative(n.rootDir,c)};e.status(201).json(m)}));Xl.patch("/:moduleId/metadata",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=rP.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Ie(),o=await fe(n);uU({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var v1=Xl;var C1=zae();C1.get("/",We(async(t,e)=>{let r=Ie(),n=await fe(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(c=>{c.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await Yy(n),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var A1=C1;import{Router as Vae}from"express";var YR=Vae();YR.get("/",We((t,e)=>{let r=hS(Ie(),ot);e.status(200).json(r)}));YR.get("/names",We((t,e)=>{let n=Ie().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var R1=YR;import{Router as Hae}from"express";var w1=Hae();w1.get("/",We((t,e)=>{let r={userId:Li(),orgId:tr(),cliVersion:Gm??"0.0.0"};e.status(200).json(r)}));var x1=w1;import{StreamableHTTPServerTransport as Gae}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as jae}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as _1}from"crypto";import{Router as $ae}from"express";var XR="mcp-session-id",I1="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",Xy=$ae();function Wae(){let t=process.env[I1];if(!t)return Is*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(ot.warn({envVar:I1,rawValue:t,fallback:Is},"Invalid MCP session idle timeout env var; falling back to default"),Is*60*1e3):e*60*1e3}function qae(t){let{headfulDefault:e,supportsFileOutput:r}=t??{},n={serverId:_1(),applicationName:"momentic-mcp-desktop-server",cliVersion:Gm??"0.0.0"},o=Ie(),i=Ar(),a=Kt(),s=ot.child({orgId:tr(),userId:Li(),...n}),l=new ct({baseUrl:a,apiKey:i,logger:s}),c=dp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Qr(o.config.ai?.agentConfig,{baseUrl:a,apiKey:i,logger:s,mode:"interactive"});return{context:{project:o,orgId:tr(),logger:s,generator:u,apiClient:l,serverId:n.serverId,saveChangesToDisk:!0,supportsFileOutput:r??!0,sessionIdleTimeoutMs:Wae(),headfulDefault:e??c??!0},info:n}}var ba={};Xy.post("/",async(t,e)=>{let r=String(t.headers[XR]??"");try{if(r&&ba[r]){await ba[r].handleRequest(t,e,t.body);return}if(!r&&jae(t.body)){let{context:n,info:o}=qae(),i=fR(n,o,qy),a=new Gae({sessionIdGenerator:()=>_1(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{ba[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&ba[s]&&delete ba[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})}});Xy.get("/",async(t,e)=>{let r=String(t.headers[XR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}await ba[r].handleRequest(t,e)});Xy.delete("/",async(t,e)=>{let r=String(t.headers[XR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}let n=ba[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});var M1=Xy;import{Router as Kae}from"express";var P1=Kae();P1.get("/:id",We(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=hs();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){ot.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var O1=P1;import{Router as Yae}from"express";var Jy=Yae();Jy.get("/",We(async(t,e)=>{let r=(await LC()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Jy.get("/current",We((t,e)=>{let r=Ie();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)}));Jy.post("/set",We(async(t,e)=>{let r;try{r=oP.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}ot.info("Setting local project");try{let n=await vt({configFilePath:r.configFilePath});zu(n,o=>vt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var L1=Jy;import{Router as Xae}from"express";var N1=Xae();N1.get("/",We((t,e)=>{let r=Ie(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var D1=N1;import{streamText as Ese}from"ai";import{Router as Tse}from"express";import qm from"fs";import Jl from"path";import{v4 as bse}from"uuid";import{convertToModelMessages as ise,pruneMessages as ase,stepCountIs as sse}from"ai";import Qy from"dedent";var td="3",Jae=Qy`
|
|
5789
5789
|
<ai-actions>
|
|
5790
5790
|
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:
|
|
5791
5791
|
- Multi-step workflows that require decision-making (e.g., "Find and click the first available appointment slot")
|
|
@@ -6089,7 +6089,7 @@ ${t.map(p=>`${kt}- ${p}`).join(`
|
|
|
6089
6089
|
`))}async function KG({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,l=new Set(s.map(p=>p.testId)),c=a.filter(p=>l.has(p.id)),u=await cE({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:c}),d=await uE({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 YG(t){return t?ht(t):"Unknown suite"}async function XG({client:t,orgId:e,suitePaths:r,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await t.queueSuiteRuns({paths:r,...i});se.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:r},"Queued suites remotely"),v.dimmed(`Queued ${r.length} suites.`),n||process.exit(0);let l=Date.now();v.dimmed(`Waiting for ${r.length} suites to finish. You can view results upon completion at:`);for(let g of s)v.dimmed(`${kt}- ${t.getAppUrl()}/run-groups/${g}`);let c=new Set,u=[],d=g=>(g.status==="FAILED"||g.status==="PASSED"||g.status==="CANCELLED")&&g.runs.every(y=>y.status==="FAILED"&&(y.failureReason||y.finishedAt&&Date.now()-y.finishedAt.getTime()>30*1e3)||y.status==="PASSED"||y.status==="CANCELLED"),p=await _g({name:"suites",getResults:async()=>{let g=s.filter(E=>!u.some(b=>b.id===E)),S=await t.bulkGetRunGroupStatus(g),y=[];for(let E of S)d(E)?u.push(E):y.push(E);return[...u,...y]},timeoutMs:o?o*1e3:void 0,checkDone:g=>(g.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),v.log(`${c.size}/${s.length} ${YG(S.suite?.name)}`)))}),g.every(d))}),m=t.getAppUrl(),h=Eu({results:p,startTime:l,onFailed:g=>{let S=YG(g.suite?.name),y=g.runs.filter(b=>b.status==="FAILED").length,E=g.runs.length;v.error(`${S} (${y}/${E} tests failed):`);for(let b of g.runs)if(b.status==="FAILED"){let A=b.testName||b.test?.name;v.error(` ${A?ht(A):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:g=>` ${g.suite?.name?ht(g.suite.name):"Unknown suite name"} (${m}/run-groups/${g.id})`});process.exit(h.failed>0?1:0)}async function JG({tests:t,client:e,orgId:r,...n}){!n.yes&&!await Lr(`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(se.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=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),u=Date.now(),d=await _g({name:"runs",getResults:async()=>{let m=i.filter(g=>!s.some(S=>S.id===g)),f=await e.bulkGetRunStatus(m),h=[];for(let g of f)l(g)?s.push(g):h.push(g);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} ${ht(h)}`)}}),m.every(l))}),p=Eu({results:d,startTime:u,onFailed:m=>{let f=m.testName||m.test?.name;Mg(m,f?ht(f):"Unknown test")},getDisplayLine:m=>{let f=m.testName||m.test?.name,h=` ${f?ht(f):"Unknown test"}`;return m.id&&(h+=` (${c}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as Hle}from"crypto";import Gle from"fs";import{existsSync as yle,mkdirSync as Ele,statSync as Tle}from"fs";import{randomUUID as Zl}from"crypto";import ad,{writeFileSync as QG}from"fs";import{hostname as Jse}from"os";import Hi from"path";import{z as dE}from"zod";async function mE(t,e,r,n){if(n){let o=await e.getScreenshot(t,n);if(o){let i=`screenshot-${n}.jpeg`,a=Hi.join(r,i);return ad.writeFileSync(a,o),i}}}async function Qse(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??Zl(),historyId:n.runId??Zl(),testCaseId:n.test.id,fullName:n.test.name,name:ht(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:Jse()},{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[l,c]of Object.entries(n.parameters))c!=null&&i.parameters.push({name:l,value:JSON.stringify(c)});n.results&&await Rw(t,e,r.folder,i.steps,n.results);let a=Zse(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;ad.writeFileSync(Hi.join(o,s),JSON.stringify(i,void 0,2))}async function pE(t,e,r,n){let o={name:mn(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 mE(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await mE(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(vd.safeParse(n.data).success){let s=vd.parse(n.data),l=s.request,c={...s,request:void 0},u=`output-attachment-api-request-${Zl()}.json`,d=`output-attachment-api-response-${Zl()}.json`,p=Hi.join(r,u),m=Hi.join(r,d);ad.writeFileSync(p,JSON.stringify(l,null,2)),ad.writeFileSync(m,JSON.stringify(c,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=dE.union([dE.object({}).passthrough(),dE.array(dE.any())]).safeParse(n.data).success,l=`output-attachment-${Zl()}.json`,c=Hi.join(r,l);ad.writeFileSync(c,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:l,type:s?"application/json":"text/plain"})}return o}async function Rw(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await pE(t,e,r,i);break}case"CONDITIONAL":{a=await pE(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await pE(t,e,r,i.assertionResult)),await Rw(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await pE(t,e,r,i),await Rw(t,e,r,a.steps,i.results),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,l]of Object.entries(i.inputs))a.parameters.push({name:s,value:l})}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-${Zl()}.json`,l=Hi.join(r,s);QG(l,ZG(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${Zl()}.json`,l=Hi.join(r,s);QG(l,ZG(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function ej(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 Qse(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function ZG(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 Zse(t,e,r){let n=t.listVideoAssetPaths();if(n.length===0)return[];let o=[];for(let i of n){let a=Hi.basename(i),s=a,l=Hi.join(e,s);try{ad.copyFileSync(i,l)}catch{continue}let c,u=Hi.extname(i).toLowerCase();u===".webm"?c="video/webm":u===".mp4"?c="video/mp4":c="application/octet-stream",o.push({name:a,source:s,type:c})}return o}import{randomUUID as nj}from"crypto";import ele from"fs";import hE from"path";function fE(t){if(t.status!=="FAILED")return"none";switch(t.failureReason){case"SetupFailureError":return"setup";case"TeardownFailureError":return"teardown";default:return"main"}}function tle(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 xn(t)}}function oj(t){let e=hE.relative(".",t);return e===""?t:e}function tj(t,e){return Math.max(0,(t.getTime()-e.getTime())/1e3)}function rle(t,e,r){let n=tj(e,t),o=tj(r,t);return{start_at:n,end_at:o,duration:Math.max(0,o-n)}}function ij(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 nle(t){if(t.status!=="FAILED"||!t.failureReason)return;let e=t.failureDetails?.classification,r=bc[e?.reason||t.failureReason],n=e?.summary||t.failureDetails?.errorMessage||_a[t.failureReason];return`${r}: ${n}`}function ole(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(`
|
|
6090
6090
|
`).map(n=>n.trim()).filter(Boolean)||[];if(!(e.length===0&&r.length===0))return[{expanded:e,backtrace:r}]}function ile(t){let e=t.status==="FAILED"?fE(t):void 0;return ij([["attempts",t.attempts.toString()],["run_url",t.runId?`https://app.momentic.ai/runs/${t.runId}`:void 0],["failure_section",e],["quarantined",t.quarantined?"true":"false"],["failure_recovery",t.failureRecoveryDetails?.attempts?"true":"false"]])}function ale(t,e,r){let n=oj(r.filePath);return{id:r.runId||nj(),scope:t,name:r.testName,location:n,file_name:hE.basename(n),result:tle(r.status),failure_reason:nle(r),failure_expanded:ole(r),history:rle(e,r.lastAttemptStartedAt,r.finishedAt),tags:ile(r)}}function rj(t,e,r,n,o){let i=oj(e);return{id:nj(),scope:t,name:r,location:i,file_name:hE.basename(i),result:"skipped",history:{start_at:0,end_at:0,duration:0},tags:ij([["quarantined",o?.quarantined||"false"],["failure_recovery","false"]])}}function sle(t,e){let r=e.map(i=>ale(t.suiteName,t.startedAt,i)),n=t.testsToSkip.map(i=>rj(t.suiteName,i.relativeFilePath,i.name,i.id,void 0)),o=t.quarantinedTestsToSkip.map(i=>rj(t.suiteName,i.relativeFilePath,i.name,i.id,{quarantined:"true"}));return[...r,...n,...o]}function aj(t,e,r){let n=sle(e,r);ele.writeFileSync(hE.join(t,`${e.suiteName}.buildkite.json`),JSON.stringify(n,null,2))}import lle from"junit-report-builder";import gE from"path";function sj(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 cle(t,e){let r=fE(t);if(e.name(t.testName).className(t.testName).file(gE.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&&sj(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=bc[t.failureDetails?.classification?.reason||t.failureReason],o=t.failureDetails?.classification?.summary||_a[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 ule(t,e,r){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:l,quarantinedTestsMetadata:c}=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();cle(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(gE.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 l){let p=u.testCase();p.name(d.name).className(d.name).file(gE.relative(".",d.relativeFilePath)).property("id",d.id);let m=c[d.id];m&&sj(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 lj(t,e,r){let n=lle.newBuilder();ule(n,e,r),n.writeTo(gE.join(t,`${e.suiteName}.xml`))}import dle from"fs";import ple from"path";function cj(t){return{title:mn(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(cj):[]}}async function mle(t,e,r,n){if(n.results?.length){let o=await mE(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function fle(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||_a[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(cj)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await mle(t,e,r,n)}}async function hle(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await fle(t,e,r,n)]}}async function gle(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await hle(t,e,r,n)],id:n.runId,file:n.filePath}}function ww(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function Sle(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 pp;try{return await gle(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:ww(o,i=>i.status==="PASSED"),unexpected:ww(o,i=>i.status!=="PASSED"),flaky:ww(o,i=>!!i.isFlake),skipped:0}}}async function uj(t,e,r,n,o){let i=await Sle(t,e,r,n,o);dle.writeFileSync(ple.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function dj(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 pj({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(yle(i)?Tle(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...`),Ele(i,{recursive:!0})),r){case"junit":{let a=o.map(dj);lj(i,n,a);return}case"buildkite-json":{let a=o.map(dj);aj(i,n,a);return}case"allure":case"allure-json":await ej(t,e,i,n,o);return;case"playwright-json":await uj(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import jle from"wait-on";import{execSync as ble}from"child_process";import{platform as vle}from"os";function SE(){return mj()?(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.
|
|
6091
6091
|
`),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.
|
|
6092
|
-
`),1)}function mj(){return vle()==="darwin"&&ble("system_profiler SPDisplaysDataType").toString().includes("Retina")}function yE(t){mj()&&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 Cle from"@actions/exec";import Ale from"@actions/io";import Rle from"quote";import wle from"string-argv";async function fj(t,e=!0){let r=wle(t),n=await Ale.which(r[0],!0),o=r.slice(1),i=Cle.exec(Rle(n),o,{delay:100});if(e)return i}import xle from"csv-parser";import{createReadStream as Ile}from"fs";function xw(t){return new Promise((e,r)=>{let n=[];Ile(t).pipe(xle()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import sd from"semver";import{z as EE}from"zod";var Tn="2.83.2",_le="https://registry.npmjs.org/momentic",Mle=EE.object({versions:EE.record(EE.string(),EE.unknown()).optional()});async function Io(t){try{await Ple(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Iw(){let t=await ee(fetch(_le),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=Mle.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Tn;for(let o of Object.keys(r))sd.valid(o)&&sd.major(o)===sd.major(Tn)&&sd.gt(o,n)&&sd.prerelease(o)===null&&(n=o);return n}async function Ple(t){let e;for(let r=0;r<2;r++)try{e=await Iw()}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}sd.eq(Tn,e)||(v.warn(`Update available: v${Tn} -> 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 Aa(){try{await ee(Promise.all([Mh(),Zt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Ole}from"lodash-es";function TE(t){return t.length===1?"test":"tests"}function hj(t){return t===1?"1 worker":`${t} workers`}function gj(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${TE(t)}:`),t.forEach(e=>{v.info(`${kt}- ${[e.relativeFilePath]}`)}),v.log(""))}function Sj(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${TE(t)}:`),t.forEach(r=>{v.info(`${kt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function Lle(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${TE(t)} with ${hj(e)}:`),t.forEach(r=>{v.info(`${kt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function Nle(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${TE(e)} with ${hj(r)}:`),e.forEach(n=>{v.info(`${kt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function yj({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]=Ole(e,s=>s.quarantined);Lle(i,r),Nle(i,a,r)}import{randomUUID as Dle}from"crypto";import{cloneDeep as ld}from"lodash-es";import{dirname as kle}from"path";async function Ej({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:l}=a;i[s]=await Fr({orgId:t,s:l,localTools:e,logger:r,context:o})}return i}async function Tj({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:l,orgId:c,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:f,aiSettings:h,visualDiffScreenshotStorage:g,tracer:S,browserTypeOverride:y}){let E=await Ju({settings:f,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:c}),b={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:se,mode:"runner"},A=Nf({browserTypeOverride:y,configuredBrowserType:E.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(E.browserType=A,!hk(A)){let _=`Browser ${A} 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(_),se.warn(_)}let M=await Ao.init({baseUrl:t,logger:d,userBrowserSettings:E,storage:a,enricher:new ms(b,l),contextArgs:{viewport:i.advanced.viewport??Wr,locale:i.advanced.locale??Na,geolocation:i.advanced.geolocation??ka,timezoneId:i.advanced.timezone??Da,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>S.onNetworkPage(_),onNetworkLogs:_=>S.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:_,timestamp:L})=>{S.setActiveVideo(_,L)}}:void 0}),I=new vs({browser:M,generator:l,logger:d,orgId:c,options:{scratchPadId:void 0,slowMoMs:E.slowMoMs,autoFollowNewTabs:E.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:g}),R=new cn({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:L,defaultValue:V,required:k}=_,H=m?.[L];k&&H===void 0&&(v.error(`Required parameter '${L}' is required by test '${i.name}' but not provided`),process.exit(1));let z=await Fr({orgId:c,s:H??V,localTools:s,logger:d,context:cn.dummyContext(R.getEnvName())});R.setMomenticSystemVariable(L,z)})),{controller:I,context:R}}async function bj({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!dl){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 vj({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:l,logger:c,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;c.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let f={controller:i,storage:l,usageTracker:u,context:a,logger:c,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},g={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await bj({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await _y({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function Cj(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await Ule(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 Ule(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:l,cacheOptions:c,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:f}=t,h=new Uu(n,o),g=Jo({logger:s,orgId:o,client:n,gitMetadata:l,regenerateCache:c.regenerateCache,alwaysSaveCache:c.alwaysSaveCache,noCache:c.noCache,isolateCachesByEnvironment:r.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:c.bustOldestCachePercentage}),{envName:S,resolvedEnv:y,environmentVariables:E,baseUrl:b}=US({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:k=>_l(k,r,s)}),A=await Vg({cacheStorage:g,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id,environment:S}),M=A.steps,I=A.beforeSteps??void 0,R=A.afterSteps??void 0,_=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:kle(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:b,environmentName:S,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(_.loggerBindings||{});Object.entries(_.envVarBindings||{}).forEach(([k,H])=>{E[k]=H});let V=await Fle({...t,variables:E,envName:S,resolvedEnv:y,baseUrl:b,storageClient:h,tracer:_,logger:L,cacheStorage:g,stepsWithCaches:M,beforeStepsWithCaches:I,afterStepsWithCaches:R,usageTracker:f});return await _.finish({logger:s,status:V.status,finishedAt:V.finishedAt,failureDetails:V.failureDetails,failureReason:V.failureReason,isFlake:V.isFlake,failureRecoveryDetails:V.failureRecoveryDetails}),{runId:_.runId,...V}}async function Fle(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:l,baseUrl:c,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:f,testInputs:h,variables:g,resolvedEnv:S,retriesOverride:y,devicePixelRatio:E,logUpdate:b,tracer:A,logger:M,cacheStorage:I,gitMetadata:R,quarantined:_,quarantinedMetadata:L,usageTracker:V}=t,k=i.config.ai?.aiFailureAnalysis??!1,H=new Date,z=new Lu(i,s,a),le={...i.config},W={envName:p,urlOverride:m,customHeaders:f,testInputs:h},Y,Z=Math.abs(y??e.retries??i.config.retries??0),ce=[];M.info({...R,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ye=0;ye<=Z;ye++){let Me=Dle(),ie=await A.startAttempt(Me),Ce=M.child(ie.loggerBindings||{}),Le={...e,steps:ld(r),beforeSteps:ld(n),afterSteps:ld(o)};ye!==0&&b("RETRY",`attempt ${ye+1}/${Z+1}`);let Ae=new Date,x=le.advanced?.fakerConstantSeed,de=new Oi({httpClient:new Nr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Ce,mode:"runner"}),fakerSeed:x?Jc:void 0}),Re=ie;try{let{controller:Nn,context:ni}=await Tj({tracer:ie,baseUrl:c,envName:p,testName:Le.name,apiClient:s,devicePixelRatio:E,logger:Ce,storageClient:u,codeEvalTools:de,test:Le,generator:l,orgId:d,variables:g,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Le.advanced},browserTypeOverride:t.browserTypeOverride,aiSettings:{...i.config.ai||{},...Le.advanced||{}},visualDiffScreenshotStorage:z});Y=await vj({attemptMetadata:{attemptNumber:ye+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Ce,storageClient:u,usageTracker:V,codeEvalTools:de,apiClient:s,context:ni,controller:Nn,tracer:ie},attemptInputs:{test:Le,orgSettings:le}});let Jn=new Date,oi={logger:M,cacheStorage:I,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:ld(r),beforeSteps:ld(n),afterSteps:ld(o)},updatedStepsWithCaches:{steps:Le.steps,beforeSteps:Le.beforeSteps,afterSteps:Le.afterSteps}};Y?.status==="PASSED"?await Cl(oi):Y?.status==="FAILED"&&ye===Z&&await Ru(oi),await ie.finish({logger:Ce,result:Y}),ce.unshift(Y.status);let pe=await Ej({orgId:d,codeEvalTools:de,logger:Ce,outputDefinitions:e.outputs??[],testContext:ni}),rc=s_(ce),Os=ye+1;if(Y.status!=="FAILED")return{...Y,runAttemptId:Me,parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:Jn,attempts:Os,baseUrl:c,outputs:pe,isFlake:rc,quarantined:_,quarantinedMetadata:L};let Gi=Y.failedStepResult,ji=Gi?.message||"Unknown failure",ii=Gi?.failureReason??iI(ji)??"UnknownError",Ls=Ce.child({failureReason:ii,errorMessage:ji,numAttempts:(Z+1).toString(),name:Le.name});if(ye<Z){Ls.warn(`Retrying failed execution attempt for run: ${ji}`);continue}Ls.error(`Test failed after all exhausting attempts: ${ji}`);let cd=new Error(ji),nc={errorMessage:ji,errorStack:cd.stack},ud;if(k){let Ns;try{if(Y.results&&Y.results.length>0){let{classification:tf,aiFailureReason:vE}=await W0({logger:Ce,browserStateStorage:Re,generator:l,fullResults:Y,failureReason:ii,error:cd,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ns=tf,ud=vE}}catch(tf){Ce.warn({err:tf},"Failed to classify test results")}Ns&&(nc.classification=Ns,ii=ud??ii)}return{...Y,runAttemptId:Me,parameters:W,failureDetails:nc,failureReason:ii,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:Jn,attempts:ye+1,baseUrl:c,outputs:pe,quarantined:_,quarantinedMetadata:L}}catch(Nn){let ni=`Encountered fatal platform error while running test '${Le.name}': ${Nn}`,Jn=new Date,oi=ye+1;Ce.error({err:Nn},ni),v.error(ni);let pe={errorMessage:Nn.message,errStack:Nn.stack},rc={status:"FAILED",failureDetails:pe,failureReason:"InternalPlatformError",finishedAt:Jn};return await ie.finish({logger:Ce,result:{status:"FAILED",results:[]}}),{...rc,runAttemptId:Me,results:[],parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:new Date,attempts:oi,baseUrl:c,outputs:{},quarantined:_,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import zle from"adm-zip";import Vle from"path";var ec=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.html`)?.toString()}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))Zt.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 _w(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:f_(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Ble(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var _w=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 ya(void 0,a=>this.storeTraceAsset(a)),Sa.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";Zt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){if(!Rh(e.step))return;let r=Ah(e.step);Zt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}storeTraceAsset(e){this.diskStorage.storeFile({name:`${Pr}/${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:Ble(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new ec(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Qm=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pr),this.harPagesStream=this.diskStorage.createFileStream(`${Pr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pr}/resource-usage.ndjson`),this.resourceUsageSampler=QO({keepSamples:!1,onSample:l=>{this.resourceUsageStream.write(`${JSON.stringify(l)}
|
|
6092
|
+
`),1)}function mj(){return vle()==="darwin"&&ble("system_profiler SPDisplaysDataType").toString().includes("Retina")}function yE(t){mj()&&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 Cle from"@actions/exec";import Ale from"@actions/io";import Rle from"quote";import wle from"string-argv";async function fj(t,e=!0){let r=wle(t),n=await Ale.which(r[0],!0),o=r.slice(1),i=Cle.exec(Rle(n),o,{delay:100});if(e)return i}import xle from"csv-parser";import{createReadStream as Ile}from"fs";function xw(t){return new Promise((e,r)=>{let n=[];Ile(t).pipe(xle()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import sd from"semver";import{z as EE}from"zod";var Tn="2.83.3",_le="https://registry.npmjs.org/momentic",Mle=EE.object({versions:EE.record(EE.string(),EE.unknown()).optional()});async function Io(t){try{await Ple(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Iw(){let t=await ee(fetch(_le),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=Mle.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Tn;for(let o of Object.keys(r))sd.valid(o)&&sd.major(o)===sd.major(Tn)&&sd.gt(o,n)&&sd.prerelease(o)===null&&(n=o);return n}async function Ple(t){let e;for(let r=0;r<2;r++)try{e=await Iw()}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}sd.eq(Tn,e)||(v.warn(`Update available: v${Tn} -> 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 Aa(){try{await ee(Promise.all([Mh(),Zt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Ole}from"lodash-es";function TE(t){return t.length===1?"test":"tests"}function hj(t){return t===1?"1 worker":`${t} workers`}function gj(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${TE(t)}:`),t.forEach(e=>{v.info(`${kt}- ${[e.relativeFilePath]}`)}),v.log(""))}function Sj(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${TE(t)}:`),t.forEach(r=>{v.info(`${kt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function Lle(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${TE(t)} with ${hj(e)}:`),t.forEach(r=>{v.info(`${kt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function Nle(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${TE(e)} with ${hj(r)}:`),e.forEach(n=>{v.info(`${kt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function yj({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]=Ole(e,s=>s.quarantined);Lle(i,r),Nle(i,a,r)}import{randomUUID as Dle}from"crypto";import{cloneDeep as ld}from"lodash-es";import{dirname as kle}from"path";async function Ej({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:l}=a;i[s]=await Fr({orgId:t,s:l,localTools:e,logger:r,context:o})}return i}async function Tj({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:l,orgId:c,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:f,aiSettings:h,visualDiffScreenshotStorage:g,tracer:S,browserTypeOverride:y}){let E=await Ju({settings:f,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:c}),b={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:se,mode:"runner"},A=Nf({browserTypeOverride:y,configuredBrowserType:E.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(E.browserType=A,!hk(A)){let _=`Browser ${A} 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(_),se.warn(_)}let M=await Ao.init({baseUrl:t,logger:d,userBrowserSettings:E,storage:a,enricher:new ms(b,l),contextArgs:{viewport:i.advanced.viewport??Wr,locale:i.advanced.locale??Na,geolocation:i.advanced.geolocation??ka,timezoneId:i.advanced.timezone??Da,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>S.onNetworkPage(_),onNetworkLogs:_=>S.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:_,timestamp:L})=>{S.setActiveVideo(_,L)}}:void 0}),I=new vs({browser:M,generator:l,logger:d,orgId:c,options:{scratchPadId:void 0,slowMoMs:E.slowMoMs,autoFollowNewTabs:E.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:g}),R=new cn({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:L,defaultValue:V,required:k}=_,H=m?.[L];k&&H===void 0&&(v.error(`Required parameter '${L}' is required by test '${i.name}' but not provided`),process.exit(1));let z=await Fr({orgId:c,s:H??V,localTools:s,logger:d,context:cn.dummyContext(R.getEnvName())});R.setMomenticSystemVariable(L,z)})),{controller:I,context:R}}async function bj({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!dl){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 vj({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:l,logger:c,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;c.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let f={controller:i,storage:l,usageTracker:u,context:a,logger:c,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},g={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await bj({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await _y({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function Cj(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await Ule(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 Ule(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:l,cacheOptions:c,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:f}=t,h=new Uu(n,o),g=Jo({logger:s,orgId:o,client:n,gitMetadata:l,regenerateCache:c.regenerateCache,alwaysSaveCache:c.alwaysSaveCache,noCache:c.noCache,isolateCachesByEnvironment:r.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:c.bustOldestCachePercentage}),{envName:S,resolvedEnv:y,environmentVariables:E,baseUrl:b}=US({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:k=>_l(k,r,s)}),A=await Vg({cacheStorage:g,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id,environment:S}),M=A.steps,I=A.beforeSteps??void 0,R=A.afterSteps??void 0,_=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,directory:kle(e.relativeFilePath),testDescription:e.description??void 0,testLabels:e.labels,baseUrl:b,environmentName:S,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:t.project.config.ai}),L=s.child(_.loggerBindings||{});Object.entries(_.envVarBindings||{}).forEach(([k,H])=>{E[k]=H});let V=await Fle({...t,variables:E,envName:S,resolvedEnv:y,baseUrl:b,storageClient:h,tracer:_,logger:L,cacheStorage:g,stepsWithCaches:M,beforeStepsWithCaches:I,afterStepsWithCaches:R,usageTracker:f});return await _.finish({logger:s,status:V.status,finishedAt:V.finishedAt,failureDetails:V.failureDetails,failureReason:V.failureReason,isFlake:V.isFlake,failureRecoveryDetails:V.failureRecoveryDetails}),{runId:_.runId,...V}}async function Fle(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:l,baseUrl:c,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:f,testInputs:h,variables:g,resolvedEnv:S,retriesOverride:y,devicePixelRatio:E,logUpdate:b,tracer:A,logger:M,cacheStorage:I,gitMetadata:R,quarantined:_,quarantinedMetadata:L,usageTracker:V}=t,k=i.config.ai?.aiFailureAnalysis??!1,H=new Date,z=new Lu(i,s,a),le={...i.config},W={envName:p,urlOverride:m,customHeaders:f,testInputs:h},Y,Z=Math.abs(y??e.retries??i.config.retries??0),ce=[];M.info({...R,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ye=0;ye<=Z;ye++){let Me=Dle(),ie=await A.startAttempt(Me),Ce=M.child(ie.loggerBindings||{}),Le={...e,steps:ld(r),beforeSteps:ld(n),afterSteps:ld(o)};ye!==0&&b("RETRY",`attempt ${ye+1}/${Z+1}`);let Ae=new Date,x=le.advanced?.fakerConstantSeed,de=new Oi({httpClient:new Nr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Ce,mode:"runner"}),fakerSeed:x?Jc:void 0}),Re=ie;try{let{controller:Nn,context:ni}=await Tj({tracer:ie,baseUrl:c,envName:p,testName:Le.name,apiClient:s,devicePixelRatio:E,logger:Ce,storageClient:u,codeEvalTools:de,test:Le,generator:l,orgId:d,variables:g,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Le.advanced},browserTypeOverride:t.browserTypeOverride,aiSettings:{...i.config.ai||{},...Le.advanced||{}},visualDiffScreenshotStorage:z});Y=await vj({attemptMetadata:{attemptNumber:ye+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Ce,storageClient:u,usageTracker:V,codeEvalTools:de,apiClient:s,context:ni,controller:Nn,tracer:ie},attemptInputs:{test:Le,orgSettings:le}});let Jn=new Date,oi={logger:M,cacheStorage:I,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:ld(r),beforeSteps:ld(n),afterSteps:ld(o)},updatedStepsWithCaches:{steps:Le.steps,beforeSteps:Le.beforeSteps,afterSteps:Le.afterSteps}};Y?.status==="PASSED"?await Cl(oi):Y?.status==="FAILED"&&ye===Z&&await Ru(oi),await ie.finish({logger:Ce,result:Y}),ce.unshift(Y.status);let pe=await Ej({orgId:d,codeEvalTools:de,logger:Ce,outputDefinitions:e.outputs??[],testContext:ni}),rc=s_(ce),Os=ye+1;if(Y.status!=="FAILED")return{...Y,runAttemptId:Me,parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:Jn,attempts:Os,baseUrl:c,outputs:pe,isFlake:rc,quarantined:_,quarantinedMetadata:L};let Gi=Y.failedStepResult,ji=Gi?.message||"Unknown failure",ii=Gi?.failureReason??iI(ji)??"UnknownError",Ls=Ce.child({failureReason:ii,errorMessage:ji,numAttempts:(Z+1).toString(),name:Le.name});if(ye<Z){Ls.warn(`Retrying failed execution attempt for run: ${ji}`);continue}Ls.error(`Test failed after all exhausting attempts: ${ji}`);let cd=new Error(ji),nc={errorMessage:ji,errorStack:cd.stack},ud;if(k){let Ns;try{if(Y.results&&Y.results.length>0){let{classification:tf,aiFailureReason:vE}=await W0({logger:Ce,browserStateStorage:Re,generator:l,fullResults:Y,failureReason:ii,error:cd,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ns=tf,ud=vE}}catch(tf){Ce.warn({err:tf},"Failed to classify test results")}Ns&&(nc.classification=Ns,ii=ud??ii)}return{...Y,runAttemptId:Me,parameters:W,failureDetails:nc,failureReason:ii,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:Jn,attempts:ye+1,baseUrl:c,outputs:pe,quarantined:_,quarantinedMetadata:L}}catch(Nn){let ni=`Encountered fatal platform error while running test '${Le.name}': ${Nn}`,Jn=new Date,oi=ye+1;Ce.error({err:Nn},ni),v.error(ni);let pe={errorMessage:Nn.message,errStack:Nn.stack},rc={status:"FAILED",failureDetails:pe,failureReason:"InternalPlatformError",finishedAt:Jn};return await ie.finish({logger:Ce,result:{status:"FAILED",results:[]}}),{...rc,runAttemptId:Me,results:[],parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Ae,finishedAt:new Date,attempts:oi,baseUrl:c,outputs:{},quarantined:_,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import zle from"adm-zip";import Vle from"path";var ec=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${Pr}/${r}.html`)?.toString()}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))Zt.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 _w(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:f_(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Ble(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var _w=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 ya(void 0,a=>this.storeTraceAsset(a)),Sa.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${Pr}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";Zt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){if(!Rh(e.step))return;let r=Ah(e.step);Zt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}storeTraceAsset(e){this.diskStorage.storeFile({name:`${Pr}/${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:Ble(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new ec(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Qm=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pr),this.harPagesStream=this.diskStorage.createFileStream(`${Pr}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pr}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pr}/resource-usage.ndjson`),this.resourceUsageSampler=QO({keepSamples:!1,onSample:l=>{this.resourceUsageStream.write(`${JSON.stringify(l)}
|
|
6093
6093
|
`),l.system.cpu&&(this.cpuUsageSum+=l.system.cpu.total,this.cpuSampleCount++);let c=l.system.memory.total-l.system.memory.free;this.memoryUsageSum+=c,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 Vle.resolve(this.diskStorage.cwd(),Pr)}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)}
|
|
6094
6094
|
`)}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)}
|
|
6095
6095
|
`)):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 zle;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Pr}/${Lb}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Lb},"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:Jg(n.results,r),beforeResults:n.beforeResults?Jg(n.beforeResults,r):void 0,afterResults:n.afterResults?Jg(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)}
|
|
@@ -6100,4 +6100,4 @@ ${o}`),v.success(`Initialized Momentic project file at ${ri.resolve(as)}`);let i
|
|
|
6100
6100
|
`)),process.exit(0)});var tce=sr.command("run").alias("test").description("Run tests on the local machine");tce.addOption(On).addOption(Ln).addOption(hr).addOption(Ca).addOption(Ps).addOption(rE).addOption(pw).addOption(mw).addOption(aE).addOption(sE).addOption(MG).addOption(NG).addOption(PG).addOption(OG).addOption(LG).addOption(oE).addOption(iE).addOption(nE).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(Xn)).addOption(new gr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Xn)).addOption(new gr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Xn)).addOption(new gr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(zG).addOption(new gr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(AG).addOption(RG).addOption(cw).addOption(wG).addOption(IG).addOption(xG).addOption(uw).addOption(dw).addOption(BG).addOption(HG).addArgument(fw).action(async(t,e)=>{await Io(se);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;Og({disableCache:r,saveCache:n,regenerateCache:o}),Ek({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=tE(e.customHeaders),s=await vt({configFilePath:e.config,nameFilter:e.filter}),l=e.parallel??s.config.parallel??1;Ij().length<l*2&&v.warn(`You requested to run tests in parallel ${l} at a time on a machine with ${Ij().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:c,parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}=await Xm({project:s,fix:!1});u>0?(Tu({parsingErrors:u,parsingErrorDetails:d,failedTestFilePaths:p,failedModuleFilePaths:m}),process.exit(1)):c>0&&(v.error(`Found ${c} 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 ct({baseUrl:e.server,apiKey:e.apiKey,logger:se});v.debug("Checking API key and dependencies");let{orgId:h,userId:g}=await PS({client:f,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let S=e.outputDir??s.config.outputDir,y=e.reporterDir??s.config.reporterDir,E=Jle(),b=se.child({cliVersion:Tn,orgId:h,userId:g,runGroupId:E}),A=await vr(se,f,s);b.info({gitMetadata:A,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let M;e.inputCsv&&(M=await xw(e.inputCsv));let I=e.pixelRatio??SE();yE(I);try{let R=await Rj({...e,suiteName:i,parallel:l,retriesOverride:e.retries,devicePixelRatio:I,tests:t,project:s,client:f,outputDir:S,uploadResults:e.uploadResults,reporterDir:y,customHeaders:a,envName:e.env,orgId:h,testInputMatrix:M,logger:b,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:A,cacheOptions:{regenerateCache:o??!1,alwaysSaveCache:n??!1,noCache:r??!1,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??s.config.recordVideo,runGroupId:E,timeoutMinutes:e.timeoutMinutes,browserTypeOverride:e.browser});await Aa(),R.failed>0?process.exit(1):process.exit(0)}catch(R){v.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),v.error(R),await Aa(),process.exit(1)}});var rce=sr.command("apply").description("Apply an operation to local resources");rce.command("patch").addOption(On).addOption(Ln).addOption(hr).addOption(Ca).addOption(Ps).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 vt({configFilePath:n}),a=se,s=new ct({baseUrl:r,apiKey:e,logger:a}),l=await fe(i),c=l.tests[t.to]??Object.values(l.tests).find(d=>ht(d.name)===t.to.trim());c||(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 cG({client:s,test:c,fragment:u,yes:o,entities:l,logger:se}),process.exit(0)});var Ow=sr.command("results").description("Merge and upload test results.");Ow.command("merge").description("Merge test results files.").addOption(cw).addArgument(FG).action(async(t,e)=>{let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),tc.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),tc.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),OU(se,r,t),process.exit(0)});Ow.command("upload").description("Upload test results to Momentic cloud.").addOption(On).addOption(Ln).addArgument(hw).action(async(t,e)=>{let{apiKey:r,server:n}=e,o=se,i=new ct({baseUrl:n,apiKey:r,logger:o});await DS({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});Ow.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 ${gh}.`).argParser(Xn)).addArgument(hw).addArgument(new Kle("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await Io(se),se.setApp("local-run-viewer");let n=Mw(import.meta.url),o=ri.dirname(n),i=ri.resolve(o,"..","run-viewer-static");await iw({logger:se,staticDir:i,resultsPath:t,runId:e,port:r.port})});var Lw=sr.command("quarantine").description("Manage test quarantines");Lw.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(On).addOption(Ln).addOption(hr).addOption(Ca).addOption(gw).addArgument(Sw).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=se,s=await vt({configFilePath:o}),l=new ct({baseUrl:n,apiKey:r,logger:a}),c=await vr(se,l,s);await GG({test:t,reason:i,apiClient:l,project:s,logger:a,identity:c})});Lw.command("list").description("List quarantined tests.").addOption(On).addOption(Ln).addOption(hr).addOption(Ca).action(async t=>{let{apiKey:e,server:r,config:n}=t,o=se,i=await vt({configFilePath:n}),a=new ct({baseUrl:r,apiKey:e,logger:o});await qG({apiClient:a,project:i})});Lw.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(On).addOption(Ln).addOption(hr).addOption(Ca).addOption(gw).addArgument(Sw).action(async(t,e)=>{let{apiKey:r,server:n,config:o,reason:i}=e,a=se,s=await vt({configFilePath:o}),l=new ct({baseUrl:n,apiKey:r,logger:a}),c=await vr(se,l,s);await KG({test:t,reason:i,apiClient:l,project:s,identity:c})});var nce=sr.command("ai").description("Momentic AI features");nce.command("classify",{hidden:!0}).description("Classify results for a given test run. Currently, only failed runs are classified.").argument("<runId>","Run ID to classify.").addOption(On).addOption(Ln).addOption(hr).addOption(Ca).addOption(new gr("--quiet","Do not stream agent reasoning to stdout.")).addOption(new gr("--output-format <format>","How to print the classification result.").choices(["text","json"]).default("text")).action(async(t,e)=>{let r=e.outputFormat==="json";try{await Io(se);let n=new ct({baseUrl:e.server,apiKey:e.apiKey,logger:se}),{orgId:o}=await n.getAuthInfo();if(!TP(o))throw new Error("Result classification is only available for Momentic organization accounts.");let i=await vt({configFilePath:e.config,nameFilter:e.filter}),a=new Qr(i.config.ai?.agentConfig,{baseUrl:e.server,apiKey:e.apiKey,logger:se,mode:"runner"}),s=await DV({logger:se,orgId:o,generator:a,apiClient:n,project:i,runId:t,agentOutputStream:e.quiet?void 0:process.stdout});r?v.info(JSON.stringify({category:s.category,reasoning:s.reasoning})):v.info(`Classification: ${s.category}
|
|
6101
6101
|
Reasoning: ${s.reasoning}`)}catch(n){if(r){let o=n instanceof Error?n.message:String(n);v.error(JSON.stringify({error:o})),process.exit(1)}throw n}});sr.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(hr).addOption(Ca).action(async t=>{let e=await vt({configFilePath:t.config,nameFilter:t.filter});v.info("Updating Momentic version in package.json..."),await wj(),v.info("Updating project configuration..."),xj(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 oce(){Mj("Main program started");try{await sr.parseAsync(process.argv),await Aa()}catch(t){let e={};try{e.playwrightVersion=Xle("npx playwright --version").toString()}catch(r){se.error({err:r},"Error fetching debug information")}se.error({err:t,debugInfo:e},"Uncaught error in CLI"),v.error(t),await Aa(),process.exit(1)}}Qle.setMaxListeners(25);process.on("warning",t=>{se.warn({err:t},`Node warning received on CLI: ${t.message}`)});Mj("CLI parsing setup complete");oce();
|
|
6102
6102
|
//# sourceMappingURL=cli.js.map
|
|
6103
|
-
//# debugId=
|
|
6103
|
+
//# debugId=475dfda5-4aab-5735-9dd6-af66b5faac94
|