momentic 2.82.0 → 2.82.2
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-wJiA9ZvJ.js → index-EufxF7ym.js} +121 -121
- package/run-viewer-static/index.html +1 -1
- package/static/assets/{index-0yU-IxZZ.js → index-uR_NkJ2X.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]="ab8ab573-ad89-56ff-b23b-e35d982708b1")}catch(e){}}();
|
|
4
4
|
var Aj=Object.create;var SE=Object.defineProperty;var Rj=Object.getOwnPropertyDescriptor;var wj=Object.getOwnPropertyNames;var xj=Object.getPrototypeOf,Ij=Object.prototype.hasOwnProperty;var kt=(t,e)=>()=>(t&&(e=t(t=0)),e);var _j=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Mj=(t,e)=>{for(var r in e)SE(t,r,{get:e[r],enumerable:!0})},Pj=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of wj(e))!Ij.call(t,o)&&o!==r&&SE(t,o,{get:()=>e[o],enumerable:!(n=Rj(e,o))||n.enumerable});return t};var Pw=(t,e,r)=>(r=t!=null?Aj(xj(t)):{},Pj(e||!t||!t.__esModule?SE(r,"default",{value:t,enumerable:!0}):r,t));var YO,XO=kt(()=>{"use strict";YO=typeof globalThis=="object"?globalThis:global});var JO=kt(()=>{"use strict";XO()});var QO=kt(()=>{"use strict";JO()});var ra,zb=kt(()=>{"use strict";ra="1.9.0"});function zX(t){var e=new Set([t]),r=new Set,n=t.match(ZO);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(ZO);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 ZO,eL,tL=kt(()=>{"use strict";zb();ZO=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;eL=zX(ra)});function ru(t,e,r,n){var o;n===void 0&&(n=!1);var i=Cp[vp]=(o=Cp[vp])!==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=Cp[vp])===null||e===void 0?void 0:e.version;if(!(!n||!eL(n)))return(r=Cp[vp])===null||r===void 0?void 0:r[t]}function nu(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+ra+".");var r=Cp[vp];r&&delete r[t]}var VX,vp,Cp,Ap=kt(()=>{"use strict";QO();zb();tL();VX=ra.split(".")[0],vp=Symbol.for("opentelemetry.js.api."+VX),Cp=YO});function Rp(t,e,r){var n=na("diag");if(n)return r.unshift(e),n[t].apply(n,GX([],HX(r),!1))}var HX,GX,rL,nL=kt(()=>{"use strict";Ap();HX=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},GX=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))},rL=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 Rp("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Rp("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Rp("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Rp("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Rp("verbose",this._namespace,e)},t}()});var It,Dh=kt(()=>{"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 oL(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 iL=kt(()=>{"use strict";Dh()});var jX,$X,WX,Ti,wp=kt(()=>{"use strict";nL();iL();Dh();Ap();jX=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},$X=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},WX="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,$X([],jX(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=oL((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 ru("diag",d,r,!0)};r.setLogger=n,r.disable=function(){nu(WX,r)},r.createComponentLogger=function(o){return new rL(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 aL,sL=kt(()=>{"use strict";aL=Symbol("BaggageEntryMetadata")});function Vb(t){return typeof t!="string"&&(qX.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:aL,toString:function(){return t}}}var qX,lL=kt(()=>{"use strict";wp();sL();qX=Ti.instance()});function Hb(t){return Symbol.for(t)}var KX,Gb,jb=kt(()=>{"use strict";KX=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}(),Gb=new KX});function qb(){return Wb}var pl,YX,kh,XX,JX,QX,ZX,$b,e3,t3,r3,Wb,n3,o3,i3,a3,s3,l3,c3,Kb=kt(()=>{"use strict";pl=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)}}(),YX=function(){function t(){}return t.prototype.createGauge=function(e,r){return o3},t.prototype.createHistogram=function(e,r){return i3},t.prototype.createCounter=function(e,r){return n3},t.prototype.createUpDownCounter=function(e,r){return a3},t.prototype.createObservableGauge=function(e,r){return l3},t.prototype.createObservableCounter=function(e,r){return s3},t.prototype.createObservableUpDownCounter=function(e,r){return c3},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),kh=function(){function t(){}return t}(),XX=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(kh),JX=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(kh),QX=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(kh),ZX=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(kh),$b=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),e3=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}($b),t3=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}($b),r3=function(t){pl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}($b),Wb=new YX,n3=new XX,o3=new QX,i3=new ZX,a3=new JX,s3=new e3,l3=new t3,c3=new r3});var Bn,cL=kt(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(Bn||(Bn={}))});var u3,d3,uL,dL=kt(()=>{"use strict";jb();u3=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},d3=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))},uL=function(){function t(){}return t.prototype.active=function(){return Gb},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,d3([n],u3(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var p3,m3,Yb,f3,pL,mL=kt(()=>{"use strict";dL();Ap();wp();p3=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},m3=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))},Yb="context",f3=new uL,pL=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return ru(Yb,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,m3([e,r,n],p3(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return na(Yb)||f3},t.prototype.disable=function(){this._getContextManager().disable(),nu(Yb,Ti.instance())},t}()});var ou,fL=kt(()=>{"use strict";mL();ou=pL.getInstance()});var ue,hL=kt(()=>{"use strict";wp();ue=Ti.instance()});var h3,gL,SL=kt(()=>{"use strict";Kb();h3=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return Wb},t}(),gL=new h3});var Xb,yL,EL=kt(()=>{"use strict";SL();Ap();wp();Xb="metrics",yL=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return ru(Xb,e,Ti.instance())},t.prototype.getMeterProvider=function(){return na(Xb)||gL},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){nu(Xb,Ti.instance())},t}()});var Uh,TL=kt(()=>{"use strict";EL();Uh=yL.getInstance()});var At=kt(()=>{"use strict";lL();jb();Dh();Kb();cL();fL();hL();TL()});var lR=_j((Am,sR)=>{"use strict";(function(t,e){if(typeof Am=="object"&&typeof sR=="object")sR.exports=e();else if(typeof define=="function"&&define.amd)define([],e);else{var r=e();for(var n in r)(typeof Am=="object"?Am:t)[n]=r[n]}})(typeof self<"u"?self:Am,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 E,y=1,b=arguments.length;y<b;y++)for(var A in E=arguments[y])Object.prototype.hasOwnProperty.call(E,A)&&(S[A]=E[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 E=0,y=m;E<y.length;E++){var b=y[E];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(E){var y=this.performTransition(E),b=y[0],A=y[1];return A!==null&&(this.currentState=f(A)),b},S.prototype.performTransition=function(E){var y=this.currentState;switch(E){case" ":return y.onWhitespace(E);case"'":return y.onSingleQuote(E);case'"':return y.onDoubleQuote(E);case"\\":return y.onEscape(E);default:return y.onCharacter(E)}},S}();function g(S){for(var E=new h,y=[],b=0,A=0,M=S;A<M.length;A++){var I=M[A],R=E.handleCharacter(I);R!==null?y[b]=y[b]?y[b]+R:R:y[b]&&b++}return y}r.d(e,"default",function(){return g}),g.default=g}]).default})});import iNe,{multistream as sNe}from"pino";import cNe from"pino-pretty";import{z as yE}from"zod";var qle=yE.object({input:yE.string(),agentConfigVersion:yE.string().optional()}),sd="finish";import{z as lr}from"zod";var Ow=lr.object({srcs:lr.array(lr.string()),urls:lr.array(lr.string()),desiredSrc:lr.string().optional(),desiredUrl:lr.string().optional()}),Lw=lr.object({srcRegex:lr.string().optional(),urlRegex:lr.string().optional()}),Nw=lr.object({x:lr.number(),y:lr.number(),correlation:lr.number()}),Xle=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 Oj}from"zod-openapi";import ld from"zod";var ks=ld.object({updatedAt:ld.coerce.date().optional()}),$i=ld.object({contentType:ld.enum(["image/jpeg","image/png"]),id:ld.string()});Oj(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||{}),Lj=j.object({mPathSelectorTokens:j.string().array(),frameSrcRegex:j.string().optional(),frameUrlRegex:j.string().optional(),indices:j.number().array()}),cd=j.object({result:j.number(),traceId:j.string()}).array(),Mo=j.object({type:j.literal("GCS_TRACES"),traces:cd}),bn=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(bn||{}),Dw=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()}),Nj=j.object({selectors:j.string().array(),requirements:Dw.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:Dw.optional(),additionalElements:Nj.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:Lj.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 nc(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var Dj=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()}),Uj=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 Vr=j.discriminatedUnion("type",[Dj,Uj]).openapi({ref:"ElementTarget"});function EE(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function Hr(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function tf(t){return Mo.safeParse(t).success}import{v4 as ft}from"uuid";import*as w from"zod";import{extendZodWithOpenApi as Yj}from"zod-openapi";import{z as Ge}from"zod";import{extendZodWithOpenApi as Fj}from"zod-openapi";import{z as ud}from"zod";var dd=ud.object({result:ud.boolean(),traceId:ud.string()}).array(),Us=ud.object({type:ud.literal("GCS_TRACES"),traces:dd}),TE=ks.extend({memory:Us.optional()});var oc=(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))(oc||{});Fj(Ge);var kw=Ge.object({thoughts:Ge.string(),result:Ge.boolean(),relevantElements:Ge.array(Ge.number()).optional(),updatedMemory:dd.optional()}),Ir=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Ir||{}),Uw=["EQUALS","CONTAINS","STARTS_WITH","EXISTS"];var bE=["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"],Bj=Ge.object({type:Ge.literal("ELEMENT_NAME"),negated:Ge.boolean().optional(),operation:Ge.nativeEnum(Ir),value:Ge.string()}).openapi({ref:"ElementNameAssertion"}),zj=Ge.object({type:Ge.literal("ELEMENT_STYLE"),negated:Ge.boolean().optional(),operation:Ge.nativeEnum(Ir),property:Ge.string(),value:Ge.string()}).openapi({ref:"ElementStyleAssertion"}),Vj=Ge.object({type:Ge.literal("ELEMENT_CONTENT"),negated:Ge.boolean().optional(),operation:Ge.nativeEnum(Ir),value:Ge.string()}).openapi({ref:"ElementContentAssertion"}),Hj=Ge.object({type:Ge.literal("ELEMENT_ATTRIBUTE"),negated:Ge.boolean().optional(),operation:Ge.nativeEnum(Ir),attr:Ge.string(),value:Ge.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Gr=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Gr||{});var Fw=["EXISTS","VISIBLE","ENABLED","EDITABLE","FOCUSED"],Gj=Ge.object({type:Ge.literal("ELEMENT_EXISTENCE"),negated:Ge.boolean().optional(),condition:Ge.nativeEnum(Gr).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),rf=Ge.discriminatedUnion("type",[Vj,Hj,Gj,Bj,zj]).openapi({ref:"ManualElementAssertion"});var jj=Ge.object({type:Ge.literal("CONTENT"),negated:Ge.boolean().optional(),value:Ge.string()}).openapi({ref:"PageContentAssertion"}),Bw=Ge.discriminatedUnion("type",[jj]).openapi({ref:"ManualPageAssertion"});import nn from"zod";var pd=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()})]),md=nn.object({urlMatcher:pd,method:nn.string().optional()});import{z as it}from"zod";var li=(r=>(r.JSON="json",r.FORM_URLENCODED="form-urlencoded",r))(li||{}),$j=it.object({type:it.literal("json"),content:it.string().describe("The JSON content to send in the request body")}),Wj=it.object({type:it.literal("form-urlencoded"),content:it.record(it.string(),it.string()).describe("The form fields to send in the request body")}),qj=it.discriminatedUnion("type",[$j,Wj]),Kj=["GET","POST","PUT","DELETE","PATCH"],fd=it.enum(Kj),Fs=it.object({url:it.string(),method:fd,headers:it.record(it.string(),it.string()).optional(),params:it.record(it.string(),it.string()).optional(),body:qj.optional(),timeout:it.number().int().optional().describe("Max seconds to wait for the request to complete")}),zw=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")}),nf=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 je=(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))(je||{});Yj(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"}),Nn=ks.extend({target:Wi}).optional().openapi({ref:"SingleTargetCache"});function of(t){return!!t&&Nn.safeParse(t).success}var af=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),Vw=Ee.merge(af).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),sf=Zn.merge(w.object({cache:Nn})),Bs=Ee.merge(sf.merge(w.object({target:Vr.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),zs=Ee.merge(sf.merge(w.object({target:Vr.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),ac=Ee.merge(sf.merge(w.object({target:Vr.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),sc=Ee.merge(sf.merge(w.object({target:Vr.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),Pce=w.discriminatedUnion("type",[Bs,zs,ac,sc]).openapi({ref:"AllScrollCommands"}),Xj=Ee.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Hw=Ee.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),Jj=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")}),Gw=Ee.extend({type:w.literal("WAIT_FOR_URL"),matcher:pd}).merge(Jj).openapi({ref:"WaitUrlCommand"}),jw=Ee.merge(af).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),$w=Ee.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Ww=Ee.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),Qj=Ee.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),Zj=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"}),vE=Ee.merge(Zn).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),qw=Ee.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),Kw=Ee.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),Yw=Ee.merge(nf).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),lc=Ee.merge(Zn).extend({type:w.literal("CLICK"),target:Vr,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:Nn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()}).openapi({ref:"ClickCommand"}),CE=ks.extend({fromTarget:Wi.optional(),toTarget:Wi.optional()}),cc=Ee.merge(Zn).merge(w.object({type:w.literal("DRAG"),fromTarget:Vr,toTarget:Vr,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:CE.optional()})).openapi({ref:"DragCommand"}),uc=Ee.merge(Zn).merge(w.object({type:w.literal("MOUSE_DRAG"),target:Vr.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:Nn})).openapi({ref:"MouseDragCommand"}),dc=Ee.merge(Zn).merge(w.object({type:w.literal("HOVER"),target:Vr,cache:Nn})).openapi({ref:"HoverCommand"}),hd=Ee.merge(Zn).merge(w.object({type:w.literal("FOCUS"),target:Vr,cache:Nn})).openapi({ref:"FocusCommand"}),gd=Ee.merge(Zn).extend({type:w.literal("BLUR"),target:Vr.optional(),cache:Nn}).openapi({ref:"BlurCommand"}),e$=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),t$=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),r$=Ee.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[e$,t$]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),Xw=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()})]),pc=Ee.merge(Zn).extend({type:w.literal("SELECT_OPTION"),target:Vr,cache:Nn,choice:Xw.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),AE=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),Sd=Ee.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:AE.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:TE.optional(),source:w.string().optional()})).openapi({ref:"AIAssertionCommand"}),eo=5,Vs=600,mc=Ee.merge(Zn).extend({type:w.literal("ELEMENT_CHECK"),target:Vr,assertion:rf,cache:Nn.or(TE).optional(),timeout:w.number().int().min(0).max(Vs).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Jw=Ee.extend({type:w.literal("PAGE_CHECK"),assertion:Bw,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(Vs).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Qw=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"}),n$=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()}),Zw=25,fc=Ee.merge(Zn).merge(n$).extend({type:w.literal("TYPE"),target:Vr.optional(),value:w.string(),cache:Nn}).openapi({ref:"TypeCommand"}),ex=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"}),tx=Ee.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),rx=Ee.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),o$=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),i$=w.object({type:w.literal("REGEX"),pattern:w.string()}),a$=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),s$=w.discriminatedUnion("type",[o$,i$,a$]),l$=Ee.merge(af).merge(w.object({type:w.literal("TAB"),action:s$})).openapi({ref:"TabCommand"}),nx=Ee.merge(af).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),c$=Ee.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),ox=Ee.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),ix=Ee.extend({type:w.literal("REQUEST")}).merge(Fs).openapi({ref:"RequestCommand"}),yd=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()})}),ax=Ee.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(zw).openapi({ref:"GraphQLRequestCommand"}),sx=Ee.merge(w.object({type:w.literal("SUCCESS"),condition:Sd.optional()})).openapi({ref:"SuccessCommand"}),lx=Ee.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),u$=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 cx(t){return t?$i.safeParse(t).success:!1}var Ed=Ee.merge(Zn).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:Vr.optional(),screenshot:u$.optional(),cache:Nn})).openapi({ref:"VisualDiffCommand"}),ux=Ee.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:md,key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),d$=Ee.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),dx=Ee.merge(w.object({type:w.literal("RECORD_REQUESTS"),requestMatcher:md,key:w.string()})).openapi({ref:"RecordRequestsCommand"}),p$=Ee.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),px=Ee.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),requestMatcher:md.optional()})).openapi({ref:"SetHeaderCommand"}),mx=Ee.merge(w.object({type:w.literal("MOCK_ROUTE"),requestMatcher:md,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"})),m$=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"})),f$=Ee.merge(w.object({type:w.literal("OFFLINE_MODE"),enable:w.boolean()})).openapi({ref:"OfflineModeCommand"}),h$=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],Oce=[...h$,"DRAG"],g$=w.discriminatedUnion("type",[lc,fc,ex,tx,rx,pc,Vw,zs,Bs,Sd,$w,dc,Hw]),S$=w.discriminatedUnion("type",[...g$.options,cc]),y$=w.discriminatedUnion("type",[...S$.options]),fx=w.discriminatedUnion("type",[...y$.options,sx]),RE=w.discriminatedUnion("type",[sx,lc,fc,ex,tx,rx,pc,Vw,zs,Bs,Sd,$w,dc,Hw,Yw,mc,Jw,nx,Gw,Qw,qw,Ww,ox,cc,uc,Kw,jw,ix,ax,px,ux,dx,mx]),E$=w.discriminatedUnion("type",[Qw,Zj,Qj,vE,c$,qw,Xj,mc,r$,Ww,Yw,ox,uc,nx,Jw,Kw,jw,ix,ax,ac,sc,l$,Ed,hd,gd,Gw,ux,d$,dx,p$,px,mx,m$,f$]),hc=w.discriminatedUnion("type",[...fx.options,...E$.options]).openapi({ref:"Command"}),lf=w.discriminatedUnion("type",[...fx.options,lx]),Lce=w.discriminatedUnion("type",[...RE.options,lx]);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:ft(),type:t};break;case"AUTH_LOAD":{e={id:ft(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:ft(),type:t,goal:""};break;case"DIALOG":e={id:ft(),type:t,action:"DISMISS"};break;case"DRAG":e={id:ft(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ft(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ft(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ft(),type:t,delay:1};break;case"BLUR":e={id:ft(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ft(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ft(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ft(),type:t,value:""};break;case"SELECT_OPTION":e={id:ft(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":e={id:ft(),type:t,url:""};break;case"TAB":e={id:ft(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ft(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ft(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ft(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:ft(),type:t,code:""};break;case"AI_ASSERTION":e={id:ft(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:ft(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ft(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"VISIBLE"}};break}case"PAGE_CHECK":{e={id:ft(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ft(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ft(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:ft(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ft(),type:t,key:""};break}case"SET_HEADER":{e={id:ft(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ft(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ft(),type:t};break}case"OFFLINE_MODE":{e={id:ft(),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 Uce={AI_ASSERTION:"AI check",ELEMENT_CHECK:"Element check",JAVASCRIPT:"JavaScript",PAGE_CHECK:"Page check"};import{z as T$}from"zod";var Hce=T$.discriminatedUnion("type",[gd,vE,lc,cc,hd,dc,uc,Bs,zs,ac,sc,pc,fc,Ed,mc]);function hx(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as uf}from"zod";import{z as on}from"zod";function gc(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 Hs(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 gx(t){return on.record(on.string(),Hs(t))}import{v4 as yx}from"uuid";import{z as Ia}from"zod";import{extendZodWithOpenApi as C$}from"zod-openapi";import{z as Sx}from"zod";import{extendZodWithOpenApi as b$}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 Se=(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))(Se||{});b$(Sx);var v$=to.extend({type:Sx.literal("PRESET_ACTION")}),jr=v$.extend({command:hc}).openapi({ref:"PresetAction"});C$(Ia);var Td=30,Sc=(r=>(r.V2="2",r.V3="3",r))(Sc||{}),wE=Ia.nativeEnum(Sc),xE=ks.extend({resolvedGoal:Ia.string(),steps:jr.array()}),yc=to.extend({type:Ia.literal("AI_ACTION_DYNAMIC"),text:Ia.string(),retries:Ia.number().optional(),version:wE.optional(),cache:xE.optional(),precondition:Ia.string().optional(),postcondition:Ia.string().optional()}).openapi({ref:"AIActionDynamic"});function Ex(t){return{id:yx(),type:"PRESET_ACTION",command:{id:yx(),type:"AI_ASSERTION",assertion:t,timeout:5}}}function cf(t){return{preconditionStep:t.precondition?.trim()?Ex(t.precondition):void 0,generatedSteps:t.cache?.steps??[],postconditionStep:t.postcondition?.trim()?Ex(t.postcondition):void 0}}var an={type:!0,cache:!0},ci=uf.discriminatedUnion("type",[Sd.pick(an),gd.pick(an),lc.pick(an),cc.pick(an),mc.pick(an),hd.pick(an),dc.pick(an),uc.pick(an),Bs.pick(an),zs.pick(an),ac.pick(an),sc.pick(an),pc.pick(an),fc.pick(an),Ed.pick(an)]),A$=uf.object({type:uf.literal("AI_ACTION_DYNAMIC"),cache:xE}),Ec=uf.union([ci,A$]),df=Object.values(je).filter(t=>ci.options.some(e=>e.shape.type.safeParse(t).success));hc.options.forEach(t=>{if("target"in t.shape&&!df.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function ro(t){return df.includes(t.type)}var Tx=gc(Ec),bx=Hs(Ec),yue=gx(Ec);import{v4 as Tme}from"uuid";import{z as O}from"zod";var Cx=Symbol("Let zodToJsonSchema decide on which parser to use");var vx={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"},Ax=t=>typeof t=="string"?{...vx,name:t}:{...vx,...t};var Rx=t=>{let e=Ax(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 IE(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function Ze(t,e,r,n,o){t[e]=r,IE(t,e,n,o)}var pf=(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 Xe}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"?pf(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as R$}from"zod";function wx(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==R$.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 xx(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 Ix(){return{type:"boolean"}}function mf(t,e){return be(t.type._def,e)}var _x=(t,e)=>be(t.innerType._def,e);function _E(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>_E(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 w$(t,e)}}var w$=(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 Mx(t,e){return{...be(t.innerType._def,e),default:t.defaultValue()}}function Px(t,e){return e.effectStrategy==="input"?be(t.schema._def,e):Pt(e)}function Ox(t){return{type:"string",enum:Array.from(t.values)}}var x$=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function Lx(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(x$(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 Nx(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 bd}from"zod";var ME,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:()=>(ME===void 0&&(ME=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),ME),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 ff(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(`^${PE(n.value,e)}`),n.message,e);break;case"endsWith":sn(r,RegExp(`${PE(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(PE(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 PE(t,e){return e.patternStrategy==="escape"?_$(t):t}var I$=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function _$(t){let e="";for(let r=0;r<t.length;r++)I$.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:Dx(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):Ze(t,"pattern",Dx(e,n),r,n)}function Dx(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:`,Fv(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
|
`,Uv(c,e),`To resolve the conflict:
|
|
27
|
-
`,Fv(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 LD=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 ND=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 DD=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!jp(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 zv=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())})},Vv=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}}},kD=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},UD=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))},FD=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(jp));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(jp)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return zv(this,void 0,void 0,function(){var n,o,i,a;return Vv(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,kN(UD(UD([],kD(n),!1),kD(o),!1))];case 1:return i=s.sent(),a=i.filter(UN).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 zv(n,void 0,void 0,function(){var s,l;return Vv(this,function(c){switch(c.label){case 0:return s=new ND(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),r!=null&&(l=Xa(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 zv(n,void 0,void 0,function(){var s,l;return Vv(this,function(c){switch(c.label){case 0:return s=new DD,l=Promise.resolve(i(s)),r!=null&&(l=Xa(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&&FN(n.instruments,r)})},t}();var zJ=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)}}(),BD=function(t){zJ(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 Sg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new yg(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(gg);var zD=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)}}(),fu=function(){function t(){}return t.Noop=function(){return HJ},t}();var VJ=function(t){zD(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(fu);var VD=function(t){zD(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}(fu);var HJ=new VJ;var GJ=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())})},jJ=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}}},$J=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},HD=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new OD,this.observableRegistry=new FD,this.meter=new ID(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,BD);return r.length===1?r[0]:new LD(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,PD);return r},t.prototype.collect=function(e,r,n){return GJ(this,void 0,void 0,function(){var o,i,a;return jJ(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(NN),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=VN(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=$J(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,fu.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var WJ=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.")},GD=function(){function t(e){this.resource=e,this.viewRegistry=new TD,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=DN(e),n=this.meterSharedStates.get(r);return n==null&&(n=new HD(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=WJ(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 Eg=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())})},Tg=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}}},qJ=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},KJ=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 Eg(this,void 0,void 0,function(){var r,n,o,i,a=this;return Tg(this,function(s){switch(s.label){case 0:return r=Sl(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return Eg(a,void 0,void 0,function(){var c;return Tg(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,KJ([],qJ(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 Eg(this,void 0,void 0,function(){return Tg(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 Eg(this,void 0,void 0,function(){return Tg(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 $D=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())})},WD=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}}},qD=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 YJ(t,e){var r=e??mg.empty();return t?mg.default().merge(r):r}var Hv=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new GD(YJ((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=qD(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=qD(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"),qb()):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 $D(this,void 0,void 0,function(){return WD(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 $D(this,void 0,void 0,function(){return WD(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 XJ=/[\^$\\.+?()[\]{}|]/g,bg=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(XJ,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var hu=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 KD=function(){function t(e){var r;this._nameFilter=new bg((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new hu(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 YD=function(){function t(e){this._nameFilter=new hu(e?.name),this._versionFilter=new hu(e?.version),this._schemaUrlFilter=new hu(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 JJ(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var vg=function(){function t(e){var r;if(JJ(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||bg.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new VD(e.attributeKeys):this.attributesProcessor=fu.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:ho.Default(),this.instrumentSelector=new KD({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new YD({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var tHe=process.env.APP||"unknown";At();import{v4 as ZJ}from"uuid";function e6(){return new PN({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:hl.DELTA})}var t6=[new vg({instrumentName:"test_event_duration",instrumentType:tt.HISTOGRAM,aggregation:new Gp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new vg({instrumentName:"test_step_duration",instrumentType:tt.HISTOGRAM,aggregation:new Gp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],Cg=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 dv({[Vh]:e.serviceName,[xL]:r,[_L]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:ZJ()}),o=e6(),i=new Dv({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Hv({resource:n,readers:[i],views:t6}),Uh.setGlobalMeterProvider(this.provider),this.meter=Uh.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Nh(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=Nh(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 Lh;function XD(t){t.disabled||(Zt=new Cg(t))}var Gv=!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.82.0",tracesSampleRate:0,sendDefaultPii:!0}),DO(t.captureException),Gv=!0}catch{}import{Argument as Lle,Command as Nle,Option as fr}from"@commander-js/extra-typings";import{execSync as Dle}from"child_process";import{existsSync as r6,statSync as n6}from"fs";function JD(t){try{return r6(t)&&n6(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as o6,input as i6}from"@inquirer/prompts";import{existsSync as a6,mkdirSync as s6,statSync as l6}from"fs";import{dirname as c6}from"path";var u6=!1,ZD=(()=>{try{return l6("/.dockerenv"),!0}catch{return!1}})();async function Lr(t){return ul||u6||ZD?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await o6({message:t}))}async function jv(t){let e=c6(t);return JD(e)?a6(t)?Lr(`File '${QD(t)}' already exists. Overwrite existing content?`):!0:await Lr(`Directory '${QD(e)}' doesn't exist. Create it now?`)?(s6(e,{recursive:!0}),!0):!1}function QD(t){return t.replace(/(\s+)/g,"\\$1")}async function ek(t,e){return ul||ZD?e:(await i6({message:t,default:e})).trim()||e}import Ai,{supportsColor as p6}from"chalk";import{Console as tk}from"console";import{format as Wp}from"util";var $v=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}},Ag=class t extends tk{_buffer=[];_groupDepth=0;Console=tk;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new $v(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
27
|
+
`,Fv(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 LD=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 ND=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 DD=function(){function t(){this._buffer=new Map}return t.prototype.observe=function(e,r,n){if(n===void 0&&(n={}),!!jp(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 zv=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())})},Vv=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}}},kD=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},UD=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))},FD=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(jp));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(jp)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},t.prototype.observe=function(e,r){return zv(this,void 0,void 0,function(){var n,o,i,a;return Vv(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,r),o=this._observeBatchCallbacks(e,r),[4,kN(UD(UD([],kD(n),!1),kD(o),!1))];case 1:return i=s.sent(),a=i.filter(UN).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 zv(n,void 0,void 0,function(){var s,l;return Vv(this,function(c){switch(c.label){case 0:return s=new ND(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),r!=null&&(l=Xa(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 zv(n,void 0,void 0,function(){var s,l;return Vv(this,function(c){switch(c.label){case 0:return s=new DD,l=Promise.resolve(i(s)),r!=null&&(l=Xa(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&&FN(n.instruments,r)})},t}();var zJ=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)}}(),BD=function(t){zJ(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 Sg(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new yg(n,i),s}return e.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},e.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},e}(gg);var zD=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)}}(),fu=function(){function t(){}return t.Noop=function(){return HJ},t}();var VJ=function(t){zD(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.process=function(r,n){return r},e}(fu);var VD=function(t){zD(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}(fu);var HJ=new VJ;var GJ=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())})},jJ=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}}},$J=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},HD=function(){function t(e,r){this._meterProviderSharedState=e,this._instrumentationScope=r,this.metricStorageRegistry=new OD,this.observableRegistry=new FD,this.meter=new ID(this)}return t.prototype.registerMetricStorage=function(e){var r=this._registerMetricStorage(e,BD);return r.length===1?r[0]:new LD(r)},t.prototype.registerAsyncMetricStorage=function(e){var r=this._registerMetricStorage(e,PD);return r},t.prototype.collect=function(e,r,n){return GJ(this,void 0,void 0,function(){var o,i,a;return jJ(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(NN),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=VN(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=$J(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,fu.Noop(),[u],f);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},t}();var WJ=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.")},GD=function(){function t(e){this.resource=e,this.viewRegistry=new TD,this.metricCollectors=[],this.meterSharedStates=new Map}return t.prototype.getMeterSharedState=function(e){var r=DN(e),n=this.meterSharedStates.get(r);return n==null&&(n=new HD(this,e),this.meterSharedStates.set(r,n)),n},t.prototype.selectAggregations=function(e){var r,n,o=[];try{for(var i=WJ(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 Eg=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())})},Tg=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}}},qJ=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},KJ=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 Eg(this,void 0,void 0,function(){var r,n,o,i,a=this;return Tg(this,function(s){switch(s.label){case 0:return r=Sl(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return Eg(a,void 0,void 0,function(){var c;return Tg(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,KJ([],qJ(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 Eg(this,void 0,void 0,function(){return Tg(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 Eg(this,void 0,void 0,function(){return Tg(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 $D=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())})},WD=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}}},qD=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 YJ(t,e){var r=e??mg.empty();return t?mg.default().merge(r):r}var Hv=function(){function t(e){var r,n,o,i,a;if(this._shutdown=!1,this._sharedState=new GD(YJ((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=qD(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=qD(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"),qb()):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 $D(this,void 0,void 0,function(){return WD(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 $D(this,void 0,void 0,function(){return WD(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 XJ=/[\^$\\.+?()[\]{}|]/g,bg=function(){function t(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(t.escapePattern(e)))}return t.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},t.escapePattern=function(e){return"^"+e.replace(XJ,"\\$&").replace("*",".*")+"$"},t.hasWildcard=function(e){return e.includes("*")},t}();var hu=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 KD=function(){function t(e){var r;this._nameFilter=new bg((r=e?.name)!==null&&r!==void 0?r:"*"),this._type=e?.type,this._unitFilter=new hu(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 YD=function(){function t(e){this._nameFilter=new hu(e?.name),this._versionFilter=new hu(e?.version),this._schemaUrlFilter=new hu(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 JJ(t){return t.instrumentName==null&&t.instrumentType==null&&t.instrumentUnit==null&&t.meterName==null&&t.meterVersion==null&&t.meterSchemaUrl==null}var vg=function(){function t(e){var r;if(JJ(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||bg.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new VD(e.attributeKeys):this.attributesProcessor=fu.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(r=e.aggregation)!==null&&r!==void 0?r:ho.Default(),this.instrumentSelector=new KD({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new YD({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return t}();var tHe=process.env.APP||"unknown";At();import{v4 as ZJ}from"uuid";function e6(){return new PN({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:hl.DELTA})}var t6=[new vg({instrumentName:"test_event_duration",instrumentType:tt.HISTOGRAM,aggregation:new Gp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new vg({instrumentName:"test_step_duration",instrumentType:tt.HISTOGRAM,aggregation:new Gp([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],Cg=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 dv({[Vh]:e.serviceName,[xL]:r,[_L]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:ZJ()}),o=e6(),i=new Dv({exporter:o,exportIntervalMillis:e.exportIntervalMs??6e4});this.provider=new Hv({resource:n,readers:[i],views:t6}),Uh.setGlobalMeterProvider(this.provider),this.meter=Uh.getMeter("momentic-serverless")}increment(e,r,n){try{let o=Nh(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=Nh(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 Lh;function XD(t){t.disabled||(Zt=new Cg(t))}var Gv=!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.82.2",tracesSampleRate:0,sendDefaultPii:!0}),DO(t.captureException),Gv=!0}catch{}import{Argument as Lle,Command as Nle,Option as fr}from"@commander-js/extra-typings";import{execSync as Dle}from"child_process";import{existsSync as r6,statSync as n6}from"fs";function JD(t){try{return r6(t)&&n6(t).isDirectory()}catch(e){return v.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as o6,input as i6}from"@inquirer/prompts";import{existsSync as a6,mkdirSync as s6,statSync as l6}from"fs";import{dirname as c6}from"path";var u6=!1,ZD=(()=>{try{return l6("/.dockerenv"),!0}catch{return!1}})();async function Lr(t){return ul||u6||ZD?!0:(await v.flush(),await new Promise(r=>setTimeout(r,100)),await o6({message:t}))}async function jv(t){let e=c6(t);return JD(e)?a6(t)?Lr(`File '${QD(t)}' already exists. Overwrite existing content?`):!0:await Lr(`Directory '${QD(e)}' doesn't exist. Create it now?`)?(s6(e,{recursive:!0}),!0):!1}function QD(t){return t.replace(/(\s+)/g,"\\$1")}async function ek(t,e){return ul||ZD?e:(await i6({message:t,default:e})).trim()||e}import Ai,{supportsColor as p6}from"chalk";import{Console as tk}from"console";import{format as Wp}from"util";var $v=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}},Ag=class t extends tk{_buffer=[];_groupDepth=0;Console=tk;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new $v(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",Wp(e,...r))}error(e,...r){this._log("error",Wp(e,...r))}info(e,...r){this._log("info",Wp(e,...r))}log(e,...r){this._log("log",Wp(e,...r))}warn(e,...r){this._log("warn",Wp(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function rk(t){let e=globalThis.console,r=new Ag;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 Dt=" ".repeat(6);function nk(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 d6}from"os";var se=eu({app:"cli",hostname:d6(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.82.
|
|
33
|
+
`)}import{hostname as d6}from"os";var se=eu({app:"cli",hostname:d6(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:"2.82.2"});var m6=5;async function wg({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>m6&&(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 gu({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 rk(()=>{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 xg=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=Tc[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(`${Dt}- Error type: ${Ai.dim(r)}`);let i="- Root cause analysis:",a=nk(`${i} ${o}`,`${Dt} `,!1),s=a.indexOf(":");v.log(`${Dt}${i} ${Ai.dim(a.slice(s+1))}`)}else v.log(`${Dt}Reason: ${Ai.red(r)}`),v.log(`${Dt}Description: ${Ai.red(n)}`)},qp=({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),p6||(i=`${i}`),v.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import f6 from"fs";import{platform as h6,tmpdir as g6}from"os";import S6 from"path";import{program as y6}from"playwright-core/lib/cli/program";import{registry as Kp}from"playwright-core/lib/server";import ok from"proper-lockfile";var ik=S6.join(g6(),"momenticBrowserInstallation");var Ig=["chrome","chromium","chrome-for-testing","ffmpeg"],Wv=[...Ig.filter(t=>t!=="ffmpeg")],E6={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function ak(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 sk={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function lk(t){if(t==="Org Default")return!1;let e=sk[E6[t]??""]??"",r=Kp.findExecutable(e);return!r||r.installType==="none"?!1:qv(r)}function qv(t){let e=t.executablePath();return f6.existsSync(e)}function T6(t,e){let r=sk[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=Kp.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&qv(n)))return n}async function b6({browser:t,force:e}){let r=T6(t,e);if(!r){v.info(`Browser '${t}' is already installed, skipping...`);return}v.info(`Installing browser '${t}'...`);try{await Kp.installDeps([r],!1),await Kp.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=Kp.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!qv(o);)v.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function v6(){if(h6()==="win32"){v.info("Installing Windows dependencies for Playwright...");try{await y6.parseAsync(["","","install","winldd"])}catch(t){v.warn(`Failed to install Windows dependencies: ${t}. Continuing with browser installation...`)}}}async function ck({rawBrowsers:t,force:e=!1,all:r=!1}){await v6();let n=r?Ig:Array.from(new Set(t));try{await ok.lock(ik,{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 b6({browser:i,force:e})}catch(a){o=a,v.error(`Failed to install the ${i} browser: ${a}`)}}finally{await ok.unlock(ik,{realpath:!1})}if(o)throw o}import{createServer as C6}from"http";async function uk(t,e,r=30){for(let n=0;n<r;n+=1){let o=t+n;if(await A6(o))return o}v.error(`Could not find an available port for ${e} starting from ${t} after ${r} attempts`),process.exit(1)}async function A6(t){return new Promise((e,r)=>{let n=C6();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 R6 from"blocked-at";import w6 from"why-is-node-running";function dk(t){x6(t),I6()}function x6(t){R6((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 I6(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}w6(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function pk(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 _6(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 mk(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?_6(e,r,n,o):e}function _g({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 Kv(t,e,r){return t instanceof js?(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 Su({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 @@ ${Tu(`Number of sub-steps: ${e}`,2)}`}default:return(r=>{throw new Error("You mi
|
|
|
58
58
|
${n}`}function eS(t,e={}){let{includeCache:r=!0}=e,n=pQ(t);return Mn({steps:n,earlyStop:!1,onPresetAction:(o,i)=>{let a=o;a.parentStepIdChain=i.parentChain.map(c=>c.id),pC(o);let s;if(r&&ro(o.command)&&o.command.cache!==void 0){let c=fQ(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),pC(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,pC(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 pC(t){let e=t;delete e.aiSuggested,delete e.retries,delete e.skipped}function mQ(t){return t.selector?t.selector:t.generatedSelectors?.[0]}function mC(t){let e=mQ(t),r=t.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),r&&(n.nodeOnlySerializedHtml=r),Object.keys(n).length?n:void 0}function fQ(t){if(!t)return;let e={};if("target"in t)return{target:mC(t.target)};if("fromTarget"in t||"toTarget"in t){let r=t.fromTarget?mC(t.fromTarget):void 0,n=t.toTarget?mC(t.toTarget):void 0;return r&&(e.fromTarget=r),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}import iS from"zod";import{v4 as fC}from"uuid";var hQ=new Set(["AI_ACTION","SECTION"]);function D0({stepTypeByStepMatchKeyV2:t,stepMatchersV2:e}){let r=Object.values(Se).filter(n=>hQ.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 B0}from"uuid";var gQ=new Set(["SUCCESS","ELEMENT_CHECK"]);function k0({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(je).filter(a=>!gQ.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 U0({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 Ie(t){return{matchKey:t.matchKey,commandType:t.commandType,toCommand:({step:e,commandId:r})=>{if(!H0(e,t.matchKey))throw new Error(`Cannot convert step without '${t.matchKey}' using this matcher.`);return t.toCommand({step:e,commandId:r??B0()})}}}function fn(t){return{useSelector:t.useSelector,force:t.force,disableCache:t.disableCache,iframeUrl:t.iframeUrl}}var Al=[Ie({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})}),Ie({matchKey:"switchTab",commandType:"TAB",toCommand:({step:t,commandId:e})=>({id:e,type:"TAB",action:U0({selectorType:t.type,selectorValue:t.switchTab}),loadTimeout:go(t.timeout??t.timeoutMs)})}),Ie({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}}}),Ie({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}}}),Ie({matchKey:"hover",commandType:"HOVER",toCommand:({step:t,commandId:e})=>({id:e,type:"HOVER",...fn(t),target:xi(t.hover)})}),Ie({matchKey:"blur",commandType:"BLUR",toCommand:({step:t,commandId:e})=>({id:e,type:"BLUR",...fn(t),target:ca(t.blur)})}),Ie({matchKey:"focus",commandType:"FOCUS",toCommand:({step:t,commandId:e})=>({id:e,type:"FOCUS",...fn(t),target:xi(t.focus)})}),Ie({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}}}),Ie({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})}),Ie({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})}),Ie({matchKey:"keyDown",commandType:"KEY_DOWN",toCommand:({step:t,commandId:e})=>({id:e,type:"KEY_DOWN",value:t.keyDown,convertMeta:t.convertMeta})}),Ie({matchKey:"keyUp",commandType:"KEY_UP",toCommand:({step:t,commandId:e})=>({id:e,type:"KEY_UP",value:t.keyUp,convertMeta:t.convertMeta})}),Ie({matchKey:"navigate",commandType:"NAVIGATE",toCommand:({step:t,commandId:e})=>({id:e,type:"NAVIGATE",url:t.navigate,loadTimeout:go(t.timeout??t.timeoutMs)})}),Ie({matchKey:"newTab",commandType:"NEW_TAB",toCommand:({step:t,commandId:e})=>({id:e,type:"NEW_TAB",url:t.newTab,loadTimeout:go(t.timeout??t.timeoutMs)})}),Ie({matchKey:"goBack",commandType:"GO_BACK",toCommand:({commandId:t})=>({id:t,type:"GO_BACK"})}),Ie({matchKey:"goForward",commandType:"GO_FORWARD",toCommand:({commandId:t})=>({id:t,type:"GO_FORWARD"})}),Ie({matchKey:"refresh",commandType:"REFRESH",toCommand:({commandId:t})=>({id:t,type:"REFRESH"})}),Ie({matchKey:"scrollUp",commandType:"SCROLL_UP",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_UP",...fn(t),target:ca(t.container),deltaY:t.scrollUp})}),Ie({matchKey:"scrollDown",commandType:"SCROLL_DOWN",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_DOWN",...fn(t),target:ca(t.container),deltaY:t.scrollDown})}),Ie({matchKey:"scrollLeft",commandType:"SCROLL_LEFT",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_LEFT",...fn(t),target:ca(t.container),deltaX:t.scrollLeft})}),Ie({matchKey:"scrollRight",commandType:"SCROLL_RIGHT",toCommand:({step:t,commandId:e})=>({id:e,type:"SCROLL_RIGHT",...fn(t),target:ca(t.container),deltaX:t.scrollRight})}),Ie({matchKey:"wait",commandType:"WAIT",toCommand:({step:t,commandId:e})=>({id:e,type:"WAIT",delay:t.wait})}),Ie({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)})}),Ie({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}})}),Ie({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})}),Ie({matchKey:"cookie",commandType:"COOKIE",toCommand:({step:t,commandId:e})=>({id:e,type:"COOKIE",value:t.cookie})}),Ie({matchKey:"localStorage",commandType:"LOCAL_STORAGE",toCommand:({step:t,commandId:e})=>({id:e,type:"LOCAL_STORAGE",key:t.localStorage.key,value:t.localStorage.value})}),Ie({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:TQ(t.request),timeout:go(t.request.timeout??t.request.timeoutMs)})}),Ie({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)})}),Ie({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)})}),Ie({matchKey:"setHeader",commandType:"SET_HEADER",toCommand:({step:t,commandId:e})=>({id:e,type:"SET_HEADER",name:t.setHeader.name,value:t.setHeader.value,requestMatcher:bQ(t.setHeader)})}),Ie({matchKey:"mockRoute",commandType:"MOCK_ROUTE",toCommand:({step:t,commandId:e})=>({id:e,type:"MOCK_ROUTE",requestMatcher:rS({urlMatcherType:t.mockRoute.urlMatcherType,urlMatcherValue:t.mockRoute.urlMatcherValue,requestMethod:t.mockRoute.requestMethod}),responseGenerator:t.mockRoute.responseGenerator,fetchOriginalResponse:t.mockRoute.fetchOriginalResponse,key:t.mockRoute.key})}),Ie({matchKey:"removeRouteMock",commandType:"REMOVE_ROUTE_MOCK",toCommand:({step:t,commandId:e})=>({id:e,type:"REMOVE_ROUTE_MOCK",key:t.removeRouteMock??void 0})}),Ie({matchKey:"waitForUrl",commandType:"WAIT_FOR_URL",toCommand:({step:t,commandId:e})=>({id:e,type:"WAIT_FOR_URL",matcher:V0({type:t.urlMatcherType,value:t.waitForUrl}),caseInsensitive:t.caseInsensitive,negated:t.not,timeout:go(t.timeout??t.timeoutMs)})}),Ie({matchKey:"dialog",commandType:"DIALOG",toCommand:({step:t,commandId:e})=>({id:e,type:"DIALOG",action:t.dialog})}),Ie({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})}),Ie({matchKey:"copy",commandType:"COPY",toCommand:({step:t,commandId:e})=>({id:e,type:"COPY",value:typeof t.copy=="string"?t.copy:""})}),Ie({matchKey:"paste",commandType:"PASTE",toCommand:({commandId:t})=>({id:t,type:"PASTE"})}),Ie({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:vQ(t)})}),Ie({matchKey:"captcha",commandType:"CAPTCHA",toCommand:({step:t,commandId:e})=>({id:e,type:"CAPTCHA",...fn(t)})}),Ie({matchKey:"offlineMode",commandType:"OFFLINE_MODE",toCommand:({step:t,commandId:e})=>({id:e,type:"OFFLINE_MODE",enable:t.offlineMode})}),Ie({matchKey:"registerRequestListener",commandType:"REGISTER_REQUEST_LISTENER",toCommand:({step:t,commandId:e})=>({id:e,type:"REGISTER_REQUEST_LISTENER",requestMatcher:rS({urlMatcherType:t.registerRequestListener.urlMatcherType,urlMatcherValue:t.registerRequestListener.urlMatcherValue,requestMethod:t.registerRequestListener.requestMethod}),key:t.registerRequestListener.key})}),Ie({matchKey:"awaitListener",commandType:"AWAIT_LISTENER",toCommand:({step:t,commandId:e})=>({id:e,type:"AWAIT_LISTENER",key:t.awaitListener,timeout:go(t.timeout??t.timeoutMs)})}),Ie({matchKey:"recordRequests",commandType:"RECORD_REQUESTS",toCommand:({step:t,commandId:e})=>({id:e,type:"RECORD_REQUESTS",requestMatcher:rS({urlMatcherType:t.recordRequests.urlMatcherType,urlMatcherValue:t.recordRequests.urlMatcherValue,requestMethod:t.recordRequests.requestMethod}),key:t.recordRequests.key})}),Ie({matchKey:"getRecordedRequests",commandType:"GET_RECORDED_REQUESTS",toCommand:({step:t,commandId:e})=>({id:e,type:"GET_RECORDED_REQUESTS",key:t.getRecordedRequests})}),Ie({matchKey:"authLoad",commandType:"AUTH_LOAD",toCommand:({step:t,commandId:e})=>({id:e,type:"AUTH_LOAD",storageState:t.authLoad})}),Ie({matchKey:"authSave",commandType:"AUTH_SAVE",toCommand:({commandId:t})=>({id:t,type:"AUTH_SAVE"})})];k0({commandMatchersV2:Al});function z0({command:t,commandId:e}){if(!SQ(t))return;let r=$a(t);if(r!==void 0)return{id:e??B0(),type:"ELEMENT_CHECK",...fn(t),target:EQ(t[r.alias],r.alias),assertion:yQ({command:t,parsedAlias:r}),timeout:go(t.timeout)}}function SQ(t){return $a(t)!==void 0}function yQ(t){let{command:e,parsedAlias:r}=t;switch(r.subject){case"content":return{type:"ELEMENT_CONTENT",operation:Ep(r.condition),value:tS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"attribute":return{type:"ELEMENT_ATTRIBUTE",operation:Ep(r.condition),attr:F0(e.name,r.alias),value:tS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"tag_name":return{type:"ELEMENT_NAME",operation:Ep(r.condition),value:tS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"style":return{type:"ELEMENT_STYLE",operation:Ep(r.condition),property:F0(e.name,r.alias),value:tS({alias:r.alias,requiresValue:r.requiresValue,value:e.value}),negated:r.negated};case"element":return{type:"ELEMENT_EXISTENCE",condition:wO(r.condition),negated:r.negated};default:return xn(r.subject)}}function EQ(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 F0(t,e){if(t!==void 0)return t;throw new Error(`Cannot deserialize element check alias '${e}' without a name.`)}function tS({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 TQ(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 bQ(t){if(t.urlMatcherValue!==void 0)return rS({urlMatcherType:t.urlMatcherType,urlMatcherValue:t.urlMatcherValue,requestMethod:t.requestMethod})}function V0({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 rS({urlMatcherType:t,urlMatcherValue:e,requestMethod:r}){return{urlMatcher:V0({type:t,value:e}),method:r}}function vQ(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 H0(t,e){return e in t}function G0({command:t,commandId:e,matcher:r}){if(H0(t,r.matchKey))return r.toCommand({step:t,commandId:e})}function nS({command:t,commandId:e}){for(let n of Al){let o=G0({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 CQ={dynamicAction:"AI_ACTION_DYNAMIC",module:"MODULE",if:"CONDITIONAL"},AQ=Object.fromEntries(Al.map(({matchKey:t})=>[t,"PRESET_ACTION"])),j0={...AQ,...CQ};function oS(t){return{matchKey:t.matchKey,toStep:({step:e,stepId:r})=>{if(!W0(e,t.matchKey))throw new Error(`Cannot convert step without '${t.matchKey}' using this matcher.`);let n=r??fC();return t.toStep({step:e,stepId:n})}}}var $0=[...Al.map(({matchKey:t})=>RQ(t)),oS({matchKey:"dynamicAction",toStep:({step:t,stepId:e})=>({id:e,type:"AI_ACTION_DYNAMIC",text:t.dynamicAction,version:t.version,...im(t)})}),oS({matchKey:"module",toStep:({step:t,stepId:e})=>({id:e,type:"MODULE",moduleId:t.module,inputs:t.inputs,...im(t)})}),oS({matchKey:"if",toStep:({step:t,stepId:e})=>{let r=im(t),n={id:fC(),type:"PRESET_ACTION",...r,command:nS({command:t.if})};return{id:e,type:"CONDITIONAL",...r,blocks:[{assertion:n,steps:t.then.map(Au)}],elseSteps:t.else?.map(Au)}}})];D0({stepTypeByStepMatchKeyV2:j0,stepMatchersV2:$0});function RQ(t){return oS({matchKey:t,toStep:({step:e,stepId:r})=>({id:r,type:"PRESET_ACTION",...im(e),command:nS({command:e})})})}function im(t){return{envKey:t.envKey,retries:t.retries,skipped:t.skipped,comment:t.comment}}function W0(t,e){return e in t}function wQ({step:t,stepId:e,matcher:r}){if(W0(t,r.matchKey))return r.toStep({step:t,stepId:e})}function Au(t){for(let r of $0){let n=wQ({step:t,matcher:r});if(n)return n}let e=xQ(t);if(e)return e;throw new Error(`Unsupported v2 step action '${JSON.stringify(t)}' while mapping to resolved step.`)}function xQ(t){if(IQ(t))return{id:fC(),type:"PRESET_ACTION",...im(t),command:nS({command:t})}}function IQ(t){return $a(t)!==void 0}function hC(t){return{steps:t.steps.map(Au),beforeSteps:t.before?.map(Au),afterSteps:t.after?.map(Au)}}async function aS(t){let e=Qc.parse(t.testV2),r={id:e.id,schemaVersion:e.schemaVersion??Te},n=hC(e);return{metadata:r,stepLists:n}}async function Ru(t){let e=wh.parse(t.moduleV2),r=rr.omit({moduleId:!0}).parse(e),n=hC({before:[],steps:NO(e),after:[]});return{module:{...r,moduleId:e.moduleId,schemaVersion:e.schemaVersion,steps:n.steps??[]}}}function Rl(t){return iS.object({fileType:iS.literal(te.TEST_V2)}).safeParse(t).success}function Vn(t){return iS.object({fileType:iS.literal(te.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 gC(t){let e=ua(t);return e===void 0?null:e}function ts({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 q0(t){if(t.forceClearContent)return"always";if(t.clearContent===!0)return"inputs";if(t.clearContent===!1)return"never"}function Tr(t){return{useSelector:t.useSelector,force:t.force,disableCache:t.disableCache,iframeUrl:t.iframeUrl}}function wu({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 SC(t){switch(t.type){case"CLICK":return{click:ts({target:t.target,commandType:t.type}),...Tr(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,...Tr(t),target:ua(t.target),pressEnter:t.pressEnter,clear:q0(t),delayMs:t.delay,relativePosition:t.relativePosition};case"SELECT_OPTION":{let e=ts({target:t.target,commandType:t.type});switch(t.choice.type){case"LABEL":return{selectOption:{dropdown:e,optionType:"label",optionValue:t.choice.label},...Tr(t)};case"VALUE":return{selectOption:{dropdown:e,optionType:"value",optionValue:t.choice.value},...Tr(t)};case"INDEX":return{selectOption:{dropdown:e,optionType:"index",optionValue:t.choice.index},...Tr(t)};default:return xn(t.choice)}}case"HOVER":return{hover:ts({target:t.target,commandType:t.type}),...Tr(t)};case"BLUR":return{blur:gC(t.target),...Tr(t)};case"FOCUS":return{focus:ts({target:t.target,commandType:t.type}),...Tr(t)};case"DRAG":{let e=ts({target:t.fromTarget,commandType:t.type}),r=ts({target:t.toTarget,commandType:t.type});return{dragAndDrop:{from:e,to:r,movements:t.steps,hoverMs:hn(t.hoverSeconds)},...Tr(t)}}case"MOUSE_DRAG":return{mouseDrag:{container:ua(t.target),deltaX:t.deltaX,deltaY:t.deltaY,movements:t.steps},...Tr(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),...Tr(t)};case"SCROLL_UP":return{scrollUp:t.deltaY,container:ua(t.target),...Tr(t)};case"SCROLL_RIGHT":return{scrollRight:t.deltaX,container:ua(t.target),...Tr(t)};case"SCROLL_LEFT":return{scrollLeft:t.deltaX,container:ua(t.target),...Tr(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=ts({target:t.target,commandType:t.type}),r=RO(t.assertion),n=_b(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,...Tr(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=wu({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=wu({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=wu({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,...Tr(t)};case"VISUAL_DIFF":return{visualDiff:gC(t.target),...Tr(t),threshold:t.threshold,screenshot:t.screenshot};case"OFFLINE_MODE":return{offlineMode:t.enable};case"REGISTER_REQUEST_LISTENER":{let e=wu({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=wu({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 wl(t){let e={envKey:t.envKey,retries:t.retries,skipped:t.skipped,comment:t.comment};switch(t.type){case"PRESET_ACTION":return{...SC(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=SC(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=>wl(a)),else:t.elseSteps?.map(a=>wl(a)),...e}}case"SECTION":throw new Error("SECTION steps are not supported in v2 serialization. Remove SECTION steps before converting.")}}function K0(t){return{before:t.beforeSteps&&t.beforeSteps.length>0?t.beforeSteps.map(wl):void 0,steps:t.steps.map(wl),after:t.afterSteps&&t.afterSteps.length>0?t.afterSteps.map(wl):void 0}}function Y0({metadata:t,stepLists:e,idOverride:r}){let n=Er.parse(t),o=K0(xd.parse(e)),i=n.advanced&&Object.keys(n.advanced).length>0?n.advanced:{};return zn({fileType:te.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 sm from"yaml";import{z as Q0}from"zod";import{execSync as _Q}from"child_process";function xu(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{_Q(n,{encoding:"utf-8"})}catch(o){v.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as MQ}from"deep-object-diff";import rs from"fs";import{cloneDeep as PQ}from"lodash-es";import am from"path";import{v4 as OQ}from"uuid";import yC from"yaml";function xl({module:t,filePath:e,projectConfig:r,opts:n}){let o=zn({fileType:te.MODULE,...Sh.parse(t),steps:t.steps});if(n?.existingModule&&!n?.forceSaveOnNoDiffs){let a=MQ(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=yC.stringify(o);rs.writeFileSync(e,i,"utf-8"),xu(e,r)}function So({content:t,schemaVersion:e,momenticFiles:r,project:n,forceSaveOnNoDiffs:o}){let i=r.modules[t.moduleId]?.fullFilePath;if(!i||!rs.existsSync(i))throw new Error(`Tried to update module ${t.moduleId} that could not be found on disk`);let a=rs.readFileSync(i,"utf-8"),s=yC.parse(a),l;if(t.name&&t.name!==s.name){let d=`${ht(t.name)}.module.yaml`;if(l=am.join(am.dirname(i),d),rs.existsSync(l))throw new Error(`A conflicting file '${t.name}' already exists at path '${l}'`)}let c={...t,schemaVersion:e},u={fileType:te.MODULE,...Sh.parse(c),steps:t.steps};xl({module:u,filePath:i,projectConfig:n.config,opts:{forceSaveOnNoDiffs:o,existingModule:s}}),l&&rs.renameSync(i,l)}function J0({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:te.MODULE,...Sh.parse(s),steps:a.steps};xl({module:l,filePath:i,projectConfig:n.config,opts:{existingModule:a}});let c;if(e.name){let u=`${ht(e.name)}.module.yaml`;if(c=am.join(am.dirname(i),u),rs.existsSync(c))throw new Error(`Module with name '${e.name}' already exists at path '${c}'`);rs.renameSync(i,c)}}async function sS({name:t,description:e,enabled:r,steps:n,folder:o,project:i}){let a=ht(t),s=am.join(o,`${a}.module.yaml`),l=OQ(),{stepsToSave:c}=await jt({stepLists:{steps:n}}),u={fileType:te.MODULE,schemaVersion:Te,moduleId:l,name:t,description:e,enabled:r,steps:c.steps};return xl({module:u,filePath:s,projectConfig:i.config}),{moduleId:l,name:t,description:e,enabled:r,steps:n}}function qo(t,e){let r=rs.readFileSync(t,"utf-8"),n=yC.parse(r);if(Vn(n))try{return LO.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 __.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 X0({module:t}){return Vn(t)?(await Ru({moduleV2:t})).module:t}async function pa(t,e,r,n){let o=qo(t.fullFilePath,r),i=await X0({module:o}),{resolvedSteps:a}=await Wg({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 X0({module:u})}}}),s={...i,steps:a};return n&&(n[t.id]=PQ(s)),s}async function lS(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 os({test:t,filePath:e,projectConfig:r,opts:n}){let o=zn({fileType:te.TEST,...dn.parse(t),beforeSteps:t.beforeSteps??void 0,steps:t.steps,afterSteps:t.afterSteps??void 0});if(n?.existingTest&&!n?.forceSaveOnNoDiffs){let a=LQ(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=sm.stringify(o);Ii.writeFileSync(e,i,"utf-8"),xu(e,r)}async function Z0({test:t,name:e,folder:r}){let n=await M0({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=ns.join(r,i);return Ii.writeFileSync(a,n.test,"utf-8"),a}function EC(t,e,r){let n=ns.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=sm.parse(o),a,s;if(e.name&&e.name!==i.name){let u=`${ht(e.name)}.test.yaml`;if(a=ns.join(ns.dirname(t),u),s=ns.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 os({test:{fileType:te.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=ns.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=sm.parse(a),l=dn.parse({...s,schemaVersion:r}),c=xt.array().or(Q0.undefined()).parse(e.beforeSteps),u=xt.array().parse(e.steps),d=xt.array().or(Q0.undefined()).parse(e.afterSteps),p={fileType:te.TEST,...l,beforeSteps:c&&c.length>0?c:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0};os({test:p,filePath:i,projectConfig:n.config,opts:{forceSaveOnNoDiffs:o,existingTest:s}})}function lm(t,e){let r=ns.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=sm.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return Er.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=sm.parse(o);if(!Rl(a)&&(!a.steps||!Array.isArray(a.steps)))throw new Error(`Test ${t} is missing steps`);return a}function TC({testV2:t,fullFilePath:e}){let r=ns.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(Rl(n)){let s=Qc.parse(n);o=TC({testV2:s,fullFilePath:t});let{stepLists:l}=await aS({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 I0({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 Ru({moduleV2:u});return d}}});return a}import NQ from"@dotenvx/dotenvx";import DQ from"fs";import eU from"path";function cS(t,e){return(t.config.environments??[]).map(r=>Il(r.name,t,e))}function tU(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 kQ(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=tU(i);s&&(n[o]=s);continue}let a;try{a=DQ.readFileSync(eU.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 UQ(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=NQ.config({path:eU.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 Il(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={[gr]:tU(n.baseUrl)},i=kQ({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=UQ({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 BQ,readFileSync as zQ,readdirSync as VQ,writeFileSync as HQ}from"fs";import{glob as GQ}from"glob";import _l,{dirname as rU}from"path";import{cwd as vC}from"process";import nU from"yaml";import{z as bt}from"zod";import FQ from"zod";var uS=["**/*.test.yaml","**/*.module.yaml"],bC=FQ.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),dS=15;var is="momentic.config.yaml",CC="momentic.workspace.yaml",jQ=bt.object({projects:bt.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),$Q=bt.union([bt.string(),bt.object({fromFile:bt.string(),json:bt.boolean().optional()})]),WQ=bt.object({name:bC,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(),$Q).optional(),inheritFromShell:bt.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Js.optional().describe("NB: most things should use project-level configuration only")}),qQ=bt.object({postSave:bt.string().optional()}),KQ=bt.object({name:bC,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(WQ).optional(),gitMainBranch:bt.string().optional().readonly(),gitProtectedBranches:bt.string().array().optional().readonly(),ai:Ji.optional(),browser:Js.optional(),emulator:ib.optional(),advanced:lT.optional(),displayRoot:bt.string().optional().describe("relative path from project root to use as the Repository root"),hooks:qQ.optional()});function oU(t,e){let r;try{r=zQ(t,"utf-8")}catch(o){v.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=nU.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 AC(t){let e=oU(t,"project configuration");if(e!==void 0)try{return KQ.parse(e)}catch(r){v.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function YQ(t){let e=oU(t,"workspace configuration");if(e!==void 0)try{return jQ.parse(e)}catch(r){v.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function XQ(){let t=[],e=vC(),r=_l.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=_l.basename(e);if(dh.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 VQ(e))if(a.endsWith(is)){let s=_l.join(e,a),l=AC(s);l&&t.push({configFilePath:s,config:l,rootDir:rU(s)})}if(t.length)return t;if(e=_l.dirname(e),e===r)break}return t}async function vt(t={}){let{configFilePath:e,nameFilter:r,skipExitOnError:n}=t,o=await RC(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 JQ(t){let e=YQ(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${is}`)),n=AbortSignal.timeout(2e3),o;try{o=await GQ(r,{absolute:!1,cwd:vC(),dotRelative:!1,maxDepth:dS,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 ${CC} is misconfigured.`),a}let i=[];for(let a of o){let s=_l.join(vC(),a),l=AC(s);l&&i.push({configFilePath:s,config:l,rootDir:rU(s)})}return i}async function RC(t,e){if(t){t=_l.resolve(t);let n=AC(t);return n?[{config:n,configFilePath:t,rootDir:_l.dirname(t)}]:(console.error(`No valid Momentic project file found at ${t}.`),e||process.exit(1),[])}if(BQ(CC)){let n=await JQ(CC);if(n)return n}return XQ()}function as(t,e){let r=nU.stringify(t);HQ(e,r)}import lU from"fs";import{glob as QQ}from"glob";import cm from"path";import ZQ from"yaml";import{z as iU}from"zod";var cU=!1,e8=iU.object({fileType:iU.nativeEnum(te)});async function he(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??uS,o=Array.from(t.config.exclude??[]).concat(ph),i=AbortSignal.timeout(5e3),a;try{a=await QQ(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:dS,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=t8(t.rootDir,s,r,e?Fn:v);l&&(r.duplicateEntities[l.id]=l.paths)}return cU=!0,r}function t8(t,e,r,n){let o=cm.join(t,e),i=r8(o,n);if(!i)return;let a=n8(i,o,n);if(!a)return;let s=e8.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=o8(o,n);if(!c)return;let u=i8(e,o,c);switch(l){case te.TEST:try{return aU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case te.TEST_V2:try{return aU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic v2 test metadata: ${d}`);return}case te.MODULE:try{return sU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case te.MODULE_V2:try{return sU(a,l,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic v2 module metadata: ${d}`);return}case te.MOBILE_TEST:try{return s8(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case te.MOBILE_MODULE:try{return a8(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 r8(t,e){try{return lU.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function n8(t,e,r){try{let n=ZQ.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 o8(t,e){try{return lU.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function i8(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:cm.sep,fullPathSegments:e.split(cm.sep),relativePathSegments:t.split(cm.sep),fileName:cm.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function aU(t,e,r,n,o,i){let a=n.fileName.replace(".test.yaml",""),s,l;e===te.TEST_V2?(s=Nb.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 sU(t,e,r,n,o,i){let a=e===te.MODULE_V2?Rh.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!cU&&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 a8(t,e,r,n,o){let i=th.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:te.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function s8(t,e,r,n,o){let i=ab.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:te.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import Iu from"fs";import wC from"path";import{z as xC}from"zod";var uU="golden/visual-diff",dU="reports",ss="test-results";var l8=xC.object({width:xC.number(),height:xC.number()}),_u=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=wC.join(e.rootDir,e.config.goldenFileDir??uU);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(cx(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=wC.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Iu.mkdirSync(wC.dirname(o),{recursive:!0}),Iu.writeFileSync(o,n.buffer),Iu.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Iu.existsSync(o)){let a=Iu.readFileSync(o),s=l8.parse(JSON.parse(Iu.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 u8}from"node:util";import d8 from"simple-git";var pU=3e3,yt=d8(),p8=u8(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>pU&&!process.env.CI&&e.warn({operation:r,durationMs:a,thresholdMs:pU,...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 m8(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 f8(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 p8("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 h8(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return f8(t,e,r);if(o)return}catch{}}function pS(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 g8(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(g8(r))return;t.error({err:r},"Failed to run git command");return}}function S8(){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 y8(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 E8(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 T8(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?pS(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 b8(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?pS(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 v8(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?pS(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 C8(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),m8(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?pS(a):void 0,S=d["user.email"]||void 0,E=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,I=(r?.includeHostingUsername??!0?await h8(t,a,d):void 0)??y??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:E,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?fa(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function A8(){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 R8(){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 w8(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=S8();if(!n)return C8(t,e,r);switch(n){case"GithubActions":return y8(t);case"GitlabCI":return E8(t);case"CircleCI":return T8(t);case"Buildkite":return b8(t);case"AzureDevOps":return v8(t);case"GCPCloudBuild":return A8();case"Custom":return R8()}}async function x8(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 I8(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 _8(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>I8(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:()=>x8(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function br(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:()=>w8(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:()=>_8(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return{...a,...s,...c}},context:o})}async function mU(){try{let t=await yt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function fU(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as TJe}from"deep-object-diff";import{cloneDeep as vJe}from"lodash-es";import{v4 as UJe}from"uuid";import BJe from"yaml";import ZJe from"yaml";import ur from"zod";var n6e=ur.discriminatedUnion("platform",[sh.extend({steps:ur.record(ur.string(),ur.unknown()).array(),beforeSteps:ur.record(ur.string(),ur.unknown()).array().optional(),afterSteps:ur.record(ur.string(),ur.unknown()).array().optional()}),lh.extend({steps:ur.record(ur.string(),ur.unknown()).array(),beforeSteps:ur.record(ur.string(),ur.unknown()).array().optional(),afterSteps:ur.record(ur.string(),ur.unknown()).array().optional()})]);import{randomUUID as M8}from"crypto";import ls from"fs";import Mu from"path";var gU=new Set([".DS_Store","__MACOSX"]),SU={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 P8(t,e,r){if(SU[r]){let i=SU[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 IC=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 yU(t,e){try{let r=Mu.join(e,"metadata.json");return yi.parse(JSON.parse(ls.readFileSync(r,"utf-8")))}catch{throw new IC(t,e)}}function EU(t,e,r){let n=M8(),o=t.child({runGroupId:n});ls.rmSync(e,{recursive:!0,force:!0});let i=ls.readdirSync(r).filter(l=>!gU.has(l)).map(l=>Mu.join(r,l));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ls.mkdirSync(e,{recursive:!0});let a={...yU(r,i[0]),id:n};for(let l of i){let c=Mu.join(l,"runs");if(!ls.existsSync(c))continue;let u=yU(r,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=P8(a,u,m)}let d=ls.readdirSync(c);for(let p of d){if(gU.has(p))continue;let m=Mu.join(c,p),f=Mu.join(e,"runs",p);ls.cpSync(m,f,{recursive:!0})}}let s=Mu.join(e,"metadata.json");ls.writeFileSync(s,JSON.stringify(a,null,2))}import nF from"adm-zip";import XC from"fs";import{z as y7}from"zod";var X="v1",_C="cli",Ml="2.82.0";var O8=9e4,L8=3,N8=1500,D8=15e3,Ko=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function k8(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var MC=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Ml&&(e[Eh]=Ml),_C&&(e[yP]=_C),e}async sendRequest(e,r){let{retries:n=L8,requestTimeoutMs:o=O8,initialRetryDelayMs:i=N8,maxRetryDelayMs:a=D8,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 Wa),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 k8(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 MC{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[SP]:this.mode??""}}};import{createAnthropic as S7}from"@ai-sdk/anthropic";import{InvalidArgumentError as F8}from"@ai-sdk/provider";import{APICallError as w6e}from"@ai-sdk/provider";import{APICallError as z8}from"@ai-sdk/provider";import{LoadAPIKeyError as hS}from"@ai-sdk/provider";import{LoadSettingError as M6e}from"@ai-sdk/provider";import{JSONParseError as ES,TypeValidationError as W8}from"@ai-sdk/provider";import{TypeValidationError as DC}from"@ai-sdk/provider";import{TypeValidationError as X8}from"@ai-sdk/provider";var mS=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 PC(t){}function TU(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=PC,onError:r=PC,onRetry:n=PC,onComment:o}=t,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,E]=U8(`${i}${g}`);for(let y of S)d(y);i=E,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),E=h[g+1]===" "?2:1,y=h.slice(g+E);p(S,y,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 f8(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 p8("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 h8(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return f8(t,e,r);if(o)return}catch{}}function pS(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 g8(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(g8(r))return;t.error({err:r},"Failed to run git command");return}}function S8(){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 y8(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 E8(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 T8(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?pS(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 b8(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?pS(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 v8(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?pS(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 C8(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),m8(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?pS(a):void 0,S=d["user.email"]||void 0,E=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,I=(r?.includeHostingUsername??!0?await h8(t,a,d):void 0)??y??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:E,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?fa(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function A8(){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 R8(){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 w8(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=S8();if(!n)return C8(t,e,r);switch(n){case"GithubActions":return y8(t);case"GitlabCI":return E8(t);case"CircleCI":return T8(t);case"Buildkite":return b8(t);case"AzureDevOps":return v8(t);case"GCPCloudBuild":return A8();case"Custom":return R8()}}async function x8(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 I8(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 _8(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await yo({logger:t,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>I8(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:()=>x8(t,e,n,r),context:{gitlabProjectPath:n}})}}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function br(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:()=>w8(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:()=>_8(t,e,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return{...a,...s,...c}},context:o})}async function mU(){try{let t=await yt.remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function fU(){try{return!!(await yt.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as TJe}from"deep-object-diff";import{cloneDeep as vJe}from"lodash-es";import{v4 as UJe}from"uuid";import BJe from"yaml";import ZJe from"yaml";import ur from"zod";var n6e=ur.discriminatedUnion("platform",[sh.extend({steps:ur.record(ur.string(),ur.unknown()).array(),beforeSteps:ur.record(ur.string(),ur.unknown()).array().optional(),afterSteps:ur.record(ur.string(),ur.unknown()).array().optional()}),lh.extend({steps:ur.record(ur.string(),ur.unknown()).array(),beforeSteps:ur.record(ur.string(),ur.unknown()).array().optional(),afterSteps:ur.record(ur.string(),ur.unknown()).array().optional()})]);import{randomUUID as M8}from"crypto";import ls from"fs";import Mu from"path";var gU=new Set([".DS_Store","__MACOSX"]),SU={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 P8(t,e,r){if(SU[r]){let i=SU[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 IC=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 yU(t,e){try{let r=Mu.join(e,"metadata.json");return yi.parse(JSON.parse(ls.readFileSync(r,"utf-8")))}catch{throw new IC(t,e)}}function EU(t,e,r){let n=M8(),o=t.child({runGroupId:n});ls.rmSync(e,{recursive:!0,force:!0});let i=ls.readdirSync(r).filter(l=>!gU.has(l)).map(l=>Mu.join(r,l));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);ls.mkdirSync(e,{recursive:!0});let a={...yU(r,i[0]),id:n};for(let l of i){let c=Mu.join(l,"runs");if(!ls.existsSync(c))continue;let u=yU(r,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=P8(a,u,m)}let d=ls.readdirSync(c);for(let p of d){if(gU.has(p))continue;let m=Mu.join(c,p),f=Mu.join(e,"runs",p);ls.cpSync(m,f,{recursive:!0})}}let s=Mu.join(e,"metadata.json");ls.writeFileSync(s,JSON.stringify(a,null,2))}import nF from"adm-zip";import XC from"fs";import{z as y7}from"zod";var X="v1",_C="cli",Ml="2.82.2";var O8=9e4,L8=3,N8=1500,D8=15e3,Ko=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function k8(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var MC=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Ml&&(e[Eh]=Ml),_C&&(e[yP]=_C),e}async sendRequest(e,r){let{retries:n=L8,requestTimeoutMs:o=O8,initialRetryDelayMs:i=N8,maxRetryDelayMs:a=D8,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 Wa),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 k8(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 MC{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[SP]:this.mode??""}}};import{createAnthropic as S7}from"@ai-sdk/anthropic";import{InvalidArgumentError as F8}from"@ai-sdk/provider";import{APICallError as w6e}from"@ai-sdk/provider";import{APICallError as z8}from"@ai-sdk/provider";import{LoadAPIKeyError as hS}from"@ai-sdk/provider";import{LoadSettingError as M6e}from"@ai-sdk/provider";import{JSONParseError as ES,TypeValidationError as W8}from"@ai-sdk/provider";import{TypeValidationError as DC}from"@ai-sdk/provider";import{TypeValidationError as X8}from"@ai-sdk/provider";var mS=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 PC(t){}function TU(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=PC,onError:r=PC,onRetry:n=PC,onComment:o}=t,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,E]=U8(`${i}${g}`);for(let y of S)d(y);i=E,a=!1}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),E=h[g+1]===" "?2:1,y=h.slice(g+E);p(S,y,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 mS(`Invalid \`retry\` value: "${g}"`,{type:"invalid-retry",value:g,line:S}));break;default:r(new mS(`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 U8(t){let e=[],r="",n=0;for(;n<t.length;){let o=t.indexOf("\r",n),i=t.indexOf(`
|
|
64
64
|
`,n),a=-1;if(o!==-1&&i!==-1?a=Math.min(o,i):o!==-1?a=o:i!==-1&&(a=i),a===-1){r=t.slice(n);break}else{let s=t.slice(n,a);e.push(s),n=a+1,t[n-1]==="\r"&&t[n]===`
|
|
@@ -79,7 +79,7 @@ ${a}
|
|
|
79
79
|
${e}:`]}}function VU({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 HU(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 u9=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()}))),d9=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()}),WC]))),GU=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()}))),p9=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:GU}),...await Sn({provider:this.providerOptionsName,providerOptions:p,schema:GU})};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(u9),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:HU(c.finish_reason),request:{body:o},response:{...VU(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:Ou(d9),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",...VU(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=HU(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}}}},f9=wt(()=>ve(GC.object({dimensions:GC.number().optional(),user:GC.string().optional()}))),h9=wt(()=>ve(Pl.object({data:Pl.array(Pl.object({embedding:Pl.array(Pl.number())})),usage:Pl.object({prompt_tokens:Pl.number()}).nullish()}))),g9=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 m9({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:t});let i=(o=await Sn({provider:"openai",providerOptions:n,schema:f9}))!=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(h9),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}}}},S9=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()}))),y9={"dall-e-3":1,"dall-e-2":10,"gpt-image-1":10,"gpt-image-1-mini":10,"gpt-image-1.5":10},E9=new Set(["gpt-image-1","gpt-image-1-mini","gpt-image-1.5"]),T9=class{constructor(t,e){this.modelId=t,this.config=e,this.specificationVersion="v2"}get maxImagesPerCall(){var t;return(t=y9[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:{},...E9.has(this.modelId)?{}:{response_format:"b64_json"}},failedResponseHandler:Pi,successfulResponseHandler:To(S9),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}:{}}))}}}}},b9=Wt(()=>ve(vr.object({code:vr.string().nullish(),containerId:vr.string()}))),v9=Wt(()=>ve(vr.object({outputs:vr.array(vr.discriminatedUnion("type",[vr.object({type:vr.literal("logs"),logs:vr.string()}),vr.object({type:vr.literal("image"),url:vr.string()})])).nullish()}))),C9=Wt(()=>ve(vr.object({container:vr.union([vr.string(),vr.object({fileIds:vr.array(vr.string()).optional()})]).optional()}))),A9=Eo({id:"openai.code_interpreter",name:"code_interpreter",inputSchema:b9,outputSchema:v9}),R9=(t={})=>A9(t),XU=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())])}),JU=rt.object({type:rt.enum(["and","or"]),filters:rt.array(rt.union([XU,rt.lazy(()=>JU)]))}),w9=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([XU,JU]).optional()}))),x9=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()}))),I9=Eo({id:"openai.file_search",name:"file_search",inputSchema:rt.object({}),outputSchema:x9}),_9=Wt(()=>ve(Xr.object({background:Xr.enum(["auto","opaque","transparent"]).optional(),inputFidelity:Xr.enum(["low","high"]).optional(),inputImageMask:Xr.object({fileId:Xr.string().optional(),imageUrl:Xr.string().optional()}).optional(),model:Xr.string().optional(),moderation:Xr.enum(["auto"]).optional(),outputCompression:Xr.number().int().min(0).max(100).optional(),outputFormat:Xr.enum(["png","jpeg","webp"]).optional(),partialImages:Xr.number().int().min(0).max(3).optional(),quality:Xr.enum(["auto","low","medium","high"]).optional(),size:Xr.enum(["1024x1024","1024x1536","1536x1024","auto"]).optional()}).strict())),M9=Wt(()=>ve(Xr.object({}))),P9=Wt(()=>ve(Xr.object({result:Xr.string()}))),O9=Eo({id:"openai.image_generation",name:"image_generation",inputSchema:M9,outputSchema:P9}),L9=(t={})=>O9(t),QU=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()})}))),ZU=Wt(()=>ve($n.object({output:$n.string()}))),N9=Eo({id:"openai.local_shell",name:"local_shell",inputSchema:QU,outputSchema:ZU}),D9=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()}))),k9=Wt(()=>ve(dt.object({}))),U9=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()}))),F9=Eo({id:"openai.web_search",name:"web_search",inputSchema:k9,outputSchema:U9}),B9=(t={})=>F9(t),z9=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()}))),V9=Wt(()=>ve(er.object({}))),H9=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()})])}))),G9=Eo({id:"openai.web_search_preview",name:"web_search_preview",inputSchema:V9,outputSchema:H9}),j9={codeInterpreter:R9,fileSearch:I9,imageGeneration:L9,localShell:N9,webSearchPreview:G9,webSearch:B9};function jU(t,e){return e?e.some(r=>t.startsWith(r)):!1}async function q9({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 E=m.mediaType==="image/*"?"image/jpeg":m.mediaType;return{type:"input_image",...m.data instanceof URL?{image_url:m.data.toString()}:typeof m.data=="string"&&jU(m.data,r)?{file_id:m.data}:{image_url:`data:${E};base64,${cs(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"&&jU(m.data,r)?{file_id:m.data}:{filename:(S=m.filename)!=null?S:`part-${f}.pdf`,file_data:`data:application/pdf;base64,${cs(m.data)}`}};throw new W9({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:QU});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:K9}),S=g?.itemId;if(S!=null){let E=m[S];if(n)E===void 0&&(c.push({type:"item_reference",id:S}),m[S]={type:"reasoning",id:S,summary:[]});else{let y=[];h.text.length>0?y.push({type:"summary_text",text:h.text}):E!==void 0&&u.push({type:"other",message:`Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(h)}.`}),E===void 0?(m[S]={type:"reasoning",id:S,encrypted_content:g?.reasoningEncryptedContent,summary:y},c.push(m[S])):(E.summary.push(...y),g?.reasoningEncryptedContent!=null&&(E.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:ZU});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 K9=jC.object({itemId:jC.string().nullish(),reasoningEncryptedContent:jC.string().nullish()});function $U({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 Y9=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}))]))),X9=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()}))),eF=20,J9=["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"],UQe=["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",...J9],Q9=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(eF)]).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 e7({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:w9});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:z9});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:D9});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:C9});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:_9});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 Z9({functionality:`tool choice type: ${a}`})}}}var t7=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=[],E=YU(this.modelId);o!=null&&S.push({type:"unsupported-setting",setting:"topK"}),s!=null&&S.push({type:"unsupported-setting",setting:"seed"}),i!=null&&S.push({type:"unsupported-setting",setting:"presencePenalty"}),a!=null&&S.push({type:"unsupported-setting",setting:"frequencyPenalty"}),r!=null&&S.push({type:"unsupported-setting",setting:"stopSequences"});let y=await Sn({provider:"openai",providerOptions:c,schema:Q9});y?.conversation&&y?.previousResponseId&&S.push({type:"unsupported-setting",setting:"conversation",details:"conversation and previousResponseId cannot be used together"});let{input:b,warnings:A}=await q9({prompt:l,systemMessageMode:E.systemMessageMode,fileIdPrefixes:this.config.fileIdPrefixes,store:(m=y?.store)!=null?m:!0,hasLocalShellTool:_("openai.local_shell")});S.push(...A);let M=(f=y?.strictJsonSchema)!=null?f:!1,I=y?.include;function R(Y){I==null?I=[Y]:I.includes(Y)||(I=[...I,Y])}function _(Y){return u?.find(J=>J.type==="provider-defined"&&J.id===Y)!=null}let L=typeof y?.logprobs=="number"?y?.logprobs:y?.logprobs===!0?eF: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=y?.store;k===!1&&E.isReasoningModel&&R("reasoning.encrypted_content");let H={model:this.modelId,input:b,temperature:e,top_p:n,max_output_tokens:t,...(p?.type==="json"||y?.textVerbosity)&&{text:{...p?.type==="json"&&{format:p.schema!=null?{type:"json_schema",strict:M,name:(g=p.name)!=null?g:"response",description:p.description,schema:p.schema}:{type:"json_object"}},...y?.textVerbosity&&{verbosity:y.textVerbosity}}},conversation:y?.conversation,max_tool_calls:y?.maxToolCalls,metadata:y?.metadata,parallel_tool_calls:y?.parallelToolCalls,previous_response_id:y?.previousResponseId,store:k,user:y?.user,instructions:y?.instructions,service_tier:y?.serviceTier,include:I,prompt_cache_key:y?.promptCacheKey,prompt_cache_retention:y?.promptCacheRetention,safety_identifier:y?.safetyIdentifier,top_logprobs:L,truncation:y?.truncation,...E.isReasoningModel&&(y?.reasoningEffort!=null||y?.reasoningSummary!=null)&&{reasoning:{...y?.reasoningEffort!=null&&{effort:y.reasoningEffort},...y?.reasoningSummary!=null&&{summary:y.reasoningSummary}}}};E.isReasoningModel?y?.reasoningEffort==="none"&&E.supportsNonReasoningParameters||(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"}))):(y?.reasoningEffort!=null&&S.push({type:"unsupported-setting",setting:"reasoningEffort",details:"reasoningEffort is not supported for non-reasoning models"}),y?.reasoningSummary!=null&&S.push({type:"unsupported-setting",setting:"reasoningSummary",details:"reasoningSummary is not supported for non-reasoning models"})),y?.serviceTier==="flex"&&!E.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),y?.serviceTier==="priority"&&!E.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 e7({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,E,y,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:J,value:ce,rawValue:fe}=await yn({url:W,headers:Dr(this.config.headers(),t.headers),body:H,failedResponseHandler:Pi,successfulResponseHandler:To(X9),abortSignal:t.abortSignal,fetch:this.config.fetch});if(ce.error)throw new $9({message:ce.error.message,url:W,requestBodyValues:H,statusCode:400,responseHeaders:J,responseBody:fe,isRetryable:!1});let Ce=[],ne=[],Ae=!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)Ce.push({type:"reasoning",text:de.text,providerMetadata:{[Y]:{itemId:x.id,reasoningEncryptedContent:(e=x.encrypted_content)!=null?e:null}}});break}case"image_generation_call":{Ce.push({type:"tool-call",toolCallId:x.id,toolName:"image_generation",input:"{}",providerExecuted:!0}),Ce.push({type:"tool-result",toolCallId:x.id,toolName:"image_generation",result:{result:x.result},providerExecuted:!0});break}case"local_shell_call":{Ce.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&&ne.push(de.logprobs),Ce.push({type:"text",text:de.text,providerMetadata:{[Y]:{itemId:x.id}}});for(let we of de.annotations)we.type==="url_citation"?Ce.push({type:"source",sourceType:"url",id:(a=(i=(o=this.config).generateId)==null?void 0:i.call(o))!=null?a:jn(),url:we.url,title:we.title}):we.type==="file_citation"?Ce.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=we.quote)!=null?u:we.filename)!=null?d:"Document",filename:(p=we.filename)!=null?p:we.file_id,...we.file_id?{providerMetadata:{[Y]:{fileId:we.file_id}}}:{}}):we.type==="container_file_citation"?Ce.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=we.filename)!=null?g:we.file_id)!=null?S:"Document",filename:(E=we.filename)!=null?E:we.file_id,providerMetadata:{[Y]:{fileId:we.file_id,containerId:we.container_id,...we.index!=null?{index:we.index}:{}}}}):we.type==="file_path"&&Ce.push({type:"source",sourceType:"document",id:(A=(b=(y=this.config).generateId)==null?void 0:b.call(y))!=null?A:jn(),mediaType:"application/octet-stream",title:we.file_id,filename:we.file_id,providerMetadata:{[Y]:{fileId:we.file_id,...we.index!=null?{index:we.index}:{}}}})}break}case"function_call":{Ae=!0,Ce.push({type:"tool-call",toolCallId:x.call_id,toolName:x.name,input:x.arguments,providerMetadata:{[Y]:{itemId:x.id}}});break}case"web_search_call":{Ce.push({type:"tool-call",toolCallId:x.id,toolName:le??"web_search",input:JSON.stringify({}),providerExecuted:!0}),Ce.push({type:"tool-result",toolCallId:x.id,toolName:le??"web_search",result:qU(x.action),providerExecuted:!0});break}case"computer_call":{Ce.push({type:"tool-call",toolCallId:x.id,toolName:"computer_use",input:"",providerExecuted:!0}),Ce.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":{Ce.push({type:"tool-call",toolCallId:x.id,toolName:"file_search",input:"{}",providerExecuted:!0}),Ce.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":{Ce.push({type:"tool-call",toolCallId:x.id,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:x.container_id}),providerExecuted:!0}),Ce.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}:{}}};ne.length>0&&(Le[Y].logprobs=ne),typeof ce.service_tier=="string"&&(Le[Y].serviceTier=ce.service_tier);let Re=ce.usage;return{content:Ce,finishReason:$U({finishReason:(R=ce.incomplete_details)==null?void 0:R.reason,hasFunctionCall:Ae}),usage:{inputTokens:Re.input_tokens,outputTokens:Re.output_tokens,totalTokens:Re.input_tokens+Re.output_tokens,reasoningTokens:(L=(_=Re.output_tokens_details)==null?void 0:_.reasoning_tokens)!=null?L:void 0,cachedInputTokens:(k=(V=Re.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:J,body:fe},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:Ou(Y9),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(E){E.enqueue({type:"stream-start",warnings:r})},transform(E,y){var b,A,M,I,R,_,L,V,k,H,z,le,W,Y,J,ce,fe,Ce,ne,Ae,Le,Re;if(t.includeRawChunks&&y.enqueue({type:"raw",rawValue:E.rawValue}),!E.success){c="error",y.enqueue({type:"error",error:E.error});return}let x=E.value;if(WU(x))x.item.type==="function_call"?(m[x.output_index]={toolName:x.item.name,toolCallId:x.item.call_id},y.enqueue({type:"tool-input-start",id:x.item.call_id,toolName:x.item.name})):x.item.type==="web_search_call"?(m[x.output_index]={toolName:n??"web_search",toolCallId:x.item.id},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:n??"web_search",providerExecuted:!0}),y.enqueue({type:"tool-input-end",id:x.item.id}),y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:n??"web_search",input:JSON.stringify({}),providerExecuted:!0})):x.item.type==="computer_call"?(m[x.output_index]={toolName:"computer_use",toolCallId:x.item.id},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:"computer_use",providerExecuted:!0})):x.item.type==="code_interpreter_call"?(m[x.output_index]={toolName:"code_interpreter",toolCallId:x.item.id,codeInterpreter:{containerId:x.item.container_id}},y.enqueue({type:"tool-input-start",id:x.item.id,toolName:"code_interpreter",providerExecuted:!0}),y.enqueue({type:"tool-input-delta",id:x.item.id,delta:`{"containerId":"${x.item.container_id}","code":"`})):x.item.type==="file_search_call"?y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"file_search",input:"{}",providerExecuted:!0}):x.item.type==="image_generation_call"?y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"image_generation",input:"{}",providerExecuted:!0}):x.item.type==="message"?(f.splice(0,f.length),y.enqueue({type:"text-start",id:x.item.id,providerMetadata:{[l]:{itemId:x.item.id}}})):WU(x)&&x.item.type==="reasoning"&&(g[x.item.id]={encryptedContent:x.item.encrypted_content,summaryParts:{0:"active"}},y.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(n7(x)){if(x.item.type==="message")y.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,y.enqueue({type:"tool-input-end",id:x.item.call_id}),y.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:x.item.name,input:x.item.arguments,providerMetadata:{[l]:{itemId:x.item.id}}});else if(x.item.type==="web_search_call")m[x.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:n??"web_search",result:qU(x.item.action),providerExecuted:!0});else if(x.item.type==="computer_call")m[x.output_index]=void 0,y.enqueue({type:"tool-input-end",id:x.item.id}),y.enqueue({type:"tool-call",toolCallId:x.item.id,toolName:"computer_use",input:"",providerExecuted:!0}),y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"computer_use",result:{type:"computer_use_tool_result",status:x.item.status||"completed"},providerExecuted:!0});else if(x.item.type==="file_search_call")m[x.output_index]=void 0,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"file_search",result:{queries:x.item.queries,results:(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,y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"code_interpreter",result:{outputs:x.item.outputs},providerExecuted:!0});else if(x.item.type==="image_generation_call")y.enqueue({type:"tool-result",toolCallId:x.item.id,toolName:"image_generation",result:{result:x.item.result},providerExecuted:!0});else if(x.item.type==="local_shell_call")m[x.output_index]=void 0,y.enqueue({type:"tool-call",toolCallId:x.item.call_id,toolName:"local_shell",input:JSON.stringify({action:{type:"exec",command:x.item.action.command,timeoutMs:x.item.action.timeout_ms,user:x.item.action.user,workingDirectory:x.item.action.working_directory,env:x.item.action.env}}),providerMetadata:{[l]:{itemId:x.item.id}}});else if(x.item.type==="reasoning"){let de=g[x.item.id],we=Object.entries(de.summaryParts).filter(([Ln,ni])=>ni==="active"||ni==="can-conclude").map(([Ln])=>Ln);for(let Ln of we)y.enqueue({type:"reasoning-end",id:`${x.item.id}:${Ln}`,providerMetadata:{[l]:{itemId:x.item.id,reasoningEncryptedContent:(I=x.item.encrypted_content)!=null?I:null}}});delete g[x.item.id]}}else if(a7(x)){let de=m[x.output_index];de!=null&&y.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:x.delta})}else if(s7(x)){let de=m[x.output_index];de!=null&&y.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:JSON.stringify(x.delta).slice(1,-1)})}else if(l7(x)){let de=m[x.output_index];de!=null&&(y.enqueue({type:"tool-input-delta",id:de.toolCallId,delta:'"}'}),y.enqueue({type:"tool-input-end",id:de.toolCallId}),y.enqueue({type:"tool-call",toolCallId:de.toolCallId,toolName:"code_interpreter",input:JSON.stringify({code:x.code,containerId:de.codeInterpreter.containerId}),providerExecuted:!0}))}else if(i7(x))p=x.response.id,y.enqueue({type:"response-metadata",id:x.response.id,timestamp:new Date(x.response.created_at*1e3),modelId:x.response.model});else if(r7(x))y.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 we of Object.keys(de.summaryParts))de.summaryParts[we]==="can-conclude"&&(y.enqueue({type:"reasoning-end",id:`${x.item_id}:${we}`,providerMetadata:{[l]:{itemId:x.item_id}}}),de.summaryParts[we]="concluded");y.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"?y.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?(y.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":o7(x)?(c=$U({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"?y.enqueue({type:"source",sourceType:"url",id:(ce=(J=(Y=s.config).generateId)==null?void 0:J.call(Y))!=null?ce:jn(),url:x.annotation.url,title:x.annotation.title}):x.annotation.type==="file_citation"&&y.enqueue({type:"source",sourceType:"document",id:(ne=(Ce=(fe=s.config).generateId)==null?void 0:Ce.call(fe))!=null?ne:jn(),mediaType:"text/plain",title:(Le=(Ae=x.annotation.quote)!=null?Ae:x.annotation.filename)!=null?Le:"Document",filename:(Re=x.annotation.filename)!=null?Re:x.annotation.file_id,...x.annotation.file_id?{providerMetadata:{[l]:{fileId:x.annotation.file_id}}}:{}})):u7(x)&&y.enqueue({type:"error",error:x})},flush(E){let y={[l]:{responseId:p}};d.length>0&&(y[l].logprobs=d),S!==void 0&&(y[l].serviceTier=S),E.enqueue({type:"finish",finishReason:c,usage:u,providerMetadata:y})}})),request:{body:e},response:{headers:i}}}};function r7(t){return t.type==="response.output_text.delta"}function n7(t){return t.type==="response.output_item.done"}function o7(t){return t.type==="response.completed"||t.type==="response.incomplete"}function i7(t){return t.type==="response.created"}function a7(t){return t.type==="response.function_call_arguments.delta"}function s7(t){return t.type==="response.code_interpreter_call_code.delta"}function l7(t){return t.type==="response.code_interpreter_call_code.done"}function WU(t){return t.type==="response.output_item.added"}function c7(t){return t.type==="response.output_text.annotation.added"}function u7(t){return t.type==="error"}function qU(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 d7=wt(()=>ve($C.object({instructions:$C.string().nullish(),speed:$C.number().min(.25).max(4).default(1).nullish()}))),p7=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:d7}),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:PU(),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}}}},m7=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()}))),f7=wt(()=>ve(ds.object({include:ds.array(ds.string()).optional(),language:ds.string().optional(),prompt:ds.string().optional(),temperature:ds.number().min(0).max(1).default(0).optional(),timestampGranularities:ds.array(ds.enum(["word","segment"])).default(["segment"]).optional()}))),KU={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"},h7=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:f7}),i=new FormData,a=t instanceof Uint8Array?new Blob([t]):new Blob([UU(t)]);i.append("model",this.modelId);let s=wU(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 IU({url:this.config.url({path:"/audio/transcriptions",modelId:this.modelId}),headers:Dr(this.config.headers(),t.headers),formData:u,failedResponseHandler:Pi,successfulResponseHandler:To(m7),abortSignal:t.abortSignal,fetch:this.config.fetch}),h=p.language!=null&&p.language in KU?KU[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}}}},g7="2.0.89";function qC(t={}){var e,r;let n=(e=FU(RU({settingValue:t.baseURL,environmentVariableName:"OPENAI_BASE_URL"})))!=null?e:"https://api.openai.com/v1",o=(r=t.name)!=null?r:"openai",i=()=>UC({Authorization:`Bearer ${AU({apiKey:t.apiKey,environmentVariableName:"OPENAI_API_KEY",description:"OpenAI"})}`,"OpenAI-Organization":t.organization,"OpenAI-Project":t.project,...t.headers},`ai-sdk/openai/${g7}`),a=h=>new s9(h,{provider:`${o}.chat`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),s=h=>new p9(h,{provider:`${o}.completion`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),l=h=>new g9(h,{provider:`${o}.embedding`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),c=h=>new T9(h,{provider:`${o}.image`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),u=h=>new h7(h,{provider:`${o}.transcription`,url:({path:g})=>`${n}${g}`,headers:i,fetch:t.fetch}),d=h=>new p7(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 t7(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=j9,f}var KQe=qC();function tF(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[Eh]:Ml??"",...r&&{[TP]:r},...n||{}};return o&&(i[EP]=JSON.stringify(o)),i}var CS=t=>e=>{let r=tF(t);return S7({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)},AS=t=>e=>{let r=tF(t);return qC({baseURL:`${t.baseUrl}/v1/llm/openai/${e}`,headers:r,apiKey:t.apiKey})(e)};var Jr=class extends Nr{agentConfig;constructor(e,r){let n={...Pc,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return p_.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${X}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Ml,...e},signal:r.abortSignal});return d_.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${X}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return y7.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(`/${X}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return wP.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(`/${X}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return Sb.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return RP.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return vP.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return CP.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return AP.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(`/${X}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return Sb.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${X}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return bP.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${X}/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(`/${X}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return ZE.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${X}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return xP.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${X}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return If.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return FI.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${X}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return BI.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${X}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return OE.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${X}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return x_.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${X}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return NI.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${X}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return kI.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${X}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return DI.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${X}/web-agent/iframe-regex`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Lw.parse(n)}getAnthropicModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return CS({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Ke(n),promptType:o},sessionId:r})}getOpenAIModelFactory(e){let{sessionId:r,logger:n,streamType:o}=e;return AS({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Ke(n),promptType:o},sessionId:r})}};import{z as KC}from"zod";var ct=class extends Nr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return Xc(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${X}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{v.warn(`API key check failed: ${r.message}`)}});return VP.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${X}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return kP.parse(r)}async getRunExport(e){let r=await this.sendRequest(`/${X}/runs/${encodeURIComponent(e)}/export`,{method:"GET",retries:3,requestTimeoutMs:1e4});return FP.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${X}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return _P.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${X}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${X}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return PP.parse(n)}async deleteStepCacheEntry(e,r){await this.sendRequest(`/${X}/cache/entry`,{method:"DELETE",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4})}async getWebStepCacheMemoryTraces(e){let r=await this.sendRequest(`/${X}/cache/traces`,{method:"POST",body:e,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return yb.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(`/${X}/${this.cacheRouteForPlatform(e)}/traces`,{method:"POST",body:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return yb.parse(n)}async updateMobileStepCaches(e){await this.sendRequest(`/${X}/${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(`/${X}/${this.cacheRouteForPlatform(e)}`,{method:"POST",body:r,extraHeaders:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return OP(oh(e)).parse(o)}async queueTests(e){let r=await this.sendRequest(`/${X}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return IP.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${X}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return zP.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${X}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${X}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${X}/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(`/${X}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return HP.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${X}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return aO.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${X}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${X}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${X}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${X}/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(`/${X}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return GP.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${X}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return i_.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${X}/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(`/${X}/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(`/${X}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return jP.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${X}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${X}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return $P.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${X}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return WP.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${X}/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(`/${X}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return pO.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${X}/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(`/${X}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return gp.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${X}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return gp.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${X}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return vb.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(`/${X}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return gp.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${X}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return gp.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${X}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return vb.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${X}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return KC.record(KC.string(),KC.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${X}/quarantine`,{method:"GET"});return KP.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${X}/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(`/${X}/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(`/${X}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return YP.parse(r)}async extendEmulatorTtl(e,r){try{await this.sendRequest(`/${X}/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(`/${X}/limbar/${this.platformRoute(o)}/upload-url`,{method:"POST",retries:3,body:i,requestTimeoutMs:15e3,logResponse:!0});return JP.parse(a)}async deleteAndroidEmulator(e){await this.sendRequest(`/${X}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getMobileAssets(){let e=await this.sendRequest(`/${X}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return QP.parse(e)}async getLimbarAssetDownloadUrl(e,r,n){let o=await this.sendRequest(`/${X}/limbar/assets/${e}/${r}/${this.platformRoute(n)}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return ZP.parse(o)}async deleteAsset(e,r,n){await this.sendRequest(`/${X}/limbar/assets/${e}/${r}/${this.platformRoute(n)}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${X}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return XP.parse(r)}async deleteIosEmulator(e){await this.sendRequest(`/${X}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${X}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return LM.parse(r)}async generateMcpSessionTraceUploadUrl(e){let r=await this.sendRequest(`/${X}/mcp/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Eb.parse(r)}};async function RS(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 wS=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var ps=class extends Nr{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${X}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return Nw.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal,loggerTags:r.loggerTags})}};var Lu=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return Xc(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 E7,en as T7}from"@faker-js/faker";var Nu="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 E7({locale:T7}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Nu}/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(`/${Nu}/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(`/${Nu}/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(`/${Nu}/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(`/${Nu}/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(`/${Nu}/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 rF(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var xS=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await rF(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 Th:new YC(t,e,r,n,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:l,isolateCachesByEnvironment:s})}var YC=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=hp(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:Cb(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 IS from"path";function b7(t){let e=new nF,r=IS.join(t,"metadata.json"),n=yi.parse(JSON.parse(XC.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of XC.readdirSync(IS.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new nF(IS.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(IS.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function _S(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!XC.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new xS(e);try{let{runGroupId:i,buffer:a}=b7(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 v7 from"adm-zip";import Qr from"fs";import bo from"path";var dm=class t{constructor(e){this.filePath=e;Qr.rmSync(this.filePath,{recursive:!0,force:!0}),Qr.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){Qr.mkdirSync(bo.join(this.filePath,e),{recursive:!0})}readFile(e){let r=bo.join(this.filePath,e);if(Qr.existsSync(r))return Qr.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=bo.join(this.filePath,r);try{Qr.writeFileSync(o,n)}catch{}}createFileStream(e){let r=bo.join(this.filePath,e),n=Qr.createWriteStream(r);return this.streams.push(n),n}createRunArchive(e){let r=new JC(bo.join(this.filePath,"runs"),e);return this.children.push(r),r}},JC=class{children=[];tempPath;finalPath;constructor(e,r){this.tempPath=bo.join(e,`temp-storage-${r}`),this.finalPath=bo.join(e,`${r}.zip`),Qr.rmSync(this.tempPath,{recursive:!0,force:!0}),Qr.rmSync(this.finalPath,{recursive:!0,force:!0}),Qr.mkdirSync(this.tempPath,{recursive:!0})}readFile(e){let r=bo.join(this.tempPath,e);if(Qr.existsSync(r))return Qr.readFileSync(r)}mkdir(e){Qr.mkdirSync(bo.join(this.tempPath,e),{recursive:!0})}cd(e){let r=new dm(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);Qr.writeFileSync(o,n)}close(){for(let n of this.children)n.close();let e=new v7;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Qr.writeFileSync(this.finalPath,r),Qr.rmSync(this.tempPath,{recursive:!0,force:!0})}};import C7 from"adm-zip";import{randomUUID as A7}from"crypto";import dr from"fs";import Ur from"path";function sF(t){try{return dr.existsSync(t)?JSON.parse(dr.readFileSync(t,"utf-8")):void 0}catch{return}}function oF(t){return dr.existsSync(t)?dr.readFileSync(t,"utf-8").split(`
|
|
80
80
|
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function R7(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(!dr.existsSync(n))return;let o=dr.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=sF(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 iF(t,e,r){let n=Ur.join(t,"attempts");if(!dr.existsSync(n))return;let o=dr.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(dr.existsSync(a))return a}}var MS=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||!dr.existsSync(this.zipPath))return;let n=Ur.join(this.runsDir,`temp-unzipped-${e}-${A7()}`);dr.mkdirSync(n,{recursive:!0}),new C7(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())dr.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return R7(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Ur.join(e,"assets");return dr.existsSync(r)?dr.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(dr.existsSync(o))try{return dr.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=sF(Ur.join(o,"console.json")),a=lb.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 oF(i)){let d=up.safeParse(aF(u));d.success&&(s[d.data.id]=d.data)}let l={},c=oF(a);for(let u=0;u<c.length;u++){let d=c[u],p=dp.safeParse(aF(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;l[m]=p.data}if(Object.keys(l).length!==0)return ub(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=iF(o.inflatedPath,r,"html");if(i)try{return dr.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=iF(o.inflatedPath,r,"xml");if(i)try{return dr.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Ur.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return dr.readFileSync(i)}catch{return}}};function aF(t){try{return JSON.parse(t)}catch{return}}function PS({test:t,envNameOverride:e,urlOverride:r,resolveEnv:n}){let o=e??w7(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[gr];typeof l=="string"&&(s=l)}if(!s)throw new Error(`Cannot run test with no base URL and no ${gr} variable defined in its environment`);return{envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function w7(t){for(let e of t.envs??[])if(e.default)return e.name}var x7={test:"tests",module:"modules",mobileTest:"mobileTests",mobileModule:"mobileModules"};async function ms(t,e,r){let n=await he(t),o=n[x7[r]],i=I7(o,e);if(e.id){if(i.length===0)throw new hr(`No ${r} found with id '${e.id}' in project '${t.rootDir}'.`);return OS(i,n)}if(e.name){if(i.length===0)throw new hr(`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 hr([`Multiple ${r}s found with exact name '${e.name}'. Please disambiguate by id or path.`,JSON.stringify(a,null,2)].join(`
|
|
81
81
|
`))}return OS(i,n)}if(e.path){let a=e.path;if(i.length===0)throw new hr(`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 OS(s,n);let l=i.map(c=>({id:c.id,path:c.fullFilePath}));throw new hr([`Multiple ${r}s matched the provided path '${a}'. Please pass the absolute path.`,JSON.stringify(l,null,2)].join(`
|
|
82
|
-
`))}return OS(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function OS(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 I7(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 LS from"fs";import _7 from"path";var M7=new Vg(30,60*1e3),DS="https://api.momentic.ai",ZC,lF,kS=t=>{DS=t},Kt=()=>DS,cF=()=>Xc(DS),US=t=>{lF=t},Ol=()=>lF,fs=()=>ZC;var Du,eA,NS,FS=async t=>{if(ZC&&Du&&NS)return Du;let e=new ct({baseUrl:DS,apiKey:t,logger:v});ZC=e;try{let r=await e.getAuthInfo();return Du=r.orgId,eA=r.userId,NS=t,Du}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},tr=()=>{if(!Du)throw new Error("Your organization ID is invalid.");return Du},Li=()=>{if(!eA)throw new Error("Your user ID is invalid.");return eA},Cr=()=>{if(!NS)throw new Error("Your API key is invalid.");return NS},tA,QC,ku=(t,e)=>{tA=t,QC?.abort(),QC=new AbortController;let r=QC.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=_7.resolve(t.rootDir,o.envFile);try{if(LS.lstatSync(i).isSymbolicLink())return;LS.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{P7({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},_e=()=>tA;function P7({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()&&(M7.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.`),tA=await Promise.resolve(e(n.configFilePath)))};LS.watchFile(o,{persistent:!1},i);let a=()=>{LS.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function We(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as O7}from"os";var L7="2.82.0",Ll=eu({app:"desktop-server",hostname:O7(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:L7});(async()=>{try{let t=await ha(Ll);t.gitBranchName&&Ll.addBinding("branch",t.gitBranchName)}catch{}})();var uF=N7();uF.get("/",async(t,e)=>{let r=_e(),n=fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await br(Ll,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ol(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName})});var rA=uF;import{Router as D7}from"express";import Zr from"fs";import{glob as k7}from"glob";import Ar from"path";var U7=5e3;function nA(t={}){let e=D7();function r(i){let a=_e(),s=Ar.dirname(a.configFilePath);return Ar.join(s,...i)}function n(i){let a=_e(),s=Ar.dirname(a.configFilePath),l=Ar.relative(s,i);return l?l.split(Ar.sep):[]}function o(i,a){let s=Zr.statSync(i),l=n(i);return mb.parse({name:a,absolutePath:i,relativePath:l.join(Ar.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=eP.parse(i.body).pathSegments}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=r(l);if(!Zr.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(Ar.sep)}`});return}if(!Zr.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Ar.sep)}`});return}let d=_e(),p=Array.from(d.config.exclude??[]).concat(ph),m=AbortSignal.timeout(U7),f;try{f=await k7("*",{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 E=Ar.join(c,S);return o(E,S)});if(t.allowedFileTypes){let S=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let b=await F7(E.absolutePath);return b!==void 0&&S.has(b)?E:null}))).filter(E=>E!==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=tP.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=r(l);if(Zr.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(Ar.sep)}`,pathSegments:l});return}Zr.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(Ar.sep)}`,pathSegments:l};a.status(201).json(u)})),e.patch("/",We(async(i,a,s)=>{let l,c;try{let f=rP.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(!Zr.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(Ar.sep)}`});return}if(Zr.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(Ar.sep)}`});return}let p=Ar.dirname(d);Zr.existsSync(p)||Zr.mkdirSync(p,{recursive:!0}),Zr.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(Ar.sep)} to ${c.join(Ar.sep)}`,pathSegments:c};a.status(200).json(m)})),e.delete("/",We(async(i,a,s)=>{let l,c=!0;try{let m=nP.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(!Zr.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(Ar.sep)}`,pathSegments:l});return}if(!Zr.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Ar.sep)}`});return}if(c)Zr.rmSync(u,{recursive:!0,force:!0});else{if(Zr.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}Zr.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p)})),e}async function F7(t){try{let e=await Zr.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 B7}from"express";var dF=B7();dF.get("/",async(t,e)=>{let r=_e(),n=fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await br(Ll,n,r);e.status(200).json(o)});var oA=dF;import cse from"events";import H1,{Router as use}from"express";import dse from"http";import pse from"path";import{Server as xie}from"socket.io";var z7=({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{}}},pF={event:"cancel",createHandler:z7};var V7=({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)})}}},mF={event:"clearAIActionCache",createHandler:V7};var H7=({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})}}},fF={event:"fetchA11yTree",createHandler:H7};var G7=({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})}}},hF={event:"fetchDom",createHandler:G7};var j7=({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)}},gF={event:"disconnect",createHandler:j7};function vo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=$7(r);W7(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await q7(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function $7(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 W7(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 q7(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as oee}from"crypto";import{faker as K7}from"@faker-js/faker";import Y7 from"assert";import X7 from"axios";import*as J7 from"child_process";import Q7 from"moment";import*as Z7 from"otpauth";import eee from"pg";async function SF(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=rh(n,e);r.push(...o)}),r}function tee(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 ree(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 nee=Object.getPrototypeOf(async function(){}).constructor;async function yF(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=(y,b)=>{o[y]=b,c[y]=b},d={},p=(y,b)=>{o[y]=b,d[y]=b},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let f;n.includes("createAppAuth")&&(f=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new nee("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(X7,Q7,l.fakerInstance??K7,Y7,eee,m,f,Z7,J7,SF,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,tee(a,s),...Object.values(i??{}))),g=!0,S,E;try{let y=await Z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await ree(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),g=!1,y instanceof Wa?E=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:E=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:E}}async function EF({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Va,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=oee(),p=await yF(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 iee,randomUUID as aee}from"crypto";import see from"fetch-retry";var lee=see(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}}),TF=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,bF=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function vF({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Va,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!TF)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!bF)throw new Error("Missing lambda auth secret.");let h=iee("sha256",bF).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:aee(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await Z(lee(TF,{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(E){m=E}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=kM.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 hs(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await vF(t);else if(t.localTools)e=await EF({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
82
|
+
`))}return OS(i,n)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function OS(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 I7(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 LS from"fs";import _7 from"path";var M7=new Vg(30,60*1e3),DS="https://api.momentic.ai",ZC,lF,kS=t=>{DS=t},Kt=()=>DS,cF=()=>Xc(DS),US=t=>{lF=t},Ol=()=>lF,fs=()=>ZC;var Du,eA,NS,FS=async t=>{if(ZC&&Du&&NS)return Du;let e=new ct({baseUrl:DS,apiKey:t,logger:v});ZC=e;try{let r=await e.getAuthInfo();return Du=r.orgId,eA=r.userId,NS=t,Du}catch(r){throw new Error(`Error checking API key against server: ${r}`,{cause:r})}},tr=()=>{if(!Du)throw new Error("Your organization ID is invalid.");return Du},Li=()=>{if(!eA)throw new Error("Your user ID is invalid.");return eA},Cr=()=>{if(!NS)throw new Error("Your API key is invalid.");return NS},tA,QC,ku=(t,e)=>{tA=t,QC?.abort(),QC=new AbortController;let r=QC.signal,n=[t.configFilePath];t.config.environments?.forEach(o=>{if(!o.envFile)return;let i=_7.resolve(t.rootDir,o.envFile);try{if(LS.lstatSync(i).isSymbolicLink())return;LS.existsSync(i)&&n.push(i)}catch(a){v.warn({err:a},`Failed to check if env file ${i} exists`)}});try{P7({filesToWatch:n,revalidator:e,signal:r,project:t})}catch(o){v.error({err:o},"Failed to start config file watchers")}},_e=()=>tA;function P7({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()&&(M7.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.`),tA=await Promise.resolve(e(n.configFilePath)))};LS.watchFile(o,{persistent:!1},i);let a=()=>{LS.unwatchFile(o,i),r.removeEventListener("abort",a)};r.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function We(t){return function(...e){let r=e[e.length-1],n=t(...e);Promise.resolve(n).catch(r)}}import{hostname as O7}from"os";var L7="2.82.2",Ll=eu({app:"desktop-server",hostname:O7(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:L7});(async()=>{try{let t=await ha(Ll);t.gitBranchName&&Ll.addBinding("branch",t.gitBranchName)}catch{}})();var uF=N7();uF.get("/",async(t,e)=>{let r=_e(),n=fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await br(Ll,n,r),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Ol(),l=!a&&(s||!i);e.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName})});var rA=uF;import{Router as D7}from"express";import Zr from"fs";import{glob as k7}from"glob";import Ar from"path";var U7=5e3;function nA(t={}){let e=D7();function r(i){let a=_e(),s=Ar.dirname(a.configFilePath);return Ar.join(s,...i)}function n(i){let a=_e(),s=Ar.dirname(a.configFilePath),l=Ar.relative(s,i);return l?l.split(Ar.sep):[]}function o(i,a){let s=Zr.statSync(i),l=n(i);return mb.parse({name:a,absolutePath:i,relativePath:l.join(Ar.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=eP.parse(i.body).pathSegments}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=r(l);if(!Zr.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(Ar.sep)}`});return}if(!Zr.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Ar.sep)}`});return}let d=_e(),p=Array.from(d.config.exclude??[]).concat(ph),m=AbortSignal.timeout(U7),f;try{f=await k7("*",{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 E=Ar.join(c,S);return o(E,S)});if(t.allowedFileTypes){let S=new Set(t.allowedFileTypes);h=(await Promise.all(h.map(async E=>{if(E.isDirectory||!(E.name.endsWith(".test.yaml")||E.name.endsWith(".module.yaml")))return E;let b=await F7(E.absolutePath);return b!==void 0&&S.has(b)?E:null}))).filter(E=>E!==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=tP.parse(i.body).pathSegments}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=r(l);if(Zr.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(Ar.sep)}`,pathSegments:l});return}Zr.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(Ar.sep)}`,pathSegments:l};a.status(201).json(u)})),e.patch("/",We(async(i,a,s)=>{let l,c;try{let f=rP.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(!Zr.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(Ar.sep)}`});return}if(Zr.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(Ar.sep)}`});return}let p=Ar.dirname(d);Zr.existsSync(p)||Zr.mkdirSync(p,{recursive:!0}),Zr.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(Ar.sep)} to ${c.join(Ar.sep)}`,pathSegments:c};a.status(200).json(m)})),e.delete("/",We(async(i,a,s)=>{let l,c=!0;try{let m=nP.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(!Zr.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(Ar.sep)}`,pathSegments:l});return}if(!Zr.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(Ar.sep)}`});return}if(c)Zr.rmSync(u,{recursive:!0,force:!0});else{if(Zr.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}Zr.rmdirSync(u)}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p)})),e}async function F7(t){try{let e=await Zr.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 B7}from"express";var dF=B7();dF.get("/",async(t,e)=>{let r=_e(),n=fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await br(Ll,n,r);e.status(200).json(o)});var oA=dF;import cse from"events";import H1,{Router as use}from"express";import dse from"http";import pse from"path";import{Server as xie}from"socket.io";var z7=({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{}}},pF={event:"cancel",createHandler:z7};var V7=({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)})}}},mF={event:"clearAIActionCache",createHandler:V7};var H7=({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})}}},fF={event:"fetchA11yTree",createHandler:H7};var G7=({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})}}},hF={event:"fetchDom",createHandler:G7};var j7=({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)}},gF={event:"disconnect",createHandler:j7};function vo(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=$7(r);W7(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await q7(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function $7(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 W7(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 q7(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as oee}from"crypto";import{faker as K7}from"@faker-js/faker";import Y7 from"assert";import X7 from"axios";import*as J7 from"child_process";import Q7 from"moment";import*as Z7 from"otpauth";import eee from"pg";async function SF(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=rh(n,e);r.push(...o)}),r}function tee(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 ree(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 nee=Object.getPrototypeOf(async function(){}).constructor;async function yF(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=(y,b)=>{o[y]=b,c[y]=b},d={},p=(y,b)=>{o[y]=b,d[y]=b},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let f;n.includes("createAppAuth")&&(f=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new nee("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(X7,Q7,l.fakerInstance??K7,Y7,eee,m,f,Z7,J7,SF,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,tee(a,s),...Object.values(i??{}))),g=!0,S,E;try{let y=await Z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await ree(e.options.responseSerialization??"RAW",y)}catch(y){r.error({err:y,env:o,evalCode:n},`[${t}] Error executing code: ${y}`),g=!1,y instanceof Wa?E=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:E=y instanceof Error?y.message:`${y}`}return{result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:E}}async function EF({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=Va,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=oee(),p=await yF(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 iee,randomUUID as aee}from"crypto";import see from"fetch-retry";var lee=see(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}}),TF=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,bF=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function vF({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=Va,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!TF)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!bF)throw new Error("Missing lambda auth secret.");let h=iee("sha256",bF).update(t).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:aee(),orgId:t,momenticLambdaAuthHash:h,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await Z(lee(TF,{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(E){m=E}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=kM.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 hs(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await vF(t);else if(t.localTools)e=await EF({...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=Va,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 hs({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 BS(t){return CF(t)}async function CF({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 CF({obj:c,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:l?void 0:r,...a})}return i}function AF(t,e){for(let{path:r,original:n}of e)cee(t,r,n)}import uee from"fetch-retry";var ent=process.env.MAILINATOR_API_KEY,tnt=uee(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 rne}from"os";var iA={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`${pz}
|
|
|
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 Rre=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function hz({beforeUrl:t,beforePages:e,browser:r,command:n,logger:o}){if(Rre.includes(n.type))return;await en().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 Me(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(Cl(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 gz=t=>!!t&&nc(t),Sz=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&&!mz(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 Ore}from"crypto";var Ez={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},Tz={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},yz=/<(\S+) id="(\d+)".*?>/g,xre=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,bz=["h1","h2","section","footer","nav","aside","form","label","dialog"],Ire=[...bz,"span","div","h3"],_re=["table","select","form","ul","ol","menu","pre","code","dialog"],Mre=["table","form","dialog","nav","section","ul","select"];function ey(t){return Pre(t)}function Pre({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 y=Array.from(h.matchAll(yz)).map(z=>z&&z.length>=3?{tagName:z[1],id:z[2]}:void 0).filter(z=>!!z),A=Array.from(h.matchAll(xre)).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 y)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=>_re.includes(z.tagName)),R=l[c+1]??"",_=lt(R),V=Array.from(R.matchAll(yz)).map(z=>z&&z.length>2?z[1]:void 0).filter(z=>!!z),k=V.some(z=>bz.includes(z)),H=V.some(z=>Ire.includes(z));d+_>=i&&(f=!0),d>=n&&(k&&!I||A.some(z=>Mre.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],E=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:E},`Chunk for page filtering (index ${g+1}/${s.length})`)}),{chunks:s}}var Lre=75e4,ty=3e5;async function Fl(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>Lre)try{let p=ey({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});c=await Dre({...t,tokenLimit:ty-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(ty*Za),u=c.serialize();let m=lt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>ty)try{if(o){let p=ey({serializedTree:u,options:Tz,logger:i}),m=Ore();c=await Z(Nre({...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=ey({serializedTree:u,options:Ez,logger:i});c=await Z(kre({...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(ty*Za),u=c.serialize(),i.info("Filtered page using naive truncation")}return u}async function Nre({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:Ke(l)}),u=[];return r.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function Dre(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:Ke(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 kre(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:Ke(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 YA(t,e){if(!t.description)throw new N("UserConfigurationError","Cannot locate element with empty description");return Ro({action:async()=>Ure(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function Ure(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:E}=e,y=t.description,b=en(),A=t.useMemory&&!r;n&&(y=await Fr({orgId:f,s:y,context:n,localTools:g,signal:E,logger:c})),a&&(y=fz(y,a));let{serializedTree:M,tree:I}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Ui(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:E,skipWait:i,logger:c}),{}),R=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let J,ce=Date.now(),fe;for(;!J&&Date.now()-ce<3e3;){E.throwIfAborted();try{J=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Ce){fe=Ce}}if(!J)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: ${fe?.message}`);return J}),_=M,L=!1,k=`data:image/jpeg;base64,${R.toString("base64")}`;_=await Fl({type:"locator",description:y,screenshot:k,serializedTree:M,options:{aiPageFiltering:l},tree:I,fixtures:{generator:S,signal:E,logger:c,orgId:f}}),_!==M&&(L=!0);let H=await b.startAsyncSpan("AI_LOCATOR_CALL",async J=>{p&&(J.attributes.isAutoHeal=!0),m&&(J.attributes.cacheBustReason=m);let ce=await S.getElementLocation({browserState:_,goal:y,screenshot:k,source:a,memory:A?s:void 0},{disableCache:r,abortSignal:E,loggerTags:Ke(c),useMemory:A});if(J.result=ce,b.storeTraceAsset){let fe=vz();b.storeTraceAsset({snapshotId:fe,data:R}),J.screenshotSnapshotId=fe}return ce});if(c.debug({usedRag:L,result:H},"Got locator result"),!(H.id>0))throw new bc(`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 J=>{let ce=await h.createTargetFromA11yId({id:H.id,requirements:H.requirements,additionalElements:H.additionalElements,description:y,targetSource:"AI",logger:c,skipSavingVisualAttributes:d});if(J.result={serializedElement:ce.target.nodeOnlySerializedHtml??"Unknown HTML element"},b.storeTraceAsset)try{let fe=await h.screenshot({locator:ce.resolution.locator,clearHighlights:!0}),Ce=vz();b.storeTraceAsset({snapshotId:Ce,data:fe}),J.elementScreenshotSnapshotId=Ce}catch(fe){c.debug({err:fe},"Failed to capture element screenshot for locator trace, continuing...")}return 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 Cz}from"crypto";var Fre=15;async function ry({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=Fre}){if(!t.assertion.trim())throw new N("ActionFailureError","Assertion command is missing the assertion content");let a=dT.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=en();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=P0(u,i-1),p=0,m=Date.now(),f=m+u,h=m,g,S,E;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 Me(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 Az(c,r,n.abortSignal);return S&&S.serializedTree===_.serializedTree&&S.screenshotBuff.equals(_.screenshotBuff)?(I=!0,g):(S=_,Rz({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&&Zp(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(),E=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 Me(A,n.abortSignal)}if(!g?.success)try{g=await Ro({action:async()=>Rz({command:t,state:await Az(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(),E=A instanceof Error?A:new Error(`${A}`)}finally{p++}g?.updatedMemory&&Zp(t,g.updatedMemory,r);let y=g?.afterScreenshotOverride;if(y&&s.storeTraceAsset){let A=Cz();s.storeTraceAsset({snapshotId:A,data:y}),l.screenshotSnapshotId=A}let b=g?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let A=Cz();s.storeTraceAsset({snapshotId:A,data:b}),l.elementScreenshotSnapshotId=A}if(!g?.success){l.result={thoughts:E?.message??"AI check failed after all attempts",result:!1};let A=`AI check still failing after ${p} attempts.`;throw E&&(A+=` Latest result: ${E.message}`),new N("AssertionFailureError",A)}return l.result={thoughts:g.thoughts,result:!0},{...g,succeedImmediately:!1,urlAfterCommand:c.url()}})}async function Az(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 Rz({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"),E=u.url(),y=t.contextChoice??"MULTIMODAL",b=f;y!=="VISION_ONLY"&&(b=await Fl({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:E,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:S,contextChoice:y,source:l},I=await(y==="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:Ke(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 Bre(I.relevantElements,u,c)}return{success:I.result,thoughts:I.thoughts,afterScreenshotOverride:g,elementScreenshotOverride:R,updatedMemory:o?I.updatedMemory:void 0}}async function Bre(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 Z(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 zre=1e5,ny=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function wz(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await Vre(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof ny?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 Me(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function Vre(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await Me(o.smartWaitingTimeout,n);return}if(!e.description)throw new N("UserConfigurationError","Cannot locate element with empty description");await Z(Hre(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function Hre(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Ro({action:async()=>Gre(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function Gre(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)>zre)throw new ny;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){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: ${E instanceof Error?E.message:E}`)}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:Ke(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Iz}from"lodash-es";async function _z(t){return en().startAsyncSpan("ELEMENT_ASSERTION",async r=>jre(t,r),{name:"Element check"})}async function jre(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>of(r.cache)?r.cache:void 0,l=s(),c=!i&&!!l?.target&&nc(l.target),u=Iz(l),d=(E=!1)=>{if(l=s(),!!l)if(E){let y=Jv(u,l);l.target=y.target,l.updatedAt=y.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 Me(h,a),a?.throwIfAborted(),l=s();let E=m===1,{result:y,elementWasFound:b}=await xz({cacheToUse:l,skipAISmartWaiting:!E,useAIIfCacheFails:!c,params:t});if(f=y,g=g||b,y.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 E=s(),y=E?.target?.memory?{target:{id:-1,memory:E.target.memory}}:void 0,{result:b,elementWasFound:A}=await xz({cacheToUse:y,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=Qp(S.target),S.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function xz({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=Ek(o.assertion),d,p=!1,m=Iz(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:g}=await l({tracer:s,command:o,target:o.target,cache:m?.target,action:async S=>$re(S.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:Xs(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 $re(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await Wre(t,e.assertion)}async function Wre(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)},!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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=Eu(e);n=new N("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Eu(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(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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 Mz(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as qre}from"jimp";async function hm(t,e){let r=await t.screenshot(e),n=await qre.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Pz}from"jimp";import XA from"jpeg-js";import Kre from"pixelmatch";async function Oz({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=>hm(n,{locator:L.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await hm(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 Pz.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Pz.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),E=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 y={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=e.threshold??.1,M=Kre(XA.decode(c.buffer).data,XA.decode(l.buffer).data,y.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 ${E} pixels.`),I)throw new N("ActionFailureError",R);return{fail:I,thoughts:R,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:XA.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var Yre=3e4;function Xre(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 Lz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??Yre/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(vu(t.url)&&(l=t.url),r&&Cu(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 Z((async()=>{let f=s?`${c}?${s}`:c;try{let h=Xre(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 Jre=5e3;async function oy({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 Nz(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 Me(s,e.signal),s=Math.min(Math.floor(s*1.5),Jre);else return i}return i=await Nz(e),i}async function Nz({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(Dz,{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(Dz,{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 Dz({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 Qre=3e4;async function kz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??Qre/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(vu(t.url)&&(s=t.url),r&&Cu(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=await Z((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 bs=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 Fl({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:{...Ke(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 Fl({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:{...Ke(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 YA({...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 Me(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=en(),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,c&&i.storeTraceAsset)try{let d=await this.browser.screenshot({locator:c.locator,clearHighlights:!0}),p=Zre();i.storeTraceAsset({snapshotId:p,data:d}),l.elementScreenshotSnapshotId=p}catch(d){o.debug({err:d},"Failed to capture element screenshot for redirect trace")}return c})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ge}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await en().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=en(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=Uz(e.cache);if((!g||u)&&!EE(n))throw new N("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let S=!1,E;u&&(f.info("Cache explicitly disabled for this step"),S=!0,E="Cache explicitly disabled",g=void 0);let y=Sz({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=y.cache,S=S||y.cacheBustedBeforeAction,!E&&y.cacheBustReason&&(E=y.cacheBustReason);let b=!0;if(!gz(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:E});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.82.0"]),Fg({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=NE(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.82.0",`missReason:${A instanceof vn?A.cacheMissReason:"unknown"}`]);let I;return g.memory&&tf(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"),(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?await r.startAsyncSpan("SMART_WAITING",async()=>await wz({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())):(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 m=2;for(let f=1;f<=m;f++){let h=!1,g=this.browser.getActiveFrameConfig();try{let S;try{S=await YA({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,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(b){if(b instanceof bc&&b.updatedLocatorMemory){let A={id:-1,...l,memory:b.updatedLocatorMemory};Fg({cmd:a,key:i.targetName,newTarget:A,logger:c,updatedWithAI:!0})}throw b}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),y=await s(E);return Fg({cmd:a,key:i.targetName,newTarget:S.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=Ke(c)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(g),this.throwIfClosed(),f<m&&NE(S)){c.warn({err:S,aiAttempt:f},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof N?S:new N("ActionFailureError",S.message)}}throw new N("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return hm(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await Me(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 hz({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{AF(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>gA(e)}}async traceBrowserInteraction(e,r,n){return en().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return BS({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()?ry({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 ry({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=mO(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:Ke(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(!vu(r.url)&&!Cu(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??$r.height,c=this.browser.getViewport()?.width??$r.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 Me(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 Xg(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:Xs(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 hs({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=Uz(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:Xs(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 Xg(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 Xg(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 tne,s=ene(fetch,a),l;try{l=new URL(r.url).hostname}catch{}let c=await Lz({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:yd.parse({...c,cookies:pM(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await kz({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Oz({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 HF({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 hs({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=nh.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(Mz(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 ry({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&&Zp(r,c.cache?.memory.traces,i)}}let l=await _z({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()=>oy({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 ys(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async l=>await bA(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 Z(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new ys(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 ys(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 ys(r.requestMatcher),async(s,l)=>{let c=await hs({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=DM.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:Ke(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 XS({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:Ke(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ke(r??this.logger)})}};var JA=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(([y,b])=>`${y}:${b}`)]},n.info({original:g,keyParams:h},"Module cache key params");let E=Date.now();for(;Date.now()-E<fP;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:_t(y,1e3,!0)},"Got result from module execution cache"),p=iy(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),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:${rne()};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 Me(2500+Math.random()*1e4,d)}}try{if(!p)p=await nne(t);else if(e.autoAuth){let g=nh.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,E=e.advanced?.cacheInvalidation;if(E&&E.type==="PAGE_CHECK"){let y={type:"CONTENT",value:E.substring},b=await oy({timeout:eo,assertion:y,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),JA(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await one({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},nne=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=iy(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 iy(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 Fz({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 hs({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 one({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===sO)&&(a=t.defaultCacheTtl??lO);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 Bl(t,e,r){return ine(t,e,r)}async function ine(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=iy(t,{},"FAILED");return l.message=s,l.startedAt=n,l.finishedAt=i,l}return{...Kg(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 rie}from"lodash-es";import{randomUUID as Bz}from"crypto";import{diff as ane}from"deep-object-diff";import{cloneDeep as zz}from"lodash-es";var ay=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?zz(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=Bz(),h=Bz();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:y})}}catch(y){c.debug({err:y},"Failed to take before screenshot, continuing...")}let g,S,E;try{let y=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),E=y.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},g={...e,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[S]},"assertion"in e.command&&(g.message=y.thoughts||"Assertion passed.")}catch(y){c.error({message:y.message,stack:y.stack},`Failed executing preset step ${$o(e.command)}`);let b=o.browser.url(),A=new Date,M=y instanceof Error?y.message:`${y}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:M},g={...e,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:M,failureReason:y instanceof N?y.reason:void 0,results:[S]}}finally{let y="cache"in e.command&&e.command.cache?zz(e.command.cache):{},b=ane(u,y);b&&Object.keys(b).length>0&&c.info({diffs:Wf(b)},"Updated cache")}if(a)try{if(E||(E=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:y})}}catch(y){c.debug({err:y},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),E&&r.attachAfterScreenshot({snapshotId:h,screenshot:E}),g};async function sne(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,()=>ay({...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 lne(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}=bl(a.steps,e,o);if(s)return i}return-1}async function Vz(t){let e=new Date,{currentParentIdChain:r}=t,{step:n}=t.conditionalParams,{logger:o}=t.fixtures,{fromStep:i}=t.inputs,a=Kg(n),s=!!i&&Jp(r,i.parentStepIdChain),l=n.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=lne(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 E=n.blocks[S],y=await sne(t,E,S);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:e,finishedAt:new Date,message:y.conditionResult.message,results:[]};return vo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(y.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,l=y.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 Hz}from"crypto";var Gz=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=Hz();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=Hz();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 gR}from"crypto";var jz=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as Uoe}from"ai";import{streamText as Wne}from"ai";import{randomUUID as qne}from"crypto";import{stepCountIs as Gne}from"ai";function sy(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 dne from"dedent";import{tool as une}from"ai";import{z as eR}from"zod";import QA 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],E=h.ids[h.ids.length-1];t.debug({tokenLength:h.tokenLength,minId:S,maxId:E},`Chunk for page filtering (index ${g+1}/${s.length})`)}),{chunks:s}}var Lre=75e4,ty=3e5;async function Fl(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>Lre)try{let p=ey({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});c=await Dre({...t,tokenLimit:ty-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(ty*Za),u=c.serialize();let m=lt(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>ty)try{if(o){let p=ey({serializedTree:u,options:Tz,logger:i}),m=Ore();c=await Z(Nre({...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=ey({serializedTree:u,options:Ez,logger:i});c=await Z(kre({...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(ty*Za),u=c.serialize(),i.info("Filtered page using naive truncation")}return u}async function Nre({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:Ke(l)}),u=[];return r.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function Dre(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:Ke(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 kre(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:Ke(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 YA(t,e){if(!t.description)throw new N("UserConfigurationError","Cannot locate element with empty description");return Ro({action:async()=>Ure(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function Ure(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:E}=e,y=t.description,b=en(),A=t.useMemory&&!r;n&&(y=await Fr({orgId:f,s:y,context:n,localTools:g,signal:E,logger:c})),a&&(y=fz(y,a));let{serializedTree:M,tree:I}=await b.startAsyncSpan("GET_PAGE_STATE",async()=>Ui(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:E,skipWait:i,logger:c}),{}),R=await b.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let J,ce=Date.now(),fe;for(;!J&&Date.now()-ce<3e3;){E.throwIfAborted();try{J=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(Ce){fe=Ce}}if(!J)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: ${fe?.message}`);return J}),_=M,L=!1,k=`data:image/jpeg;base64,${R.toString("base64")}`;_=await Fl({type:"locator",description:y,screenshot:k,serializedTree:M,options:{aiPageFiltering:l},tree:I,fixtures:{generator:S,signal:E,logger:c,orgId:f}}),_!==M&&(L=!0);let H=await b.startAsyncSpan("AI_LOCATOR_CALL",async J=>{p&&(J.attributes.isAutoHeal=!0),m&&(J.attributes.cacheBustReason=m);let ce=await S.getElementLocation({browserState:_,goal:y,screenshot:k,source:a,memory:A?s:void 0},{disableCache:r,abortSignal:E,loggerTags:Ke(c),useMemory:A});if(J.result=ce,b.storeTraceAsset){let fe=vz();b.storeTraceAsset({snapshotId:fe,data:R}),J.screenshotSnapshotId=fe}return ce});if(c.debug({usedRag:L,result:H},"Got locator result"),!(H.id>0))throw new bc(`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 J=>{let ce=await h.createTargetFromA11yId({id:H.id,requirements:H.requirements,additionalElements:H.additionalElements,description:y,targetSource:"AI",logger:c,skipSavingVisualAttributes:d});if(J.result={serializedElement:ce.target.nodeOnlySerializedHtml??"Unknown HTML element"},b.storeTraceAsset)try{let fe=await h.screenshot({locator:ce.resolution.locator,clearHighlights:!0}),Ce=vz();b.storeTraceAsset({snapshotId:Ce,data:fe}),J.elementScreenshotSnapshotId=Ce}catch(fe){c.debug({err:fe},"Failed to capture element screenshot for locator trace, continuing...")}return 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 Cz}from"crypto";var Fre=15;async function ry({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=Fre}){if(!t.assertion.trim())throw new N("ActionFailureError","Assertion command is missing the assertion content");let a=dT.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let s=en();return s.startAsyncSpan("AI_ASSERTION_CALL",async l=>{let{browser:c}=n,u=t.timeout?t.timeout*1e3:c.smartWaitingTimeout,d=P0(u,i-1),p=0,m=Date.now(),f=m+u,h=m,g,S,E;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 Me(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 Az(c,r,n.abortSignal);return S&&S.serializedTree===_.serializedTree&&S.screenshotBuff.equals(_.screenshotBuff)?(I=!0,g):(S=_,Rz({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&&Zp(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(),E=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 Me(A,n.abortSignal)}if(!g?.success)try{g=await Ro({action:async()=>Rz({command:t,state:await Az(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(),E=A instanceof Error?A:new Error(`${A}`)}finally{p++}g?.updatedMemory&&Zp(t,g.updatedMemory,r);let y=g?.afterScreenshotOverride;if(y&&s.storeTraceAsset){let A=Cz();s.storeTraceAsset({snapshotId:A,data:y}),l.screenshotSnapshotId=A}let b=g?.elementScreenshotOverride;if(b&&s.storeTraceAsset){let A=Cz();s.storeTraceAsset({snapshotId:A,data:b}),l.elementScreenshotSnapshotId=A}if(!g?.success){l.result={thoughts:E?.message??"AI check failed after all attempts",result:!1};let A=`AI check still failing after ${p} attempts.`;throw E&&(A+=` Latest result: ${E.message}`),new N("AssertionFailureError",A)}return l.result={thoughts:g.thoughts,result:!0},{...g,succeedImmediately:!1,urlAfterCommand:c.url()}})}async function Az(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 Rz({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"),E=u.url(),y=t.contextChoice??"MULTIMODAL",b=f;y!=="VISION_ONLY"&&(b=await Fl({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:E,memory:o?t.cache?.memory:void 0,browserState:b,screenshot:S,contextChoice:y,source:l},I=await(y==="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:Ke(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 Bre(I.relevantElements,u,c)}return{success:I.result,thoughts:I.thoughts,afterScreenshotOverride:g,elementScreenshotOverride:R,updatedMemory:o?I.updatedMemory:void 0}}async function Bre(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 Z(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 zre=1e5,ny=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function wz(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await Vre(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof ny?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 Me(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function Vre(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await Me(o.smartWaitingTimeout,n);return}if(!e.description)throw new N("UserConfigurationError","Cannot locate element with empty description");await Z(Hre(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function Hre(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await Ro({action:async()=>Gre(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function Gre(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)>zre)throw new ny;s.throwIfAborted();let f;try{f=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(E){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: ${E instanceof Error?E.message:E}`)}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:Ke(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as Iz}from"lodash-es";async function _z(t){return en().startAsyncSpan("ELEMENT_ASSERTION",async r=>jre(t,r),{name:"Element check"})}async function jre(t,e){let{command:r,timeoutMs:n,fixtures:o,disableCache:i}=t,{abortSignal:a}=o,s=()=>of(r.cache)?r.cache:void 0,l=s(),c=!i&&!!l?.target&&nc(l.target),u=Iz(l),d=(E=!1)=>{if(l=s(),!!l)if(E){let y=Jv(u,l);l.target=y.target,l.updatedAt=y.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 Me(h,a),a?.throwIfAborted(),l=s();let E=m===1,{result:y,elementWasFound:b}=await xz({cacheToUse:l,skipAISmartWaiting:!E,useAIIfCacheFails:!c,params:t});if(f=y,g=g||b,y.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 E=s(),y=E?.target?.memory?{target:{id:-1,memory:E.target.memory}}:void 0,{result:b,elementWasFound:A}=await xz({cacheToUse:y,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=Qp(S.target),S.updatedAt=new Date),e.result={success:f.success,message:f.err?.message},f}async function xz({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=Ek(o.assertion),d,p=!1,m=Iz(t);try{let{elementInteractedDisplayString:f,result:h,thoughts:g}=await l({tracer:s,command:o,target:o.target,cache:m?.target,action:async S=>$re(S.locator,n),options:{...o,allowNotActionableNodesOverride:!0,disableCache:i,memory:m?.target?.memory,disableGlobalLocatorRedirect:!0,source:Xs(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 $re(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await Wre(t,e.assertion)}async function Wre(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)},!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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=Eu(e);n=new N("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Eu(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(!Xp(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Eu(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 Mz(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as qre}from"jimp";async function hm(t,e){let r=await t.screenshot(e),n=await qre.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Pz}from"jimp";import XA from"jpeg-js";import Kre from"pixelmatch";async function Oz({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=>hm(n,{locator:L.locator,...s}),options:{...e,disableCache:r,disableGlobalLocatorRedirect:!0,memory:e.cache?.target?.memory,targetName:"target"}})).result:l=await hm(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 Pz.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Pz.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),E=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 y={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=e.threshold??.1,M=Kre(XA.decode(c.buffer).data,XA.decode(l.buffer).data,y.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 ${E} pixels.`),I)throw new N("ActionFailureError",R);return{fail:I,thoughts:R,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:XA.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:n.url()}}var Yre=3e4;function Xre(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 Lz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??Yre/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(vu(t.url)&&(l=t.url),r&&Cu(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 Z((async()=>{let f=s?`${c}?${s}`:c;try{let h=Xre(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 Jre=5e3;async function oy({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 Nz(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 Me(s,e.signal),s=Math.min(Math.floor(s*1.5),Jre);else return i}return i=await Nz(e),i}async function Nz({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(Dz,{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(Dz,{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 Dz({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 Qre=3e4;async function kz({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??Qre/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(vu(t.url)&&(s=t.url),r&&Cu(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new N("ActionFailureError",`Invalid URL: ${t.url}`);let c=await Z((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 bs=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 Fl({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:{...Ke(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 Fl({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:{...Ke(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 YA({...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 Me(500)}}throw s}async scrollIntoViewAndResolveFinalTarget(e){let{resolutionResult:r,disableGlobalLocatorRedirect:n,logger:o}=e,i=en(),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,c&&i.storeTraceAsset)try{let d=await this.browser.screenshot({locator:c.locator,clearHighlights:!0}),p=Zre();i.storeTraceAsset({snapshotId:p,data:d}),l.elementScreenshotSnapshotId=p}catch(d){o.debug({err:d},"Failed to capture element screenshot for redirect trace")}return c})),s||(s={locator:r.locator,serverSideBoundingBox:await r.locator.boundingBox({timeout:ge}),originalElementLocationResult:r.originalElementLocationResult}),s}async resolveCachedTargetForAction(e){let{cache:r,options:n,logger:o}=e,a=await en().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=en(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=Uz(e.cache);if((!g||u)&&!EE(n))throw new N("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(e);let S=!1,E;u&&(f.info("Cache explicitly disabled for this step"),S=!0,E="Cache explicitly disabled",g=void 0);let y=Sz({cache:g,description:n.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=y.cache,S=S||y.cacheBustedBeforeAction,!E&&y.cacheBustReason&&(E=y.cacheBustReason);let b=!0;if(!gz(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:E});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.82.2"]),Fg({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=NE(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.82.2",`missReason:${A instanceof vn?A.cacheMissReason:"unknown"}`]);let I;return g.memory&&tf(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"),(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?await r.startAsyncSpan("SMART_WAITING",async()=>await wz({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())):(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 m=2;for(let f=1;f<=m;f++){let h=!1,g=this.browser.getActiveFrameConfig();try{let S;try{S=await YA({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,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p},this.getControllerFixtures())}catch(b){if(b instanceof bc&&b.updatedLocatorMemory){let A={id:-1,...l,memory:b.updatedLocatorMemory};Fg({cmd:a,key:i.targetName,newTarget:A,logger:c,updatedWithAI:!0})}throw b}S.frameConfig&&(this.browser.setActiveFrameConfig(S.frameConfig),h=!0);let E=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:S.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),y=await s(E);return Fg({cmd:a,key:i.targetName,newTarget:S.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(n.recordTargetAutoHeal({healType:"AI"}),S.target.targetSource="AI_HEALED",S.target.targetUpdateTime=new Date().toUTCString(),S.target.targetUpdateLoggerTags=Ke(c)),{result:y,elementInteractedDisplayString:S.resolution.displayString,thoughts:S.thoughts}}catch(S){if(h&&this.browser.setActiveFrameConfig(g),this.throwIfClosed(),f<m&&NE(S)){c.warn({err:S,aiAttempt:f},"Encountered retryable AI targeting error; retrying with AI once");continue}throw S instanceof N?S:new N("ActionFailureError",S.message)}}throw new N("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(e){return hm(this.browser,e)}async executePresetCommand(e,r,n,o){this.options?.slowMoMs&&await Me(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 hz({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{AF(r,s)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>gA(e)}}async traceBrowserInteraction(e,r,n){return en().startAsyncSpan("BROWSER_INTERACTION",async()=>r(),{name:e,...n})}async resolveCommandTemplateStrings(e,r){return BS({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()?ry({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 ry({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=mO(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:Ke(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(!vu(r.url)&&!Cu(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??$r.height,c=this.browser.getViewport()?.width??$r.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 Me(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 Xg(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:Xs(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 hs({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=Uz(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:Xs(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 Xg(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 Xg(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 tne,s=ene(fetch,a),l;try{l=new URL(r.url).hostname}catch{}let c=await Lz({command:r,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return{data:yd.parse({...c,cookies:pM(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await kz({command:r,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Oz({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 HF({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 hs({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=nh.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(Mz(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 ry({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&&Zp(r,c.cache?.memory.traces,i)}}let l=await _z({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()=>oy({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 ys(r.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[r.key]=s.then(async l=>await bA(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 Z(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new ys(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 ys(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 ys(r.requestMatcher),async(s,l)=>{let c=await hs({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=DM.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:Ke(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 XS({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:Ke(this.logger)})}async getFailureRecoveryPlan(e,r){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ke(r??this.logger)})}};var JA=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(([y,b])=>`${y}:${b}`)]},n.info({original:g,keyParams:h},"Module cache key params");let E=Date.now();for(;Date.now()-E<fP;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){n.info({cacheResult:_t(y,1e3,!0)},"Got result from module execution cache"),p=iy(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),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:${rne()};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 Me(2500+Math.random()*1e4,d)}}try{if(!p)p=await nne(t);else if(e.autoAuth){let g=nh.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,E=e.advanced?.cacheInvalidation;if(E&&E.type==="PAGE_CHECK"){let y={type:"CONTENT",value:E.substring},b=await oy({timeout:eo,assertion:y,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),JA(t)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await one({step:e,result:p,browser:s.browser,cacheKeyPrefix:f,logger:n,storage:i})}finally{f!==void 0&&await i.releaseCacheLock(f)}}return p},nne=async t=>{let{currentParentIdChain:e}=t,{step:r,tracer:n}=t.moduleParams,o=iy(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 iy(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 Fz({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 hs({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 one({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===sO)&&(a=t.defaultCacheTtl??lO);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 Bl(t,e,r){return ine(t,e,r)}async function ine(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=iy(t,{},"FAILED");return l.message=s,l.startedAt=n,l.finishedAt=i,l}return{...Kg(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 rie}from"lodash-es";import{randomUUID as Bz}from"crypto";import{diff as ane}from"deep-object-diff";import{cloneDeep as zz}from"lodash-es";var ay=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?zz(e.command.cache):{},d=o.browser.url(),p=new Date,m,f=Bz(),h=Bz();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:y})}}catch(y){c.debug({err:y},"Failed to take before screenshot, continuing...")}let g,S,E;try{let y=await o.executePresetCommand(r,e.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),E=y.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},g={...e,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[S]},"assertion"in e.command&&(g.message=y.thoughts||"Assertion passed.")}catch(y){c.error({message:y.message,stack:y.stack},`Failed executing preset step ${$o(e.command)}`);let b=o.browser.url(),A=new Date,M=y instanceof Error?y.message:`${y}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:M},g={...e,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:M,failureReason:y instanceof N?y.reason:void 0,results:[S]}}finally{let y="cache"in e.command&&e.command.cache?zz(e.command.cache):{},b=ane(u,y);b&&Object.keys(b).length>0&&c.info({diffs:Wf(b)},"Updated cache")}if(a)try{if(E||(E=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let y=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:y})}}catch(y){c.debug({err:y},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&r.attachBeforeScreenshot({snapshotId:f,screenshot:m}),E&&r.attachAfterScreenshot({snapshotId:h,screenshot:E}),g};async function sne(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,()=>ay({...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 lne(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}=bl(a.steps,e,o);if(s)return i}return-1}async function Vz(t){let e=new Date,{currentParentIdChain:r}=t,{step:n}=t.conditionalParams,{logger:o}=t.fixtures,{fromStep:i}=t.inputs,a=Kg(n),s=!!i&&Jp(r,i.parentStepIdChain),l=n.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=lne(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 E=n.blocks[S],y=await sne(t,E,S);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:e,finishedAt:new Date,message:y.conditionResult.message,results:[]};return vo({asyncTasks:t.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(y.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,l=y.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 Hz}from"crypto";var Gz=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=Hz();o.beforeSnapshot=a,e.attachBeforeScreenshot({snapshotId:a,screenshot:n});let s=Hz();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 gR}from"crypto";var jz=t=>{throw new Error(`Exhaustive check failed for value: ${t}`)};import{streamText as Uoe}from"ai";import{streamText as Wne}from"ai";import{randomUUID as qne}from"crypto";import{stepCountIs as Gne}from"ai";function sy(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 dne from"dedent";import{tool as une}from"ai";import{z as eR}from"zod";import QA 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 ZA({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 hr("No content parts provided to construct the tool response content.");return{type:"content",value:t}}function $z(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 Wz(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 qz({projectRoot:t,filePath:e,pathLabel:r="path"}){if(!e||!QA.isAbsolute(e))return e;let n=QA.relative(t,e);if(n.startsWith("..")||QA.isAbsolute(n))throw new Error(`Error: ${r} "${e}" must be inside project root "${t}".`);return n}function Kz(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 gm from"dedent";var Vu=[{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:gm`
|
|
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=$ie(p);f+=h;let g=zie({schema:wR,model:m("claude-sonnet-4-5-20250929"),system:jie,messages:[{role:"user",content:f}]}),S=[];for await(let M of g.textStream)S.push(M);let E=S.join(""),y;try{let M=JSON.parse(E);y=wR.parse(M)}catch(M){i.error({rawResponse:E,parseError:M},"Failed to parse AI response as JSON"),r.addError(`Failed to parse AI response: ${gt(M)}. Raw response: ${E}`);return}let b=new Set(p.map(M=>M.moduleId)),A=y.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)}`)}}}),Iy=[qie,Hie];var DH=pr({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=Rs(),a=["## Project context","",`- **projectRoot**: \`${n}\``,`- **cwd**: \`${o}\``,"","## Step schema","",i].join(`
|
|
5787
5787
|
`);r.addPartFromText(a)}});import{z as _y}from"zod";var kH=pr({schema:{name:XE,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:_y.string().describe("The session id to query."),returnBrowserState:_y.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:_y.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=Hl({response:r,sessionId:e.sessionId,toolName:XE});if(!n)return;n.controller.setOpen();let o=await CR({browser:n.controller.browser,supportsFileOutput:t.supportsFileOutput,returnBrowserState:e.returnBrowserState,returnScreenshot:e.returnScreenshot});r.addContentParts(o)}}),UH=pr({schema:{name:JE,description:"Get the current environment variables for a session.",inputSchema:{sessionId:_y.string()}},handle:async(t,e,r)=>{let n=Hl({response:r,sessionId:e.sessionId,toolName:JE});if(!n)return;let o=await wo({testContext:n.context,supportsFileOutput:t.supportsFileOutput});r.addContentParts(o)}});import{mkdirSync as Kie}from"fs";import{z as Gl}from"zod";var FH=pr({schema:{name:bI,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:Gl.string().describe("The test id to target when starting a session."),envName:Gl.string().optional().describe("Optional environment override (matches CLI --env behavior). Defaults to the test's default env when omitted."),projectConfigPath:Gl.string().optional().describe("Optional path to a momentic.config.yaml file (matches CLI --config)."),projectNameFilter:Gl.string().optional().describe("Optional project name filter for workspace configs (matches CLI --filter)."),headfulBrowser:Gl.boolean().optional().describe("Whether to launch a headful browser for the session. When omitted, uses the MCP server default if configured."),video:Gl.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&&(Cs(t.project.rootDir),i=As({rootDir:t.project.rootDir,entity:"video",ext:"d"}),Kie(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"}))}}),BH=pr({schema:{name:vI,description:"Kill a granular browser session by sessionId. Returns available session ids if the target is missing.",inputSchema:{sessionId:Gl.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 Zz({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 zH from"path";import{v4 as Yie}from"uuid";async function Pm({project:t,input:e}){try{No(e.name)}catch(c){throw new hr(`${c} when validating the test entity name`)}if(!e.baseUrl&&!e.environment)throw new hr("Either 'baseUrl' or 'environment' must be provided when creating a test.");let r=await he(t);if(Object.values(r.tests).find(c=>c.name===e.name))throw new hr(`A test with the name "${e.name}" already exists. Please use a different name.`);let i={id:Yie(),name:e.name,description:e.description,baseUrl:e.baseUrl,schemaVersion:Te,advanced:{browserType:e.browserType??"Chromium",viewport:e.viewport??$r},retries:1,steps:[]};e.environment&&(i.envs=[{name:e.environment,default:!0}]);let a=zH.join(t.rootDir,...e.pathSegments||[]),s=await Z0({test:i,name:e.name,folder:a});return{...i,relativeFilePath:zH.relative(t.rootDir,s)}}import{randomUUID as Jie}from"crypto";import{cloneDeep as Qie}from"lodash-es";import{randomUUID as Xie}from"crypto";var Yu=async({step:t,controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l})=>{let{results:c}=await xR({steps:[t],controller:e,executionOptions:r,storage:n,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l});return c[0]},xR=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 Gc},m=n??(c?new Ta({orgId:d,parentStep:null,parentTracer:null,socket:c}):new Sp);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:Xie(),steps:t,testMetadata:null,orgSettings:{},fromStep:e,toStep:r},callbacks:{test:{},step:{}},work:f});return i?o.withExecutionOptions(i,h):h()};async function My({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 fy(t,{project:e,logger:r,tempCaches:u});switch(d.type){case"PRESET_ACTION":return Zie({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 eae({step:d,logger:r,storage:n,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c});case"RESOLVED_MODULE":return tae({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 Zie({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l,tempCaches:c}){let u=await Yu({step:t,logger:e,storage:r,controller:n,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s}),d=[];u?u.status==="SUCCESS"?(rae({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 eae({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l}){let c=await Yu({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 tae({step:t,logger:e,storage:r,controller:n,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l}){let c=await Yu({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 rae({logger:t,tempCaches:e,command:r,parts:n}){if(e&&ro(r)&&r.cache)try{let o=Jie();e[o]=ci.parse(Qie({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 zR}from"lodash-es";import t1 from"path";var UR=Symbol.for("immer-nothing"),Om=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 $l=Object.getPrototypeOf;function Wl(t){return!!t&&!!t[qn]}function _s(t){return t?$H(t)||Array.isArray(t)||!!t[Om]||!!t.constructor?.[Om]||Um(t)||Fm(t):!1}var nae=Object.prototype.constructor.toString();function $H(t){if(!t||typeof t!="object")return!1;let e=$l(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)===nae}function Lm(t,e){ql(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function ql(t){let e=t[qn];return e?e.type_:Array.isArray(t)?1:Um(t)?2:Fm(t)?3:0}function Nm(t,e){return ql(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function IR(t,e){return ql(t)===2?t.get(e):t[e]}function WH(t,e,r){let n=ql(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function oae(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function Um(t){return t instanceof Map}function Fm(t){return t instanceof Set}function jl(t){return t.copy_||t.base_}function PR(t,e){if(Um(t))return new Map(t);if(Fm(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=$H(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($l(t),n)}else{let n=$l(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function FR(t,e=!1){return Ly(t)||Wl(t)||!_s(t)||(ql(t)>1&&(t.set=t.add=t.clear=t.delete=iae),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>FR(n,!0))),t}function iae(){rn(2)}function Ly(t){return Object.isFrozen(t)}var OR={};function Kl(t){let e=OR[t];return e||rn(0,t),e}function aae(t,e){OR[t]||(OR[t]=e)}var Dm;function qH(){return Dm}function sae(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function VH(t,e){e&&(Kl("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function LR(t){NR(t),t.drafts_.forEach(lae),t.drafts_=null}function NR(t){t===Dm&&(Dm=t.parent_)}function HH(t){return Dm=sae(Dm,t)}function lae(t){let e=t[qn];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function GH(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[qn].modified_&&(LR(e),rn(4)),_s(t)&&(t=Py(e,t),e.parent_||Oy(e,t)),e.patches_&&Kl("Patches").generateReplacementPatches_(r[qn].base_,t,e.patches_,e.inversePatches_)):t=Py(e,r,[]),LR(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==UR?t:void 0}function Py(t,e,r){if(Ly(e))return e;let n=e[qn];if(!n)return Lm(e,(o,i)=>jH(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return Oy(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),Lm(i,(s,l)=>jH(t,n,o,s,l,r,a)),Oy(t,o,!1),r&&t.patches_&&Kl("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function jH(t,e,r,n,o,i,a){if(Wl(o)){let s=i&&e&&e.type_!==3&&!Nm(e.assigned_,n)?i.concat(n):void 0,l=Py(t,o,s);if(WH(r,n,l),Wl(l))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(_s(o)&&!Ly(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;Py(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&Oy(t,o)}}function Oy(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&FR(e,r)}function cae(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:qH(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=BR;r&&(o=[n],i=km);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var BR={get(t,e){if(e===qn)return t;let r=jl(t);if(!Nm(r,e))return uae(t,r,e);let n=r[e];return t.finalized_||!_s(n)?n:n===_R(t.base_,e)?(MR(t),t.copy_[e]=kR(n,t)):n},has(t,e){return e in jl(t)},ownKeys(t){return Reflect.ownKeys(jl(t))},set(t,e,r){let n=KH(jl(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=_R(jl(t),e),i=o?.[qn];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(oae(r,o)&&(r!==void 0||Nm(t.base_,e)))return!0;MR(t),DR(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 _R(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,MR(t),DR(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=jl(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 $l(t.base_)},setPrototypeOf(){rn(12)}},km={};Lm(BR,(t,e)=>{km[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});km.deleteProperty=function(t,e){return km.set.call(this,t,e,void 0)};km.set=function(t,e,r){return BR.set.call(this,t[0],e,r,t[0])};function _R(t,e){let r=t[qn];return(r?jl(r):t)[e]}function uae(t,e,r){let n=KH(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function KH(t,e){if(!(e in t))return;let r=$l(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=$l(r)}}function DR(t){t.modified_||(t.modified_=!0,t.parent_&&DR(t.parent_))}function MR(t){t.copy_||(t.copy_=PR(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var dae=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(_s(e)){let i=HH(this),a=kR(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?LR(i):NR(i)}return VH(i,n),GH(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===UR&&(o=void 0),this.autoFreeze_&&FR(o,!0),n){let i=[],a=[];Kl("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){_s(t)||rn(8),Wl(t)&&(t=pae(t));let e=HH(this),r=kR(t,void 0);return r[qn].isManual_=!0,NR(e),r}finishDraft(t,e){let r=t&&t[qn];(!r||!r.isManual_)&&rn(9);let{scope_:n}=r;return VH(n,e),GH(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=Kl("Patches").applyPatches_;return Wl(t)?n(t,e):this.produce(t,o=>n(o,e))}};function kR(t,e){let r=Um(t)?Kl("MapSet").proxyMap_(t,e):Fm(t)?Kl("MapSet").proxySet_(t,e):cae(t,e);return(e?e.scope_:qH()).drafts_.push(r),r}function pae(t){return Wl(t)||rn(10,t),YH(t)}function YH(t){if(!_s(t)||Ly(t))return t;let e=t[qn],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=PR(t,e.scope_.immer_.useStrictShallowCopy_)}else r=PR(t,!0);return Lm(r,(n,o)=>{WH(r,n,YH(o))}),e&&(e.finalized_=!1),r}function XH(){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,E=p.copy_;E.length<g.length&&([g,E]=[E,g],[f,h]=[h,f]);for(let y=0;y<g.length;y++)if(S[y]&&E[y]!==g[y]){let b=m.concat([y]);f.push({op:e,path:b,value:d(E[y])}),h.push({op:e,path:b,value:d(g[y])})}for(let y=g.length;y<E.length;y++){let b=m.concat([y]);f.push({op:r,path:b,value:d(E[y])})}for(let y=E.length-1;g.length<=y;--y){let b=m.concat([y]);h.push({op:n,path:b})}}function a(p,m,f,h){let{base_:g,copy_:S}=p;Lm(p.assigned_,(E,y)=>{let b=IR(g,E),A=IR(S,E),M=y?Nm(g,E)?e:r:n;if(b===A&&M===e)return;let I=m.concat(E);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,E=0;g.forEach(y=>{if(!S.has(y)){let b=m.concat([E]);f.push({op:n,path:b,value:y}),h.unshift({op:r,path:b,value:y})}E++}),E=0,S.forEach(y=>{if(!g.has(y)){let b=m.concat([E]);f.push({op:r,path:b,value:y}),h.unshift({op:n,path:b,value:y})}E++})}function l(p,m,f,h){f.push({op:e,path:[],value:m===UR?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=ql(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=IR(S,I),typeof S!="object"&&rn(18,h.join("/"))}let E=ql(S),y=u(f.value),b=h[h.length-1];switch(g){case e:switch(E){case 2:return S.set(b,y);case 3:rn(16);default:return S[b]=y}case r:switch(E){case 1:return b==="-"?S.push(y):S.splice(b,0,y);case 2:return S.set(b,y);case 3:return S.add(y);default:return S[b]=y}case n:switch(E){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(!_s(p))return p;if(Array.isArray(p))return p.map(u);if(Um(p))return new Map(Array.from(p.entries()).map(([f,h])=>[f,u(h)]));if(Fm(p))return new Set(Array.from(p).map(u));let m=Object.create($l(p));for(let f in p)m[f]=u(p[f]);return Nm(p,Om)&&(m[Om]=p[Om]),m}function d(p){return Wl(p)?u(p):p}aae("Patches",{applyPatches_:c,generatePatches_:o,generateReplacementPatches_:l})}var Kn=new dae,__t=Kn.produce,JH=Kn.produceWithPatches.bind(Kn),M_t=Kn.setAutoFreeze.bind(Kn),P_t=Kn.setUseStrictShallowCopy.bind(Kn),O_t=Kn.applyPatches.bind(Kn),L_t=Kn.createDraft.bind(Kn),N_t=Kn.finishDraft.bind(Kn);import{v4 as mae}from"uuid";XH();function Ny({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=JH(r,n),l={id:mae(),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 QH=({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=Rm(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!l)return!1;n.fastForwardingToStep=!1}return n.total+=1,!!(r&&Rm(i.id,s,r.toStepId,r.parentStepIdChain))};return Mn({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=Rm(i.id,s,e.fromStepId,e.parentStepIdChain);if(n.fastForwardingToStep){if(!l)return!1;n.fastForwardingToStep=!1}return!!(r&&Rm(i.id,s,r.toStepId,r.parentStepIdChain))},onSimpleStepContainer:(i,a)=>o(i,a.parentChain)}),n.total};var fae=t=>{throw new Error(`Unknown test section: ${t}`)};function VR(t,e){switch(e){case"setup":return t.beforeSteps??[];case"teardown":return t.afterSteps??[];case"main":return t.steps;default:return fae(e)}}function ZH(t,e,r){let n=VR(t,e);if(!r?.length)return n;let o=vk(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 e1(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??[]])Mn({steps:o,onPresetAction:n,onConditional:n,onSimpleStepContainer:n})}async function Dy({project:t,orgId:e,logger:r,testPath:n,socket:o,saveChangesToDisk:i,supportsFileOutput:a,tempCaches:s,params:l,envName:c}){let u=await he(t),d=await $t(t1.join(t.rootDir,n),r,u),p={steps:d.steps??[],beforeSteps:d.beforeSteps??[],afterSteps:d.afterSteps??[]},m=await Promise.all(l.steps.map(I=>fy(I,{project:t,logger:r,tempCaches:s}))),f=l.parentStepIdChain,h;try{h=ZH(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,E=zR(h.slice(l.startIndex,l.startIndex+S)),y=zR(m),b="Cannot add a module step inside another module. Modules cannot be nested.",A;try{A=Ny({logger:r,socket:o,baseState:p,recipe:_=>{let L;if(f?.length&&(L=Ck(VR(_,l.targetSection),f,l.targetSection),L.some(H=>H.type==="RESOLVED_MODULE")&&m.some(H=>H.type==="RESOLVED_MODULE")))throw new Error(b);ZH(_,l.targetSection,f).splice(l.startIndex,l.deleteCount,...m);for(let k of m)k.type==="RESOLVED_MODULE"&&e1(_,k);if(L)for(let k of L)k.type==="RESOLVED_MODULE"&&e1(_,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 hae({logger:r,project:t,orgId:e,testId:d.id,environment:c,originalSteps:p,updatedSteps:A})),M.push(...await FV({rootDir:t.rootDir,supportsFileOutput:a,deletedStepRefs:E.map((I,R)=>({id:I.id,index:l.startIndex+R})),insertedStepRefs:y.map((I,R)=>({id:I.id,index:l.startIndex+R})),deletedSteps:eS(E,{includeCache:!1}),insertedSteps:eS(y,{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 Ry({project:t,testPath:n,envName:c,logger:r}),null,2),section:"Test Content"})),ut(M)}async function ky({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 he(t),E=await $t(t1.join(t.rootDir,r),e,S),y=new ct({baseUrl:Kt(),apiKey:Cr(),logger:e}),b=await br(e,y,t),{alwaysSaveCache:A,noCache:M}=Ol(),I=Jo({logger:e,orgId:s,client:y,gitMetadata:b,regenerateCache:!1,alwaysSaveCache:A,noCache:M,isolateCachesByEnvironment:t.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:void 0});try{await I.resolveStepCacheEntries({logger:e,schemaVersion:E.schemaVersion,stepLists:{beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[],steps:E.steps},testId:E.id,environment:l})}catch(ne){e.warn({err:ne},"Failed to resolve step cache entries, continuing without cache")}let R=VR(E,g),_=zR({steps:E.steps,beforeSteps:E.beforeSteps,afterSteps:E.afterSteps}),{result:L}=bl(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:ne}=bl(R,h.toStepId,h.parentStepIdChain);if(!ne)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 ne=QH({steps:R,fromStep:f,toStep:h});u.setProgressTotal(ne)}o.setOpen();let{results:V}=await xR({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:E.id,environment:l,originalStepsWithCaches:_,updatedStepsWithCaches:{steps:E.steps,beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[]}},z=k.status!=="SUCCESS";if(z)k.status==="FAILED"&&await bu(H);else try{await vl(H)}catch(ne){e.warn({err:ne},"Failed to save step cache after execution, future runs may be slower")}let le=g==="main"?"":` in ${g}`,W=ne=>{let Ae="fromStepId"in ne?ne.fromStepId:ne.toStepId;return ne.parentStepIdChain.length>0?`id "${Ae}" (parent chain [${ne.parentStepIdChain.join(", ")}])`:`id "${Ae}"`},Y=f?W(f):"beginning",J=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 ne=`${J} executed successfully.`;ce.push(...Q({text:ne,section:"Result"})),k.data&&ce.push(...Q({text:`Data: ${JSON.stringify(k.data,null,2)}`,section:"Result Data"}))}let[fe,Ce]=await Promise.all([tn({browser:o.browser,supportsFileOutput:m}),wo({testContext:c,supportsFileOutput:m,limits:{tokenLimit:p}})]);return ut([...ce,...fe,...Ce])}async function hae({logger:t,project:e,orgId:r,testId:n,environment:o,originalSteps:i,updatedSteps:a}){let s=[];try{let l=new ct({baseUrl:Kt(),apiKey:Cr(),logger:t}),c=await br(t,l,e),{alwaysSaveCache:u,noCache:d}=Ol(),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 vl({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 HR=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 Uy(this.reporter,this.parentStepIdChain.concat(this.step.id),this.setTotal)}},Uy=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 HR(this.reporter,e.step,this.parentStepIdChain,this.setTotal)}};function r1(t,e,r,n){let o=cR(t),i={completed:0,total:0},a=new AbortController,s=!1,l=p=>{o&&PV(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 Uy(d,[],u)}var gae=pr({schema:{name:TI,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:pb},handle:async(t,e,r,n)=>{let{project:o}=t;try{let i=await Pm({project:o,input:e});r.addPartFromText(JSON.stringify(i,null,2))}catch(i){r.addError(gt(i));return}}}),Sae=pr({schema:{name:Rf,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 he(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=cS(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 eV({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
|
-
`)}))}}),n1=pr({schema:{name:wf,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=Hl({response:r,sessionId:o,toolName:wf});if(!a)return;a.controller.setOpen();let s=await My({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)}}),o1=pr({schema:{name:KE,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:Ys.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=Hl({response:r,sessionId:e.sessionId,toolName:KE});if(!o)return;let a=(await Dy({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)}}),i1=pr({schema:{name:YE,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:xo.string(),fromStep:Bf,toStep:zf.optional(),targetSection:Ys.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=Hl({response:r,sessionId:e.sessionId,toolName:YE});if(!o)return;o.controller.setOpen(),e.resetSession&&await wy({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:Cr(),baseUrl:Kt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=r1(n,t.logger,r,()=>{ti.touchSession(o.sessionId)}),s=(await ky({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)}}),a1=[Sae,gae];var s1=[DH,kH,UH,FH,BH,n1,i1,o1];import{z as Br}from"zod";import Eae from"fs";import Bm from"path";import yae from"fs";import Xu from"path";function l1(t){let e=t.subDir?Xu.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${ht(t.name)}.module.yaml`,n=Xu.join(e,r),o=Xu.relative(t.project.rootDir,n),i=yae.statSync(n);return{type:te.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:Xu.sep,fullPathSegments:n.split(Xu.sep),relativePathSegments:o.split(Xu.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function Tae({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 Fy({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){No(i.name);let a=await he(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Bm.isAbsolute(r)?r:Bm.join(t.rootDir,r);s=(await $t(f,e,a)).steps}let{stepsToExtract:l,startIndex:c,endIndex:u}=BV({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:bk}),d=i.subDir?Bm.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Eae.mkdirSync(d,{recursive:!0});let p=await sS({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:l,folder:d,project:t}),m=l1({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 Tae({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=Bm.isAbsolute(r)?r:Bm.join(t.rootDir,r),h=await $t(f,e,a),g={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},S=await Cm({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,A])=>`${b}=${A}`)},{project:t,logger:e}),E=b=>{b.steps.splice(c,u-c,S)},{newState:y}=Ny({logger:e,socket:n,baseState:g,recipe:E,description:`Create module "${i.name}" from steps ${c}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:A}=await jt({stepLists:y});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 c1=pr({schema:{name:EI,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:Br.string().describe(ja),description:Br.string(),enabled:Br.boolean().default(!0),parameters:Br.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Br.record(Br.string(),Br.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Br.record(Br.string(),Br.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Br.record(Br.string(),Br.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:Br.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:Br.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:Br.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:Br.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=qz({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await Fy({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 By=[...a1,...Iy,...s1,c1,fV,EV];var GR=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 jR({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}){yu(e,!0),kS(n),US({alwaysSaveCache:l,noCache:c}),await FS(r),ku(t,y=>vt({configFilePath:y}));let h={serverId:bae(),applicationName:a,cliVersion:i},g=e.child({orgId:tr(),userId:Li(),...h}),S=new Jr(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:g,mode:"interactive"}),E={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:xs)*60*1e3,customHeaders:p,devicePixelRatio:m};return LV({context:E,info:h,tools:By,shutdownHandlers:[GR]})}import{Router as Rae}from"express";import{Router as Cae}from"express";import zy from"fs";import Vm from"path";import{v4 as Aae}from"uuid";import{hostname as vae}from"os";var zm="2.82.0",ot=eu({app:"desktop-server",hostname:vae(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:zm});(async()=>{try{let t=await ha(ot);t.gitBranchName&&ot.addBinding("branch",t.gitBranchName)}catch{}})();var Yl=Cae();async function Vy(t){return(await lS(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)}Yl.get("/",We(async(t,e)=>{let r=_e(),n=await he(r),o=await Vy(n);e.status(200).json(o)}));Yl.get("/tests-join",We(async(t,e)=>{let r=_e(),n=await he(r),o=await Vy(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)Mn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{GE(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)}));Yl.post("/",We(async(t,e)=>{let r;try{r=XM.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=_e(),o=(await he(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=Vm.join(n.rootDir,r.folderPath??"");if(!zy.existsSync(i)||!zy.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await sS({...r,folder:i,project:n});e.status(201).json(a)}));Yl.get("/:moduleId",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await he(_e()),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})}}));Yl.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=YM.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=_e(),o=await he(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=Vm.join(n.rootDir,Vm.dirname(i.relativePath));if(!zy.existsSync(s)||!zy.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=Vm.join(s,`${l}.module.yaml`),u=Aae(),{stepsToSave:d}=await jt({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:te.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};xl({module:p,filePath:c,projectConfig:n.config});let m={relativeFilePath:Vm.relative(n.rootDir,c)};e.status(201).json(m)}));Yl.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=JM.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=_e(),o=await he(n);J0({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var u1=Yl;var d1=Rae();d1.get("/",We(async(t,e)=>{let r=_e(),n=await he(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 Vy(n),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var p1=d1;import{Router as wae}from"express";var $R=wae();$R.get("/",We((t,e)=>{let r=cS(_e(),ot);e.status(200).json(r)}));$R.get("/names",We((t,e)=>{let n=_e().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var m1=$R;import{Router as xae}from"express";var f1=xae();f1.get("/",We((t,e)=>{let r={userId:Li(),orgId:tr(),cliVersion:zm??"0.0.0"};e.status(200).json(r)}));var h1=f1;import{StreamableHTTPServerTransport as Iae}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as _ae}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as S1}from"crypto";import{Router as Mae}from"express";var WR="mcp-session-id",g1="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",Hy=Mae();function Pae(){let t=process.env[g1];if(!t)return xs*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(ot.warn({envVar:g1,rawValue:t,fallback:xs},"Invalid MCP session idle timeout env var; falling back to default"),xs*60*1e3):e*60*1e3}function Oae(t){let{headfulDefault:e,supportsFileOutput:r}=t??{},n={serverId:S1(),applicationName:"momentic-mcp-desktop-server",cliVersion:zm??"0.0.0"},o=_e(),i=Cr(),a=Kt(),s=ot.child({orgId:tr(),userId:Li(),...n}),l=new ct({baseUrl:a,apiKey:i,logger:s}),c=lp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Jr(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:Pae(),headfulDefault:e??c??!0},info:n}}var ba={};Hy.post("/",async(t,e)=>{let r=String(t.headers[WR]??"");try{if(r&&ba[r]){await ba[r].handleRequest(t,e,t.body);return}if(!r&&_ae(t.body)){let{context:n,info:o}=Oae(),i=uR(n,o,By),a=new Iae({sessionIdGenerator:()=>S1(),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})}});Hy.get("/",async(t,e)=>{let r=String(t.headers[WR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}await ba[r].handleRequest(t,e)});Hy.delete("/",async(t,e)=>{let r=String(t.headers[WR]??"");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 y1=Hy;import{Router as Lae}from"express";var E1=Lae();E1.get("/:id",We(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=fs();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 T1=E1;import{Router as Nae}from"express";var Gy=Nae();Gy.get("/",We(async(t,e)=>{let r=(await RC()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Gy.get("/current",We((t,e)=>{let r=_e();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)}));Gy.post("/set",We(async(t,e)=>{let r;try{r=ZM.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});ku(n,o=>vt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var b1=Gy;import{Router as Dae}from"express";var v1=Dae();v1.get("/",We((t,e)=>{let r=_e(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var C1=v1;import{streamText as ose}from"ai";import{Router as ise}from"express";import jm from"fs";import Xl from"path";import{v4 as ase}from"uuid";import{convertToModelMessages as jae,pruneMessages as $ae,stepCountIs as Wae}from"ai";import jy from"dedent";var Ju="3",kae=jy`
|
|
5788
|
+
`)}))}}),n1=pr({schema:{name:wf,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=Hl({response:r,sessionId:o,toolName:wf});if(!a)return;a.controller.setOpen();let s=await My({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)}}),o1=pr({schema:{name:KE,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:Ys.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=Hl({response:r,sessionId:e.sessionId,toolName:KE});if(!o)return;let a=(await Dy({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)}}),i1=pr({schema:{name:YE,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:xo.string(),fromStep:Bf,toStep:zf.optional(),targetSection:Ys.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=Hl({response:r,sessionId:e.sessionId,toolName:YE});if(!o)return;o.controller.setOpen(),e.resetSession&&await wy({project:t.project,logger:t.logger,testPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:Cr(),baseUrl:Kt(),controller:o.controller,testContext:o.context,supportsFileOutput:t.supportsFileOutput});let i=r1(n,t.logger,r,()=>{ti.touchSession(o.sessionId)}),s=(await ky({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)}}),a1=[Sae,gae];var s1=[DH,kH,UH,FH,BH,n1,i1,o1];import{z as Br}from"zod";import Eae from"fs";import Bm from"path";import yae from"fs";import Xu from"path";function l1(t){let e=t.subDir?Xu.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${ht(t.name)}.module.yaml`,n=Xu.join(e,r),o=Xu.relative(t.project.rootDir,n),i=yae.statSync(n);return{type:te.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:Xu.sep,fullPathSegments:n.split(Xu.sep),relativePathSegments:o.split(Xu.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}async function Tae({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 Fy({project:t,logger:e,testPath:r,socket:n,saveChangesToDisk:o,params:i}){No(i.name);let a=await he(t),s;if(i.startIndex!==void 0&&r!==void 0){let f=Bm.isAbsolute(r)?r:Bm.join(t.rootDir,r);s=(await $t(f,e,a)).steps}let{stepsToExtract:l,startIndex:c,endIndex:u}=BV({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:bk}),d=i.subDir?Bm.join(t.rootDir,i.subDir):t.rootDir;i.subDir&&Eae.mkdirSync(d,{recursive:!0});let p=await sS({name:i.name,description:i.description??"",enabled:i.enabled??!0,steps:l,folder:d,project:t}),m=l1({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 Tae({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=Bm.isAbsolute(r)?r:Bm.join(t.rootDir,r),h=await $t(f,e,a),g={steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]},S=await Cm({stepType:"MODULE",moduleId:p.moduleId,inputs:Object.entries(i.moduleInputs??{}).map(([b,A])=>`${b}=${A}`)},{project:t,logger:e}),E=b=>{b.steps.splice(c,u-c,S)},{newState:y}=Ny({logger:e,socket:n,baseState:g,recipe:E,description:`Create module "${i.name}" from steps ${c}-${u-1}`});if(o){let{stepsToSave:b,moduleUpdates:A}=await jt({stepLists:y});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 c1=pr({schema:{name:EI,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:Br.string().describe(ja),description:Br.string(),enabled:Br.boolean().default(!0),parameters:Br.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Br.record(Br.string(),Br.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Br.record(Br.string(),Br.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Br.record(Br.string(),Br.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:Br.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:Br.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:Br.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:Br.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=qz({projectRoot:t.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await Fy({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 By=[...a1,...Iy,...s1,c1,fV,EV];var GR=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 jR({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}){yu(e,!0),kS(n),US({alwaysSaveCache:l,noCache:c}),await FS(r),ku(t,y=>vt({configFilePath:y}));let h={serverId:bae(),applicationName:a,cliVersion:i},g=e.child({orgId:tr(),userId:Li(),...h}),S=new Jr(t.config.ai?.agentConfig,{baseUrl:n,apiKey:r,logger:g,mode:"interactive"}),E={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:xs)*60*1e3,customHeaders:p,devicePixelRatio:m};return LV({context:E,info:h,tools:By,shutdownHandlers:[GR]})}import{Router as Rae}from"express";import{Router as Cae}from"express";import zy from"fs";import Vm from"path";import{v4 as Aae}from"uuid";import{hostname as vae}from"os";var zm="2.82.2",ot=eu({app:"desktop-server",hostname:vae(),disableConsoleLogs:!0,captureExceptions:!0}).child({cliVersion:zm});(async()=>{try{let t=await ha(ot);t.gitBranchName&&ot.addBinding("branch",t.gitBranchName)}catch{}})();var Yl=Cae();async function Vy(t){return(await lS(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)}Yl.get("/",We(async(t,e)=>{let r=_e(),n=await he(r),o=await Vy(n);e.status(200).json(o)}));Yl.get("/tests-join",We(async(t,e)=>{let r=_e(),n=await he(r),o=await Vy(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)Mn({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{GE(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)}));Yl.post("/",We(async(t,e)=>{let r;try{r=XM.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=_e(),o=(await he(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=Vm.join(n.rootDir,r.folderPath??"");if(!zy.existsSync(i)||!zy.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await sS({...r,folder:i,project:n});e.status(201).json(a)}));Yl.get("/:moduleId",We(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await he(_e()),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})}}));Yl.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=YM.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=_e(),o=await he(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=Vm.join(n.rootDir,Vm.dirname(i.relativePath));if(!zy.existsSync(s)||!zy.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=Vm.join(s,`${l}.module.yaml`),u=Aae(),{stepsToSave:d}=await jt({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:te.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};xl({module:p,filePath:c,projectConfig:n.config});let m={relativeFilePath:Vm.relative(n.rootDir,c)};e.status(201).json(m)}));Yl.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=JM.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=_e(),o=await he(n);J0({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:v,project:n}),e.status(201).json({message:"ok"})}));var u1=Yl;var d1=Rae();d1.get("/",We(async(t,e)=>{let r=_e(),n=await he(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 Vy(n),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var p1=d1;import{Router as wae}from"express";var $R=wae();$R.get("/",We((t,e)=>{let r=cS(_e(),ot);e.status(200).json(r)}));$R.get("/names",We((t,e)=>{let n=_e().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var m1=$R;import{Router as xae}from"express";var f1=xae();f1.get("/",We((t,e)=>{let r={userId:Li(),orgId:tr(),cliVersion:zm??"0.0.0"};e.status(200).json(r)}));var h1=f1;import{StreamableHTTPServerTransport as Iae}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as _ae}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as S1}from"crypto";import{Router as Mae}from"express";var WR="mcp-session-id",g1="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",Hy=Mae();function Pae(){let t=process.env[g1];if(!t)return xs*60*1e3;let e=Number.parseInt(t,10);return Number.isNaN(e)||e<1?(ot.warn({envVar:g1,rawValue:t,fallback:xs},"Invalid MCP session idle timeout env var; falling back to default"),xs*60*1e3):e*60*1e3}function Oae(t){let{headfulDefault:e,supportsFileOutput:r}=t??{},n={serverId:S1(),applicationName:"momentic-mcp-desktop-server",cliVersion:zm??"0.0.0"},o=_e(),i=Cr(),a=Kt(),s=ot.child({orgId:tr(),userId:Li(),...n}),l=new ct({baseUrl:a,apiKey:i,logger:s}),c=lp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Jr(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:Pae(),headfulDefault:e??c??!0},info:n}}var ba={};Hy.post("/",async(t,e)=>{let r=String(t.headers[WR]??"");try{if(r&&ba[r]){await ba[r].handleRequest(t,e,t.body);return}if(!r&&_ae(t.body)){let{context:n,info:o}=Oae(),i=uR(n,o,By),a=new Iae({sessionIdGenerator:()=>S1(),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})}});Hy.get("/",async(t,e)=>{let r=String(t.headers[WR]??"");if(!r||!ba[r]){e.status(400).send("Invalid or missing session ID");return}await ba[r].handleRequest(t,e)});Hy.delete("/",async(t,e)=>{let r=String(t.headers[WR]??"");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 y1=Hy;import{Router as Lae}from"express";var E1=Lae();E1.get("/:id",We(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=fs();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 T1=E1;import{Router as Nae}from"express";var Gy=Nae();Gy.get("/",We(async(t,e)=>{let r=(await RC()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));Gy.get("/current",We((t,e)=>{let r=_e();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)}));Gy.post("/set",We(async(t,e)=>{let r;try{r=ZM.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});ku(n,o=>vt({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var b1=Gy;import{Router as Dae}from"express";var v1=Dae();v1.get("/",We((t,e)=>{let r=_e(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var C1=v1;import{streamText as ose}from"ai";import{Router as ise}from"express";import jm from"fs";import Xl from"path";import{v4 as ase}from"uuid";import{convertToModelMessages as jae,pruneMessages as $ae,stepCountIs as Wae}from"ai";import jy from"dedent";var Ju="3",kae=jy`
|
|
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=>`${Dt}- ${p}`).join(`
|
|
|
6089
6089
|
`))}async function kG({test:t,reason:e,apiClient:r,project:n,identity:o}){let i=(await he(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 tE({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:c}),d=await rE({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 UG(t){return t?ht(t):"Unknown suite"}async function FG({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(`${Dt}- ${t.getAppUrl()}/run-groups/${g}`);let c=new Set,u=[],d=g=>(g.status==="FAILED"||g.status==="PASSED"||g.status==="CANCELLED")&&g.runs.every(E=>E.status==="FAILED"&&(E.failureReason||E.finishedAt&&Date.now()-E.finishedAt.getTime()>30*1e3)||E.status==="PASSED"||E.status==="CANCELLED"),p=await wg({name:"suites",getResults:async()=>{let g=s.filter(y=>!u.some(b=>b.id===y)),S=await t.bulkGetRunGroupStatus(g),E=[];for(let y of S)d(y)?u.push(y):E.push(y);return[...u,...E]},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} ${UG(S.suite?.name)}`)))}),g.every(d))}),m=t.getAppUrl(),h=gu({results:p,startTime:l,onFailed:g=>{let S=UG(g.suite?.name),E=g.runs.filter(b=>b.status==="FAILED").length,y=g.runs.length;v.error(`${S} (${E}/${y} 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 BG({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 wg({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=gu({results:d,startTime:u,onFailed:m=>{let f=m.testName||m.test?.name;xg(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 xle}from"crypto";import Ile from"fs";import{existsSync as nle,mkdirSync as ole,statSync as ile}from"fs";import{randomUUID as Ql}from"crypto";import rd,{writeFileSync as zG}from"fs";import{hostname as kse}from"os";import Hi from"path";import{z as nE}from"zod";async function iE(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 rd.writeFileSync(a,o),i}}}async function Use(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??Ql(),historyId:n.runId??Ql(),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:kse()},{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 bw(t,e,r.folder,i.steps,n.results);let a=Fse(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;rd.writeFileSync(Hi.join(o,s),JSON.stringify(i,void 0,2))}async function oE(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 iE(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await iE(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(yd.safeParse(n.data).success){let s=yd.parse(n.data),l=s.request,c={...s,request:void 0},u=`output-attachment-api-request-${Ql()}.json`,d=`output-attachment-api-response-${Ql()}.json`,p=Hi.join(r,u),m=Hi.join(r,d);rd.writeFileSync(p,JSON.stringify(l,null,2)),rd.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=nE.union([nE.object({}).passthrough(),nE.array(nE.any())]).safeParse(n.data).success,l=`output-attachment-${Ql()}.json`,c=Hi.join(r,l);rd.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 bw(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await oE(t,e,r,i);break}case"CONDITIONAL":{a=await oE(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await oE(t,e,r,i.assertionResult)),await bw(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await oE(t,e,r,i),await bw(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-${Ql()}.json`,l=Hi.join(r,s);zG(l,VG(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${Ql()}.json`,l=Hi.join(r,s);zG(l,VG(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function HG(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 Use(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function VG(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 Fse(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{rd.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 $G}from"crypto";import Bse from"fs";import sE from"path";function aE(t){if(t.status!=="FAILED")return"none";switch(t.failureReason){case"SetupFailureError":return"setup";case"TeardownFailureError":return"teardown";default:return"main"}}function zse(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 WG(t){let e=sE.relative(".",t);return e===""?t:e}function GG(t,e){return Math.max(0,(t.getTime()-e.getTime())/1e3)}function Vse(t,e,r){let n=GG(e,t),o=GG(r,t);return{start_at:n,end_at:o,duration:Math.max(0,o-n)}}function qG(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 Hse(t){if(t.status!=="FAILED"||!t.failureReason)return;let e=t.failureDetails?.classification,r=Tc[e?.reason||t.failureReason],n=e?.summary||t.failureDetails?.errorMessage||_a[t.failureReason];return`${r}: ${n}`}function Gse(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 jse(t){let e=t.status==="FAILED"?aE(t):void 0;return qG([["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 $se(t,e,r){let n=WG(r.filePath);return{id:r.runId||$G(),scope:t,name:r.testName,location:n,file_name:sE.basename(n),result:zse(r.status),failure_reason:Hse(r),failure_expanded:Gse(r),history:Vse(e,r.lastAttemptStartedAt,r.finishedAt),tags:jse(r)}}function jG(t,e,r,n,o){let i=WG(e);return{id:$G(),scope:t,name:r,location:i,file_name:sE.basename(i),result:"skipped",history:{start_at:0,end_at:0,duration:0},tags:qG([["quarantined",o?.quarantined||"false"],["failure_recovery","false"]])}}function Wse(t,e){let r=e.map(i=>$se(t.suiteName,t.startedAt,i)),n=t.testsToSkip.map(i=>jG(t.suiteName,i.relativeFilePath,i.name,i.id,void 0)),o=t.quarantinedTestsToSkip.map(i=>jG(t.suiteName,i.relativeFilePath,i.name,i.id,{quarantined:"true"}));return[...r,...n,...o]}function KG(t,e,r){let n=Wse(e,r);Bse.writeFileSync(sE.join(t,`${e.suiteName}.buildkite.json`),JSON.stringify(n,null,2))}import qse from"junit-report-builder";import lE from"path";function YG(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 Kse(t,e){let r=aE(t);if(e.name(t.testName).className(t.testName).file(lE.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&&YG(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=Tc[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 Yse(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();Kse(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(lE.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(lE.relative(".",d.relativeFilePath)).property("id",d.id);let m=c[d.id];m&&YG(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 XG(t,e,r){let n=qse.newBuilder();Yse(n,e,r),n.writeTo(lE.join(t,`${e.suiteName}.xml`))}import Xse from"fs";import Jse from"path";function JG(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(JG):[]}}async function Qse(t,e,r,n){if(n.results?.length){let o=await iE(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function Zse(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(JG)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await Qse(t,e,r,n)}}async function ele(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await Zse(t,e,r,n)]}}async function tle(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await ele(t,e,r,n)],id:n.runId,file:n.filePath}}function vw(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function rle(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 cp;try{return await tle(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:vw(o,i=>i.status==="PASSED"),unexpected:vw(o,i=>i.status!=="PASSED"),flaky:vw(o,i=>!!i.isFlake),skipped:0}}}async function QG(t,e,r,n,o){let i=await rle(t,e,r,n,o);Xse.writeFileSync(Jse.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function ZG(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 ej({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(nle(i)?ile(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...`),ole(i,{recursive:!0})),r){case"junit":{let a=o.map(ZG);XG(i,n,a);return}case"buildkite-json":{let a=o.map(ZG);KG(i,n,a);return}case"allure":case"allure-json":await HG(t,e,i,n,o);return;case"playwright-json":await QG(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import _le from"wait-on";import{execSync as ale}from"child_process";import{platform as sle}from"os";function cE(){return tj()?(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 tj(){return sle()==="darwin"&&ale("system_profiler SPDisplaysDataType").toString().includes("Retina")}function uE(t){tj()&&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 lle from"@actions/exec";import cle from"@actions/io";import ule from"quote";import dle from"string-argv";async function rj(t,e=!0){let r=dle(t),n=await cle.which(r[0],!0),o=r.slice(1),i=lle.exec(ule(n),o,{delay:100});if(e)return i}import ple from"csv-parser";import{createReadStream as mle}from"fs";function Cw(t){return new Promise((e,r)=>{let n=[];mle(t).pipe(ple()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import nd from"semver";import{z as dE}from"zod";var Tn="2.82.0",fle="https://registry.npmjs.org/momentic",hle=dE.object({versions:dE.record(dE.string(),dE.unknown()).optional()});async function Io(t){try{await gle(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Aw(){let t=await Z(fetch(fle),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=hle.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))nd.valid(o)&&nd.major(o)===nd.major(Tn)&&nd.gt(o,n)&&nd.prerelease(o)===null&&(n=o);return n}async function gle(t){let e;for(let r=0;r<2;r++)try{e=await Aw()}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}nd.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 Z(Promise.all([xh(),Zt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Sle}from"lodash-es";function pE(t){return t.length===1?"test":"tests"}function nj(t){return t===1?"1 worker":`${t} workers`}function oj(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${pE(t)}:`),t.forEach(e=>{v.info(`${Dt}- ${[e.relativeFilePath]}`)}),v.log(""))}function ij(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${pE(t)}:`),t.forEach(r=>{v.info(`${Dt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function yle(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${pE(t)} with ${nj(e)}:`),t.forEach(r=>{v.info(`${Dt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function Ele(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${pE(e)} with ${nj(r)}:`),e.forEach(n=>{v.info(`${Dt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function aj({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]=Sle(e,s=>s.quarantined);yle(i,r),Ele(i,a,r)}import{randomUUID as Tle}from"crypto";import{cloneDeep as od}from"lodash-es";import{dirname as ble}from"path";async function sj({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 lj({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:E}){let y=await qu({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=Pf({browserTypeOverride:E,configuredBrowserType:y.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(y.browserType=A,!lk(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:y,storage:a,enricher:new ps(b,l),contextArgs:{viewport:i.advanced.viewport??$r,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 bs({browser:M,generator:l,logger:d,orgId:c,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.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 cj({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!ul){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 uj({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 cj({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await by({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function dj(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await vle(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 vle(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 Lu(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:E,environmentVariables:y,baseUrl:b}=PS({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:k=>Il(k,r,s)}),A=await Bg({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:ble(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])=>{y[k]=H});let V=await Cle({...t,variables:y,envName:S,resolvedEnv:E,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 Cle(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:E,devicePixelRatio:y,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 _u(i,s,a),le={...i.config},W={envName:p,urlOverride:m,customHeaders:f,testInputs:h},Y,J=Math.abs(E??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 fe=0;fe<=J;fe++){let Ce=Tle(),ne=await A.startAttempt(Ce),Ae=M.child(ne.loggerBindings||{}),Le={...e,steps:od(r),beforeSteps:od(n),afterSteps:od(o)};fe!==0&&b("RETRY",`attempt ${fe+1}/${J+1}`);let Re=new Date,x=le.advanced?.fakerConstantSeed,de=new Oi({httpClient:new Nr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Ae,mode:"runner"}),fakerSeed:x?Kc:void 0}),we=ne;try{let{controller:Ln,context:ni}=await lj({tracer:ne,baseUrl:c,envName:p,testName:Le.name,apiClient:s,devicePixelRatio:y,logger:Ae,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 uj({attemptMetadata:{attemptNumber:fe+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Ae,storageClient:u,usageTracker:V,codeEvalTools:de,apiClient:s,context:ni,controller:Ln,tracer:ne},attemptInputs:{test:Le,orgSettings:le}});let Jn=new Date,oi={logger:M,cacheStorage:I,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:od(r),beforeSteps:od(n),afterSteps:od(o)},updatedStepsWithCaches:{steps:Le.steps,beforeSteps:Le.beforeSteps,afterSteps:Le.afterSteps}};Y?.status==="PASSED"?await vl(oi):Y?.status==="FAILED"&&fe===J&&await bu(oi),await ne.finish({logger:Ae,result:Y}),ce.unshift(Y.status);let pe=await sj({orgId:d,codeEvalTools:de,logger:Ae,outputDefinitions:e.outputs??[],testContext:ni}),tc=n_(ce),Ps=fe+1;if(Y.status!=="FAILED")return{...Y,runAttemptId:Ce,parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:Jn,attempts:Ps,baseUrl:c,outputs:pe,isFlake:tc,quarantined:_,quarantinedMetadata:L};let Gi=Y.failedStepResult,ji=Gi?.message||"Unknown failure",ii=Gi?.failureReason??tI(ji)??"UnknownError",Os=Ae.child({failureReason:ii,errorMessage:ji,numAttempts:(J+1).toString(),name:Le.name});if(fe<J){Os.warn(`Retrying failed execution attempt for run: ${ji}`);continue}Os.error(`Test failed after all exhausting attempts: ${ji}`);let id=new Error(ji),rc={errorMessage:ji,errorStack:id.stack},ad;if(k){let Ls;try{if(Y.results&&Y.results.length>0){let{classification:Qm,aiFailureReason:fE}=await L0({logger:Ae,browserStateStorage:we,generator:l,fullResults:Y,failureReason:ii,error:id,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ls=Qm,ad=fE}}catch(Qm){Ae.warn({err:Qm},"Failed to classify test results")}Ls&&(rc.classification=Ls,ii=ad??ii)}return{...Y,runAttemptId:Ce,parameters:W,failureDetails:rc,failureReason:ii,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:Jn,attempts:fe+1,baseUrl:c,outputs:pe,quarantined:_,quarantinedMetadata:L}}catch(Ln){let ni=`Encountered fatal platform error while running test '${Le.name}': ${Ln}`,Jn=new Date,oi=fe+1;Ae.error({err:Ln},ni),v.error(ni);let pe={errorMessage:Ln.message,errStack:Ln.stack},tc={status:"FAILED",failureDetails:pe,failureReason:"InternalPlatformError",finishedAt:Jn};return await ne.finish({logger:Ae,result:{status:"FAILED",results:[]}}),{...tc,runAttemptId:Ce,results:[],parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:new Date,attempts:oi,baseUrl:c,outputs:{},quarantined:_,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import Rle from"adm-zip";import wle from"path";var Zl=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 Rw(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:u_(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Ale(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Rw=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(!vh(e.step))return;let r=bh(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:Ale(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Zl(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Ym=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=$O({keepSamples:!1,onSample:l=>{this.resourceUsageStream.write(`${JSON.stringify(l)}
|
|
6092
|
+
`),1)}function tj(){return sle()==="darwin"&&ale("system_profiler SPDisplaysDataType").toString().includes("Retina")}function uE(t){tj()&&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 lle from"@actions/exec";import cle from"@actions/io";import ule from"quote";import dle from"string-argv";async function rj(t,e=!0){let r=dle(t),n=await cle.which(r[0],!0),o=r.slice(1),i=lle.exec(ule(n),o,{delay:100});if(e)return i}import ple from"csv-parser";import{createReadStream as mle}from"fs";function Cw(t){return new Promise((e,r)=>{let n=[];mle(t).pipe(ple()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import nd from"semver";import{z as dE}from"zod";var Tn="2.82.2",fle="https://registry.npmjs.org/momentic",hle=dE.object({versions:dE.record(dE.string(),dE.unknown()).optional()});async function Io(t){try{await gle(t)}catch(e){v.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Aw(){let t=await Z(fetch(fle),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=hle.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))nd.valid(o)&&nd.major(o)===nd.major(Tn)&&nd.gt(o,n)&&nd.prerelease(o)===null&&(n=o);return n}async function gle(t){let e;for(let r=0;r<2;r++)try{e=await Aw()}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}nd.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 Z(Promise.all([xh(),Zt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Sle}from"lodash-es";function pE(t){return t.length===1?"test":"tests"}function nj(t){return t===1?"1 worker":`${t} workers`}function oj(t){t.length!==0&&(v.info(`Skipping ${t.length} disabled ${pE(t)}:`),t.forEach(e=>{v.info(`${Dt}- ${[e.relativeFilePath]}`)}),v.log(""))}function ij(t,e){t.length!==0&&(v.info(`Skipping ${t.length} quarantined ${pE(t)}:`),t.forEach(r=>{v.info(`${Dt}- ${[r.relativeFilePath]}: ${e[r.id]?.quarantinedReason}`)}),v.log(""))}function yle(t,e){t.length!==0&&(v.info(`Running ${t.length} quarantined ${pE(t)} with ${nj(e)}:`),t.forEach(r=>{v.info(`${Dt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),v.log(""))}function Ele(t,e,r){e.length===0&&t.length>0||(v.info(`Running ${e.length} ${pE(e)} with ${nj(r)}:`),e.forEach(n=>{v.info(`${Dt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),v.log(""))}function aj({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]=Sle(e,s=>s.quarantined);yle(i,r),Ele(i,a,r)}import{randomUUID as Tle}from"crypto";import{cloneDeep as od}from"lodash-es";import{dirname as ble}from"path";async function sj({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 lj({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:E}){let y=await qu({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=Pf({browserTypeOverride:E,configuredBrowserType:y.browserType,orgDefaultBrowserType:f.defaultBrowserType});if(y.browserType=A,!lk(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:y,storage:a,enricher:new ps(b,l),contextArgs:{viewport:i.advanced.viewport??$r,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 bs({browser:M,generator:l,logger:d,orgId:c,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.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 cj({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!ul){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 uj({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 cj({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await by({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function dj(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await vle(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 vle(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 Lu(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:E,environmentVariables:y,baseUrl:b}=PS({test:e,envNameOverride:t.envName,urlOverride:i,resolveEnv:k=>Il(k,r,s)}),A=await Bg({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:ble(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])=>{y[k]=H});let V=await Cle({...t,variables:y,envName:S,resolvedEnv:E,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 Cle(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:E,devicePixelRatio:y,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 _u(i,s,a),le={...i.config},W={envName:p,urlOverride:m,customHeaders:f,testInputs:h},Y,J=Math.abs(E??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 fe=0;fe<=J;fe++){let Ce=Tle(),ne=await A.startAttempt(Ce),Ae=M.child(ne.loggerBindings||{}),Le={...e,steps:od(r),beforeSteps:od(n),afterSteps:od(o)};fe!==0&&b("RETRY",`attempt ${fe+1}/${J+1}`);let Re=new Date,x=le.advanced?.fakerConstantSeed,de=new Oi({httpClient:new Nr({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Ae,mode:"runner"}),fakerSeed:x?Kc:void 0}),we=ne;try{let{controller:Ln,context:ni}=await lj({tracer:ne,baseUrl:c,envName:p,testName:Le.name,apiClient:s,devicePixelRatio:y,logger:Ae,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 uj({attemptMetadata:{attemptNumber:fe+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Ae,storageClient:u,usageTracker:V,codeEvalTools:de,apiClient:s,context:ni,controller:Ln,tracer:ne},attemptInputs:{test:Le,orgSettings:le}});let Jn=new Date,oi={logger:M,cacheStorage:I,orgId:d,testId:e.id,environment:p,originalStepsWithCaches:{steps:od(r),beforeSteps:od(n),afterSteps:od(o)},updatedStepsWithCaches:{steps:Le.steps,beforeSteps:Le.beforeSteps,afterSteps:Le.afterSteps}};Y?.status==="PASSED"?await vl(oi):Y?.status==="FAILED"&&fe===J&&await bu(oi),await ne.finish({logger:Ae,result:Y}),ce.unshift(Y.status);let pe=await sj({orgId:d,codeEvalTools:de,logger:Ae,outputDefinitions:e.outputs??[],testContext:ni}),tc=n_(ce),Ps=fe+1;if(Y.status!=="FAILED")return{...Y,runAttemptId:Ce,parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:Jn,attempts:Ps,baseUrl:c,outputs:pe,isFlake:tc,quarantined:_,quarantinedMetadata:L};let Gi=Y.failedStepResult,ji=Gi?.message||"Unknown failure",ii=Gi?.failureReason??tI(ji)??"UnknownError",Os=Ae.child({failureReason:ii,errorMessage:ji,numAttempts:(J+1).toString(),name:Le.name});if(fe<J){Os.warn(`Retrying failed execution attempt for run: ${ji}`);continue}Os.error(`Test failed after all exhausting attempts: ${ji}`);let id=new Error(ji),rc={errorMessage:ji,errorStack:id.stack},ad;if(k){let Ls;try{if(Y.results&&Y.results.length>0){let{classification:Qm,aiFailureReason:fE}=await L0({logger:Ae,browserStateStorage:we,generator:l,fullResults:Y,failureReason:ii,error:id,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Ls=Qm,ad=fE}}catch(Qm){Ae.warn({err:Qm},"Failed to classify test results")}Ls&&(rc.classification=Ls,ii=ad??ii)}return{...Y,runAttemptId:Ce,parameters:W,failureDetails:rc,failureReason:ii,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:Jn,attempts:fe+1,baseUrl:c,outputs:pe,quarantined:_,quarantinedMetadata:L}}catch(Ln){let ni=`Encountered fatal platform error while running test '${Le.name}': ${Ln}`,Jn=new Date,oi=fe+1;Ae.error({err:Ln},ni),v.error(ni);let pe={errorMessage:Ln.message,errStack:Ln.stack},tc={status:"FAILED",failureDetails:pe,failureReason:"InternalPlatformError",finishedAt:Jn};return await ne.finish({logger:Ae,result:{status:"FAILED",results:[]}}),{...tc,runAttemptId:Ce,results:[],parameters:W,test:Le,filePath:Le.relativeFilePath,startedAt:H,lastAttemptStartedAt:Re,finishedAt:new Date,attempts:oi,baseUrl:c,outputs:{},quarantined:_,quarantinedMetadata:L}}}throw new Error("This code should not be reachable")}import Rle from"adm-zip";import wle from"path";var Zl=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 Rw(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:u_(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function Ale(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Rw=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(!vh(e.step))return;let r=bh(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:Ale(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step),e.step.trace=this.interactionTracer.getRootSpan()}async startSubSteps(){let e=new Zl(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var Ym=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=$O({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 wle.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 Rle;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Pr}/${Rb}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Rb},"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:$g(n.results,r),beforeResults:n.beforeResults?$g(n.beforeResults,r):void 0,afterResults:n.afterResults?$g(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)}
|
|
@@ -6097,7 +6097,7 @@ ${t.map(p=>`${Dt}- ${p}`).join(`
|
|
|
6097
6097
|
`),v.log(""),I?(v.success(`Test results have been saved to the folder ${M}. Uploading to Momentic Cloud...`),await _S({client:l,consoleLogger:v,resultsPath:M})):v.success(`Test results have been saved to the folder ${M}. Upload them to Momentic Cloud by running 'npx momentic results upload ${M}' or view test results locally by running 'npx momentic results view ${M}'.`),_o};Ile.existsSync(M)&&v.warn(`Output directory ${M} already exists, removing before test execution...`);let ii=await Jm.start({suiteName:e,orgId:m,runGroupId:J,outputDir:M,gitMetadata:H,labels:b,recordVideo:ce}),Os=r.child(ii.loggerBindings||{}),id=!1,rc=async mt=>{if(id)return;id=!0;let Qn=new Set(oi.map(_o=>_o.runId).filter(_o=>!!_o));v.warn(`${mt} Stopping tests and printing latest results...`);for(let _o of Object.values(Gi)){if(_o.done||Qn.has(_o.activeRun.runId))continue;let{activeRun:zr}=_o,xr={results:[],beforeResults:[],afterResults:[],test:zr.testDefinition,filePath:zr.testDefinition.relativeFilePath,startedAt:zr.startedAt,lastAttemptStartedAt:zr.startedAt,finishedAt:new Date,status:"CANCELLED",attempts:0,runId:zr.runId,quarantined:zr.quarantined,quarantinedMetadata:zr.quarantinedMetadata,parameters:{testInputs:zr.inputs,envName:p,urlOverride:d,customHeaders:h},outputs:{}};pe.set(zr.runId,xr)}await ii.finish({logger:Os,status:"CANCELLED"}),await ji(),await Aa(),process.exit(1)},ad=async()=>{await rc("SIGINT received.")};process.once("SIGINT",ad);let Ls;if(fe!==void 0&&fe>0){let mt=fe*60*1e3;v.info(`Test run timeout set to ${fe} minute(s).`),Ls=setTimeout(()=>{rc(`Timeout of ${fe} minute(s) reached.`)},mt)}for(let mt=0;mt<Jn.length;mt++){let Qn=Object.values(Gi);Qn.length===_&&await Promise.race(Qn.map(Ns=>Ns.promise));let _o=Jn[mt],zr=`test-${mt}`,xr={..._o,runId:xle(),startedAt:new Date};Gi[zr]={done:!1,activeRun:xr,promise:(async({inputs:Ns,quarantined:Tj,quarantinedMetadata:bj,testDefinition:Ds,runId:hE})=>{Ps.add({inputs:Ns});let Zm=Ds.relativeFilePath.includes("..")?Ds.fullFilePath:Ds.relativeFilePath;qp({status:"START",testLogRef:Zm,getRunningTestsCount:()=>Ps.size,getTotalTestsCount:()=>Jn.length});let vj=setInterval(()=>qp({status:"RUN",testLogRef:Zm,getRunningTestsCount:()=>Ps.size,getTotalTestsCount:()=>Jn.length}),5*60*1e3),gE=Os.child({testId:Ds.id,runId:hE}),Mw=new Qg({logger:gE,reporter:new wS(l),runType:"test-run",runId:hE,testMetadata:Ds,suiteMetadata:void 0});try{let Ra=await dj({testDefinition:Ds,project:c,testInputs:Ns,quarantined:Tj,quarantinedMetadata:bj,orgId:m,runId:hE,devicePixelRatio:f,apiClient:l,runGroupTracer:ii,generator:ne,retriesOverride:u,urlOverride:d,envName:p,customHeaders:h,regenerateGoldenFiles:k,logUpdate:(ef,Cj)=>qp({status:ef,testLogRef:Zm,getRunningTestsCount:()=>Ps.size,getTotalTestsCount:()=>Jn.length,additionalText:Cj}),logger:gE,gitMetadata:H,cacheOptions:z,usageTracker:Mw,browserTypeOverride:Ce});qp({status:Ra.status,testLogRef:Zm,getRunningTestsCount:()=>Ps.size,getTotalTestsCount:()=>Jn.length}),oi.push(Ra)}catch(Ra){let ef=`Encountered unexpected fatal error when running test '${Ds.name}': ${Ra.message}`;v.error(ef),gE.error({err:Ra},ef),await rc("Fatal error occurred.")}finally{clearInterval(vj);let Ra=Gi[zr];Ra&&(Ra.done=!0),delete Gi[zr]}await Mw.flush(r)})(xr)}}await Promise.allSettled(Object.values(Gi).map(mt=>mt.promise));let fE=oi.some(mt=>Y?mt.status==="FAILED":!mt.quarantined&&mt.status==="FAILED")?"FAILED":"PASSED";return process.off("SIGINT",ad),Ls&&clearTimeout(Ls),await ii.finish({logger:Os,status:fE}),S&&await ej({logger:Os,callbacks:{createDebugDataReaderForRunAttempt:(mt,Qn)=>new MS(M,mt,Qn)},format:S,params:{projectConfigPath:c.configFilePath,suiteName:e??c.config.name,startedAt:tc,finishedAt:new Date,testsToSkip:x,quarantinedTestsToSkip:de,quarantinedTestsMetadata:Re},runs:oi,folder:A}),ji()}import{installPackage as Mle}from"@antfu/install-pkg";import{cloneDeep as Ple}from"lodash-es";import Ole from"semver";async function fj(){let t=await Aw();Ole.lt(Tn,t)&&v.warn(`The current CLI version (${Tn}) is not the latest. It's recommended to run the upgrade command using momentic@latest.`),await Mle(`momentic@${t}`,{silent:!1,dev:!0})}function hj(t){let e=Ple(t.config),r={...e.ai?.agentConfig,...Pc},n={...e.ai,agentConfig:r};e.ai=n,as(e,t.configFilePath)}se.setApp("cli");Gv||se.warn("Sentry is not enabled in this environment due to unsupported node version");XD({serviceName:"cli"});var Sj=process.argv.some(t=>t.includes("--log-level"))&&process.argv.some(t=>t.includes("debug")),yj=t=>{Sj&&v.dimmed(t)};Sj&&dk(se);var sr=new Nle;sr.name("momentic").description("Momentic CLI").version(Tn);sr.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Ig.join(", ")}.`).action(async(t,e)=>{await Io(se),!e.all&&t.length===0&&(v.error("No browsers specified"),process.exit(1)),await ck({rawBrowsers:t,force:e.force,all:e.all})});sr.command("install-skills").description("Install the Momentic skill markdown as SKILL.md.").addOption(new fr("--editor <editor>","Editor to install skills for.").choices(gk).makeOptionMandatory()).action(async t=>{let e=t.editor,r=ww(import.meta.url),n=ri.dirname(r),o=ri.resolve(n,"..","skills");Sk({editor:e,skillsDir:o})});sr.addOption(new fr("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",t=>{t==="debug"&&v.info("Enabling debug logging"),v.setMinLevel(t.toLowerCase())});sr.addOption(new fr("--verbose","enable verbose logging")).on("option:verbose",()=>{se.enableConsoleLogs(),v.setMinLevel(20)});var xw=sr.command("checks").alias("check").description("Perform various project checks");xw.command("config").addOption(mr).action(async t=>{await Io(se),await vt({configFilePath:t.config})});xw.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(mr).addOption(SG).action(async t=>{await Io(se);let e=await vt({configFilePath:t.config});await Z1({project:e,fix:t.fix})});xw.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(mr).action(async t=>{await Io(se);let e=await vt({configFilePath:t.config});await eG({project:e})});var mE=sr.command("migrate").description("Migrate and upgrade tooling");mE.command("steps").description("Migrate steps in all tests and modules to the latest schema version. Note that this is always done when a test is loaded through the interactive editor, so is generally not needed.").addOption(mr).action(async t=>{let e=await vt({configFilePath:t.config});await fw(e)});mE.command("standard-v2",{hidden:!0}).description("Rewrite local web tests and modules from legacy YAML to the CLI-only v2 YAML format.").addOption(mr).action(async t=>{let e=await vt({configFilePath:t.config});await Sw(e),process.exit(0)});mE.command("v2-standard",{hidden:!0}).description("Rewrite a v2 test or module YAML file back to the legacy Momentic format.").argument("<file>","Path to a v2 .test.yaml or .module.yaml file").addOption(mr).action(async(t,e)=>{let r=await vt({configFilePath:e.config});await yw(t,r),process.exit(0)});mE.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(On).addOption(mr).addOption(Pn).addOption(Ms).action(async t=>{!t.yes&&!await Lr("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?")&&process.exit(1);let e=await vt({configFilePath:t.config}),r=new ct({baseUrl:t.server,apiKey:t.apiKey,logger:se}),{orgId:n}=await r.getAuthInfo();await hw({project:e,orgId:n,apiClient:r}),process.exit(0)});sr.command("import").addOption(Pn).addOption(On).addOption(mr).addOption(Ms).addArgument(AG).action(async(t,e)=>{await Io(se);let{apiKey:r,server:n,config:o,yes:i}=e,a=await vt({configFilePath:o}),s=new ct({baseUrl:n,apiKey:r,logger:se});!t||t.length===0?await iG({client:s,project:a,skipPrompts:i}):await aG({client:s,project:a,paths:t,skipPrompts:i}),process.exit(0)});sr.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new fr("--name <name>","Name of the project")).action(async t=>{v.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
6098
6098
|
`),v.info("This wizard will help you bootstrap a new Momentic project. If you need to import existing assets from Momentic Cloud, you can call the 'import' command after initialization."),ec.existsSync(is)&&(v.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let e=t.name??await ek("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await fU()||await Lr("A Git repository was not detected in the current directory. Momentic highly recommends initializing your project within a Git repository for seamless version control. Continue?")||process.exit(1);let r=await mU(),n={name:e,include:uS,retries:1,parallel:1,recordVideo:!0,...r?{gitMainBranch:r}:{},browser:{autoExpandIframes:!0},ai:{useMemory:!0,agentConfig:{...Pc}},environments:[{name:"swag-labs",baseUrl:"https://saucedemo.com",envVariables:{USERNAME:"standard_user",PASSWORD:"secret_sauce"}}]};as(n,is);let o=ec.readFileSync(is,"utf-8");ec.writeFileSync(is,`# See https://momentic.ai/docs/cli/configuration
|
|
6099
6099
|
${o}`),v.success(`Initialized Momentic project file at ${ri.resolve(is)}`);let i=ri.join("swag-labs");ec.mkdirSync(i,{recursive:!0});let a=ee(),s=ee(),l=ee(),c=[{fileName:"log-in-username-password.module.yaml",data:{fileType:te.MODULE,moduleId:a,name:"log-in-username-password",description:"log in using username and password",enabled:!0,parameters:[],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:Te,steps:[{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,delay:50,type:"TYPE",target:{type:"description",elementDescriptor:"username input"},value:"{{env.USERNAME}}"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"password input"},value:"{{env.PASSWORD}}"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"login button"}}}]}},{fileName:"add-item-to-cart.module.yaml",data:{fileType:te.MODULE,moduleId:s,name:"add-item-to-cart",description:"Add the specified item to cart",enabled:!0,parameters:["ITEM"],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:Te,steps:[{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"add to cart for the {{env.ITEM}} item"}}}]}},{fileName:"fill-out-personal-info.module.yaml",data:{fileType:te.MODULE,moduleId:l,name:"fill-out-personal-info",description:"Fill out name and zip code",enabled:!0,parameters:[],defaultCacheKey:null,defaultCacheTtl:null,defaultCacheAllInvocations:null,autoAuth:null,schemaVersion:Te,steps:[{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"first name input"},value:"{{faker.person.firstName()}}"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"last name input"},value:"{{faker.person.lastName()}}"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"zip code input"},value:"{{faker.location.zipCode()}}"}}]}}],u=[{fileName:"standard-user-purchases.test.yaml",data:{fileType:te.TEST,id:ee(),name:"standard-user-purchases",baseUrl:"",description:"End-to-end checkout flow",schemaVersion:Te,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,envs:[{name:"swag-labs",default:!0}],disabled:!1,labels:[],steps:[{id:ee(),type:"MODULE",moduleId:a},{id:ee(),inputs:{ITEM:'"sauce labs backpack"'},type:"MODULE",moduleId:s},{id:ee(),inputs:{ITEM:'"sauce labs onesie"'},type:"MODULE",moduleId:s},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Cart icon on the top right of the page"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify that both the backpack and the onesie is in the cart"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Checkout button"}}},{id:ee(),type:"MODULE",moduleId:l},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Continue button"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify the item total matches the amount listed for each item"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify the total matches item total + tax"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Finish button"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify there is a thank you message"}}]}},{fileName:"problem-user-adds-tshirt.test.yaml",data:{fileType:te.TEST,id:ee(),name:"problem-user-adds-tshirt",baseUrl:"https://saucedemo.com",description:"Test that problem_user can add a t-shirt to cart",schemaVersion:Te,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,steps:[{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"username input"},value:"problem_user"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),clearContent:!0,type:"TYPE",target:{type:"description",elementDescriptor:"password input"},value:"secret_sauce"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Login button"}}},{id:ee(),inputs:{ITEM:"'Sauce Labs Bolt T-Shirt'"},type:"MODULE",moduleId:s},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"shopping cart icon in the top right"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"The Sauce Labs Bolt T-Shirt should be listed as an item in the cart",timeout:5}}]}},{fileName:"cart-and-sorting-behavior.test.yaml",data:{fileType:te.TEST,id:ee(),name:"cart-and-sorting-behavior",baseUrl:"",description:"Sorting changes view, not state; cart remains consistent",schemaVersion:Te,advanced:{viewport:{width:1920,height:1080},browserType:"Chromium"},retries:1,envs:[{name:"swag-labs",default:!0}],disabled:!1,labels:[],steps:[{id:ee(),type:"MODULE",moduleId:a},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"SELECT_OPTION",target:{type:"description",elementDescriptor:"sort dropdown"},choice:{type:"LABEL",label:"Price (low to high)"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify the first item is the cheapest one on the page"}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"AI_ASSERTION",assertion:"Verify the last item on the page is the most expensive one",timeout:5}},{id:ee(),inputs:{ITEM:'"cheapest item"'},type:"MODULE",moduleId:s},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Cart icon on the top right"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Checkout button"}}},{id:ee(),type:"MODULE",moduleId:l},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Continue button"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"CLICK",target:{type:"description",elementDescriptor:"Finish button"}}},{id:ee(),type:"PRESET_ACTION",command:{id:ee(),type:"ELEMENT_CHECK",target:{type:"description",elementDescriptor:"Back home button"},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}}}]}}];for(let{fileName:d,data:p}of c)xl({module:p,filePath:ri.join(i,d),projectConfig:n});for(let{fileName:d,data:p}of u)os({test:p,filePath:ri.join(i,d),projectConfig:n});v.success(`Created sample Swag Labs tests and modules in ${ri.resolve(i)}/`)});sr.command("app").addOption(Pn).addOption(On).addOption(Ms).addOption(Yy).addOption(mr).addOption(cG).addOption(cw).addOption(Qy).addOption(Zy).action(async t=>{await Io(se),se.setApp("desktop-server");let{apiKey:e,yes:r,server:n,pixelRatio:o,port:i,disableCache:a,saveCache:s,regenerateCache:l}=t;_g({disableCache:a,saveCache:s,regenerateCache:l});let c=await vt({configFilePath:t.config,nameFilter:void 0}),{errors:u,parsingErrors:d,failedTestFilePaths:p,failedModuleFilePaths:m,parsingErrorDetails:f}=await qm({project:c,fix:!1});d>0?(Su({parsingErrors:d,parsingErrorDetails:f,failedTestFilePaths:p,failedModuleFilePaths:m}),process.exit(1)):u>0&&(v.error(`Found ${u} errors`),v.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1)),WO(se);let h=new ct({baseUrl:n,apiKey:e,logger:se});await RS({client:h,skipPrompts:r});let g=ww(import.meta.url),S=ri.dirname(g),E=ri.resolve(S,"..","static"),y=o??cE();uE(y),await j1({momenticServerUrl:n,apiKey:e,serverPort:i,appPort:i,staticDir:E,devicePixelRatio:y,regenerateCache:l??!1,noCache:a??!1,alwaysSaveCache:s??!1,initialProject:c});let b=`http://localhost:${i}`;await Fle(b)});sr.command("mcp").description("Start the MCP server over stdio.").addOption(Pn).addOption(On).addOption(mr).addOption(Qy).addOption(Zy).addOption(uG).addOption(dG).addOption(Yy).addOption(_G).action(async t=>{se.setApp("mcp"),v.setMinLevel(Number.POSITIVE_INFINITY);let{apiKey:e,server:r,saveCache:n,disableCache:o,headfulBrowser:i,video:a,pixelRatio:s,sessionIdleTimeoutMinutes:l}=t;_g({disableCache:o,saveCache:n});let c=i,u=a,d=s??cE();uE(d);let p=await vt({configFilePath:t.config,nameFilter:void 0}),{errors:m,parsingErrors:f,failedTestFilePaths:h,failedModuleFilePaths:g,parsingErrorDetails:S}=await qm({project:p,fix:!1});f>0?(Su({parsingErrors:f,parsingErrorDetails:S,failedTestFilePaths:h,failedModuleFilePaths:g}),process.exit(1)):m>0&&(v.error(`Found ${m} 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 E=new ct({baseUrl:r,apiKey:e,logger:se});if(await RS({client:E,skipPrompts:!0}),!Tn)throw new Error("CLI_VERSION is not set");await jR({project:p,logger:se,apiKey:e,serverUrl:r,apiClient:E,cliVersion:Tn,supportsFileOutput:!0,alwaysSaveCache:n??!1,noCache:o??!1,videoDefault:u,headfulDefault:c,devicePixelRatio:d,sessionIdleTimeoutMinutes:l})});var Ej=sr.command("queue").description("Queue tests or suites to run on Momentic Cloud");Ej.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Pn).addOption(On).addOption(nw).addOption(ow).addOption(Ms).addArgument(RG).addOption(Jy).addOption(Xy).addOption(Ky).action(async(t,e)=>{await Io(se);let{apiKey:r,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,l=qy(e.customHeaders),c=new ct({baseUrl:n,apiKey:r,logger:se});(!t||!Array.isArray(t)||!t.length)&&(v.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await c.getAuthInfo();await FG({client:c,orgId:u,wait:o,suitePaths:t,waitTimeout:i,env:a,urlOverride:s,customHeaders:l}),await Aa()});Ej.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Pn).addOption(On).addOption(Ms).addOption(Ky).addOption(lw).addOption(Jy).addOption(Xy).addOption(new fr("--all","Run all tests.").default(!1)).addOption(nw).addOption(ow).addArgument(CG).action(async(t,e)=>{await Io(se);let{all:r,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:l,waitTimeout:c,yes:u}=e,d=qy(e.customHeaders);for(let h of t)(h.endsWith(".yaml")||ec.existsSync(h))&&v.warn("Are you trying to run a test on your local machine? If so, please use the 'run' command instead of the 'queue' command");let p=new ct({baseUrl:i,apiKey:n,logger:se}),{orgId:m}=await p.getAuthInfo(),f;a&&(f=await Cw(a)),await BG({client:p,orgId:m,tests:t,all:r,customHeaders:d,env:o,urlOverride:s,wait:l,waitTimeout:c,testInputMatrix:f,yes:u}),await Aa(),process.exit(0)});var Ble=sr.command("list").description("List test paths");Ble.addOption(mr).addOption(Ca).addOption(aw).addOption(sw).addOption(new fr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(uw).action(async(t,e)=>{let r=await vt({configFilePath:e.config,nameFilter:e.filter}),n=await he(r),o=await td({tests:t,momenticFiles:n,yes:!0,project:r,include:e.include,exclude:e.exclude,labels:e.labels,logger:new ll(40,{})});v.info(o.map(i=>i.relativeFilePath).join(`
|
|
6100
|
-
`)),process.exit(0)});var zle=sr.command("run").alias("test").description("Run tests on the local machine");zle.addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(Ms).addOption(Ky).addOption(lw).addOption(cw).addOption(Qy).addOption(Zy).addOption(yG).addOption(vG).addOption(EG).addOption(TG).addOption(bG).addOption(Xy).addOption(Jy).addOption(Yy).addOption(new fr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new fr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new fr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new fr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Xn)).addOption(new fr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Xn)).addOption(new fr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Xn)).addOption(new fr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(IG).addOption(new fr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(pG).addOption(mG).addOption(iw).addOption(fG).addOption(gG).addOption(hG).addOption(aw).addOption(sw).addOption(xG).addOption(MG).addArgument(uw).action(async(t,e)=>{await Io(se);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;_g({disableCache:r,saveCache:n,regenerateCache:o}),pk({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=qy(e.customHeaders),s=await vt({configFilePath:e.config,nameFilter:e.filter}),l=e.parallel??s.config.parallel??1;gj().length<l*2&&v.warn(`You requested to run tests in parallel ${l} at a time on a machine with ${gj().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 qm({project:s,fix:!1});u>0?(Su({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 RS({client:f,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let S=e.outputDir??s.config.outputDir,E=e.reporterDir??s.config.reporterDir,y=kle(),b=se.child({cliVersion:Tn,orgId:h,userId:g,runGroupId:y}),A=await br(se,f,s);b.info({gitMetadata:A,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let M;e.inputCsv&&(M=await Cw(e.inputCsv));let I=e.pixelRatio??cE();uE(I);try{let R=await mj({...e,suiteName:i,parallel:l,retriesOverride:e.retries,devicePixelRatio:I,tests:t,project:s,client:f,outputDir:S,uploadResults:e.uploadResults,reporterDir:E,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:y,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 Vle=sr.command("apply").description("Apply an operation to local resources");Vle.command("patch").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(Ms).addOption(new fr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new fr("--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 he(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 J1({client:s,test:c,fragment:u,yes:o,entities:l,logger:se}),process.exit(0)});var Iw=sr.command("results").description("Merge and upload test results.");Iw.command("merge").description("Merge test results files.").addOption(iw).addArgument(wG).action(async(t,e)=>{let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),ec.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),ec.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),EU(se,r,t)});Iw.command("upload").description("Upload test results to Momentic cloud.").addOption(Pn).addOption(On).addArgument(dw).action(async(t,e)=>{let{apiKey:r,server:n}=e,o=se,i=new ct({baseUrl:n,apiKey:r,logger:o});await _S({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});Iw.command("view").description("Launch the run viewer to view test results in your current directory.").addOption(new fr("--port <port>",`Port to run the backend server on. Defaults to ${mh}.`).argParser(Xn)).addArgument(dw).addArgument(new Lle("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await Io(se),se.setApp("local-run-viewer");let n=ww(import.meta.url),o=ri.dirname(n),i=ri.resolve(o,"..","run-viewer-static");await tw({logger:se,staticDir:i,resultsPath:t,runId:e,port:r.port})});var _w=sr.command("quarantine").description("Manage test quarantines");_w.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(pw).addArgument(mw).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 br(se,l,s);await PG({test:t,reason:i,apiClient:l,project:s,logger:a,identity:c})});_w.command("list").description("List quarantined tests.").addOption(Pn).addOption(On).addOption(mr).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 DG({apiClient:a,project:i})});_w.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(pw).addArgument(mw).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 br(se,l,s);await kG({test:t,reason:i,apiClient:l,project:s,identity:c})});var Hle=sr.command("ai").description("Momentic AI features");Hle.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(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(new fr("--quiet","Do not stream agent reasoning to stdout.")).addOption(new fr("--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(!hP(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 Jr(i.config.ai?.agentConfig,{baseUrl:e.server,apiKey:e.apiKey,logger:se,mode:"runner"}),s=await CV({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}
|
|
6100
|
+
`)),process.exit(0)});var zle=sr.command("run").alias("test").description("Run tests on the local machine");zle.addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(Ms).addOption(Ky).addOption(lw).addOption(cw).addOption(Qy).addOption(Zy).addOption(yG).addOption(vG).addOption(EG).addOption(TG).addOption(bG).addOption(Xy).addOption(Jy).addOption(Yy).addOption(new fr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new fr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new fr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new fr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Xn)).addOption(new fr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Xn)).addOption(new fr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Xn)).addOption(new fr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(IG).addOption(new fr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(pG).addOption(mG).addOption(iw).addOption(fG).addOption(gG).addOption(hG).addOption(aw).addOption(sw).addOption(xG).addOption(MG).addArgument(uw).action(async(t,e)=>{await Io(se);let{disableCache:r,saveCache:n,regenerateCache:o,name:i}=e;_g({disableCache:r,saveCache:n,regenerateCache:o}),pk({shardIndex:e.shardIndex,shardCount:e.shardCount});let a=qy(e.customHeaders),s=await vt({configFilePath:e.config,nameFilter:e.filter}),l=e.parallel??s.config.parallel??1;gj().length<l*2&&v.warn(`You requested to run tests in parallel ${l} at a time on a machine with ${gj().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 qm({project:s,fix:!1});u>0?(Su({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 RS({client:f,skipPrompts:e.yes});v.debug("API key check and browser installation complete");let S=e.outputDir??s.config.outputDir,E=e.reporterDir??s.config.reporterDir,y=kle(),b=se.child({cliVersion:Tn,orgId:h,userId:g,runGroupId:y}),A=await br(se,f,s);b.info({gitMetadata:A,config:s.config,nodeVersion:process.versions.node},"Got local metadata");let M;e.inputCsv&&(M=await Cw(e.inputCsv));let I=e.pixelRatio??cE();uE(I);try{let R=await mj({...e,suiteName:i,parallel:l,retriesOverride:e.retries,devicePixelRatio:I,tests:t,project:s,client:f,outputDir:S,uploadResults:e.uploadResults,reporterDir:E,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:y,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 Vle=sr.command("apply").description("Apply an operation to local resources");Vle.command("patch").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(Ms).addOption(new fr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new fr("--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 he(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 J1({client:s,test:c,fragment:u,yes:o,entities:l,logger:se}),process.exit(0)});var Iw=sr.command("results").description("Merge and upload test results.");Iw.command("merge").description("Merge test results files.").addOption(iw).addArgument(wG).action(async(t,e)=>{let{outputDir:r}=e;r||(v.error("Output directory is required."),process.exit(1)),ec.existsSync(t)||(v.warn("Results path does not exist, skipping merge."),process.exit(0)),ec.existsSync(r)&&v.warn(`Output directory ${r} already exists, removing before merging...`),EU(se,r,t),process.exit(0)});Iw.command("upload").description("Upload test results to Momentic cloud.").addOption(Pn).addOption(On).addArgument(dw).action(async(t,e)=>{let{apiKey:r,server:n}=e,o=se,i=new ct({baseUrl:n,apiKey:r,logger:o});await _S({consoleLogger:v,resultsPath:t,client:i}),process.exit(0)});Iw.command("view").description("Launch the run viewer to view test results in your current directory.").addOption(new fr("--port <port>",`Port to run the backend server on. Defaults to ${mh}.`).argParser(Xn)).addArgument(dw).addArgument(new Lle("<runId>","Run ID to open in the viewer.").argOptional()).action(async(t,e,r)=>{await Io(se),se.setApp("local-run-viewer");let n=ww(import.meta.url),o=ri.dirname(n),i=ri.resolve(o,"..","run-viewer-static");await tw({logger:se,staticDir:i,resultsPath:t,runId:e,port:r.port})});var _w=sr.command("quarantine").description("Manage test quarantines");_w.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(pw).addArgument(mw).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 br(se,l,s);await PG({test:t,reason:i,apiClient:l,project:s,logger:a,identity:c})});_w.command("list").description("List quarantined tests.").addOption(Pn).addOption(On).addOption(mr).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 DG({apiClient:a,project:i})});_w.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(pw).addArgument(mw).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 br(se,l,s);await kG({test:t,reason:i,apiClient:l,project:s,identity:c})});var Hle=sr.command("ai").description("Momentic AI features");Hle.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(Pn).addOption(On).addOption(mr).addOption(Ca).addOption(new fr("--quiet","Do not stream agent reasoning to stdout.")).addOption(new fr("--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(!hP(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 Jr(i.config.ai?.agentConfig,{baseUrl:e.server,apiKey:e.apiKey,logger:se,mode:"runner"}),s=await CV({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(mr).addOption(Ca).action(async t=>{let e=await vt({configFilePath:t.config,nameFilter:t.filter});v.info("Updating Momentic version in package.json..."),await fj(),v.info("Updating project configuration..."),hj(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 Gle(){yj("Main program started");try{await sr.parseAsync(process.argv),await Aa()}catch(t){let e={};try{e.playwrightVersion=Dle("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)}}Ule.setMaxListeners(25);process.on("warning",t=>{se.warn({err:t},`Node warning received on CLI: ${t.message}`)});yj("CLI parsing setup complete");Gle();
|
|
6102
6102
|
//# sourceMappingURL=cli.js.map
|
|
6103
|
-
//# debugId=
|
|
6103
|
+
//# debugId=ab8ab573-ad89-56ff-b23b-e35d982708b1
|