momentic 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4ee28e9c-92b2-5b13-a0be-45d9de847244")}catch(e){}}();
4
- var ox=Object.create;var Au=Object.defineProperty;var ix=Object.getOwnPropertyDescriptor;var sx=Object.getOwnPropertyNames;var ax=Object.getPrototypeOf,lx=Object.prototype.hasOwnProperty;var nn=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var cx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of sx(e))!lx.call(n,o)&&o!==t&&Au(n,o,{get:()=>e[o],enumerable:!(r=ix(e,o))||r.enumerable});return n};var Iu=(n,e,t)=>(t=n!=null?ox(ax(n)):{},cx(e||!n||!n.__esModule?Au(t,"default",{value:n,enumerable:!0}):t,n));var sy=nn((Ja,Hd)=>{"use strict";(function(n){typeof define=="function"&&define.amd?define([],n):typeof Ja=="object"?(Ja=n(),typeof Hd=="object"&&(Hd.exports=Ja)):window?window.JClass=n():typeof console=="object"&&console.error instanceof Function&&console.error("cannot determine environment")})(function(){var n=function(i){return i instanceof Function},e=function(i){var s=Array.prototype.slice.call(arguments,1);for(var a in s){var l=s[a];if(typeof l=="object")for(var c in l)i[c]=l[c]}return i},t={_isClassObject:!1},r=!1,o=function(){};return o._subClasses=[],o.prototype.init=function(){},o._extend=function(i,s,a){i===void 0&&(i={}),s===void 0&&(s={}),a===void 0&&(a={}),a=e({},t,a);var l=function(){r||(this._class=l,this.init instanceof Function&&this.init.apply(this,arguments))},c=this;r=!0;var p=new c;r=!1;var d=c.prototype;l.prototype=p,l.prototype.constructor=l,l._superClass=c,l._subClasses=[],c._subClasses.push(l),l._extend=c._extend,l._extends=function(b){return this._superClass==o?!1:b==this._superClass||b==o?!0:this._superClass._extends(b)};for(var u in i){var m=Object.getOwnPropertyDescriptor(i,u),h=m.value;if(h!==null&&typeof h=="object"&&h.descriptor)Object.defineProperty(p,u,h);else if(!("value"in m)&&("set"in m||"get"in m))Object.defineProperty(p,u,m);else{p[u]=h;var g=d[u];n(h)&&n(g)&&h!==g&&(h._super=g)}}if(!a._isClassObject){var f=c._members===void 0?o:c._members._class,S=e({},a,{_isClassObject:!0}),x=f._extend(s,{},S);x._instanceClass=l,l._members=new x}return l},o._convert=function(i,s){var a=i.prototype;return a.init=function(){var l=this._origin=o._construct(i,arguments);Object.keys(l).forEach(function(c){l.hasOwnProperty(c)&&Object.defineProperty(this,c,{get:function(){return l[c]}})},this)},o._extend(a,{},s)},o._construct=function(i,s){s===void 0&&(s=[]);var a=function(){return i.apply(this,s)};return a.prototype=i.prototype,new a},o._superDescriptor=function(i,s){if("_class"in i&&i instanceof i._class&&(i=i._class),"_extends"in i&&i._extends instanceof Function&&i._extends(this))return Object.getOwnPropertyDescriptor(i._superClass.prototype,s)},o})});var ly=nn((E7,ay)=>{"use strict";var aP=sy(),$r=aP._extend({init:function(n,e,t){n=n instanceof Array?n:[n],this._map={},this._list=[],this.callback=e,this.keyFields=n,this.isHashArray=!0,this.options=t||{ignoreDuplicates:!1},e&&e("construct")},addOne:function(n){var e=!1;for(var t in this.keyFields){t=this.keyFields[t];var r=this.objectAt(n,t);if(r)if(this.has(r)){if(this.options.ignoreDuplicates)return;if(this._map[r].indexOf(n)!=-1){e=!0;continue}this._map[r].push(n)}else this._map[r]=[n]}(!e||this._list.indexOf(n)==-1)&&this._list.push(n)},add:function(){for(var n=0;n<arguments.length;n++)this.addOne(arguments[n]);return this.callback&&this.callback("add",Array.prototype.slice.call(arguments,0)),this},addAll:function(n){if(n.length<100)this.add.apply(this,n);else for(var e=0;e<n.length;e++)this.add(n[e]);return this},addMap:function(n,e){return this._map[n]=e,this.callback&&this.callback("addMap",{key:n,obj:e}),this},intersection:function(n){var e=this;if(!n||!n.isHashArray)throw Error("Cannot HashArray.intersection() on a non-hasharray object. You passed in: ",n);var t=this.clone(null,!0),r=this.clone(null,!0).addAll(this.all.concat(n.all));return r.all.forEach(function(o){e.collides(o)&&n.collides(o)&&t.add(o)}),t},complement:function(n){var e=this;if(!n||!n.isHashArray)throw Error("Cannot HashArray.complement() on a non-hasharray object. You passed in: ",n);var t=this.clone(null,!0);return this.all.forEach(function(r){n.collides(r)||t.add(r)}),t},get:function(n){if(this.has(n))return!(this._map[n]instanceof Array)||this._map[n].length!=1?this._map[n]:this._map[n][0]},getAll:function(n){if(n=n instanceof Array?n:[n],n[0]=="*")return this.all;var e=new $r(this.keyFields);for(var t in n)e.add.apply(e,this.getAsArray(n[t]));return e.all},getAsArray:function(n){return this._map[n]||[]},getUniqueRandomIntegers:function(n,e,t){var r=[],o={};for(n=Math.min(Math.max(t-e,1),n);r.length<n;){var i=Math.floor(e+Math.random()*(t+1));o[i]||(o[i]=!0,r.push(i))}return r},sample:function(n,e){var t=this.all,r={},o=[];e&&(t=this.getAll(e));for(var i=this.getUniqueRandomIntegers(n,0,t.length-1),s=0;s<i.length;s++)o.push(t[i[s]]);return o},has:function(n){return this._map.hasOwnProperty(n)},collides:function(n){for(var e in this.keyFields)if(this.has(this.objectAt(n,this.keyFields[e])))return!0;return!1},hasMultiple:function(n){return this._map[n]instanceof Array},removeByKey:function(){for(var n=[],e=0;e<arguments.length;e++){var t=arguments[e],r=this._map[t].concat();if(r){n=n.concat(r);for(var o in r){var i=r[o];for(var s in this.keyFields){var a=this.objectAt(i,this.keyFields[s]);if(a&&this.has(a)){var s=this._map[a].indexOf(i);s!=-1&&this._map[a].splice(s,1),this._map[a].length==0&&delete this._map[a]}}this._list.splice(this._list.indexOf(i),1)}}delete this._map[t]}return this.callback&&this.callback("removeByKey",n),this},remove:function(){for(var n=0;n<arguments.length;n++){var e=arguments[n];for(var r in this.keyFields){var t=this.objectAt(e,this.keyFields[r]);if(t){var r=this._map[t].indexOf(e);if(r!=-1)this._map[t].splice(r,1);else throw new Error("HashArray: attempting to remove an object that was never added!"+t);this._map[t].length==0&&delete this._map[t]}}var r=this._list.indexOf(e);if(r!=-1)this._list.splice(r,1);else throw new Error("HashArray: attempting to remove an object that was never added!"+t)}return this.callback&&this.callback("remove",arguments),this},removeAll:function(){var n=this._list.concat();return this._map={},this._list=[],this.callback&&this.callback("remove",n),this},objectAt:function(n,e){if(typeof e=="string")return n[e];for(var t=e.concat();t.length&&n;)n=n[t.shift()];return n},forEach:function(n,e){n=n instanceof Array?n:[n];var t=this.getAll(n);return t.forEach(e),this},forEachDeep:function(n,e,t){n=n instanceof Array?n:[n];var r=this,o=this.getAll(n);return o.forEach(function(i){t(r.objectAt(i,e),i)}),this},clone:function(n,e){var t=new $r(this.keyFields.concat(),n||this.callback);return e||t.add.apply(t,this.all.concat()),t},sum:function(n,e,t){var r=this,o=0;return this.forEachDeep(n,e,function(i,s){t!==void 0&&(i*=r.objectAt(s,t)),o+=i}),o},average:function(n,e,t){var r=0,o=0,i=0,s=this;return t!==void 0&&this.forEachDeep(n,t,function(a){i+=a}),this.forEachDeep(n,e,function(a,l){t!==void 0&&(a*=s.objectAt(l,t)/i),r+=a,o++}),t!==void 0?r:r/o},filter:function(n,e){var t=this,r=typeof e=="function"?e:i,o=new $r(this.keyFields);return o.addAll(this.getAll(n).filter(r)),o;function i(s){var a=t.objectAt(s,e);return a!==void 0&&a!==!1}}});Object.defineProperty($r.prototype,"all",{get:function(){return this._list}});Object.defineProperty($r.prototype,"map",{get:function(){return this._map}});ay.exports=$r;typeof window<"u"&&(window.HashArray=$r)});var dy=nn((C7,cy)=>{"use strict";cy.exports=ly()});var uy=nn((R7,py)=>{"use strict";(function(){var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e={rotl:function(t,r){return t<<r|t>>>32-r},rotr:function(t,r){return t<<32-r|t>>>r},endian:function(t){if(t.constructor==Number)return e.rotl(t,8)&16711935|e.rotl(t,24)&4278255360;for(var r=0;r<t.length;r++)t[r]=e.endian(t[r]);return t},randomBytes:function(t){for(var r=[];t>0;t--)r.push(Math.floor(Math.random()*256));return r},bytesToWords:function(t){for(var r=[],o=0,i=0;o<t.length;o++,i+=8)r[i>>>5]|=t[o]<<24-i%32;return r},wordsToBytes:function(t){for(var r=[],o=0;o<t.length*32;o+=8)r.push(t[o>>>5]>>>24-o%32&255);return r},bytesToHex:function(t){for(var r=[],o=0;o<t.length;o++)r.push((t[o]>>>4).toString(16)),r.push((t[o]&15).toString(16));return r.join("")},hexToBytes:function(t){for(var r=[],o=0;o<t.length;o+=2)r.push(parseInt(t.substr(o,2),16));return r},bytesToBase64:function(t){for(var r=[],o=0;o<t.length;o+=3)for(var i=t[o]<<16|t[o+1]<<8|t[o+2],s=0;s<4;s++)o*8+s*6<=t.length*8?r.push(n.charAt(i>>>6*(3-s)&63)):r.push("=");return r.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/ig,"");for(var r=[],o=0,i=0;o<t.length;i=++o%4)i!=0&&r.push((n.indexOf(t.charAt(o-1))&Math.pow(2,-2*i+8)-1)<<i*2|n.indexOf(t.charAt(o))>>>6-i*2);return r}};py.exports=e})()});var Wd=nn((A7,my)=>{"use strict";var $d={utf8:{stringToBytes:function(n){return $d.bin.stringToBytes(unescape(encodeURIComponent(n)))},bytesToString:function(n){return decodeURIComponent(escape($d.bin.bytesToString(n)))}},bin:{stringToBytes:function(n){for(var e=[],t=0;t<n.length;t++)e.push(n.charCodeAt(t)&255);return e},bytesToString:function(n){for(var e=[],t=0;t<n.length;t++)e.push(String.fromCharCode(n[t]));return e.join("")}}};my.exports=$d});var fy=nn((I7,gy)=>{"use strict";gy.exports=function(n){return n!=null&&(hy(n)||lP(n)||!!n._isBuffer)};function hy(n){return!!n.constructor&&typeof n.constructor.isBuffer=="function"&&n.constructor.isBuffer(n)}function lP(n){return typeof n.readFloatLE=="function"&&typeof n.slice=="function"&&hy(n.slice(0,0))}});var yy=nn((P7,Sy)=>{"use strict";(function(){var n=uy(),e=Wd().utf8,t=fy(),r=Wd().bin,o=function(i,s){i.constructor==String?s&&s.encoding==="binary"?i=r.stringToBytes(i):i=e.stringToBytes(i):t(i)?i=Array.prototype.slice.call(i,0):!Array.isArray(i)&&i.constructor!==Uint8Array&&(i=i.toString());for(var a=n.bytesToWords(i),l=i.length*8,c=1732584193,p=-271733879,d=-1732584194,u=271733878,m=0;m<a.length;m++)a[m]=(a[m]<<8|a[m]>>>24)&16711935|(a[m]<<24|a[m]>>>8)&4278255360;a[l>>>5]|=128<<l%32,a[(l+64>>>9<<4)+14]=l;for(var h=o._ff,g=o._gg,f=o._hh,S=o._ii,m=0;m<a.length;m+=16){var x=c,b=p,w=d,E=u;c=h(c,p,d,u,a[m+0],7,-680876936),u=h(u,c,p,d,a[m+1],12,-389564586),d=h(d,u,c,p,a[m+2],17,606105819),p=h(p,d,u,c,a[m+3],22,-1044525330),c=h(c,p,d,u,a[m+4],7,-176418897),u=h(u,c,p,d,a[m+5],12,1200080426),d=h(d,u,c,p,a[m+6],17,-1473231341),p=h(p,d,u,c,a[m+7],22,-45705983),c=h(c,p,d,u,a[m+8],7,1770035416),u=h(u,c,p,d,a[m+9],12,-1958414417),d=h(d,u,c,p,a[m+10],17,-42063),p=h(p,d,u,c,a[m+11],22,-1990404162),c=h(c,p,d,u,a[m+12],7,1804603682),u=h(u,c,p,d,a[m+13],12,-40341101),d=h(d,u,c,p,a[m+14],17,-1502002290),p=h(p,d,u,c,a[m+15],22,1236535329),c=g(c,p,d,u,a[m+1],5,-165796510),u=g(u,c,p,d,a[m+6],9,-1069501632),d=g(d,u,c,p,a[m+11],14,643717713),p=g(p,d,u,c,a[m+0],20,-373897302),c=g(c,p,d,u,a[m+5],5,-701558691),u=g(u,c,p,d,a[m+10],9,38016083),d=g(d,u,c,p,a[m+15],14,-660478335),p=g(p,d,u,c,a[m+4],20,-405537848),c=g(c,p,d,u,a[m+9],5,568446438),u=g(u,c,p,d,a[m+14],9,-1019803690),d=g(d,u,c,p,a[m+3],14,-187363961),p=g(p,d,u,c,a[m+8],20,1163531501),c=g(c,p,d,u,a[m+13],5,-1444681467),u=g(u,c,p,d,a[m+2],9,-51403784),d=g(d,u,c,p,a[m+7],14,1735328473),p=g(p,d,u,c,a[m+12],20,-1926607734),c=f(c,p,d,u,a[m+5],4,-378558),u=f(u,c,p,d,a[m+8],11,-2022574463),d=f(d,u,c,p,a[m+11],16,1839030562),p=f(p,d,u,c,a[m+14],23,-35309556),c=f(c,p,d,u,a[m+1],4,-1530992060),u=f(u,c,p,d,a[m+4],11,1272893353),d=f(d,u,c,p,a[m+7],16,-155497632),p=f(p,d,u,c,a[m+10],23,-1094730640),c=f(c,p,d,u,a[m+13],4,681279174),u=f(u,c,p,d,a[m+0],11,-358537222),d=f(d,u,c,p,a[m+3],16,-722521979),p=f(p,d,u,c,a[m+6],23,76029189),c=f(c,p,d,u,a[m+9],4,-640364487),u=f(u,c,p,d,a[m+12],11,-421815835),d=f(d,u,c,p,a[m+15],16,530742520),p=f(p,d,u,c,a[m+2],23,-995338651),c=S(c,p,d,u,a[m+0],6,-198630844),u=S(u,c,p,d,a[m+7],10,1126891415),d=S(d,u,c,p,a[m+14],15,-1416354905),p=S(p,d,u,c,a[m+5],21,-57434055),c=S(c,p,d,u,a[m+12],6,1700485571),u=S(u,c,p,d,a[m+3],10,-1894986606),d=S(d,u,c,p,a[m+10],15,-1051523),p=S(p,d,u,c,a[m+1],21,-2054922799),c=S(c,p,d,u,a[m+8],6,1873313359),u=S(u,c,p,d,a[m+15],10,-30611744),d=S(d,u,c,p,a[m+6],15,-1560198380),p=S(p,d,u,c,a[m+13],21,1309151649),c=S(c,p,d,u,a[m+4],6,-145523070),u=S(u,c,p,d,a[m+11],10,-1120210379),d=S(d,u,c,p,a[m+2],15,718787259),p=S(p,d,u,c,a[m+9],21,-343485551),c=c+x>>>0,p=p+b>>>0,d=d+w>>>0,u=u+E>>>0}return n.endian([c,p,d,u])};o._ff=function(i,s,a,l,c,p,d){var u=i+(s&a|~s&l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._gg=function(i,s,a,l,c,p,d){var u=i+(s&l|a&~l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._hh=function(i,s,a,l,c,p,d){var u=i+(s^a^l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._ii=function(i,s,a,l,c,p,d){var u=i+(a^(s|~l))+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._blocksize=16,o._digestsize=16,Sy.exports=function(i,s){if(i==null)throw new Error("Illegal argument "+i);var a=n.wordsToBytes(o(i,s));return s&&s.asBytes?a:s&&s.asString?r.bytesToString(a):n.bytesToHex(a)}})()});var wy=nn((L7,qd)=>{"use strict";var Gd=dy(),cP=yy(),dP=1024,by=/^[\s]*$/,pP=[{regex:/[åäàáâãæ]/ig,alternate:"a"},{regex:/[èéêë]/ig,alternate:"e"},{regex:/[ìíîï]/ig,alternate:"i"},{regex:/[òóôõö]/ig,alternate:"o"},{regex:/[ùúûü]/ig,alternate:"u"},{regex:/[æ]/ig,alternate:"ae"}];String.prototype.replaceCharAt=function(n,e){return this.substring(0,n)+e+this.substr(n+e.length)};var Yi=function(n,e){this.options=e||{},this.options.ignoreCase=this.options.ignoreCase===void 0?!0:this.options.ignoreCase,this.options.maxCacheSize=this.options.maxCacheSize||dP,this.options.cache=this.options.hasOwnProperty("cache")?this.options.cache:!0,this.options.splitOnRegEx=this.options.hasOwnProperty("splitOnRegEx")?this.options.splitOnRegEx:/[\s.,\/#!$%\^&\*;:{}=\-_`~()]/g,this.options.splitOnGetRegEx=this.options.hasOwnProperty("splitOnGetRegEx")?this.options.splitOnGetRegEx:this.options.splitOnRegEx,this.options.min=this.options.min||1,this.options.keepAll=this.options.hasOwnProperty("keepAll")?this.options.keepAll:!1,this.options.keepAllKey=this.options.hasOwnProperty("keepAllKey")?this.options.keepAllKey:"id",this.options.idFieldOrFunction=this.options.hasOwnProperty("idFieldOrFunction")?this.options.idFieldOrFunction:void 0,this.options.expandRegexes=this.options.expandRegexes||pP,this.options.insertFullUnsplitKey=this.options.hasOwnProperty("insertFullUnsplitKey")?this.options.insertFullUnsplitKey:!1,this.options.defaultReducer=this.options.hasOwnProperty("defaultReducer")?this.options.defaultReducer:Yi.UNION_REDUCER,this.keyFields=n?n instanceof Array?n:[n]:[],this.root={},this.size=0,this.options.cache&&(this.getCache=new Gd("key"))};function Vd(n,e){return e.length===1?n[e[0]]:Vd(n[e[0]],e.slice(1,e.length))}Yi.prototype={add:function(n,e){this.options.cache&&this.clearCache(),typeof e=="number"&&(e=void 0);var t=e||this.keyFields;for(var r in t){var o=t[r],i=o instanceof Array,s=i?Vd(n,o):n[o];if(s){s=s.toString(),this.options.ignoreCase&&(s=s.toLowerCase());for(var a=this.expandString(s),l=0;l<a.length;l++){var c=a[l];this.map(c,n,e)}}}},remove:function(n,e){if(n){n=n.toString(),n=this.options.ignoreCase?n.toLowerCase():n,e=e||this.keyFields,e=e instanceof Array?e:[e],this.options.cache&&this.clearCache();var t=this.expandString(n);for(var r of t){var o=this.options.splitOnRegEx?r.split(this.options.splitOnRegEx):[r];for(var i of o)this.removeNode(this.root,e,n,i)}}},removeNode:function(n,e,t,r){if(!n)return null;if(!r.length){n.value&&(n.value=n.value.filter(i=>!e.some(s=>{var a=i[s]||"";return a=this.options.ignoreCase?a.toLowerCase():a,a.indexOf(t)>-1})),n.value.length||delete n.value);return}var o=r[0];n[o]&&(this.removeNode(n[o],e,t,r.slice(1)),this.deleteNodeIfEmpty(n,o))},deleteNodeIfEmpty:function(n,e){Object.keys(n[e]).length===0&&(delete n[e],this.size--)},expandString:function(n){var e=[n];if(this.options.expandRegexes&&this.options.expandRegexes.length)for(var t=0;t<this.options.expandRegexes.length;t++)for(var r=this.options.expandRegexes[t],o;(o=r.regex.exec(n))!==null;){var i=n.replaceCharAt(o.index,r.alternate);e.push(i)}return e},addAll:function(n,e){for(var t=0;t<n.length;t++)this.add(n[t],e)},reset:function(){this.root={},this.size=0},clearCache:function(){this.getCache=new Gd("key")},cleanCache:function(){for(;this.getCache.all.length>this.options.maxCacheSize;)this.getCache.remove(this.getCache.all[0])},addFromObject:function(n,e){this.options.cache&&this.clearCache(),e=e||"value",this.keyFields.indexOf("_key_")==-1&&this.keyFields.push("_key_");for(var t in n){var r={_key_:t};r[e]=n[t],this.add(r)}},map:function(n,e,t){if(this.options.splitOnRegEx&&this.options.splitOnRegEx.test(n)){var r=n.split(this.options.splitOnRegEx),o=r.filter(function(u){return by.test(u)}),i=r.filter(function(u){return u===n}),s=i.length+o.length===r.length;if(!s){for(var a=0,l=r.length;a<l;a++)by.test(r[a])||this.map(r[a],e,t);if(!this.options.insertFullUnsplitKey)return}}this.options.cache&&this.clearCache(),this.options.keepAll&&(this.indexed=this.indexed||new Gd([this.options.keepAllKey]),this.indexed.add(e)),this.options.ignoreCase&&(n=n.toLowerCase());var c=this.keyToArr(n),p=this;d(c,e,this.root);try{e.$tsid=this.getId(e,t)}catch(u){throw console.warn("TrieSearch: since version 2.2 you cannot insert primitives as items, you must wrap them in an Object. This was done for performance."),u}function d(u,m,h){if(u.length==0){h.value=h.value||[],h.value.push(m);return}var g=u.shift();h[g]||p.size++,h[g]=h[g]||{},d(u,m,h[g])}},keyToArr:function(n){var e;if(this.options.min&&this.options.min>1){if(n.length<this.options.min)return[];e=[n.substring(0,this.options.min)],e=e.concat(n.substring(this.options.min).split(""))}else e=n.split("");return e},findNode:function(n){return e(this.keyToArr(n),this.root);function e(t,r){if(r){if(t.length===0)return r;var o=t.shift();return e(t,r[o])}}},_getCacheKey:function(n,e){var t=n;return e&&(t=n+"_"+e),t},_get:function(n,e){var t=this;n=this.options.ignoreCase?n.toLowerCase():n;var r,o,i=[],s={};if(this.options.cache&&(r=this.getCache.get(this._getCacheKey(n,e))))return r.value;if(o=this.findNode(n),o&&l(o),this.options.cache){var a=this._getCacheKey(n,e);this.getCache.add({key:a,value:i}),this.cleanCache()}return i;function l(c){if(i.length!==e){if(c.value&&c.value.length)for(let u=0;u<c.value.length;u++){var p=c.value[u];if(!e||i.length<e){let m=t.getId(p);if(s[m])continue;i.push(p),s[m]=p}}if(i.length!==e)for(var d in c)d!=="value"&&l(c[d])}}},get:function(n,e,t){var r=void 0;e=e||this.options.defaultReducer,typeof n=="string"&&(n=this.options.splitOnGetRegEx?n.split(this.options.splitOnGetRegEx):[n]),n=n.filter(l=>!this.options.min||l.length>=this.options.min);for(var o=0,i=n.length;o<i;o++){var s=n[o],a=this._get(s,t);r=e(r,s,a,this)}return r||[]},search:function(n,e,t){return this.get(n,e,t)},getId:function(n,e){if(n.$tsid)return n.$tsid;if(!this.options.idFieldOrFunction){var t="",r=e||this.keyFields;for(let s=0;s<r.length;s++){var o=r[s],i=typeof o=="string"?n[o]:Vd(n,o);if(i==null)throw new Error(`Since 2.2.0 of TrieSearch, if you have undefined/null keyFields (or customKeys) on your items you must specify an idFieldOrFunction. item.${o} === ${i}`);t+=i.toString()}return cP(t)}return typeof this.options.idFieldOrFunction=="function"?this.options.idFieldOrFunction(n):n[this.options.idFieldOrFunction]}};Yi.UNION_REDUCER=function(n,e,t,r){if(n===void 0)return t;var o={},i=[];return n.forEach(function(s){o[r.getId(s)]=!0}),t.forEach(function(s){var a=r.getId(s);o[a]&&i.push(s)}),i};qd.exports=Yi;qd.exports.default=Yi});var xy=nn((O7,vy)=>{"use strict";vy.exports=wy()});var fb=nn((uie,gb)=>{"use strict";gb.exports=mb;function mb(n,e,t){n instanceof RegExp&&(n=ub(n,t)),e instanceof RegExp&&(e=ub(e,t));var r=hb(n,e,t);return r&&{start:r[0],end:r[1],pre:t.slice(0,r[0]),body:t.slice(r[0]+n.length,r[1]),post:t.slice(r[1]+e.length)}}function ub(n,e){var t=e.match(n);return t?t[0]:null}mb.range=hb;function hb(n,e,t){var r,o,i,s,a,l=t.indexOf(n),c=t.indexOf(e,l+1),p=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;p>=0&&!a;)p==l?(r.push(p),l=t.indexOf(n,p+1)):r.length==1?a=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,s=c),c=t.indexOf(e,p+1)),p=l<c&&l>=0?l:c;r.length&&(a=[i,s])}return a}});var Eb=nn((mie,Tb)=>{"use strict";var Sb=fb();Tb.exports=IL;var yb="\0SLASH"+Math.random()+"\0",bb="\0OPEN"+Math.random()+"\0",up="\0CLOSE"+Math.random()+"\0",wb="\0COMMA"+Math.random()+"\0",vb="\0PERIOD"+Math.random()+"\0";function pp(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function RL(n){return n.split("\\\\").join(yb).split("\\{").join(bb).split("\\}").join(up).split("\\,").join(wb).split("\\.").join(vb)}function AL(n){return n.split(yb).join("\\").split(bb).join("{").split(up).join("}").split(wb).join(",").split(vb).join(".")}function xb(n){if(!n)return[""];var e=[],t=Sb("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,s=r.split(",");s[s.length-1]+="{"+o+"}";var a=xb(i);return i.length&&(s[s.length-1]+=a.shift(),s.push.apply(s,a)),e.push.apply(e,s),e}function IL(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),rs(RL(n),!0).map(AL)):[]}function PL(n){return"{"+n+"}"}function LL(n){return/^-?0\d/.test(n)}function OL(n,e){return n<=e}function kL(n,e){return n>=e}function rs(n,e){var t=[],r=Sb("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?rs(r.post,!1):[""];if(/\$$/.test(r.pre))for(var s=0;s<i.length;s++){var a=o+"{"+r.body+"}"+i[s];t.push(a)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),p=l||c,d=r.body.indexOf(",")>=0;if(!p&&!d)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+up+r.post,rs(n)):[n];var u;if(p)u=r.body.split(/\.\./);else if(u=xb(r.body),u.length===1&&(u=rs(u[0],!1).map(PL),u.length===1))return i.map(function(D){return r.pre+u[0]+D});var m;if(p){var h=pp(u[0]),g=pp(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(pp(u[2])):1,x=OL,b=g<h;b&&(S*=-1,x=kL);var w=u.some(LL);m=[];for(var E=h;x(E,g);E+=S){var C;if(c)C=String.fromCharCode(E),C==="\\"&&(C="");else if(C=String(E),w){var I=f-C.length;if(I>0){var N=new Array(I+1).join("0");E<0?C="-"+N+C.slice(1):C=N+C}}m.push(C)}}else{m=[];for(var P=0;P<u.length;P++)m.push.apply(m,rs(u[P],!1))}for(var P=0;P<m.length;P++)for(var s=0;s<i.length;s++){var a=o+m[P]+i[s];(!e||p||a)&&t.push(a)}}return t}});var nc=(n,e)=>{},ui=()=>{},rc=!1;try{let n=await import("@sentry/node"),{nodeProfilingIntegration:e}=await import("@sentry/profiling-node");nc=n.captureException,ui=n.profiler.stopProfiler,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",integrations:[e()],environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:1}),n.profiler.startProfiler(),rc=!0}catch{}import{Command as n_,Option as en}from"@commander-js/extra-typings";import{execSync as r_}from"child_process";import Dw from"body-parser";import Nk from"cors";import _k from"dedent";import Mk from"events";import Uw,{Router as Fk}from"express";import Dk from"http";import{z as Pu}from"zod";var f_=Pu.object({input:Pu.string()});import{z as je}from"zod";var b_=je.object({srcs:je.array(je.string()),urls:je.array(je.string()),desiredSrc:je.string().optional(),desiredUrl:je.string().optional()}),Lu=je.object({srcRegex:je.string().optional(),urlRegex:je.string().optional()}),Ou=je.object({x:je.number(),y:je.number(),correlation:je.number()}),w_=je.object({searchImageBase64String:je.string(),pageImageBase64String:je.string(),id:je.string().uuid(),timeoutMs:je.number().max(1e4).min(0).optional()});import{z as k}from"zod";import{v4 as Re}from"uuid";import*as v from"zod";function ye(n){if(typeof n.ZodType.prototype.openapi<"u")return;n.ZodType.prototype.openapi=function(o){return new this.constructor({...this._def,openapi:o})};let e=n.ZodObject.prototype.extend;n.ZodObject.prototype.extend=function(...o){let i=e.apply(this,o);return i._def.extendMetadata={extends:this},delete i._def.openapi,i};let t=n.ZodObject.prototype.omit;n.ZodObject.prototype.omit=function(...o){let i=t.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i};let r=n.ZodObject.prototype.pick;n.ZodObject.prototype.pick=function(...o){let i=r.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i}}import{z as ue}from"zod";ye(ue);var ku=ue.object({plan:ue.string().optional(),evidence:ue.string().optional(),thoughts:ue.string(),result:ue.boolean(),relevantElements:ue.array(ue.number()).optional()}),ro=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(ro||{});var dx=ue.object({type:ue.literal("ELEMENT_CONTENT"),negated:ue.boolean().optional(),operation:ue.nativeEnum(ro),value:ue.string()}).openapi({ref:"ElementContentAssertion"}),px=ue.object({type:ue.literal("ELEMENT_ATTRIBUTE"),negated:ue.boolean().optional(),operation:ue.nativeEnum(ro),attr:ue.string(),value:ue.string()}).openapi({ref:"ElementAttributeValueAssertion"}),mi=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(mi||{}),ux=ue.object({type:ue.literal("ELEMENT_EXISTENCE"),negated:ue.boolean().optional(),condition:ue.nativeEnum(mi).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Nu=ue.discriminatedUnion("type",[dx,px,ux]).openapi({ref:"ManualElementAssertion"});var mx=ue.object({type:ue.literal("CONTENT"),negated:ue.boolean().optional(),value:ue.string()}).openapi({ref:"PageContentAssertion"}),_u=ue.discriminatedUnion("type",[mx]).openapi({ref:"ManualPageAssertion"});import*as K from"zod";ye(K);var Gn=(a=>(a.AI="AI",a.AI_HEALED="AI_HEALED",a.CLICK_TO_FIND="CLICK_TO_FIND",a.XY_PERCENT="XY_PERCENT",a.RECORDING="RECORDING",a.USER_CSS_SELECTOR="USER_CSS_SELECTOR",a.HEURISTIC_HEALED="HEURISTIC_HEALED",a))(Gn||{}),hx=K.object({mPathSelectorTokens:K.string().array(),frameSrcRegex:K.string().optional(),frameUrlRegex:K.string().optional(),indices:K.number().array()}),yr=K.object({id:K.number().int(),dataMomenticId:K.number().int().optional(),selector:K.string().optional(),generatedSelectors:K.string().array().optional(),role:K.string().optional(),name:K.string().optional(),numChildren:K.number().optional(),content:K.string().optional(),pathFromRoot:K.string().optional(),serializedForm:K.string().optional(),nodeOnlySerializedForm:K.string().optional(),serializedHtml:K.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:K.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:K.string().url().optional(),boundingBox:K.object({x:K.number().optional(),y:K.number().optional(),width:K.number(),height:K.number()}).describe("css pixel bounding box").optional(),frameCache:hx.optional(),inputDescription:K.string().optional().describe("the description that generated this cache"),targetSource:K.nativeEnum(Gn).optional(),targetUpdateTime:K.string().optional()}).openapi({ref:"A11yTargetWithCache"});function Mu(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var gx=K.object({type:K.literal("description"),elementDescriptor:K.string(),a11yData:yr.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),fx=K.object({x:K.number(),y:K.number()}),Sx=K.object({type:K.literal("coordinates"),pixels:fx}).openapi({ref:"CoordinatesTarget"});function Vn(n){return n.type==="description"}function Sn(n){return n.type==="coordinates"}var ct=K.discriminatedUnion("type",[gx,Sx]).openapi({ref:"ElementTarget"});function oc(n){if(!n)return!1;switch(n.type){case"description":return!!n.elementDescriptor}return!0}function dt(n){if(!n)return"";switch(n.type){case"description":return n.elementDescriptor;case"coordinates":return`x: ${n.pixels.x}, y: ${n.pixels.y}`}}import{z as oe}from"zod";var As=oe.object({url:oe.string(),method:oe.union([oe.literal("GET"),oe.literal("POST"),oe.literal("PUT"),oe.literal("DELETE"),oe.literal("PATCH")]),headers:oe.record(oe.string(),oe.string()).optional(),params:oe.record(oe.string(),oe.string()).optional(),body:oe.string().optional(),timeout:oe.number().int().optional().describe("Max seconds to wait for the request to complete")}),Fu=oe.object({url:oe.string(),headers:oe.record(oe.string(),oe.string()).optional(),query:oe.string(),variables:oe.record(oe.string(),oe.string()).optional(),timeout:oe.number().int().optional().describe("Max seconds to wait for the request to complete")}),Is=oe.object({code:oe.string(),fragment:oe.boolean().optional(),environment:oe.union([oe.literal("NODE"),oe.literal("BROWSER")]).optional().describe("default NODE"),timeout:oe.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Be=(G=>(G.AI_EXTRACT="AI_EXTRACT",G.AI_ASSERTION="AI_ASSERTION",G.AI_WAIT="AI_WAIT",G.AUTH_LOAD="AUTH_LOAD",G.AUTH_SAVE="AUTH_SAVE",G.BLUR="BLUR",G.CAPTCHA="CAPTCHA",G.CLICK="CLICK",G.COOKIE="COOKIE",G.COPY="COPY",G.DIALOG="DIALOG",G.DRAG="DRAG",G.ELEMENT_CHECK="ELEMENT_CHECK",G.FILE_UPLOAD="FILE_UPLOAD",G.FOCUS="FOCUS",G.GO_BACK="GO_BACK",G.GO_FORWARD="GO_FORWARD",G.HOVER="HOVER",G.JAVASCRIPT="JAVASCRIPT",G.LOCAL_STORAGE="LOCAL_STORAGE",G.MOUSE_DRAG="MOUSE_DRAG",G.NAVIGATE="NAVIGATE",G.NEW_TAB="NEW_TAB",G.PAGE_CHECK="PAGE_CHECK",G.PASTE="PASTE",G.PRESS="PRESS",G.REFRESH="REFRESH",G.REQUEST="REQUEST",G.GRAPHQL_REQUEST="GRAPHQL_REQUEST",G.SCROLL_DOWN="SCROLL_DOWN",G.SCROLL_UP="SCROLL_UP",G.SCROLL_LEFT="SCROLL_LEFT",G.SCROLL_RIGHT="SCROLL_RIGHT",G.SELECT_OPTION="SELECT_OPTION",G.SWITCH_TAB="TAB",G.TYPE="TYPE",G.VISUAL_DIFF="VISUAL_DIFF",G.WAIT="WAIT",G.WAIT_FOR_URL="WAIT_FOR_URL",G.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",G.AWAIT_LISTENER="AWAIT_LISTENER",G.SUCCESS="SUCCESS",G))(Be||{});ye(v);var Y=v.object({thoughts:v.string().optional(),id:v.string().uuid().describe("unique identifier to this step, used for step cache")}),$t=v.object({useSelector:v.boolean().optional(),force:v.boolean().optional(),disableCache:v.boolean().optional().describe("disable element caching for this step"),iframeUrl:v.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),yn=v.object({target:yr}).optional().openapi({ref:"SingleTargetCache"}),Ls=v.object({loadTimeout:v.number().int().max(60).optional().describe("Max seconds for the page to load")}),yx=Y.merge(Ls).merge(v.object({type:v.literal("NAVIGATE"),url:v.string()})).openapi({ref:"NavigateCommand"}),Os=$t.merge(v.object({cache:yn})),oo=Y.merge(Os.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_UP"),deltaY:v.number().optional()}))).openapi({ref:"ScrollUpCommand"}),io=Y.merge(Os.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_DOWN"),deltaY:v.number().optional()}))).openapi({ref:"ScrollDownCommand"}),so=Y.merge(Os.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_LEFT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),ao=Y.merge(Os.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_RIGHT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollRightCommand"}),D_=v.discriminatedUnion("type",[oo,io,so,ao]).openapi({ref:"AllScrollCommands"}),bx=Y.merge(v.object({type:v.literal("DIALOG"),action:v.union([v.literal("ACCEPT"),v.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),wx=Y.merge(v.object({type:v.literal("WAIT"),delay:v.number()})).openapi({ref:"WaitCommand"}),vx=v.discriminatedUnion("type",[v.object({type:v.literal("SUBSTRING"),url:v.string()}),v.object({type:v.literal("GLOB"),glob:v.string()}),v.object({type:v.literal("REGEX"),regex:v.string()})]),xx=v.object({caseInsensitive:v.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:v.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:v.number().int().optional().describe("Max seconds to wait for the URL to match")}),Tx=Y.extend({type:v.literal("WAIT_FOR_URL"),url:v.string().optional().describe("Deprecated: url or glob to wait for. New commands should use the discriminated matcher field."),matcher:vx.optional()}).merge(xx).openapi({ref:"WaitUrlCommand"}),Ex=Y.merge(Ls).merge(v.object({type:v.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Cx=Y.merge(v.object({type:v.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Rx=Y.merge(v.object({type:v.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),Ax=Y.extend({type:v.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),Ix=Y.extend({type:v.literal("AUTH_LOAD"),storageState:v.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),sc=Y.merge($t).extend({type:v.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Px=Y.extend({type:v.literal("COPY"),value:v.string()}).openapi({ref:"CopyCommand"}),Lx=Y.extend({type:v.literal("PASTE")}).openapi({ref:"PasteCommand"}),Ox=Y.merge(Is).extend({type:v.literal("JAVASCRIPT"),envKey:v.string().optional()}).openapi({ref:"JavaScriptCommand"}),hi=Y.merge($t).merge(v.object({type:v.literal("CLICK"),target:ct,doubleClick:v.boolean().optional(),rightClick:v.boolean().optional(),waitForUrl:v.string().optional().describe("Deprecated: wait for the click to trigger a page load or new tab that matches the provided URL or URL glob (e.g. https://google.com/**/*)."),waitForDownload:v.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:v.number().optional(),downloadTimeoutMs:v.number().optional(),cache:yn,relativePosition:v.object({x:v.number(),y:v.number()}).optional()})).openapi({ref:"ClickCommand"}),gi=Y.merge($t).merge(v.object({type:v.literal("DRAG"),fromTarget:ct,toTarget:ct,steps:v.number().optional(),hoverSeconds:v.number().optional().describe("Seconds to hover the object before dropping"),cache:v.object({fromTarget:yr.optional(),toTarget:yr.optional()}).optional()})).openapi({ref:"DragCommand"}),fi=Y.merge($t).merge(v.object({type:v.literal("MOUSE_DRAG"),target:ct.optional(),deltaX:v.string().describe("pixels to move horizontally, can be template"),deltaY:v.string().describe("pixels to move vertically, can be template"),steps:v.number().optional(),cache:yn})).openapi({ref:"MouseDragCommand"}),Si=Y.merge($t).merge(v.object({type:v.literal("HOVER"),target:ct,cache:yn})).openapi({ref:"HoverCommand"}),yi=Y.merge($t).merge(v.object({type:v.literal("FOCUS"),target:ct,cache:yn})).openapi({ref:"FocusCommand"}),bi=Y.merge($t).extend({type:v.literal("BLUR"),target:ct.optional(),cache:yn}).openapi({ref:"BlurCommand"}),kx=v.object({type:v.literal("URL"),url:v.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),Nx=v.object({type:v.literal("USER_FILE"),name:v.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),_x=Y.extend({type:v.literal("FILE_UPLOAD"),fileSource:v.discriminatedUnion("type",[kx,Nx]),filename:v.string().optional()}).openapi({ref:"FileUploadCommand"}),Mx=v.discriminatedUnion("type",[v.object({type:v.literal("VALUE"),value:v.string()}),v.object({type:v.literal("LABEL"),label:v.string()}),v.object({type:v.literal("INDEX"),index:v.number().int()})]),wi=Y.merge($t).extend({type:v.literal("SELECT_OPTION"),target:ct,cache:yn,option:v.string().describe("option value, deprecated old field").optional(),choice:Mx.optional().describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),ac=v.union([v.literal("MULTIMODAL"),v.literal("VISION_ONLY")]),lc=Y.merge(v.object({type:v.literal("AI_ASSERTION"),assertion:v.string(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional(),contextChoice:ac.optional(),timeout:v.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),Fx=lc.extend({type:v.literal("AI_WAIT")}).openapi({ref:"AIWaitCommand"}),bn=5,cc=600,vi=Y.merge($t).extend({type:v.literal("ELEMENT_CHECK"),target:ct,assertion:Nu,cache:yn,timeout:v.number().int().min(0).max(cc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Dx=Y.extend({type:v.literal("PAGE_CHECK"),assertion:_u,iframeUrl:v.string().optional().describe("url or url regex for the iframe"),timeout:v.number().int().min(0).max(cc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Ux=Y.merge(v.object({type:v.literal("AI_EXTRACT"),goal:v.string(),schema:v.string().optional(),envKey:v.string().optional(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional()})).openapi({ref:"AIExtractCommand"}),Bx=v.object({clearContent:v.boolean().optional(),forceClearContent:v.boolean().optional(),pressKeysSequentially:v.boolean().optional().describe("Deprecated: this is now the default. Please set delay to zero if you wish to achieve instant typing behavior."),delay:v.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:v.boolean().optional(),pressEnter:v.boolean().optional()}),Du=25,xi=Y.merge($t).merge(Bx).extend({type:v.literal("TYPE"),target:ct.optional(),value:v.string(),cache:yn}).openapi({ref:"TypeCommand"}),zx=Y.merge(v.object({type:v.literal("PRESS"),value:v.string(),repeat:v.number().optional(),convertMeta:v.boolean().optional(),delayMs:v.number().optional()})).openapi({ref:"PressCommand"}),jx=v.object({type:v.literal("SUBSTRING"),substring:v.string()}),Hx=v.object({type:v.literal("REGEX"),pattern:v.string()}),$x=v.object({type:v.literal("INDEX"),index:v.number()}),Wx=v.discriminatedUnion("type",[jx,Hx,$x]),Gx=Y.merge(Ls).merge(v.object({type:v.literal("TAB"),url:v.string().optional().describe("deprecated field - new instances should use the discriminated union"),action:Wx.optional()})).openapi({ref:"TabCommand"}),Vx=Y.merge(Ls).merge(v.object({type:v.literal("NEW_TAB"),url:v.string()})).openapi({ref:"NewTabCommand"}),qx=Y.merge(v.object({type:v.literal("COOKIE"),value:v.string()})).openapi({ref:"CookieCommand"}),Kx=Y.merge(v.object({type:v.literal("LOCAL_STORAGE"),key:v.string(),value:v.string()})).openapi({ref:"LocalStorageCommand"}),Yx=Y.extend({type:v.literal("REQUEST")}).merge(As).openapi({ref:"RequestCommand"}),Jx=Y.extend({type:v.literal("GRAPHQL_REQUEST")}).merge(Fu).openapi({ref:"GraphQLRequestCommand"}),Xx=Y.merge(v.object({type:v.literal("SUCCESS"),condition:lc.optional()})).openapi({ref:"SuccessCommand"}),Zx=Y.merge(v.object({type:v.literal("FAILURE")})).openapi({ref:"FailureCommand"}),Qx=v.object({data:v.string().describe("location at which to find a jpg"),width:v.number(),height:v.number()}),Ti=Y.merge($t).merge(v.object({type:v.literal("VISUAL_DIFF"),threshold:v.number().optional().describe("default 0.1"),target:ct.optional(),screenshot:Qx.optional(),cache:yn})).openapi({ref:"VisualDiffCommand"}),eT=Y.merge(v.object({type:v.literal("REGISTER_REQUEST_LISTENER"),pattern:v.string(),key:v.string()})).openapi({ref:"RegisterRequestListenerCommand"}),tT=Y.merge(v.object({type:v.literal("AWAIT_LISTENER"),key:v.string(),timeout:v.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),Uu=v.discriminatedUnion("type",[hi,xi,zx,wi,yx,io,oo,lc,Si,wx,Xx]),nT=v.discriminatedUnion("type",[Fx,Ux,Ix,Ax,sc,qx,Px,bx,gi,vi,_x,Cx,Rx,Ox,Kx,fi,Vx,Dx,Lx,Ex,Yx,Jx,so,ao,Gx,Ti,yi,bi,Tx,eT,tT]),lo=v.discriminatedUnion("type",[...Uu.options,...nT.options]).openapi({ref:"Command"}),ks=v.discriminatedUnion("type",[...Uu.options,Zx]);function On(n){let e;switch(n){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:Re(),type:n};break;case"AUTH_LOAD":{e={id:Re(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:Re(),type:n,goal:""};break;case"DIALOG":e={id:Re(),type:n,action:"DISMISS"};break;case"DRAG":e={id:Re(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Re(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Re(),type:n,url:""};break;case"WAIT":e={id:Re(),type:n,delay:1};break;case"BLUR":e={id:Re(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Re(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Re(),type:n,value:"",clearContent:!0};break;case"SELECT_OPTION":e={id:Re(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":case"TAB":e={id:Re(),type:n,url:""};break;case"REQUEST":e={id:Re(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Re(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Re(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:Re(),type:n,code:""};break;case"AI_WAIT":case"AI_ASSERTION":e={id:Re(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:Re(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Re(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Re(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Re(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:Re(),type:n,key:""};break}default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return e}import{z as rT}from"zod";var H_=rT.discriminatedUnion("type",[bi,sc,hi,gi,yi,Si,fi,oo,io,so,ao,wi,xi,Ti,vi]);function Bu(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as oT}from"zod";var Et={type:!0,cache:!0},br=oT.discriminatedUnion("type",[bi.pick(Et),hi.pick(Et),gi.pick(Et),vi.pick(Et),yi.pick(Et),Si.pick(Et),fi.pick(Et),oo.pick(Et),io.pick(Et),so.pick(Et),ao.pick(Et),wi.pick(Et),xi.pick(Et),Ti.pick(Et)]),dc=Object.values(Be).filter(n=>br.options.some(e=>e.shape.type.safeParse(n).success));lo.options.forEach(n=>{if("target"in n.shape&&!dc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as uc}from"zod";import{z as pc}from"zod";import{z as co}from"zod";var Ct=co.object({index:co.number().optional().describe("global index within a test (in-order traversal)"),id:co.string(),skipped:co.boolean().optional(),envKey:co.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:co.boolean().optional()});ye(pc);var Rt=Ct.extend({type:pc.literal("PRESET_ACTION"),command:lo,skipped:pc.boolean().optional()}).openapi({ref:"PresetAction"});ye(uc);var wr=Ct.extend({type:uc.literal("AI_ACTION"),text:uc.string(),steps:Rt.array().optional()}).openapi({ref:"AIAction"});import{z as ie}from"zod";var iT=ie.object({cacheKey:ie.string(),cacheExpiryMs:ie.number()}),mc=Ct.extend({id:ie.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:ie.record(ie.string()).optional(),cacheConfig:iT.optional()}),kn=mc.extend({type:ie.literal("MODULE"),moduleId:ie.string().uuid()}),sT=ie.union([kn.pick({type:!0,moduleId:!0}),ie.record(ie.unknown())]),aT=ie.object({type:ie.literal("URL_REGEX"),regex:ie.string()}),lT=ie.object({type:ie.literal("PAGE_CHECK"),substring:ie.string()}),hc=ie.object({cacheInvalidation:ie.discriminatedUnion("type",[lT,aT]).optional()}),At=ie.object({moduleId:ie.string().uuid(),name:ie.string(),description:ie.string().nullish(),enabled:ie.boolean().nullish(),parameters:ie.string().array().nullish(),defaultParameters:ie.record(ie.string(),ie.string()).nullish(),defaultCacheKey:ie.string().nullish(),defaultCacheTtl:ie.number().nullish(),defaultCacheAllInvocations:ie.boolean().nullish(),autoAuth:ie.boolean().nullish(),advanced:hc.nullish()});import{z as rt}from"zod";import{z as gc}from"zod";ye(gc);var po=Ct.extend({type:gc.literal("AI_ACTION_DYNAMIC"),text:gc.string()}).openapi({ref:"AIActionDynamic"});import{z as zu}from"zod";var fc=Ct.extend({type:zu.literal("CONDITIONAL"),skipped:zu.boolean().optional()});import{z as Ns}from"zod";var cT=Ns.object({type:Ns.literal("url"),url:Ns.string()}),Ei=Ct.extend({type:Ns.literal("IFRAME"),identifier:cT});import{z as Wt}from"zod";var Sc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(Sc||{});var dT=Wt.discriminatedUnion("type",[Wt.object({type:Wt.literal("NAVIGATE_URL"),url:Wt.string().url()}),Wt.object({type:Wt.literal("GO_TO_SECTION_START")})]),pT=Wt.object({trigger:Wt.nativeEnum(Sc).optional(),attempts:Wt.number().int().optional(),restartBehavior:dT}),Ci=Ct.extend({type:Wt.literal("SECTION"),description:Wt.string().describe("user provided goal of what the section should accomplish"),plan:Wt.string().array().optional(),autohealingConfig:pT.optional()});var ju=At.merge(mc).extend({type:rt.literal("RESOLVED_MODULE"),steps:rt.lazy(()=>ve.array())}),yc=At.extend({steps:rt.lazy(()=>ve.array())}),bc=Ei.extend({steps:rt.lazy(()=>Ke.array())}),uT=Ei.extend({steps:rt.lazy(()=>ve.array())}),wc=Ci.extend({steps:rt.lazy(()=>Ke.array())}),mT=Ci.extend({steps:rt.lazy(()=>ve.array())}),vr=fc.extend({blocks:rt.object({assertion:rt.lazy(()=>Rt),steps:rt.lazy(()=>Ke.array())}).array(),elseSteps:rt.lazy(()=>Ke.array().optional())}),hT=fc.extend({blocks:rt.object({assertion:rt.lazy(()=>Rt),steps:rt.lazy(()=>ve.array())}).array(),elseSteps:rt.lazy(()=>ve.array().optional())}),Ke=rt.discriminatedUnion("type",[Rt,wr,po,kn,vr,bc,wc]),ve=rt.discriminatedUnion("type",[Rt,wr,po,ju,hT,uT,mT]);import{z as Gt}from"zod";var gT=Gt.object({steps:Ke.array(),beforeSteps:Ke.array().nullish(),afterSteps:Ke.array().nullish()}),uo=Gt.object({steps:ve.array(),beforeSteps:ve.array().nullish(),afterSteps:ve.array().nullish()}),xr=Gt.object({steps:Gt.record(Gt.string(),Gt.unknown()).array(),beforeSteps:Gt.record(Gt.string(),Gt.unknown()).array().nullish(),afterSteps:Gt.record(Gt.string(),Gt.unknown()).array().nullish()});var He="1.0.19";import{z as Tr}from"zod";var vc=Tr.object({key:Tr.string(),testId:Tr.string().optional(),moduleId:Tr.string().optional(),organizationId:Tr.string(),value:br}),Hu=Tr.record(Tr.string(),vc);var $u=k.object({phrase:k.string()}),xc=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),jF=k.object({text:k.string()}),Wu=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int()}),_s=(u=>(u.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",u.FEW_WORDS="FEW_WORDS",u.STYLE_TAG="STYLE_TAG",u.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",u.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",u.NONE="NONE",u.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",u.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",u.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",u.PREFER_ASSERTION="PREFER_ASSERTION",u.HTML_ELEMENTS="HTML_ELEMENTS",u.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",u))(_s||{});var Gu=k.object({thoughts:k.string(),category:k.nativeEnum(_s)}),fT=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),HF=k.object({thoughts:k.string(),patches:fT.array()}),Vu=[k.literal("add"),k.literal("replace"),k.literal("remove")],ST=k.object({op:k.union(Vu),path:k.string(),value:ve.optional()}),qu=k.object({patches:ST.array(),thoughts:k.string()});var yT=k.object({thoughts:k.string(),op:k.union(Vu),value:k.union([k.null(),ve])}),Ku=k.object({reasoning:k.string(),scenario:k.string(),patch:yT.or(k.null())}),$F=k.object({thoughts:k.string(),evaluation:k.number().min(1).max(10)}),WF=k.object({observations:k.string(),reasoning:k.string(),command:ks});var Tc=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])});import{z as F}from"zod";import*as te from"zod";var JF=te.object({thoughts:te.string().optional().describe("only provided if a description was provided"),target:yr.optional().describe("only provided if a description was provided"),pageState:te.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:te.object({label:te.string(),value:te.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:te.object({data:te.string(),height:te.number().int(),width:te.number().int()}).optional().describe("only provided if returnScreenshot is true")}),Yu=te.union([te.literal("NEGATED_CHECK"),te.literal("SELECT_OPTION"),te.literal("TYPE")]);function Ri(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.negated)return"NEGATED_CHECK"}}var Ai=(s=>(s.A11Y_ID="A11Y_ID",s.USER_SELECTOR="USER_SELECTOR",s.CSS_SELECTOR="CSS_SELECTOR",s.HTML_DISTANCE="HTML_DISTANCE",s.TEMPLATE_MATCHING="TEMPLATE_MATCHING",s.AUTO_FRAME="AUTO_FRAME",s))(Ai||{}),mo=te.object({matched:te.boolean(),reason:te.string().optional().describe("Human understandable description"),logs:te.string().array().optional().describe("Logs for debugging")}),bT=mo.extend({type:te.literal("A11Y_ID")}),wT=mo.extend({type:te.literal("USER_SELECTOR")}),vT=mo.extend({type:te.literal("CSS_SELECTOR"),selectors:te.string().array()}),xT=mo.extend({type:te.literal("HTML_DISTANCE"),distance:te.number().optional(),closestElement:te.string().optional(),savedElement:te.string().optional()}),TT=mo.extend({type:te.literal("TEMPLATE_MATCHING"),elementImageUrl:te.string().url()}),ET=mo.extend({type:te.literal("AUTO_FRAME"),logs:te.string().array().optional()}),Ju=te.discriminatedUnion("type",[bT,wT,vT,xT,TT,ET]);import{z as Ni}from"zod";import{z as VE}from"zod";import*as J from"zod";import{cloneDeep as Li}from"lodash-es";var CT=n=>{let e=Xu(n,0);if(e===void 0||!AT(n[e]))return;let t=Xu(n,e+1);if(t!==void 0)return IT(n,e,t)},Zu=CT,Xu=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!RT(r))return t}},RT=n=>n===" "||n===" "||n===`
5
- `||n==="\r",AT=n=>n==="{"||n==="[",IT=(n,e,t)=>{let r;for(let o=t-1;o>e;o-=1){let i=n[o];if(i==="\r")return;if(i===`
6
- `)return PT(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},PT=n=>n===void 0?0:n[0]===" "?n.length:n;var Qu=(n,e)=>{let t=Ec(n,"toPrecision",e,e);return t===void 0?Ec(n,"toExponential",e,e):t},Ec=(n,e,t,r)=>{let i=n[e](r).replace(LT,"$1").replace(OT,"$1");return i.length<=t?i:r===1?void 0:Ec(n,e,t,r-1)},LT=/(e)\+/iu,OT=/\.?0*($|e)/iu;var tm=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);kT(e)},kT=n=>{if(NT(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<em)throw new TypeError(`"maxSize" argument must be at least ${em}: ${n}`)},NT=n=>{if(n===void 0)throw new TypeError('"maxSize" argument must be defined');if(!Number.isInteger(n))throw new TypeError(`"maxSize" argument must be an integer: ${n}`)},em=7;var Ms=(n,e,t)=>{let r=rm(e,t);return nm(n,e,r)},nm=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=HT&&r<=$T?nm(n,e,t+1):t},Fs=(n,e,t)=>{if(t===void 0)return t;let r=rm(e,t);return _T(n,r)},_T=(n,e)=>MT(n,e)?e-3:FT(n,e)?e-2:DT(n,e)?e-1:e,MT=(n,e)=>e>=3&&n[e-3]>=UT&&n[e-3]<=BT,FT=(n,e)=>e>=2&&n[e-2]>=zT,DT=(n,e)=>e>=1&&n[e-1]>=jT,rm=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,UT=240,BT=244,zT=224,jT=194,HT=128,$T=191;var om=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=Ms(r,r.length,e),i=Fs(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var im=/[\uD800-\uDFFF]/gu,sm="\uFFFD";var Ds=n=>WT(n)?n.replace(im,sm):n,WT=n=>{for(let e=0;e<n.length;e+=1){let t=n.codePointAt(e);if(t>=55296&&t<=57343)return!0}return!1};var Ac=({input:n,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:r,firstEndSurrogate:o,lastEndSurrogate:i,increment:s,canBacktrack:a,shift:l,charIndexInit:c})=>{let p=c,d=p,u=0;for(;u<e;p+=s){d=p;let h=n.charCodeAt(p);if(Number.isNaN(h))break;if(h<=127){u+=1;continue}if(h<=2047){u+=2;continue}if(u+=3,h<t||h>r)continue;let g=n.charCodeAt(p+s);Number.isNaN(g)||g<o||g>i||(u+=1,p+=s)}return(a&&u>e?d:p)+l};var Ic=(n,e,t)=>e<0||Object.is(e,-0)?JT(n,e,t):YT(n,e,t),YT=(n,e,t)=>Ac({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),JT=(n,e,t)=>Ac({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var Us=(n,e,t)=>{let r=Ic(n,e,!1),o=XT(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return Ds(i)},XT=(n,e)=>{if(e===void 0)return e;let t=Ic(n,e,!0);return t===n.length?void 0:t};var lm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=ZT(),i=QT(n),{written:s}=r.encodeInto(n,i),a=Ms(i,s,e),l=Fs(i,s,t),c=l===void 0?s:Math.min(l,s),p=i.subarray(a,c);return o.decode(p)},ZT=()=>(Pc===void 0&&(Pc=new globalThis.TextEncoder,am=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Pc,textDecoder:am}),Pc,am,QT=n=>{let e=n.length*3;return e>eE?new Uint8Array(e):((Bs===void 0||Bs.length<e)&&(Bs=new Uint8Array(e)),Bs)},eE=1e5,Bs;var cm=(n,e)=>{if(e===void 0)return e;let t=Lc(n,e);return t>=n.length*dm?void 0:t},Lc=(n,e)=>e<=n.length*-dm?0:e,dm=4;var pm=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);tE(e),nE(t)},tE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");um("Second",n)},nE=n=>{n!==void 0&&um("Third",n)},um=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var mm=n=>{let e=!0,t=0;for(let r=0;r<Oc;r+=1){let o=rE(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Oc}},rE=(n,e)=>{let t=Oc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},Oc=50;var oE=(n,e,t)=>{if(pm(n,e,t),n==="")return n;let r=Lc(n,e),o=cm(n,t);return o===void 0&&Object.is(r,0)?Ds(n):iE(n,r,o)},hm=oE,iE=(n,e,t)=>{if(n.length<=sE)return Us(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=mm(n);return r?lE(n,e,t):o>=aE?Us(n,e,t):gm(n,e,t)},sE=200,aE=.4,lE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?om(n,e,t):gm(n,e,t),gm=(n,e,t)=>"TextEncoder"in globalThis?lm(n,e,t):Us(n,e,t);var Sm=(n,e)=>{let t=JSON.stringify(n),r=pE(t),o=hm(r,0,e-fm.length-Ii.length*2),s=`${cE(o)}${fm}`;return uE(s)},cE=n=>n.replace(dE,""),dE=/(\\|\\u[0-9a-fA-F]{0,3})$/u,pE=n=>n.slice(Ii.length,-Ii.length),uE=n=>`${Ii}${n}${Ii}`,Ii='"',fm="...";var ym=n=>globalThis.Buffer.byteLength(n);var kc=n=>{let e=n.length,t=e;for(let r=0;r<e;r+=1){let o=n.charCodeAt(r);if(o<=mE)continue;if(o<=hE){t+=1;continue}if(t+=2,o<gE||o>fE)continue;let i=n.charCodeAt(r+1);i<SE||i>yE||(r+=1)}return t},mE=127,hE=2047,gE=55296,fE=56319,SE=56320,yE=57343;var bm=()=>bE.bind(void 0,new TextEncoder),bE=(n,e)=>{let t=wE(e);return n.encodeInto(e,t).written},wE=n=>{let e=n.length*3;return e>vE?new Uint8Array(e):((zs===void 0||zs.length<e)&&(zs=new Uint8Array(e)),zs)},vE=1e5,zs;var TE=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?ym:"TextEncoder"in globalThis?EE.bind(void 0,bm()):kc,EE=(n,e)=>e.length<100?kc(e):n(e),wm=TE();var vm=n=>{if(n===null)return CE;if(n===!0)return RE;if(n===!1)return AE;let e=typeof n;return e==="object"?IE:e==="number"?JSON.stringify(n).length:Nc(n)},CE=4,RE=4,AE=5,IE=2,Nc=n=>wm(JSON.stringify(n));var js=({size:n,increment:e,maxSize:t,truncatedProps:r,path:o,value:i})=>{let s=n+e,a=s>t;return a?{size:n,stop:a,truncatedProps:[...r,{path:o,value:i}]}:{size:s,stop:a,truncatedProps:r}},Tm=n=>vm(n),Em=(n,e,t)=>{let r=Rm({empty:n,indent:e,depth:t,keySpaceSize:0}),o=Am(n);return r+o},Cm=({key:n,empty:e,indent:t,depth:r})=>{let o=Rm({empty:e,indent:t,depth:r,keySpaceSize:1}),i=Nc(n),s=Am(e);return o+i+PE+s},PE=1,Rm=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=xm+e*(t+1),i=n?xm+e*t:0;return r+o+i},xm=1,Am=n=>n?0:LE,LE=1;var Hs=({parent:n,truncatedProps:e,path:t,increment:r,maxSize:o,key:i,empty:s,size:a,truncateValue:l,indent:c,depth:p})=>{let d=n[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=js({size:a,increment:r,maxSize:o,truncatedProps:e,path:u,value:d});return h?{empty:s,size:m,truncatedProps:g}:OE({value:d,truncatedProps:e,path:u,maxSize:o,empty:s,size:a,newSize:m,truncateValue:l,indent:c,depth:p})},OE=({value:n,truncatedProps:e,path:t,maxSize:r,empty:o,size:i,newSize:s,truncateValue:a,indent:l,depth:c})=>{let{value:p,size:d,truncatedProps:u}=a({value:n,truncatedProps:e,path:t,size:s,maxSize:r,indent:l,depth:c+1});return p===void 0?{empty:o,size:i,truncatedProps:u}:{empty:!1,size:d,value:p,truncatedProps:u}};var Im=({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l=[],c={empty:!0,size:r,truncatedProps:e};for(let p=0;p<n.length;p+=1){let d=Em(c.empty,s,a);c=Hs({parent:n,truncatedProps:c.truncatedProps,path:t,increment:d,maxSize:o,key:p,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&l.push(c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var Pm=({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l={},c={empty:!0,size:r,truncatedProps:e};for(let p in n){let d=Cm({key:p,empty:c.empty,indent:s,depth:a});c=Hs({parent:n,truncatedProps:c.truncatedProps,path:t,increment:d,maxSize:o,key:p,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&(l[p]=c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var $s=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>{let a=Tm(n),{size:l,stop:c,truncatedProps:p}=js({size:r,increment:a,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:p}:kE({value:n,truncatedProps:p,path:t,size:l,maxSize:o,indent:i,depth:s})},kE=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>typeof n!="object"||n===null?{value:n,size:r,truncatedProps:e}:Array.isArray(n)?Im({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:$s,indent:i,depth:s}):Pm({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:$s,indent:i,depth:s});var NE=(n,e)=>{tm(n,e);let t=_E(n),r=ME(n),{value:o,truncatedProps:i}=$s({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:FE({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Pi=NE,_E=n=>{let e=Zu(n);return typeof e=="string"?e.length:e},ME=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
7
- ${e.message}`)}},FE=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?Qu(e,t):Sm(e,t);import*as Er from"zod";import{z as St}from"zod";var Ae="BASE_URL",Ws="CURRENT_URL",ho="ENV_NAME",o0={[Ae]:"https://www.google.com"},Lm=St.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Gs=St.object({name:St.string(),variables:St.record(St.string().describe("variable name"),St.string().describe("variable value"))}),Vs=St.object({pageLoadTimeoutMs:St.number().optional().describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),localChromeExtensionPaths:St.string().array().optional(),disableGpu:St.boolean().optional()}),qs=St.object({name:St.string(),variables:St.record(St.string().describe("variable name"),St.unknown().describe("variable value")),browser:Vs.optional()});ye(Er);var Oi=Er.object({env:Er.record(Er.unknown())}).openapi({ref:"TestContextSnapshot"}),DE="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",UE=[Ae,ho],Om=[Ws,Ae,ho],It=class n{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t={}){return new n({baseUrl:"about:blank",currentUrl:"about:blank",envName:e,variablesFromEnvironment:t})}static fromSnapshot({snapshot:e,environmentVariables:t}){let r=e.env[Ae]??"about:blank",o=e.env[Ws]??"about:blank",i=e.env[ho],s={};for(let[l,c]of Object.entries(e.env))Om.includes(l)||(t??{})[l]===void 0&&(s[l]=c);return new n({baseUrl:r,currentUrl:o,dynamicVariables:s,envName:i,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Li(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){UE.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[ho]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Li(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>Om.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,DE]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Pi(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Pi(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Ws]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Li(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ae,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ho,e.envName)}getDynamicVariablesCopy(){return Li(this.env)}getVariablesFromEnvironmentCopy(){return Li(this.varsFromMomenticEnvironment)}};import{z as Cr}from"zod";ye(Cr);var le=(c=>(c.AI_PROVIDER="AIProviderError",c.USER_INFRA="UserInfrastructureError",c.ACTION_FAILURE="ActionFailureError",c.ASSERTION_FAILURE="AssertionFailureError",c.CONFIG_ERROR="UserConfigurationError",c.WEB_AGENT_PLATFORM="InternalWebAgentError",c.UNKNOWN_PLATFORM="InternalPlatformError",c.JOB_TIMEOUT="JobTimeoutError",c.UNKNOWN="UnknownError",c))(le||{});var km=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Ks={ActionFailureError:"Action failure",AssertionFailureError:"Assertion failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error"},go={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",AssertionFailureError:"An AI assertion or check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},_c=Cr.object({reason:Cr.nativeEnum(le),summary:Cr.string()}).openapi({ref:"TestResultClassification"}),Ys=Cr.object({errorMessage:Cr.string(),errorStack:Cr.string().optional(),classification:_c.optional()}).openapi({ref:"TestFailureDetails"});ye(J);var Ie=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ie||{}),Mc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Mc||{}),Fc=J.object({beforeUrl:J.string().optional(),afterUrl:J.string().optional(),message:J.string().optional(),beforeScreenshot:J.string().optional(),afterScreenshot:J.string().optional(),beforeSnapshot:J.string().optional(),afterSnapshot:J.string().optional(),startedAt:J.coerce.date(),finishedAt:J.coerce.date()}),BE=Fc.extend({viewport:J.object({height:J.number(),width:J.number()}),status:J.nativeEnum(Mc),message:J.string().optional(),elementInteracted:J.string().optional()}),qn=Fc.extend({status:J.nativeEnum(Ie),message:J.string().optional(),data:J.unknown().optional(),beforeTestContext:Oi.optional(),afterTestContext:Oi.optional(),failureReason:J.nativeEnum(le).optional(),details:J.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),Js=qn.merge(Rt).extend({results:BE.array(),proposedStep:Rt.optional()}),zE=qn.merge(wr).extend({results:J.lazy(()=>Js.array())}),jE=qn.merge(po).extend({results:J.lazy(()=>Js.array())}),HE=qn.merge(kn).extend({moduleName:J.string().optional(),results:J.lazy(()=>Nn.array())}),$E=qn.merge(vr).extend({assertion:Js.optional(),results:J.lazy(()=>Nn.array()).describe("results for the block actually executed")}),WE=qn.merge(Ei).extend({results:J.lazy(()=>Nn.array())}),GE=qn.merge(Ci).extend({results:J.lazy(()=>Nn.array()),healingAttempts:J.lazy(()=>Nn.array().array()).optional()}),Nn=J.discriminatedUnion("type",[zE,jE,Js,HE,$E,WE,GE]),Xs=qn.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),Zs=Fc.extend({index:J.number().optional(),description:J.string(),pageState:J.string().optional()});var Dc=VE.object({results:Nn.array().describe("main results"),beforeResults:Nn.array().optional(),afterResults:Nn.array().optional()}),Qs=Dc.partial();import{z as H}from"zod";import{z as be}from"zod";var qE=be.object({type:be.literal("FAILURE_RECOVERY"),thoughts:be.string()}),KE=be.object({type:be.literal("DESCRIPTION_UPDATE"),thoughts:be.string()}),ea=be.discriminatedUnion("type",[KE,qE]),ta=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(ta||{}),YE=be.object({testId:be.string(),name:be.string(),orgId:be.string(),runId:be.string(),purpose:be.nativeEnum(ta).catch("AUTO_HEALING"),steps:ve.array(),details:ea.or(ea.array()).optional()}),O0=YE.pick({name:!0,orgId:!0}),Uc=be.object({id:be.string(),name:be.string().nullish(),createdAt:be.string().pipe(be.coerce.date()).or(be.date()),organizationId:be.string(),schemaVersion:be.string(),purpose:be.nativeEnum(ta).catch("AUTO_HEALING"),runId:be.string().nullish(),details:ea.or(ea.array()).nullish(),applied:be.boolean().nullish(),appliedAt:be.coerce.date().nullish()}),Nm=Uc.extend({steps:ve.array()});import{isValidCron as JE}from"cron-validator";import{z as Z}from"zod";import{z as Bc}from"zod";var na=Bc.object({width:Bc.number().min(200).max(1e4),height:Bc.number().min(200).max(1e4)}),_m={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},_0=Object.keys(_m);var rn=_m["Desktop Large"];var Mm=1e4,Fm=6e4,Dm=2e3,Rr=(t=>(t.CHROMIUM="Chromium",t.GOOGLE_CHROME="Google Chrome",t))(Rr||{}),ra=Z.object({browserType:Z.nativeEnum(Rr).optional(),pageLoadTimeoutMs:Z.number().optional().refine(n=>n===void 0||n<=Fm&&n>=-1,{message:`Page load timeout must be between 0 and ${Fm/1e3} seconds`}),slowMoMs:Z.number().optional().refine(n=>n===void 0||n<=Dm&&n>=-1,{message:`Slow motion must be between 0 and ${Dm} milliseconds`}),smartWaitingTimeoutMs:Z.number().optional().refine(n=>n===void 0||n<=Mm&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${Mm/1e3} seconds`}),extraHeaders:Z.record(Z.string(),Z.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:Z.string().optional(),basicAuthorization:Z.object({username:Z.string().optional(),password:Z.string().optional()}).optional(),disableJavaScript:Z.boolean().optional(),disableGpu:Z.boolean().optional(),localChromeExtensionPaths:Z.string().array().optional()}),Um=["extraHeaders","basicAuthorization","localChromeExtensionPaths"];var XE=Z.object({disableAICaching:Z.boolean().default(!1),failureRecovery:Z.boolean().optional().describe("undefined means inherit org settings")});var ZE=Z.object({viewport:na.optional()}),fo=ZE.merge(XE).merge(ra),So=Z.object({cron:Z.string().refine(n=>JE(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Z.boolean().default(!1),env:Z.string().optional(),timeZone:Z.string().default("America/Los_Angeles"),jobKey:Z.string().optional()}),yo=Z.object({onSuccess:Z.boolean().default(!1),failureMessage:Z.string().optional(),onFailure:Z.boolean().default(!0),successMessage:Z.string().optional()}),QE=Z.object({name:Z.string(),required:Z.boolean().optional(),defaultValue:Z.string().describe("this is not optional because we need a value when the editor is first loaded")}),oa=QE.array(),eC=Z.object({name:Z.string(),value:Z.string()}),Bm=eC.array(),ia=Z.object({name:Z.string(),default:Z.boolean().optional(),fixtures:Lm.array().optional()});ye(H);var Pt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},re=(a=>(a.PENDING="PENDING",a.RUNNING="RUNNING",a.PASSED="PASSED",a.FAILED="FAILED",a.CANCELLED="CANCELLED",a.RETRYING="RETRYING",a.WAITING_FOR_USER="WAITING_FOR_USER",a))(re||{}),sa=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(sa||{});var ze=H.string().pipe(H.coerce.date()).or(H.date()),ki=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),createdAt:ze,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ze.or(H.null()),startedAt:ze.or(H.null()),updatedAt:ze.nullish(),finishedAt:ze.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),labels:H.array(H.string()).optional(),cliVersion:H.string().nullish(),section:H.nativeEnum(sa).nullish(),status:H.nativeEnum(re),trigger:H.nativeEnum(Pt),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(re),startedAt:ze.or(H.null()),finishedAt:ze.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(le).nullish(),failureDetails:Ys.nullish(),testFragments:H.array(Uc).nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),tC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},aa=ki.pick({...tC,test:!0}),zm=ki.omit({failureReason:!0,failureDetails:!0,test:!0}),zc=ki.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:fo.nullish()}).nullish()}).merge(Dc),jm=n=>n.includes("PASSED")&&n.includes("FAILED");var nC=Ni.object({id:Ni.string().uuid(),startedAt:ze.or(Ni.null()),finishedAt:ze.or(Ni.null()),status:Ni.nativeEnum(re)}).merge(Qs),Q0=nC.array();var _i=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(_i||{});import{z as $e}from"zod";var rC=$e.object({id:$e.string(),status:$e.nativeEnum(re),trigger:$e.nativeEnum(Pt),createdAt:ze,startedAt:ze.nullish(),finishedAt:ze.nullish(),gitCommitSha:$e.string().nullish(),gitCommitShaShort:$e.string().nullish(),gitCommitTimestamp:ze.nullish(),gitBranchName:$e.string().nullish(),gitOriginUrl:$e.string().nullish(),gitCommitMessage:$e.string().nullish(),gitCommitAuthorName:$e.string().nullish(),githubRepository:$e.string().nullish(),gitlabProjectPath:$e.string().nullish(),pipelineId:$e.string().nullish(),cliVersion:$e.string().nullish(),suite:$e.object({id:$e.string(),name:$e.string()}).nullish(),runs:$e.object({status:$e.nativeEnum(re)}).array()}).openapi({ref:"RunGroup"}),Hm=rC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:aa.array()});import{z as Ye}from"zod";var oC=Ye.object({type:Ye.literal("TARGETING"),name:Ye.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:Ju.array(),pageState:Ye.string().optional(),targetSource:Ye.nativeEnum(Gn).optional(),targetUpdateTime:Ye.string().optional()}),iC=Ye.object({type:Ye.literal("AI_LOCATION"),matched:Ye.boolean(),pageState:Ye.string().optional(),ragUsed:Ye.boolean().optional(),thoughts:Ye.string().optional()}),sC=Ye.object({type:Ye.literal("ASSERTION"),relevantElementsSerialized:Ye.string().array().optional(),pageState:Ye.string().optional(),ragUsed:Ye.boolean().optional()}),$m=Ye.discriminatedUnion("type",[oC,iC,sC]);function la(){return{details:[]}}import{z as _e}from"zod";var aC=_e.object({id:_e.string(),name:_e.string()}),m1=aC.merge(_e.object({createdAt:ze,createdBy:_e.string(),schedule:So,notification:yo,environment:_e.object({name:_e.string()}).nullish(),beforeTests:_e.object({id:_e.string()}).array().nullish(),afterTests:_e.object({id:_e.string()}).array().nullish()})),Wm=_e.object({id:_e.string().uuid(),orgId:_e.string(),createdAt:ze,startedAt:ze.or(_e.null()),finishedAt:ze.or(_e.null()),status:_e.nativeEnum(re),trigger:_e.nativeEnum(Pt),suite:_e.object({id:_e.string(),name:_e.string()}).nullish(),runs:ki.array()}),h1=Wm.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),Gm=Wm.extend({runs:aa.array()});var Vt=F.object({disableCache:F.boolean().optional(),loggerTags:F.record(F.string(),F.string()).optional(),langfuseSessionId:F.string().optional()}),lC=F.object({screenshotBase64AfterCommand:F.string(),urlAfterCommand:F.string(),serializedCommand:F.string(),elementInteracted:F.string().optional(),thoughts:F.string().optional()}),Vm=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string(),source:Yu.optional()}),qm=F.object({target:F.string().or(F.number()),browserState:F.string().optional(),screenshot:F.string().optional(),boundingBox:F.object({x:F.number(),y:F.number(),height:F.number(),width:F.number()}).optional()}),Km=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string().optional(),returnSchema:F.string().optional()}),Ym=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string(),url:F.string(),contextChoice:ac.optional()}),Jm=F.object({command:lo}),jc=F.object({goal:F.string(),browserState:F.string(),startingScreenshot:F.string().optional(),screenshot:F.string(),url:F.string(),history:lC.array(),actionHint:F.string().optional(),lastError:F.string().optional()}),Xm=F.object({results:Zs.array(),errorMessage:F.string(),errorStack:F.string().optional()}),Zm=F.object({results:Zs.array(),goal:F.string(),errorMessage:F.string()}),Qm=F.object({failedResults:Zs.array(),nextStepsSerialized:F.string().array(),currentUrl:F.string(),currentPageState:F.string(),currentScreenshot:F.string()}),_1=F.object({description:F.string(),type:F.union([F.literal("locator"),F.literal("assertion"),F.literal("ai-action")]),excerpt:F.string()});import{z as Mi}from"zod";var D1=Mi.object({goal:Mi.string()}),eh=Mi.object({keywords:Mi.array(Mi.string())});import{z as yt}from"zod";var Hc=yt.object({content:yt.string(),ids:yt.string().array(),tokenLength:yt.number()}),cC=yt.object({chunks:Hc.array()}),z1=yt.object({ids:yt.string().array(),score:yt.number(),tokenLength:yt.number()}),j1=cC.extend({description:yt.string().describe("Input to pass to RAG engine"),tokenLimit:yt.number()}),th=yt.object({ids:yt.number().array()}),nh=yt.object({indices:yt.number().array()});var rh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Ar}from"zod";var oh=Ar.object({id:Ar.string().uuid(),skipped:Ar.boolean().optional(),envKey:Ar.string().optional().describe("key in the environment to save the result of this step to")}),$c=oh.merge(As).extend({type:Ar.literal("REQUEST")}),Wc=oh.merge(Is).extend({type:Ar.literal("JAVASCRIPT")}),Gc=Ar.discriminatedUnion("type",[Wc,$c]);import{z as qt}from"zod";import{z as Ir}from"zod";var dC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Pe=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ca=Ir.string().min(1).max(255).superRefine((n,e)=>{try{bo(n)}catch(t){return e.addIssue({code:Ir.ZodIssueCode.custom,message:t.message,fatal:!0}),Ir.NEVER}});function bo(n){if(n=n.toLowerCase().trim(),n.length===0||n.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(n))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(n.endsWith("-")||n.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(n.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(n))throw new Error(`"${n}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(n)||/^\s|\s$/.test(n))throw new Error("Name cannot start or end with a space or dot.");if(n.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(n==="none")throw new Error("Name cannot be 'none'.");if(n.match(dC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var da=Ir.preprocess(n=>n===null?"":n,Ir.union([Ir.string().url(),Ir.literal("")])).optional();var ih=qt.object({id:qt.string(),name:ca,description:qt.string().optional().nullish(),baseUrl:da.nullish(),schemaVersion:qt.string(),advanced:qt.unknown().optional(),retries:qt.number(),envs:qt.array(ia).nullish(),parameters:oa.nullish()}),pC=qt.object({createdAt:qt.coerce.date(),updatedAt:qt.coerce.date(),schedule:So.nullish(),notification:yo.nullish(),createdBy:qt.string(),organizationId:qt.string()}),uC=ih.merge(pC),aU=uC.extend({steps:Gc.array()}),lU=ih.extend({steps:Gc.array()});import{z as Lt}from"zod";var sh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date(),status:Lt.nativeEnum(Ie),message:Lt.string().optional(),data:Lt.unknown().optional()}),hC=sh.merge(Wc).extend({type:Lt.literal("JAVASCRIPT")}),gC=sh.merge($c).extend({type:Lt.literal("REQUEST")}),fC=Lt.discriminatedUnion("type",[hC,gC]),ah=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date().nullish(),status:Lt.nativeEnum(re),results:fC.array(),failureReason:Lt.string().nullish(),failureDetails:Ys.nullish()});import{z as Ot}from"zod";var SC=Ot.object({id:Ot.string(),organizationId:Ot.string(),createdAt:Ot.coerce.date(),updatedAt:Ot.coerce.date(),createdBy:Ot.string(),scheduledAt:Ot.coerce.date().nullish(),startedAt:Ot.coerce.date().nullish(),finishedAt:Ot.coerce.date().nullish(),status:Ot.nativeEnum(re),trigger:Ot.nativeEnum(Pt),results:ah.array().nullish(),apiTestName:Ot.string().nullish(),apiTestPath:Ot.string().nullish(),apiTestId:Ot.string().nullish()}),SU=SC.pick({status:!0,startedAt:!0,finishedAt:!0});var Pr=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Pr||{}),lh=3;function yC(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Fi(n){if(!yC(n))switch(n){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Di(n){switch(n.type){case"AI_EXTRACT":return 3;case"AI_ASSERTION":return lh;case"AI_WAIT":return 3;case"CAPTCHA":return 3;case"VISUAL_DIFF":return 3;case"CLICK":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"TYPE":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"SELECT_OPTION":return n.useSelector?0:1;case"HOVER":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"DRAG":return n.useSelector?0:1;case"ELEMENT_CHECK":return n.useSelector?0:1;case"MOUSE_DRAG":return n.useSelector?0:1;case"FOCUS":return n.useSelector?0:1;case"BLUR":return n.useSelector?0:1;case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":return n.target?.type==="description"?1:0;case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var wo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function Vc(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as bC,splitCookiesString as wC}from"set-cookie-parser";import{z as de}from"zod";var qc=de.object({name:de.string(),value:de.string(),url:de.string().optional(),domain:de.string().optional(),path:de.string().optional(),expires:de.number().default(Date.now()/1e3+60*60*24*365),httpOnly:de.boolean().optional(),secure:de.boolean().default(!0),sameSite:de.union([de.literal("Strict"),de.literal("Lax"),de.literal("None")]).default("None")});function pa(n,e){let t=[],r=wC(n);for(let o of r){let i=bC(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let s;if(i.sameSite){let p=i.sameSite.trim().toLowerCase();if(p==="strict")s="Strict";else if(p==="lax")s="Lax";else if(p==="none")s="None";else throw new Error(`Invalid sameSite setting in cookie: ${p}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let a=qc.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:s});t.push(a);let l=[a.name,...Object.keys(a)].map(p=>p.toLowerCase()),c=o.match(/\b(\S+)=([^;]*)/g);if(c)for(let p of c){let[d,u]=p.split("=");if(!d||!u)throw new Error(`Invalid key-value pair in cookie: ${p}`);l.includes(d.toLowerCase())||t.push({...a,name:d,value:u})}}return t}var vC=de.object({origin:de.string(),localStorage:de.array(de.object({name:de.string(),value:de.string()}))}),xC=de.object({entries:de.record(de.string(),de.array(de.tuple([de.unknown(),de.unknown()]))),version:de.number().optional()}),ua=de.object({cookies:qc.array().optional(),origins:vC.array().optional(),idb:de.record(de.string(),xC).optional().describe("key is db name")});function ma(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=qc.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var BU=new Set(Object.values(Be));var TC={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_WAIT:"AI wait",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"Local storage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",SUCCESS:"Done"},zU={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_WAIT:[],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],SUCCESS:[]},jU={AI_ACTION:"Ask AI achieve a specific goal. Caches the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI whether something is true on the page, retrying until a configurable timeout.",AI_WAIT:"Wait until AI considers a condition to be true.",CLICK:"Click on an element on the page based on a description.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page based on a description.",HOVER:"Hover over an element on the page based on a description.",FILE_UPLOAD:"Automatically upload a file when the next file chooser is activated.",FOCUS:"Focus an element on the page based on a description.",BLUR:"Remove focus from an element on the page based on a description.",SELECT_OPTION:"Select an option from an HTML Select <select> element based on a description.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session",LOCAL_STORAGE:"Set a local storage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JSON snapshot including cookies, local storage, and IndexDB entries.",AUTH_SAVE:"Save auth state (cookies, local storage) into a JavaScript object format usable by 'Load auth state'.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's state using pre-built conditions, including URL and content checks.",WAIT_FOR_URL:"Wait for the active page's URL to match a specific URL or glob pattern. If a new tab is opened, this command will wait for the new tab's URL to match instead.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as WU,en as GU}from"@faker-js/faker";import{z as $}from"zod";var ch=55555,YU=$.object({body:$.string(),to:$.string(),from:$.string()}),JU=$.object({from:$.string().optional(),to:$.string(),timeout:$.number().optional(),beforeDate:$.string().pipe($.coerce.date()).or($.date()).optional(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional()}),XU=$.object({to:$.string(),from:$.string(),subject:$.string(),body:$.string()}),ZU=$.object({inbox:$.string(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional(),timeout:$.number().optional(),trimWhitespace:$.boolean().optional()}),QU=$.object({inbox:$.string(),limit:$.number().optional(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional(),trimWhitespace:$.boolean().optional()});var dh=$.object({result:$.unknown(),variableUpdates:$.record($.string(),$.unknown()).optional(),persistentVariableUpdates:$.record($.string(),$.unknown()).optional(),error:$.string().optional(),success:$.boolean()}),eB=$.object({id:$.string().optional(),orgId:$.string(),momenticLambdaAuthHash:$.string(),code:$.string(),fragment:$.boolean(),state:Oi,timeoutMs:$.number().optional()}),Kn=15e3;import*as pt from"zod";ye(pt);var EC=pt.object({url:pt.string(),lineNumber:pt.number(),columnNumber:pt.number()}).openapi({ref:"CodeLocation"}),ha=pt.object({timestamp:pt.number(),text:pt.string(),type:pt.string(),tabIndex:pt.number(),args:pt.unknown().array().optional(),url:pt.string().optional(),location:EC.optional()}).openapi({ref:"ConsoleLog"}),ph=ha.array(),CC=ph.array();import*as Yc from"zod";import{z as A}from"zod";var RC=A.object({name:A.string(),version:A.string(),comment:A.string().optional()}),AC=A.object({name:A.string(),version:A.string(),comment:A.string().optional()}),IC=A.object({onContentLoad:A.number().optional(),onLoad:A.number().optional(),comment:A.string().optional()}),mh=A.object({startedDateTime:A.string(),id:A.string(),title:A.string().optional(),pageTimings:IC,comment:A.string().optional()}),PC=A.array(mh),LC=A.object({name:A.string(),value:A.string(),path:A.string().optional(),domain:A.string().optional(),expires:A.string().optional(),httpOnly:A.boolean().optional(),secure:A.boolean().optional(),comment:A.string().optional()}),hh=A.array(LC),OC=A.object({name:A.string(),value:A.string(),comment:A.string().optional()}),gh=A.array(OC),kC=A.object({name:A.string(),value:A.string(),comment:A.string().optional()}),NC=A.array(kC),_C=A.object({name:A.string(),value:A.string().optional(),fileName:A.string().optional(),contentType:A.string().optional(),comment:A.string().optional()}),MC=A.array(_C),FC=A.object({mimeType:A.string(),params:MC,text:A.string(),comment:A.string().optional()}),DC=A.object({method:A.string(),url:A.string(),httpVersion:A.string().optional(),cookies:hh,headers:gh,queryString:NC,postData:FC.optional(),headersSize:A.number().optional(),bodySize:A.number().optional(),comment:A.string().optional()}),UC=A.object({size:A.number().optional(),compression:A.number().optional(),mimeType:A.string().optional(),text:A.string().optional(),encoding:A.string().optional(),comment:A.string().optional()}),BC=A.object({status:A.number(),statusText:A.string(),httpVersion:A.string().optional(),cookies:hh,headers:gh,content:UC,redirectURL:A.string().optional(),headersSize:A.number().optional(),bodySize:A.number().optional(),comment:A.string().optional()}),uh=A.object({expires:A.string().optional(),lastAccess:A.string(),eTag:A.string(),hitCount:A.number(),comment:A.string().optional()}),zC=A.object({beforeRequest:uh.optional(),afterRequest:uh.optional(),comment:A.string().optional()}),jC=A.object({blocked:A.number().optional(),dns:A.number().optional(),connect:A.number().optional(),send:A.number(),wait:A.number(),receive:A.number(),ssl:A.number().optional(),comment:A.string().optional()}),fh=A.object({pageref:A.string().optional(),startedDateTime:A.string(),time:A.number().optional(),request:DC,response:BC.optional(),cache:zC.optional(),timings:jC,serverIPAddress:A.string().optional(),connection:A.string().optional(),comment:A.string().optional(),_resourceType:A.string().optional()}),HC=A.array(fh),$C=A.object({version:A.string().default("1.1"),creator:RC.optional(),browser:AC.optional(),pages:PC.optional(),entries:HC,comment:A.string().optional()}),WC=A.object({log:$C}),Sh=A.record(A.string(),mh),yh=A.record(A.string(),fh);function Kc(n,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(n).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime()),entries:Object.values(e).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime())}}}ye(Yc);var GC=Yc.object({logsPerPage:ha.array().array(),harPages:Sh.optional(),harEntries:yh.optional()}).openapi({ref:"DebugData"});var Lr=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var ga=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function bh(n){for(let e of Object.values(le))if(n.includes(e))return e}var R=class extends Error{reason;constructor(e,t,r){let o=!1;for(let i of Object.values(le))if(t.startsWith(i)){o=!0,e=i;break}if(r?.errOptions?.cause)super(o?t:`${e}: ${t}`,r?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,r?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:r?.lastScreenshotBuffer,enumerable:!1})}getLastScreenshotBuffer(){return"lastScreenshotBuffer"in this?this.lastScreenshotBuffer:void 0}toString(){return this.message}toJSON(){return{message:this.message}}},Yn=class extends Error{decisions;constructor(e,t,r={}){super(e,r),this.decisions=t,this.name="NoElementsFoundError"}toString(){return`${this.message}
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="db115a00-082c-55ef-b6e5-7fbf05267b88")}catch(e){}}();
4
+ var sx=Object.create;var Iu=Object.defineProperty;var ax=Object.getOwnPropertyDescriptor;var lx=Object.getOwnPropertyNames;var cx=Object.getPrototypeOf,dx=Object.prototype.hasOwnProperty;var nn=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var px=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of lx(e))!dx.call(n,o)&&o!==t&&Iu(n,o,{get:()=>e[o],enumerable:!(r=ax(e,o))||r.enumerable});return n};var Pu=(n,e,t)=>(t=n!=null?sx(cx(n)):{},px(e||!n||!n.__esModule?Iu(t,"default",{value:n,enumerable:!0}):t,n));var ly=nn((Ja,$d)=>{"use strict";(function(n){typeof define=="function"&&define.amd?define([],n):typeof Ja=="object"?(Ja=n(),typeof $d=="object"&&($d.exports=Ja)):window?window.JClass=n():typeof console=="object"&&console.error instanceof Function&&console.error("cannot determine environment")})(function(){var n=function(i){return i instanceof Function},e=function(i){var s=Array.prototype.slice.call(arguments,1);for(var a in s){var l=s[a];if(typeof l=="object")for(var c in l)i[c]=l[c]}return i},t={_isClassObject:!1},r=!1,o=function(){};return o._subClasses=[],o.prototype.init=function(){},o._extend=function(i,s,a){i===void 0&&(i={}),s===void 0&&(s={}),a===void 0&&(a={}),a=e({},t,a);var l=function(){r||(this._class=l,this.init instanceof Function&&this.init.apply(this,arguments))},c=this;r=!0;var p=new c;r=!1;var d=c.prototype;l.prototype=p,l.prototype.constructor=l,l._superClass=c,l._subClasses=[],c._subClasses.push(l),l._extend=c._extend,l._extends=function(b){return this._superClass==o?!1:b==this._superClass||b==o?!0:this._superClass._extends(b)};for(var u in i){var m=Object.getOwnPropertyDescriptor(i,u),h=m.value;if(h!==null&&typeof h=="object"&&h.descriptor)Object.defineProperty(p,u,h);else if(!("value"in m)&&("set"in m||"get"in m))Object.defineProperty(p,u,m);else{p[u]=h;var g=d[u];n(h)&&n(g)&&h!==g&&(h._super=g)}}if(!a._isClassObject){var f=c._members===void 0?o:c._members._class,S=e({},a,{_isClassObject:!0}),x=f._extend(s,{},S);x._instanceClass=l,l._members=new x}return l},o._convert=function(i,s){var a=i.prototype;return a.init=function(){var l=this._origin=o._construct(i,arguments);Object.keys(l).forEach(function(c){l.hasOwnProperty(c)&&Object.defineProperty(this,c,{get:function(){return l[c]}})},this)},o._extend(a,{},s)},o._construct=function(i,s){s===void 0&&(s=[]);var a=function(){return i.apply(this,s)};return a.prototype=i.prototype,new a},o._superDescriptor=function(i,s){if("_class"in i&&i instanceof i._class&&(i=i._class),"_extends"in i&&i._extends instanceof Function&&i._extends(this))return Object.getOwnPropertyDescriptor(i._superClass.prototype,s)},o})});var dy=nn((A7,cy)=>{"use strict";var pP=ly(),$r=pP._extend({init:function(n,e,t){n=n instanceof Array?n:[n],this._map={},this._list=[],this.callback=e,this.keyFields=n,this.isHashArray=!0,this.options=t||{ignoreDuplicates:!1},e&&e("construct")},addOne:function(n){var e=!1;for(var t in this.keyFields){t=this.keyFields[t];var r=this.objectAt(n,t);if(r)if(this.has(r)){if(this.options.ignoreDuplicates)return;if(this._map[r].indexOf(n)!=-1){e=!0;continue}this._map[r].push(n)}else this._map[r]=[n]}(!e||this._list.indexOf(n)==-1)&&this._list.push(n)},add:function(){for(var n=0;n<arguments.length;n++)this.addOne(arguments[n]);return this.callback&&this.callback("add",Array.prototype.slice.call(arguments,0)),this},addAll:function(n){if(n.length<100)this.add.apply(this,n);else for(var e=0;e<n.length;e++)this.add(n[e]);return this},addMap:function(n,e){return this._map[n]=e,this.callback&&this.callback("addMap",{key:n,obj:e}),this},intersection:function(n){var e=this;if(!n||!n.isHashArray)throw Error("Cannot HashArray.intersection() on a non-hasharray object. You passed in: ",n);var t=this.clone(null,!0),r=this.clone(null,!0).addAll(this.all.concat(n.all));return r.all.forEach(function(o){e.collides(o)&&n.collides(o)&&t.add(o)}),t},complement:function(n){var e=this;if(!n||!n.isHashArray)throw Error("Cannot HashArray.complement() on a non-hasharray object. You passed in: ",n);var t=this.clone(null,!0);return this.all.forEach(function(r){n.collides(r)||t.add(r)}),t},get:function(n){if(this.has(n))return!(this._map[n]instanceof Array)||this._map[n].length!=1?this._map[n]:this._map[n][0]},getAll:function(n){if(n=n instanceof Array?n:[n],n[0]=="*")return this.all;var e=new $r(this.keyFields);for(var t in n)e.add.apply(e,this.getAsArray(n[t]));return e.all},getAsArray:function(n){return this._map[n]||[]},getUniqueRandomIntegers:function(n,e,t){var r=[],o={};for(n=Math.min(Math.max(t-e,1),n);r.length<n;){var i=Math.floor(e+Math.random()*(t+1));o[i]||(o[i]=!0,r.push(i))}return r},sample:function(n,e){var t=this.all,r={},o=[];e&&(t=this.getAll(e));for(var i=this.getUniqueRandomIntegers(n,0,t.length-1),s=0;s<i.length;s++)o.push(t[i[s]]);return o},has:function(n){return this._map.hasOwnProperty(n)},collides:function(n){for(var e in this.keyFields)if(this.has(this.objectAt(n,this.keyFields[e])))return!0;return!1},hasMultiple:function(n){return this._map[n]instanceof Array},removeByKey:function(){for(var n=[],e=0;e<arguments.length;e++){var t=arguments[e],r=this._map[t].concat();if(r){n=n.concat(r);for(var o in r){var i=r[o];for(var s in this.keyFields){var a=this.objectAt(i,this.keyFields[s]);if(a&&this.has(a)){var s=this._map[a].indexOf(i);s!=-1&&this._map[a].splice(s,1),this._map[a].length==0&&delete this._map[a]}}this._list.splice(this._list.indexOf(i),1)}}delete this._map[t]}return this.callback&&this.callback("removeByKey",n),this},remove:function(){for(var n=0;n<arguments.length;n++){var e=arguments[n];for(var r in this.keyFields){var t=this.objectAt(e,this.keyFields[r]);if(t){var r=this._map[t].indexOf(e);if(r!=-1)this._map[t].splice(r,1);else throw new Error("HashArray: attempting to remove an object that was never added!"+t);this._map[t].length==0&&delete this._map[t]}}var r=this._list.indexOf(e);if(r!=-1)this._list.splice(r,1);else throw new Error("HashArray: attempting to remove an object that was never added!"+t)}return this.callback&&this.callback("remove",arguments),this},removeAll:function(){var n=this._list.concat();return this._map={},this._list=[],this.callback&&this.callback("remove",n),this},objectAt:function(n,e){if(typeof e=="string")return n[e];for(var t=e.concat();t.length&&n;)n=n[t.shift()];return n},forEach:function(n,e){n=n instanceof Array?n:[n];var t=this.getAll(n);return t.forEach(e),this},forEachDeep:function(n,e,t){n=n instanceof Array?n:[n];var r=this,o=this.getAll(n);return o.forEach(function(i){t(r.objectAt(i,e),i)}),this},clone:function(n,e){var t=new $r(this.keyFields.concat(),n||this.callback);return e||t.add.apply(t,this.all.concat()),t},sum:function(n,e,t){var r=this,o=0;return this.forEachDeep(n,e,function(i,s){t!==void 0&&(i*=r.objectAt(s,t)),o+=i}),o},average:function(n,e,t){var r=0,o=0,i=0,s=this;return t!==void 0&&this.forEachDeep(n,t,function(a){i+=a}),this.forEachDeep(n,e,function(a,l){t!==void 0&&(a*=s.objectAt(l,t)/i),r+=a,o++}),t!==void 0?r:r/o},filter:function(n,e){var t=this,r=typeof e=="function"?e:i,o=new $r(this.keyFields);return o.addAll(this.getAll(n).filter(r)),o;function i(s){var a=t.objectAt(s,e);return a!==void 0&&a!==!1}}});Object.defineProperty($r.prototype,"all",{get:function(){return this._list}});Object.defineProperty($r.prototype,"map",{get:function(){return this._map}});cy.exports=$r;typeof window<"u"&&(window.HashArray=$r)});var uy=nn((I7,py)=>{"use strict";py.exports=dy()});var hy=nn((P7,my)=>{"use strict";(function(){var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e={rotl:function(t,r){return t<<r|t>>>32-r},rotr:function(t,r){return t<<32-r|t>>>r},endian:function(t){if(t.constructor==Number)return e.rotl(t,8)&16711935|e.rotl(t,24)&4278255360;for(var r=0;r<t.length;r++)t[r]=e.endian(t[r]);return t},randomBytes:function(t){for(var r=[];t>0;t--)r.push(Math.floor(Math.random()*256));return r},bytesToWords:function(t){for(var r=[],o=0,i=0;o<t.length;o++,i+=8)r[i>>>5]|=t[o]<<24-i%32;return r},wordsToBytes:function(t){for(var r=[],o=0;o<t.length*32;o+=8)r.push(t[o>>>5]>>>24-o%32&255);return r},bytesToHex:function(t){for(var r=[],o=0;o<t.length;o++)r.push((t[o]>>>4).toString(16)),r.push((t[o]&15).toString(16));return r.join("")},hexToBytes:function(t){for(var r=[],o=0;o<t.length;o+=2)r.push(parseInt(t.substr(o,2),16));return r},bytesToBase64:function(t){for(var r=[],o=0;o<t.length;o+=3)for(var i=t[o]<<16|t[o+1]<<8|t[o+2],s=0;s<4;s++)o*8+s*6<=t.length*8?r.push(n.charAt(i>>>6*(3-s)&63)):r.push("=");return r.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/ig,"");for(var r=[],o=0,i=0;o<t.length;i=++o%4)i!=0&&r.push((n.indexOf(t.charAt(o-1))&Math.pow(2,-2*i+8)-1)<<i*2|n.indexOf(t.charAt(o))>>>6-i*2);return r}};my.exports=e})()});var Gd=nn((L7,gy)=>{"use strict";var Wd={utf8:{stringToBytes:function(n){return Wd.bin.stringToBytes(unescape(encodeURIComponent(n)))},bytesToString:function(n){return decodeURIComponent(escape(Wd.bin.bytesToString(n)))}},bin:{stringToBytes:function(n){for(var e=[],t=0;t<n.length;t++)e.push(n.charCodeAt(t)&255);return e},bytesToString:function(n){for(var e=[],t=0;t<n.length;t++)e.push(String.fromCharCode(n[t]));return e.join("")}}};gy.exports=Wd});var yy=nn((O7,Sy)=>{"use strict";Sy.exports=function(n){return n!=null&&(fy(n)||uP(n)||!!n._isBuffer)};function fy(n){return!!n.constructor&&typeof n.constructor.isBuffer=="function"&&n.constructor.isBuffer(n)}function uP(n){return typeof n.readFloatLE=="function"&&typeof n.slice=="function"&&fy(n.slice(0,0))}});var wy=nn((k7,by)=>{"use strict";(function(){var n=hy(),e=Gd().utf8,t=yy(),r=Gd().bin,o=function(i,s){i.constructor==String?s&&s.encoding==="binary"?i=r.stringToBytes(i):i=e.stringToBytes(i):t(i)?i=Array.prototype.slice.call(i,0):!Array.isArray(i)&&i.constructor!==Uint8Array&&(i=i.toString());for(var a=n.bytesToWords(i),l=i.length*8,c=1732584193,p=-271733879,d=-1732584194,u=271733878,m=0;m<a.length;m++)a[m]=(a[m]<<8|a[m]>>>24)&16711935|(a[m]<<24|a[m]>>>8)&4278255360;a[l>>>5]|=128<<l%32,a[(l+64>>>9<<4)+14]=l;for(var h=o._ff,g=o._gg,f=o._hh,S=o._ii,m=0;m<a.length;m+=16){var x=c,b=p,w=d,E=u;c=h(c,p,d,u,a[m+0],7,-680876936),u=h(u,c,p,d,a[m+1],12,-389564586),d=h(d,u,c,p,a[m+2],17,606105819),p=h(p,d,u,c,a[m+3],22,-1044525330),c=h(c,p,d,u,a[m+4],7,-176418897),u=h(u,c,p,d,a[m+5],12,1200080426),d=h(d,u,c,p,a[m+6],17,-1473231341),p=h(p,d,u,c,a[m+7],22,-45705983),c=h(c,p,d,u,a[m+8],7,1770035416),u=h(u,c,p,d,a[m+9],12,-1958414417),d=h(d,u,c,p,a[m+10],17,-42063),p=h(p,d,u,c,a[m+11],22,-1990404162),c=h(c,p,d,u,a[m+12],7,1804603682),u=h(u,c,p,d,a[m+13],12,-40341101),d=h(d,u,c,p,a[m+14],17,-1502002290),p=h(p,d,u,c,a[m+15],22,1236535329),c=g(c,p,d,u,a[m+1],5,-165796510),u=g(u,c,p,d,a[m+6],9,-1069501632),d=g(d,u,c,p,a[m+11],14,643717713),p=g(p,d,u,c,a[m+0],20,-373897302),c=g(c,p,d,u,a[m+5],5,-701558691),u=g(u,c,p,d,a[m+10],9,38016083),d=g(d,u,c,p,a[m+15],14,-660478335),p=g(p,d,u,c,a[m+4],20,-405537848),c=g(c,p,d,u,a[m+9],5,568446438),u=g(u,c,p,d,a[m+14],9,-1019803690),d=g(d,u,c,p,a[m+3],14,-187363961),p=g(p,d,u,c,a[m+8],20,1163531501),c=g(c,p,d,u,a[m+13],5,-1444681467),u=g(u,c,p,d,a[m+2],9,-51403784),d=g(d,u,c,p,a[m+7],14,1735328473),p=g(p,d,u,c,a[m+12],20,-1926607734),c=f(c,p,d,u,a[m+5],4,-378558),u=f(u,c,p,d,a[m+8],11,-2022574463),d=f(d,u,c,p,a[m+11],16,1839030562),p=f(p,d,u,c,a[m+14],23,-35309556),c=f(c,p,d,u,a[m+1],4,-1530992060),u=f(u,c,p,d,a[m+4],11,1272893353),d=f(d,u,c,p,a[m+7],16,-155497632),p=f(p,d,u,c,a[m+10],23,-1094730640),c=f(c,p,d,u,a[m+13],4,681279174),u=f(u,c,p,d,a[m+0],11,-358537222),d=f(d,u,c,p,a[m+3],16,-722521979),p=f(p,d,u,c,a[m+6],23,76029189),c=f(c,p,d,u,a[m+9],4,-640364487),u=f(u,c,p,d,a[m+12],11,-421815835),d=f(d,u,c,p,a[m+15],16,530742520),p=f(p,d,u,c,a[m+2],23,-995338651),c=S(c,p,d,u,a[m+0],6,-198630844),u=S(u,c,p,d,a[m+7],10,1126891415),d=S(d,u,c,p,a[m+14],15,-1416354905),p=S(p,d,u,c,a[m+5],21,-57434055),c=S(c,p,d,u,a[m+12],6,1700485571),u=S(u,c,p,d,a[m+3],10,-1894986606),d=S(d,u,c,p,a[m+10],15,-1051523),p=S(p,d,u,c,a[m+1],21,-2054922799),c=S(c,p,d,u,a[m+8],6,1873313359),u=S(u,c,p,d,a[m+15],10,-30611744),d=S(d,u,c,p,a[m+6],15,-1560198380),p=S(p,d,u,c,a[m+13],21,1309151649),c=S(c,p,d,u,a[m+4],6,-145523070),u=S(u,c,p,d,a[m+11],10,-1120210379),d=S(d,u,c,p,a[m+2],15,718787259),p=S(p,d,u,c,a[m+9],21,-343485551),c=c+x>>>0,p=p+b>>>0,d=d+w>>>0,u=u+E>>>0}return n.endian([c,p,d,u])};o._ff=function(i,s,a,l,c,p,d){var u=i+(s&a|~s&l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._gg=function(i,s,a,l,c,p,d){var u=i+(s&l|a&~l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._hh=function(i,s,a,l,c,p,d){var u=i+(s^a^l)+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._ii=function(i,s,a,l,c,p,d){var u=i+(a^(s|~l))+(c>>>0)+d;return(u<<p|u>>>32-p)+s},o._blocksize=16,o._digestsize=16,by.exports=function(i,s){if(i==null)throw new Error("Illegal argument "+i);var a=n.wordsToBytes(o(i,s));return s&&s.asBytes?a:s&&s.asString?r.bytesToString(a):n.bytesToHex(a)}})()});var xy=nn((N7,Kd)=>{"use strict";var Vd=uy(),mP=wy(),hP=1024,vy=/^[\s]*$/,gP=[{regex:/[åäàáâãæ]/ig,alternate:"a"},{regex:/[èéêë]/ig,alternate:"e"},{regex:/[ìíîï]/ig,alternate:"i"},{regex:/[òóôõö]/ig,alternate:"o"},{regex:/[ùúûü]/ig,alternate:"u"},{regex:/[æ]/ig,alternate:"ae"}];String.prototype.replaceCharAt=function(n,e){return this.substring(0,n)+e+this.substr(n+e.length)};var Ji=function(n,e){this.options=e||{},this.options.ignoreCase=this.options.ignoreCase===void 0?!0:this.options.ignoreCase,this.options.maxCacheSize=this.options.maxCacheSize||hP,this.options.cache=this.options.hasOwnProperty("cache")?this.options.cache:!0,this.options.splitOnRegEx=this.options.hasOwnProperty("splitOnRegEx")?this.options.splitOnRegEx:/[\s.,\/#!$%\^&\*;:{}=\-_`~()]/g,this.options.splitOnGetRegEx=this.options.hasOwnProperty("splitOnGetRegEx")?this.options.splitOnGetRegEx:this.options.splitOnRegEx,this.options.min=this.options.min||1,this.options.keepAll=this.options.hasOwnProperty("keepAll")?this.options.keepAll:!1,this.options.keepAllKey=this.options.hasOwnProperty("keepAllKey")?this.options.keepAllKey:"id",this.options.idFieldOrFunction=this.options.hasOwnProperty("idFieldOrFunction")?this.options.idFieldOrFunction:void 0,this.options.expandRegexes=this.options.expandRegexes||gP,this.options.insertFullUnsplitKey=this.options.hasOwnProperty("insertFullUnsplitKey")?this.options.insertFullUnsplitKey:!1,this.options.defaultReducer=this.options.hasOwnProperty("defaultReducer")?this.options.defaultReducer:Ji.UNION_REDUCER,this.keyFields=n?n instanceof Array?n:[n]:[],this.root={},this.size=0,this.options.cache&&(this.getCache=new Vd("key"))};function qd(n,e){return e.length===1?n[e[0]]:qd(n[e[0]],e.slice(1,e.length))}Ji.prototype={add:function(n,e){this.options.cache&&this.clearCache(),typeof e=="number"&&(e=void 0);var t=e||this.keyFields;for(var r in t){var o=t[r],i=o instanceof Array,s=i?qd(n,o):n[o];if(s){s=s.toString(),this.options.ignoreCase&&(s=s.toLowerCase());for(var a=this.expandString(s),l=0;l<a.length;l++){var c=a[l];this.map(c,n,e)}}}},remove:function(n,e){if(n){n=n.toString(),n=this.options.ignoreCase?n.toLowerCase():n,e=e||this.keyFields,e=e instanceof Array?e:[e],this.options.cache&&this.clearCache();var t=this.expandString(n);for(var r of t){var o=this.options.splitOnRegEx?r.split(this.options.splitOnRegEx):[r];for(var i of o)this.removeNode(this.root,e,n,i)}}},removeNode:function(n,e,t,r){if(!n)return null;if(!r.length){n.value&&(n.value=n.value.filter(i=>!e.some(s=>{var a=i[s]||"";return a=this.options.ignoreCase?a.toLowerCase():a,a.indexOf(t)>-1})),n.value.length||delete n.value);return}var o=r[0];n[o]&&(this.removeNode(n[o],e,t,r.slice(1)),this.deleteNodeIfEmpty(n,o))},deleteNodeIfEmpty:function(n,e){Object.keys(n[e]).length===0&&(delete n[e],this.size--)},expandString:function(n){var e=[n];if(this.options.expandRegexes&&this.options.expandRegexes.length)for(var t=0;t<this.options.expandRegexes.length;t++)for(var r=this.options.expandRegexes[t],o;(o=r.regex.exec(n))!==null;){var i=n.replaceCharAt(o.index,r.alternate);e.push(i)}return e},addAll:function(n,e){for(var t=0;t<n.length;t++)this.add(n[t],e)},reset:function(){this.root={},this.size=0},clearCache:function(){this.getCache=new Vd("key")},cleanCache:function(){for(;this.getCache.all.length>this.options.maxCacheSize;)this.getCache.remove(this.getCache.all[0])},addFromObject:function(n,e){this.options.cache&&this.clearCache(),e=e||"value",this.keyFields.indexOf("_key_")==-1&&this.keyFields.push("_key_");for(var t in n){var r={_key_:t};r[e]=n[t],this.add(r)}},map:function(n,e,t){if(this.options.splitOnRegEx&&this.options.splitOnRegEx.test(n)){var r=n.split(this.options.splitOnRegEx),o=r.filter(function(u){return vy.test(u)}),i=r.filter(function(u){return u===n}),s=i.length+o.length===r.length;if(!s){for(var a=0,l=r.length;a<l;a++)vy.test(r[a])||this.map(r[a],e,t);if(!this.options.insertFullUnsplitKey)return}}this.options.cache&&this.clearCache(),this.options.keepAll&&(this.indexed=this.indexed||new Vd([this.options.keepAllKey]),this.indexed.add(e)),this.options.ignoreCase&&(n=n.toLowerCase());var c=this.keyToArr(n),p=this;d(c,e,this.root);try{e.$tsid=this.getId(e,t)}catch(u){throw console.warn("TrieSearch: since version 2.2 you cannot insert primitives as items, you must wrap them in an Object. This was done for performance."),u}function d(u,m,h){if(u.length==0){h.value=h.value||[],h.value.push(m);return}var g=u.shift();h[g]||p.size++,h[g]=h[g]||{},d(u,m,h[g])}},keyToArr:function(n){var e;if(this.options.min&&this.options.min>1){if(n.length<this.options.min)return[];e=[n.substring(0,this.options.min)],e=e.concat(n.substring(this.options.min).split(""))}else e=n.split("");return e},findNode:function(n){return e(this.keyToArr(n),this.root);function e(t,r){if(r){if(t.length===0)return r;var o=t.shift();return e(t,r[o])}}},_getCacheKey:function(n,e){var t=n;return e&&(t=n+"_"+e),t},_get:function(n,e){var t=this;n=this.options.ignoreCase?n.toLowerCase():n;var r,o,i=[],s={};if(this.options.cache&&(r=this.getCache.get(this._getCacheKey(n,e))))return r.value;if(o=this.findNode(n),o&&l(o),this.options.cache){var a=this._getCacheKey(n,e);this.getCache.add({key:a,value:i}),this.cleanCache()}return i;function l(c){if(i.length!==e){if(c.value&&c.value.length)for(let u=0;u<c.value.length;u++){var p=c.value[u];if(!e||i.length<e){let m=t.getId(p);if(s[m])continue;i.push(p),s[m]=p}}if(i.length!==e)for(var d in c)d!=="value"&&l(c[d])}}},get:function(n,e,t){var r=void 0;e=e||this.options.defaultReducer,typeof n=="string"&&(n=this.options.splitOnGetRegEx?n.split(this.options.splitOnGetRegEx):[n]),n=n.filter(l=>!this.options.min||l.length>=this.options.min);for(var o=0,i=n.length;o<i;o++){var s=n[o],a=this._get(s,t);r=e(r,s,a,this)}return r||[]},search:function(n,e,t){return this.get(n,e,t)},getId:function(n,e){if(n.$tsid)return n.$tsid;if(!this.options.idFieldOrFunction){var t="",r=e||this.keyFields;for(let s=0;s<r.length;s++){var o=r[s],i=typeof o=="string"?n[o]:qd(n,o);if(i==null)throw new Error(`Since 2.2.0 of TrieSearch, if you have undefined/null keyFields (or customKeys) on your items you must specify an idFieldOrFunction. item.${o} === ${i}`);t+=i.toString()}return mP(t)}return typeof this.options.idFieldOrFunction=="function"?this.options.idFieldOrFunction(n):n[this.options.idFieldOrFunction]}};Ji.UNION_REDUCER=function(n,e,t,r){if(n===void 0)return t;var o={},i=[];return n.forEach(function(s){o[r.getId(s)]=!0}),t.forEach(function(s){var a=r.getId(s);o[a]&&i.push(s)}),i};Kd.exports=Ji;Kd.exports.default=Ji});var Ey=nn((_7,Ty)=>{"use strict";Ty.exports=xy()});var Sb=nn((fie,fb)=>{"use strict";fb.exports=hb;function hb(n,e,t){n instanceof RegExp&&(n=mb(n,t)),e instanceof RegExp&&(e=mb(e,t));var r=gb(n,e,t);return r&&{start:r[0],end:r[1],pre:t.slice(0,r[0]),body:t.slice(r[0]+n.length,r[1]),post:t.slice(r[1]+e.length)}}function mb(n,e){var t=e.match(n);return t?t[0]:null}hb.range=gb;function gb(n,e,t){var r,o,i,s,a,l=t.indexOf(n),c=t.indexOf(e,l+1),p=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;p>=0&&!a;)p==l?(r.push(p),l=t.indexOf(n,p+1)):r.length==1?a=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,s=c),c=t.indexOf(e,p+1)),p=l<c&&l>=0?l:c;r.length&&(a=[i,s])}return a}});var Cb=nn((Sie,Eb)=>{"use strict";var yb=Sb();Eb.exports=kL;var bb="\0SLASH"+Math.random()+"\0",wb="\0OPEN"+Math.random()+"\0",mp="\0CLOSE"+Math.random()+"\0",vb="\0COMMA"+Math.random()+"\0",xb="\0PERIOD"+Math.random()+"\0";function up(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function LL(n){return n.split("\\\\").join(bb).split("\\{").join(wb).split("\\}").join(mp).split("\\,").join(vb).split("\\.").join(xb)}function OL(n){return n.split(bb).join("\\").split(wb).join("{").split(mp).join("}").split(vb).join(",").split(xb).join(".")}function Tb(n){if(!n)return[""];var e=[],t=yb("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,s=r.split(",");s[s.length-1]+="{"+o+"}";var a=Tb(i);return i.length&&(s[s.length-1]+=a.shift(),s.push.apply(s,a)),e.push.apply(e,s),e}function kL(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),os(LL(n),!0).map(OL)):[]}function NL(n){return"{"+n+"}"}function _L(n){return/^-?0\d/.test(n)}function ML(n,e){return n<=e}function FL(n,e){return n>=e}function os(n,e){var t=[],r=yb("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?os(r.post,!1):[""];if(/\$$/.test(r.pre))for(var s=0;s<i.length;s++){var a=o+"{"+r.body+"}"+i[s];t.push(a)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),p=l||c,d=r.body.indexOf(",")>=0;if(!p&&!d)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+mp+r.post,os(n)):[n];var u;if(p)u=r.body.split(/\.\./);else if(u=Tb(r.body),u.length===1&&(u=os(u[0],!1).map(NL),u.length===1))return i.map(function(D){return r.pre+u[0]+D});var m;if(p){var h=up(u[0]),g=up(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(up(u[2])):1,x=ML,b=g<h;b&&(S*=-1,x=FL);var w=u.some(_L);m=[];for(var E=h;x(E,g);E+=S){var C;if(c)C=String.fromCharCode(E),C==="\\"&&(C="");else if(C=String(E),w){var I=f-C.length;if(I>0){var N=new Array(I+1).join("0");E<0?C="-"+N+C.slice(1):C=N+C}}m.push(C)}}else{m=[];for(var P=0;P<u.length;P++)m.push.apply(m,os(u[P],!1))}for(var P=0;P<m.length;P++)for(var s=0;s<i.length;s++){var a=o+m[P]+i[s];(!e||p||a)&&t.push(a)}}return t}});var nc=(n,e)=>{},ui=()=>{},rc=!1;try{let n=await import("@sentry/node"),{nodeProfilingIntegration:e}=await import("@sentry/profiling-node");nc=n.captureException,ui=n.profiler.stopProfiler,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",integrations:[e()],environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:1}),n.profiler.startProfiler(),rc=!0}catch{}import{Command as i_,Option as en}from"@commander-js/extra-typings";import{execSync as s_}from"child_process";import Uw from"body-parser";import Dk from"cors";import Uk from"dedent";import Bk from"events";import Bw,{Router as zk}from"express";import jk from"http";import{z as Lu}from"zod";var b_=Lu.object({input:Lu.string()});import{z as je}from"zod";var x_=je.object({srcs:je.array(je.string()),urls:je.array(je.string()),desiredSrc:je.string().optional(),desiredUrl:je.string().optional()}),Ou=je.object({srcRegex:je.string().optional(),urlRegex:je.string().optional()}),ku=je.object({x:je.number(),y:je.number(),correlation:je.number()}),T_=je.object({searchImageBase64String:je.string(),pageImageBase64String:je.string(),id:je.string().uuid(),timeoutMs:je.number().max(1e4).min(0).optional()});import{z as k}from"zod";import{v4 as Re}from"uuid";import*as v from"zod";function ye(n){if(typeof n.ZodType.prototype.openapi<"u")return;n.ZodType.prototype.openapi=function(o){return new this.constructor({...this._def,openapi:o})};let e=n.ZodObject.prototype.extend;n.ZodObject.prototype.extend=function(...o){let i=e.apply(this,o);return i._def.extendMetadata={extends:this},delete i._def.openapi,i};let t=n.ZodObject.prototype.omit;n.ZodObject.prototype.omit=function(...o){let i=t.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i};let r=n.ZodObject.prototype.pick;n.ZodObject.prototype.pick=function(...o){let i=r.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i}}import{z as ue}from"zod";ye(ue);var Nu=ue.object({plan:ue.string().optional(),evidence:ue.string().optional(),thoughts:ue.string(),result:ue.boolean(),relevantElements:ue.array(ue.number()).optional()}),ro=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(ro||{});var ux=ue.object({type:ue.literal("ELEMENT_CONTENT"),negated:ue.boolean().optional(),operation:ue.nativeEnum(ro),value:ue.string()}).openapi({ref:"ElementContentAssertion"}),mx=ue.object({type:ue.literal("ELEMENT_ATTRIBUTE"),negated:ue.boolean().optional(),operation:ue.nativeEnum(ro),attr:ue.string(),value:ue.string()}).openapi({ref:"ElementAttributeValueAssertion"}),mi=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(mi||{}),hx=ue.object({type:ue.literal("ELEMENT_EXISTENCE"),negated:ue.boolean().optional(),condition:ue.nativeEnum(mi).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),_u=ue.discriminatedUnion("type",[ux,mx,hx]).openapi({ref:"ManualElementAssertion"});var gx=ue.object({type:ue.literal("CONTENT"),negated:ue.boolean().optional(),value:ue.string()}).openapi({ref:"PageContentAssertion"}),Mu=ue.discriminatedUnion("type",[gx]).openapi({ref:"ManualPageAssertion"});import*as K from"zod";ye(K);var Gn=(a=>(a.AI="AI",a.AI_HEALED="AI_HEALED",a.CLICK_TO_FIND="CLICK_TO_FIND",a.XY_PERCENT="XY_PERCENT",a.RECORDING="RECORDING",a.USER_CSS_SELECTOR="USER_CSS_SELECTOR",a.HEURISTIC_HEALED="HEURISTIC_HEALED",a))(Gn||{}),fx=K.object({mPathSelectorTokens:K.string().array(),frameSrcRegex:K.string().optional(),frameUrlRegex:K.string().optional(),indices:K.number().array()}),yr=K.object({id:K.number().int(),dataMomenticId:K.number().int().optional(),selector:K.string().optional(),generatedSelectors:K.string().array().optional(),role:K.string().optional(),name:K.string().optional(),numChildren:K.number().optional(),content:K.string().optional(),pathFromRoot:K.string().optional(),serializedForm:K.string().optional(),nodeOnlySerializedForm:K.string().optional(),serializedHtml:K.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:K.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:K.string().url().optional(),boundingBox:K.object({x:K.number().optional(),y:K.number().optional(),width:K.number(),height:K.number()}).describe("css pixel bounding box").optional(),frameCache:fx.optional(),inputDescription:K.string().optional().describe("the description that generated this cache"),targetSource:K.nativeEnum(Gn).optional(),targetUpdateTime:K.string().optional()}).openapi({ref:"A11yTargetWithCache"});function Fu(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var Sx=K.object({type:K.literal("description"),elementDescriptor:K.string(),a11yData:yr.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),yx=K.object({x:K.number(),y:K.number()}),bx=K.object({type:K.literal("coordinates"),pixels:yx}).openapi({ref:"CoordinatesTarget"});function Vn(n){return n.type==="description"}function Sn(n){return n.type==="coordinates"}var ct=K.discriminatedUnion("type",[Sx,bx]).openapi({ref:"ElementTarget"});function oc(n){if(!n)return!1;switch(n.type){case"description":return!!n.elementDescriptor}return!0}function dt(n){if(!n)return"";switch(n.type){case"description":return n.elementDescriptor;case"coordinates":return`x: ${n.pixels.x}, y: ${n.pixels.y}`}}import{z as oe}from"zod";var Is=oe.object({url:oe.string(),method:oe.union([oe.literal("GET"),oe.literal("POST"),oe.literal("PUT"),oe.literal("DELETE"),oe.literal("PATCH")]),headers:oe.record(oe.string(),oe.string()).optional(),params:oe.record(oe.string(),oe.string()).optional(),body:oe.string().optional(),timeout:oe.number().int().optional().describe("Max seconds to wait for the request to complete")}),Du=oe.object({url:oe.string(),headers:oe.record(oe.string(),oe.string()).optional(),query:oe.string(),variables:oe.record(oe.string(),oe.string()).optional(),timeout:oe.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ps=oe.object({code:oe.string(),fragment:oe.boolean().optional(),environment:oe.union([oe.literal("NODE"),oe.literal("BROWSER")]).optional().describe("default NODE"),timeout:oe.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Be=(G=>(G.AI_EXTRACT="AI_EXTRACT",G.AI_ASSERTION="AI_ASSERTION",G.AI_WAIT="AI_WAIT",G.AUTH_LOAD="AUTH_LOAD",G.AUTH_SAVE="AUTH_SAVE",G.BLUR="BLUR",G.CAPTCHA="CAPTCHA",G.CLICK="CLICK",G.COOKIE="COOKIE",G.COPY="COPY",G.DIALOG="DIALOG",G.DRAG="DRAG",G.ELEMENT_CHECK="ELEMENT_CHECK",G.FILE_UPLOAD="FILE_UPLOAD",G.FOCUS="FOCUS",G.GO_BACK="GO_BACK",G.GO_FORWARD="GO_FORWARD",G.HOVER="HOVER",G.JAVASCRIPT="JAVASCRIPT",G.LOCAL_STORAGE="LOCAL_STORAGE",G.MOUSE_DRAG="MOUSE_DRAG",G.NAVIGATE="NAVIGATE",G.NEW_TAB="NEW_TAB",G.PAGE_CHECK="PAGE_CHECK",G.PASTE="PASTE",G.PRESS="PRESS",G.REFRESH="REFRESH",G.REQUEST="REQUEST",G.GRAPHQL_REQUEST="GRAPHQL_REQUEST",G.SCROLL_DOWN="SCROLL_DOWN",G.SCROLL_UP="SCROLL_UP",G.SCROLL_LEFT="SCROLL_LEFT",G.SCROLL_RIGHT="SCROLL_RIGHT",G.SELECT_OPTION="SELECT_OPTION",G.SWITCH_TAB="TAB",G.TYPE="TYPE",G.VISUAL_DIFF="VISUAL_DIFF",G.WAIT="WAIT",G.WAIT_FOR_URL="WAIT_FOR_URL",G.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",G.AWAIT_LISTENER="AWAIT_LISTENER",G.SUCCESS="SUCCESS",G))(Be||{});ye(v);var Y=v.object({thoughts:v.string().optional(),id:v.string().uuid().describe("unique identifier to this step, used for step cache")}),$t=v.object({useSelector:v.boolean().optional(),force:v.boolean().optional(),disableCache:v.boolean().optional().describe("disable element caching for this step"),iframeUrl:v.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),yn=v.object({target:yr}).optional().openapi({ref:"SingleTargetCache"}),Os=v.object({loadTimeout:v.number().int().max(60).optional().describe("Max seconds for the page to load")}),wx=Y.merge(Os).merge(v.object({type:v.literal("NAVIGATE"),url:v.string()})).openapi({ref:"NavigateCommand"}),ks=$t.merge(v.object({cache:yn})),oo=Y.merge(ks.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_UP"),deltaY:v.number().optional()}))).openapi({ref:"ScrollUpCommand"}),io=Y.merge(ks.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_DOWN"),deltaY:v.number().optional()}))).openapi({ref:"ScrollDownCommand"}),so=Y.merge(ks.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_LEFT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),ao=Y.merge(ks.merge(v.object({target:ct.optional(),type:v.literal("SCROLL_RIGHT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollRightCommand"}),z_=v.discriminatedUnion("type",[oo,io,so,ao]).openapi({ref:"AllScrollCommands"}),vx=Y.merge(v.object({type:v.literal("DIALOG"),action:v.union([v.literal("ACCEPT"),v.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),xx=Y.merge(v.object({type:v.literal("WAIT"),delay:v.number()})).openapi({ref:"WaitCommand"}),Tx=v.discriminatedUnion("type",[v.object({type:v.literal("SUBSTRING"),url:v.string()}),v.object({type:v.literal("GLOB"),glob:v.string()}),v.object({type:v.literal("REGEX"),regex:v.string()})]),Ex=v.object({caseInsensitive:v.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:v.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:v.number().int().optional().describe("Max seconds to wait for the URL to match")}),Cx=Y.extend({type:v.literal("WAIT_FOR_URL"),url:v.string().optional().describe("Deprecated: url or glob to wait for. New commands should use the discriminated matcher field."),matcher:Tx.optional()}).merge(Ex).openapi({ref:"WaitUrlCommand"}),Rx=Y.merge(Os).merge(v.object({type:v.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Ax=Y.merge(v.object({type:v.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Ix=Y.merge(v.object({type:v.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),Px=Y.extend({type:v.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),Lx=Y.extend({type:v.literal("AUTH_LOAD"),storageState:v.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),sc=Y.merge($t).extend({type:v.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Ox=Y.extend({type:v.literal("COPY"),value:v.string()}).openapi({ref:"CopyCommand"}),kx=Y.extend({type:v.literal("PASTE")}).openapi({ref:"PasteCommand"}),Nx=Y.merge(Ps).extend({type:v.literal("JAVASCRIPT"),envKey:v.string().optional()}).openapi({ref:"JavaScriptCommand"}),hi=Y.merge($t).merge(v.object({type:v.literal("CLICK"),target:ct,doubleClick:v.boolean().optional(),rightClick:v.boolean().optional(),waitForUrl:v.string().optional().describe("Deprecated: wait for the click to trigger a page load or new tab that matches the provided URL or URL glob (e.g. https://google.com/**/*)."),waitForDownload:v.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:v.number().optional(),downloadTimeoutMs:v.number().optional(),cache:yn,relativePosition:v.object({x:v.number(),y:v.number()}).optional()})).openapi({ref:"ClickCommand"}),gi=Y.merge($t).merge(v.object({type:v.literal("DRAG"),fromTarget:ct,toTarget:ct,steps:v.number().optional(),hoverSeconds:v.number().optional().describe("Seconds to hover the object before dropping"),cache:v.object({fromTarget:yr.optional(),toTarget:yr.optional()}).optional()})).openapi({ref:"DragCommand"}),fi=Y.merge($t).merge(v.object({type:v.literal("MOUSE_DRAG"),target:ct.optional(),deltaX:v.string().describe("pixels to move horizontally, can be template"),deltaY:v.string().describe("pixels to move vertically, can be template"),steps:v.number().optional(),cache:yn})).openapi({ref:"MouseDragCommand"}),Si=Y.merge($t).merge(v.object({type:v.literal("HOVER"),target:ct,cache:yn})).openapi({ref:"HoverCommand"}),yi=Y.merge($t).merge(v.object({type:v.literal("FOCUS"),target:ct,cache:yn})).openapi({ref:"FocusCommand"}),bi=Y.merge($t).extend({type:v.literal("BLUR"),target:ct.optional(),cache:yn}).openapi({ref:"BlurCommand"}),_x=v.object({type:v.literal("URL"),url:v.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),Mx=v.object({type:v.literal("USER_FILE"),name:v.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),Fx=Y.extend({type:v.literal("FILE_UPLOAD"),fileSource:v.discriminatedUnion("type",[_x,Mx]),filename:v.string().optional()}).openapi({ref:"FileUploadCommand"}),Dx=v.discriminatedUnion("type",[v.object({type:v.literal("VALUE"),value:v.string()}),v.object({type:v.literal("LABEL"),label:v.string()}),v.object({type:v.literal("INDEX"),index:v.number().int()})]),wi=Y.merge($t).extend({type:v.literal("SELECT_OPTION"),target:ct,cache:yn,option:v.string().describe("option value, deprecated old field").optional(),choice:Dx.optional().describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),ac=v.union([v.literal("MULTIMODAL"),v.literal("VISION_ONLY")]),lc=Y.merge(v.object({type:v.literal("AI_ASSERTION"),assertion:v.string(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional(),contextChoice:ac.optional(),timeout:v.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),Ux=lc.extend({type:v.literal("AI_WAIT")}).openapi({ref:"AIWaitCommand"}),bn=5,cc=600,vi=Y.merge($t).extend({type:v.literal("ELEMENT_CHECK"),target:ct,assertion:_u,cache:yn,timeout:v.number().int().min(0).max(cc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Bx=Y.extend({type:v.literal("PAGE_CHECK"),assertion:Mu,iframeUrl:v.string().optional().describe("url or url regex for the iframe"),timeout:v.number().int().min(0).max(cc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),zx=Y.merge(v.object({type:v.literal("AI_EXTRACT"),goal:v.string(),schema:v.string().optional(),envKey:v.string().optional(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional()})).openapi({ref:"AIExtractCommand"}),jx=v.object({clearContent:v.boolean().optional(),forceClearContent:v.boolean().optional(),pressKeysSequentially:v.boolean().optional().describe("Deprecated: this is now the default. Please set delay to zero if you wish to achieve instant typing behavior."),delay:v.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:v.boolean().optional(),pressEnter:v.boolean().optional()}),Uu=25,xi=Y.merge($t).merge(jx).extend({type:v.literal("TYPE"),target:ct.optional(),value:v.string(),cache:yn}).openapi({ref:"TypeCommand"}),Hx=Y.merge(v.object({type:v.literal("PRESS"),value:v.string(),repeat:v.number().optional(),convertMeta:v.boolean().optional(),delayMs:v.number().optional()})).openapi({ref:"PressCommand"}),$x=v.object({type:v.literal("SUBSTRING"),substring:v.string()}),Wx=v.object({type:v.literal("REGEX"),pattern:v.string()}),Gx=v.object({type:v.literal("INDEX"),index:v.number()}),Vx=v.discriminatedUnion("type",[$x,Wx,Gx]),qx=Y.merge(Os).merge(v.object({type:v.literal("TAB"),url:v.string().optional().describe("deprecated field - new instances should use the discriminated union"),action:Vx.optional()})).openapi({ref:"TabCommand"}),Kx=Y.merge(Os).merge(v.object({type:v.literal("NEW_TAB"),url:v.string()})).openapi({ref:"NewTabCommand"}),Yx=Y.merge(v.object({type:v.literal("COOKIE"),value:v.string()})).openapi({ref:"CookieCommand"}),Jx=Y.merge(v.object({type:v.literal("LOCAL_STORAGE"),key:v.string(),value:v.string()})).openapi({ref:"LocalStorageCommand"}),Xx=Y.extend({type:v.literal("REQUEST")}).merge(Is).openapi({ref:"RequestCommand"}),Zx=Y.extend({type:v.literal("GRAPHQL_REQUEST")}).merge(Du).openapi({ref:"GraphQLRequestCommand"}),Qx=Y.merge(v.object({type:v.literal("SUCCESS"),condition:lc.optional()})).openapi({ref:"SuccessCommand"}),eT=Y.merge(v.object({type:v.literal("FAILURE")})).openapi({ref:"FailureCommand"}),tT=v.object({data:v.string().describe("location at which to find a jpg"),width:v.number(),height:v.number()}),Ti=Y.merge($t).merge(v.object({type:v.literal("VISUAL_DIFF"),threshold:v.number().optional().describe("default 0.1"),target:ct.optional(),screenshot:tT.optional(),cache:yn})).openapi({ref:"VisualDiffCommand"}),nT=Y.merge(v.object({type:v.literal("REGISTER_REQUEST_LISTENER"),pattern:v.string(),key:v.string()})).openapi({ref:"RegisterRequestListenerCommand"}),rT=Y.merge(v.object({type:v.literal("AWAIT_LISTENER"),key:v.string(),timeout:v.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),Bu=v.discriminatedUnion("type",[hi,xi,Hx,wi,wx,io,oo,lc,Si,xx,Qx]),oT=v.discriminatedUnion("type",[Ux,zx,Lx,Px,sc,Yx,Ox,vx,gi,vi,Fx,Ax,Ix,Nx,Jx,fi,Kx,Bx,kx,Rx,Xx,Zx,so,ao,qx,Ti,yi,bi,Cx,nT,rT]),lo=v.discriminatedUnion("type",[...Bu.options,...oT.options]).openapi({ref:"Command"}),Ns=v.discriminatedUnion("type",[...Bu.options,eT]);function On(n){let e;switch(n){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:Re(),type:n};break;case"AUTH_LOAD":{e={id:Re(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:Re(),type:n,goal:""};break;case"DIALOG":e={id:Re(),type:n,action:"DISMISS"};break;case"DRAG":e={id:Re(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Re(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Re(),type:n,url:""};break;case"WAIT":e={id:Re(),type:n,delay:1};break;case"BLUR":e={id:Re(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Re(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Re(),type:n,value:"",clearContent:!0};break;case"SELECT_OPTION":e={id:Re(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":case"TAB":e={id:Re(),type:n,url:""};break;case"REQUEST":e={id:Re(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Re(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Re(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:Re(),type:n,code:""};break;case"AI_WAIT":case"AI_ASSERTION":e={id:Re(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:Re(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Re(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Re(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Re(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:Re(),type:n,key:""};break}default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return e}function zu(n){switch(n.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_WAIT":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}import{z as iT}from"zod";var G_=iT.discriminatedUnion("type",[bi,sc,hi,gi,yi,Si,fi,oo,io,so,ao,wi,xi,Ti,vi]);function ju(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as sT}from"zod";var Et={type:!0,cache:!0},br=sT.discriminatedUnion("type",[bi.pick(Et),hi.pick(Et),gi.pick(Et),vi.pick(Et),yi.pick(Et),Si.pick(Et),fi.pick(Et),oo.pick(Et),io.pick(Et),so.pick(Et),ao.pick(Et),wi.pick(Et),xi.pick(Et),Ti.pick(Et)]),dc=Object.values(Be).filter(n=>br.options.some(e=>e.shape.type.safeParse(n).success));lo.options.forEach(n=>{if("target"in n.shape&&!dc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as uc}from"zod";import{z as pc}from"zod";import{z as co}from"zod";var Ct=co.object({index:co.number().optional().describe("global index within a test (in-order traversal)"),id:co.string(),skipped:co.boolean().optional(),envKey:co.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:co.boolean().optional()});ye(pc);var Rt=Ct.extend({type:pc.literal("PRESET_ACTION"),command:lo,skipped:pc.boolean().optional()}).openapi({ref:"PresetAction"});ye(uc);var wr=Ct.extend({type:uc.literal("AI_ACTION"),text:uc.string(),steps:Rt.array().optional()}).openapi({ref:"AIAction"});import{z as se}from"zod";var aT=se.object({cacheKey:se.string(),cacheExpiryMs:se.number()}),mc=Ct.extend({id:se.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:se.record(se.string()).optional(),cacheConfig:aT.optional()}),kn=mc.extend({type:se.literal("MODULE"),moduleId:se.string().uuid()}),lT=se.union([kn.pick({type:!0,moduleId:!0}),se.record(se.unknown())]),cT=se.object({type:se.literal("URL_REGEX"),regex:se.string()}),dT=se.object({type:se.literal("PAGE_CHECK"),substring:se.string()}),hc=se.object({cacheInvalidation:se.discriminatedUnion("type",[dT,cT]).optional()}),At=se.object({moduleId:se.string().uuid(),name:se.string(),description:se.string().nullish(),enabled:se.boolean().nullish(),parameters:se.string().array().nullish(),defaultParameters:se.record(se.string(),se.string()).nullish(),defaultCacheKey:se.string().nullish(),defaultCacheTtl:se.number().nullish(),defaultCacheAllInvocations:se.boolean().nullish(),autoAuth:se.boolean().nullish(),advanced:hc.nullish()});import{z as rt}from"zod";import{z as gc}from"zod";ye(gc);var po=Ct.extend({type:gc.literal("AI_ACTION_DYNAMIC"),text:gc.string()}).openapi({ref:"AIActionDynamic"});import{z as Hu}from"zod";var fc=Ct.extend({type:Hu.literal("CONDITIONAL"),skipped:Hu.boolean().optional()});import{z as _s}from"zod";var pT=_s.object({type:_s.literal("url"),url:_s.string()}),Ei=Ct.extend({type:_s.literal("IFRAME"),identifier:pT});import{z as Wt}from"zod";var Sc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(Sc||{});var uT=Wt.discriminatedUnion("type",[Wt.object({type:Wt.literal("NAVIGATE_URL"),url:Wt.string().url()}),Wt.object({type:Wt.literal("GO_TO_SECTION_START")})]),mT=Wt.object({trigger:Wt.nativeEnum(Sc).optional(),attempts:Wt.number().int().optional(),restartBehavior:uT}),Ci=Ct.extend({type:Wt.literal("SECTION"),description:Wt.string().describe("user provided goal of what the section should accomplish"),plan:Wt.string().array().optional(),autohealingConfig:mT.optional()});var $u=At.merge(mc).extend({type:rt.literal("RESOLVED_MODULE"),steps:rt.lazy(()=>ve.array())}),yc=At.extend({steps:rt.lazy(()=>ve.array())}),bc=Ei.extend({steps:rt.lazy(()=>Ke.array())}),hT=Ei.extend({steps:rt.lazy(()=>ve.array())}),wc=Ci.extend({steps:rt.lazy(()=>Ke.array())}),gT=Ci.extend({steps:rt.lazy(()=>ve.array())}),vr=fc.extend({blocks:rt.object({assertion:rt.lazy(()=>Rt),steps:rt.lazy(()=>Ke.array())}).array(),elseSteps:rt.lazy(()=>Ke.array().optional())}),fT=fc.extend({blocks:rt.object({assertion:rt.lazy(()=>Rt),steps:rt.lazy(()=>ve.array())}).array(),elseSteps:rt.lazy(()=>ve.array().optional())}),Ke=rt.discriminatedUnion("type",[Rt,wr,po,kn,vr,bc,wc]),ve=rt.discriminatedUnion("type",[Rt,wr,po,$u,fT,hT,gT]);import{z as Gt}from"zod";var ST=Gt.object({steps:Ke.array(),beforeSteps:Ke.array().nullish(),afterSteps:Ke.array().nullish()}),uo=Gt.object({steps:ve.array(),beforeSteps:ve.array().nullish(),afterSteps:ve.array().nullish()}),xr=Gt.object({steps:Gt.record(Gt.string(),Gt.unknown()).array(),beforeSteps:Gt.record(Gt.string(),Gt.unknown()).array().nullish(),afterSteps:Gt.record(Gt.string(),Gt.unknown()).array().nullish()});var He="1.0.19";import{z as Tr}from"zod";var vc=Tr.object({key:Tr.string(),testId:Tr.string().optional(),moduleId:Tr.string().optional(),organizationId:Tr.string(),value:br}),Wu=Tr.record(Tr.string(),vc);var Gu=k.object({phrase:k.string()}),xc=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),WF=k.object({text:k.string()}),Vu=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int()}),Ms=(u=>(u.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",u.FEW_WORDS="FEW_WORDS",u.STYLE_TAG="STYLE_TAG",u.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",u.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",u.NONE="NONE",u.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",u.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",u.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",u.PREFER_ASSERTION="PREFER_ASSERTION",u.HTML_ELEMENTS="HTML_ELEMENTS",u.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",u))(Ms||{});var qu=k.object({thoughts:k.string(),category:k.nativeEnum(Ms)}),yT=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),GF=k.object({thoughts:k.string(),patches:yT.array()}),Ku=[k.literal("add"),k.literal("replace"),k.literal("remove")],bT=k.object({op:k.union(Ku),path:k.string(),value:ve.optional()}),Yu=k.object({patches:bT.array(),thoughts:k.string()});var wT=k.object({thoughts:k.string(),op:k.union(Ku),value:k.union([k.null(),ve])}),Ju=k.object({reasoning:k.string(),scenario:k.string(),patch:wT.or(k.null())}),VF=k.object({thoughts:k.string(),evaluation:k.number().min(1).max(10)}),qF=k.object({observations:k.string(),reasoning:k.string(),command:Ns});var Tc=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])});import{z as F}from"zod";import*as te from"zod";var QF=te.object({thoughts:te.string().optional().describe("only provided if a description was provided"),target:yr.optional().describe("only provided if a description was provided"),pageState:te.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:te.object({label:te.string(),value:te.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:te.object({data:te.string(),height:te.number().int(),width:te.number().int()}).optional().describe("only provided if returnScreenshot is true")}),Xu=te.union([te.literal("NEGATED_CHECK"),te.literal("SELECT_OPTION"),te.literal("TYPE")]);function Ri(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.negated)return"NEGATED_CHECK"}}var Ai=(s=>(s.A11Y_ID="A11Y_ID",s.USER_SELECTOR="USER_SELECTOR",s.CSS_SELECTOR="CSS_SELECTOR",s.HTML_DISTANCE="HTML_DISTANCE",s.TEMPLATE_MATCHING="TEMPLATE_MATCHING",s.AUTO_FRAME="AUTO_FRAME",s))(Ai||{}),mo=te.object({matched:te.boolean(),reason:te.string().optional().describe("Human understandable description"),logs:te.string().array().optional().describe("Logs for debugging")}),vT=mo.extend({type:te.literal("A11Y_ID")}),xT=mo.extend({type:te.literal("USER_SELECTOR")}),TT=mo.extend({type:te.literal("CSS_SELECTOR"),selectors:te.string().array()}),ET=mo.extend({type:te.literal("HTML_DISTANCE"),distance:te.number().optional(),closestElement:te.string().optional(),savedElement:te.string().optional()}),CT=mo.extend({type:te.literal("TEMPLATE_MATCHING"),elementImageUrl:te.string().url()}),RT=mo.extend({type:te.literal("AUTO_FRAME"),logs:te.string().array().optional()}),Zu=te.discriminatedUnion("type",[vT,xT,TT,ET,CT,RT]);import{z as Ni}from"zod";import{z as KE}from"zod";import*as J from"zod";import{cloneDeep as Li}from"lodash-es";var AT=n=>{let e=Qu(n,0);if(e===void 0||!PT(n[e]))return;let t=Qu(n,e+1);if(t!==void 0)return LT(n,e,t)},em=AT,Qu=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!IT(r))return t}},IT=n=>n===" "||n===" "||n===`
5
+ `||n==="\r",PT=n=>n==="{"||n==="[",LT=(n,e,t)=>{let r;for(let o=t-1;o>e;o-=1){let i=n[o];if(i==="\r")return;if(i===`
6
+ `)return OT(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},OT=n=>n===void 0?0:n[0]===" "?n.length:n;var tm=(n,e)=>{let t=Ec(n,"toPrecision",e,e);return t===void 0?Ec(n,"toExponential",e,e):t},Ec=(n,e,t,r)=>{let i=n[e](r).replace(kT,"$1").replace(NT,"$1");return i.length<=t?i:r===1?void 0:Ec(n,e,t,r-1)},kT=/(e)\+/iu,NT=/\.?0*($|e)/iu;var rm=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);_T(e)},_T=n=>{if(MT(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<nm)throw new TypeError(`"maxSize" argument must be at least ${nm}: ${n}`)},MT=n=>{if(n===void 0)throw new TypeError('"maxSize" argument must be defined');if(!Number.isInteger(n))throw new TypeError(`"maxSize" argument must be an integer: ${n}`)},nm=7;var Fs=(n,e,t)=>{let r=im(e,t);return om(n,e,r)},om=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=WT&&r<=GT?om(n,e,t+1):t},Ds=(n,e,t)=>{if(t===void 0)return t;let r=im(e,t);return FT(n,r)},FT=(n,e)=>DT(n,e)?e-3:UT(n,e)?e-2:BT(n,e)?e-1:e,DT=(n,e)=>e>=3&&n[e-3]>=zT&&n[e-3]<=jT,UT=(n,e)=>e>=2&&n[e-2]>=HT,BT=(n,e)=>e>=1&&n[e-1]>=$T,im=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,zT=240,jT=244,HT=224,$T=194,WT=128,GT=191;var sm=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=Fs(r,r.length,e),i=Ds(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var am=/[\uD800-\uDFFF]/gu,lm="\uFFFD";var Us=n=>VT(n)?n.replace(am,lm):n,VT=n=>{for(let e=0;e<n.length;e+=1){let t=n.codePointAt(e);if(t>=55296&&t<=57343)return!0}return!1};var Ac=({input:n,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:r,firstEndSurrogate:o,lastEndSurrogate:i,increment:s,canBacktrack:a,shift:l,charIndexInit:c})=>{let p=c,d=p,u=0;for(;u<e;p+=s){d=p;let h=n.charCodeAt(p);if(Number.isNaN(h))break;if(h<=127){u+=1;continue}if(h<=2047){u+=2;continue}if(u+=3,h<t||h>r)continue;let g=n.charCodeAt(p+s);Number.isNaN(g)||g<o||g>i||(u+=1,p+=s)}return(a&&u>e?d:p)+l};var Ic=(n,e,t)=>e<0||Object.is(e,-0)?ZT(n,e,t):XT(n,e,t),XT=(n,e,t)=>Ac({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),ZT=(n,e,t)=>Ac({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var Bs=(n,e,t)=>{let r=Ic(n,e,!1),o=QT(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return Us(i)},QT=(n,e)=>{if(e===void 0)return e;let t=Ic(n,e,!0);return t===n.length?void 0:t};var dm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=eE(),i=tE(n),{written:s}=r.encodeInto(n,i),a=Fs(i,s,e),l=Ds(i,s,t),c=l===void 0?s:Math.min(l,s),p=i.subarray(a,c);return o.decode(p)},eE=()=>(Pc===void 0&&(Pc=new globalThis.TextEncoder,cm=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Pc,textDecoder:cm}),Pc,cm,tE=n=>{let e=n.length*3;return e>nE?new Uint8Array(e):((zs===void 0||zs.length<e)&&(zs=new Uint8Array(e)),zs)},nE=1e5,zs;var pm=(n,e)=>{if(e===void 0)return e;let t=Lc(n,e);return t>=n.length*um?void 0:t},Lc=(n,e)=>e<=n.length*-um?0:e,um=4;var mm=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);rE(e),oE(t)},rE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");hm("Second",n)},oE=n=>{n!==void 0&&hm("Third",n)},hm=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var gm=n=>{let e=!0,t=0;for(let r=0;r<Oc;r+=1){let o=iE(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Oc}},iE=(n,e)=>{let t=Oc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},Oc=50;var sE=(n,e,t)=>{if(mm(n,e,t),n==="")return n;let r=Lc(n,e),o=pm(n,t);return o===void 0&&Object.is(r,0)?Us(n):aE(n,r,o)},fm=sE,aE=(n,e,t)=>{if(n.length<=lE)return Bs(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=gm(n);return r?dE(n,e,t):o>=cE?Bs(n,e,t):Sm(n,e,t)},lE=200,cE=.4,dE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?sm(n,e,t):Sm(n,e,t),Sm=(n,e,t)=>"TextEncoder"in globalThis?dm(n,e,t):Bs(n,e,t);var bm=(n,e)=>{let t=JSON.stringify(n),r=mE(t),o=fm(r,0,e-ym.length-Ii.length*2),s=`${pE(o)}${ym}`;return hE(s)},pE=n=>n.replace(uE,""),uE=/(\\|\\u[0-9a-fA-F]{0,3})$/u,mE=n=>n.slice(Ii.length,-Ii.length),hE=n=>`${Ii}${n}${Ii}`,Ii='"',ym="...";var wm=n=>globalThis.Buffer.byteLength(n);var kc=n=>{let e=n.length,t=e;for(let r=0;r<e;r+=1){let o=n.charCodeAt(r);if(o<=gE)continue;if(o<=fE){t+=1;continue}if(t+=2,o<SE||o>yE)continue;let i=n.charCodeAt(r+1);i<bE||i>wE||(r+=1)}return t},gE=127,fE=2047,SE=55296,yE=56319,bE=56320,wE=57343;var vm=()=>vE.bind(void 0,new TextEncoder),vE=(n,e)=>{let t=xE(e);return n.encodeInto(e,t).written},xE=n=>{let e=n.length*3;return e>TE?new Uint8Array(e):((js===void 0||js.length<e)&&(js=new Uint8Array(e)),js)},TE=1e5,js;var CE=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?wm:"TextEncoder"in globalThis?RE.bind(void 0,vm()):kc,RE=(n,e)=>e.length<100?kc(e):n(e),xm=CE();var Tm=n=>{if(n===null)return AE;if(n===!0)return IE;if(n===!1)return PE;let e=typeof n;return e==="object"?LE:e==="number"?JSON.stringify(n).length:Nc(n)},AE=4,IE=4,PE=5,LE=2,Nc=n=>xm(JSON.stringify(n));var Hs=({size:n,increment:e,maxSize:t,truncatedProps:r,path:o,value:i})=>{let s=n+e,a=s>t;return a?{size:n,stop:a,truncatedProps:[...r,{path:o,value:i}]}:{size:s,stop:a,truncatedProps:r}},Cm=n=>Tm(n),Rm=(n,e,t)=>{let r=Im({empty:n,indent:e,depth:t,keySpaceSize:0}),o=Pm(n);return r+o},Am=({key:n,empty:e,indent:t,depth:r})=>{let o=Im({empty:e,indent:t,depth:r,keySpaceSize:1}),i=Nc(n),s=Pm(e);return o+i+OE+s},OE=1,Im=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=Em+e*(t+1),i=n?Em+e*t:0;return r+o+i},Em=1,Pm=n=>n?0:kE,kE=1;var $s=({parent:n,truncatedProps:e,path:t,increment:r,maxSize:o,key:i,empty:s,size:a,truncateValue:l,indent:c,depth:p})=>{let d=n[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=Hs({size:a,increment:r,maxSize:o,truncatedProps:e,path:u,value:d});return h?{empty:s,size:m,truncatedProps:g}:NE({value:d,truncatedProps:e,path:u,maxSize:o,empty:s,size:a,newSize:m,truncateValue:l,indent:c,depth:p})},NE=({value:n,truncatedProps:e,path:t,maxSize:r,empty:o,size:i,newSize:s,truncateValue:a,indent:l,depth:c})=>{let{value:p,size:d,truncatedProps:u}=a({value:n,truncatedProps:e,path:t,size:s,maxSize:r,indent:l,depth:c+1});return p===void 0?{empty:o,size:i,truncatedProps:u}:{empty:!1,size:d,value:p,truncatedProps:u}};var Lm=({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l=[],c={empty:!0,size:r,truncatedProps:e};for(let p=0;p<n.length;p+=1){let d=Rm(c.empty,s,a);c=$s({parent:n,truncatedProps:c.truncatedProps,path:t,increment:d,maxSize:o,key:p,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&l.push(c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var Om=({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l={},c={empty:!0,size:r,truncatedProps:e};for(let p in n){let d=Am({key:p,empty:c.empty,indent:s,depth:a});c=$s({parent:n,truncatedProps:c.truncatedProps,path:t,increment:d,maxSize:o,key:p,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&(l[p]=c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var Ws=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>{let a=Cm(n),{size:l,stop:c,truncatedProps:p}=Hs({size:r,increment:a,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:p}:_E({value:n,truncatedProps:p,path:t,size:l,maxSize:o,indent:i,depth:s})},_E=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>typeof n!="object"||n===null?{value:n,size:r,truncatedProps:e}:Array.isArray(n)?Lm({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:Ws,indent:i,depth:s}):Om({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:Ws,indent:i,depth:s});var ME=(n,e)=>{rm(n,e);let t=FE(n),r=DE(n),{value:o,truncatedProps:i}=Ws({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:UE({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Pi=ME,FE=n=>{let e=em(n);return typeof e=="string"?e.length:e},DE=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
7
+ ${e.message}`)}},UE=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?tm(e,t):bm(e,t);import*as Er from"zod";import{z as St}from"zod";var Ae="BASE_URL",Gs="CURRENT_URL",ho="ENV_NAME",a0={[Ae]:"https://www.google.com"},km=St.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Vs=St.object({name:St.string(),variables:St.record(St.string().describe("variable name"),St.string().describe("variable value"))}),qs=St.object({pageLoadTimeoutMs:St.number().optional().describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),localChromeExtensionPaths:St.string().array().optional(),disableGpu:St.boolean().optional()}),Ks=St.object({name:St.string(),variables:St.record(St.string().describe("variable name"),St.unknown().describe("variable value")),browser:qs.optional()});ye(Er);var Oi=Er.object({env:Er.record(Er.unknown())}).openapi({ref:"TestContextSnapshot"}),BE="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",zE=[Ae,ho],Nm=[Gs,Ae,ho],It=class n{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t={}){return new n({baseUrl:"about:blank",currentUrl:"about:blank",envName:e,variablesFromEnvironment:t})}static fromSnapshot({snapshot:e,environmentVariables:t}){let r=e.env[Ae]??"about:blank",o=e.env[Gs]??"about:blank",i=e.env[ho],s={};for(let[l,c]of Object.entries(e.env))Nm.includes(l)||(t??{})[l]===void 0&&(s[l]=c);return new n({baseUrl:r,currentUrl:o,dynamicVariables:s,envName:i,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Li(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){zE.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[ho]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Li(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>Nm.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,BE]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Pi(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Pi(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Gs]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Li(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ae,e.baseUrl),e.envName&&this.setMomenticSystemVariable(ho,e.envName)}getDynamicVariablesCopy(){return Li(this.env)}getVariablesFromEnvironmentCopy(){return Li(this.varsFromMomenticEnvironment)}};import{z as Cr}from"zod";ye(Cr);var le=(c=>(c.AI_PROVIDER="AIProviderError",c.USER_INFRA="UserInfrastructureError",c.ACTION_FAILURE="ActionFailureError",c.ASSERTION_FAILURE="AssertionFailureError",c.CONFIG_ERROR="UserConfigurationError",c.WEB_AGENT_PLATFORM="InternalWebAgentError",c.UNKNOWN_PLATFORM="InternalPlatformError",c.JOB_TIMEOUT="JobTimeoutError",c.UNKNOWN="UnknownError",c))(le||{});var _m=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Ys={ActionFailureError:"Action failure",AssertionFailureError:"Assertion failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error"},go={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",AssertionFailureError:"An AI assertion or check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},_c=Cr.object({reason:Cr.nativeEnum(le),summary:Cr.string()}).openapi({ref:"TestResultClassification"}),Js=Cr.object({errorMessage:Cr.string(),errorStack:Cr.string().optional(),classification:_c.optional()}).openapi({ref:"TestFailureDetails"});ye(J);var Ie=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ie||{}),Mc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Mc||{}),Fc=J.object({beforeUrl:J.string().optional(),afterUrl:J.string().optional(),message:J.string().optional(),beforeScreenshot:J.string().optional(),afterScreenshot:J.string().optional(),beforeSnapshot:J.string().optional(),afterSnapshot:J.string().optional(),startedAt:J.coerce.date(),finishedAt:J.coerce.date()}),jE=Fc.extend({viewport:J.object({height:J.number(),width:J.number()}),status:J.nativeEnum(Mc),message:J.string().optional(),elementInteracted:J.string().optional()}),qn=Fc.extend({status:J.nativeEnum(Ie),message:J.string().optional(),data:J.unknown().optional(),beforeTestContext:Oi.optional(),afterTestContext:Oi.optional(),failureReason:J.nativeEnum(le).optional(),details:J.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),Xs=qn.merge(Rt).extend({results:jE.array(),proposedStep:Rt.optional()}),HE=qn.merge(wr).extend({results:J.lazy(()=>Xs.array())}),$E=qn.merge(po).extend({results:J.lazy(()=>Xs.array())}),WE=qn.merge(kn).extend({moduleName:J.string().optional(),results:J.lazy(()=>Nn.array())}),GE=qn.merge(vr).extend({assertion:Xs.optional(),results:J.lazy(()=>Nn.array()).describe("results for the block actually executed")}),VE=qn.merge(Ei).extend({results:J.lazy(()=>Nn.array())}),qE=qn.merge(Ci).extend({results:J.lazy(()=>Nn.array()),healingAttempts:J.lazy(()=>Nn.array().array()).optional()}),Nn=J.discriminatedUnion("type",[HE,$E,Xs,WE,GE,VE,qE]),Zs=qn.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),Qs=Fc.extend({index:J.number().optional(),description:J.string(),pageState:J.string().optional()});var Dc=KE.object({results:Nn.array().describe("main results"),beforeResults:Nn.array().optional(),afterResults:Nn.array().optional()}),ea=Dc.partial();import{z as H}from"zod";import{z as be}from"zod";var YE=be.object({type:be.literal("FAILURE_RECOVERY"),thoughts:be.string()}),JE=be.object({type:be.literal("DESCRIPTION_UPDATE"),thoughts:be.string()}),ta=be.discriminatedUnion("type",[JE,YE]),na=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(na||{}),XE=be.object({testId:be.string(),name:be.string(),orgId:be.string(),runId:be.string(),purpose:be.nativeEnum(na).catch("AUTO_HEALING"),steps:ve.array(),details:ta.or(ta.array()).optional()}),_0=XE.pick({name:!0,orgId:!0}),Uc=be.object({id:be.string(),name:be.string().nullish(),createdAt:be.string().pipe(be.coerce.date()).or(be.date()),organizationId:be.string(),schemaVersion:be.string(),purpose:be.nativeEnum(na).catch("AUTO_HEALING"),runId:be.string().nullish(),details:ta.or(ta.array()).nullish(),applied:be.boolean().nullish(),appliedAt:be.coerce.date().nullish()}),Mm=Uc.extend({steps:ve.array()});import{isValidCron as ZE}from"cron-validator";import{z as Z}from"zod";import{z as Bc}from"zod";var ra=Bc.object({width:Bc.number().min(200).max(1e4),height:Bc.number().min(200).max(1e4)}),Fm={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},D0=Object.keys(Fm);var rn=Fm["Desktop Large"];var Dm=1e4,Um=6e4,Bm=2e3,Rr=(t=>(t.CHROMIUM="Chromium",t.GOOGLE_CHROME="Google Chrome",t))(Rr||{}),oa=Z.object({browserType:Z.nativeEnum(Rr).optional(),pageLoadTimeoutMs:Z.number().optional().refine(n=>n===void 0||n<=Um&&n>=-1,{message:`Page load timeout must be between 0 and ${Um/1e3} seconds`}),slowMoMs:Z.number().optional().refine(n=>n===void 0||n<=Bm&&n>=-1,{message:`Slow motion must be between 0 and ${Bm} milliseconds`}),smartWaitingTimeoutMs:Z.number().optional().refine(n=>n===void 0||n<=Dm&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${Dm/1e3} seconds`}),extraHeaders:Z.record(Z.string(),Z.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:Z.string().optional(),basicAuthorization:Z.object({username:Z.string().optional(),password:Z.string().optional()}).optional(),disableJavaScript:Z.boolean().optional(),disableGpu:Z.boolean().optional(),localChromeExtensionPaths:Z.string().array().optional()}),zm=["extraHeaders","basicAuthorization","localChromeExtensionPaths"];var QE=Z.object({disableAICaching:Z.boolean().default(!1),failureRecovery:Z.boolean().optional().describe("undefined means inherit org settings")});var eC=Z.object({viewport:ra.optional()}),fo=eC.merge(QE).merge(oa),So=Z.object({cron:Z.string().refine(n=>ZE(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:Z.boolean().default(!1),env:Z.string().optional(),timeZone:Z.string().default("America/Los_Angeles"),jobKey:Z.string().optional()}),yo=Z.object({onSuccess:Z.boolean().default(!1),failureMessage:Z.string().optional(),onFailure:Z.boolean().default(!0),successMessage:Z.string().optional()}),tC=Z.object({name:Z.string(),required:Z.boolean().optional(),defaultValue:Z.string().describe("this is not optional because we need a value when the editor is first loaded")}),ia=tC.array(),nC=Z.object({name:Z.string(),value:Z.string()}),jm=nC.array(),sa=Z.object({name:Z.string(),default:Z.boolean().optional(),fixtures:km.array().optional()});ye(H);var Pt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},re=(a=>(a.PENDING="PENDING",a.RUNNING="RUNNING",a.PASSED="PASSED",a.FAILED="FAILED",a.CANCELLED="CANCELLED",a.RETRYING="RETRYING",a.WAITING_FOR_USER="WAITING_FOR_USER",a))(re||{}),aa=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(aa||{});var ze=H.string().pipe(H.coerce.date()).or(H.date()),ki=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),createdAt:ze,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ze.or(H.null()),startedAt:ze.or(H.null()),updatedAt:ze.nullish(),finishedAt:ze.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),labels:H.array(H.string()).optional(),cliVersion:H.string().nullish(),section:H.nativeEnum(aa).nullish(),status:H.nativeEnum(re),trigger:H.nativeEnum(Pt),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(re),startedAt:ze.or(H.null()),finishedAt:ze.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(le).nullish(),failureDetails:Js.nullish(),testFragments:H.array(Uc).nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),rC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},la=ki.pick({...rC,test:!0}),Hm=ki.omit({failureReason:!0,failureDetails:!0,test:!0}),zc=ki.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:fo.nullish()}).nullish()}).merge(Dc),$m=n=>n.includes("PASSED")&&n.includes("FAILED");var oC=Ni.object({id:Ni.string().uuid(),startedAt:ze.or(Ni.null()),finishedAt:ze.or(Ni.null()),status:Ni.nativeEnum(re)}).merge(ea),n1=oC.array();var _i=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(_i||{});import{z as $e}from"zod";var iC=$e.object({id:$e.string(),status:$e.nativeEnum(re),trigger:$e.nativeEnum(Pt),createdAt:ze,startedAt:ze.nullish(),finishedAt:ze.nullish(),gitCommitSha:$e.string().nullish(),gitCommitShaShort:$e.string().nullish(),gitCommitTimestamp:ze.nullish(),gitBranchName:$e.string().nullish(),gitOriginUrl:$e.string().nullish(),gitCommitMessage:$e.string().nullish(),gitCommitAuthorName:$e.string().nullish(),githubRepository:$e.string().nullish(),gitlabProjectPath:$e.string().nullish(),pipelineId:$e.string().nullish(),cliVersion:$e.string().nullish(),suite:$e.object({id:$e.string(),name:$e.string()}).nullish(),runs:$e.object({status:$e.nativeEnum(re)}).array()}).openapi({ref:"RunGroup"}),Wm=iC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:la.array()});import{z as Ye}from"zod";var sC=Ye.object({type:Ye.literal("TARGETING"),name:Ye.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:Zu.array(),pageState:Ye.string().optional(),targetSource:Ye.nativeEnum(Gn).optional(),targetUpdateTime:Ye.string().optional()}),aC=Ye.object({type:Ye.literal("AI_LOCATION"),matched:Ye.boolean(),pageState:Ye.string().optional(),ragUsed:Ye.boolean().optional(),thoughts:Ye.string().optional()}),lC=Ye.object({type:Ye.literal("ASSERTION"),relevantElementsSerialized:Ye.string().array().optional(),pageState:Ye.string().optional(),ragUsed:Ye.boolean().optional()}),Gm=Ye.discriminatedUnion("type",[sC,aC,lC]);function ca(){return{details:[]}}import{z as _e}from"zod";var cC=_e.object({id:_e.string(),name:_e.string()}),f1=cC.merge(_e.object({createdAt:ze,createdBy:_e.string(),schedule:So,notification:yo,environment:_e.object({name:_e.string()}).nullish(),beforeTests:_e.object({id:_e.string()}).array().nullish(),afterTests:_e.object({id:_e.string()}).array().nullish()})),Vm=_e.object({id:_e.string().uuid(),orgId:_e.string(),createdAt:ze,startedAt:ze.or(_e.null()),finishedAt:ze.or(_e.null()),status:_e.nativeEnum(re),trigger:_e.nativeEnum(Pt),suite:_e.object({id:_e.string(),name:_e.string()}).nullish(),runs:ki.array()}),S1=Vm.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),qm=Vm.extend({runs:la.array()});var Vt=F.object({disableCache:F.boolean().optional(),loggerTags:F.record(F.string(),F.string()).optional(),langfuseSessionId:F.string().optional()}),dC=F.object({screenshotBase64AfterCommand:F.string(),urlAfterCommand:F.string(),serializedCommand:F.string(),elementInteracted:F.string().optional(),thoughts:F.string().optional()}),Km=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string(),source:Xu.optional()}),Ym=F.object({target:F.string().or(F.number()),browserState:F.string().optional(),screenshot:F.string().optional(),boundingBox:F.object({x:F.number(),y:F.number(),height:F.number(),width:F.number()}).optional()}),Jm=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string().optional(),returnSchema:F.string().optional()}),Xm=F.object({goal:F.string(),browserState:F.string(),screenshot:F.string(),url:F.string(),contextChoice:ac.optional()}),Zm=F.object({command:lo}),jc=F.object({goal:F.string(),browserState:F.string(),startingScreenshot:F.string().optional(),screenshot:F.string(),url:F.string(),history:dC.array(),actionHint:F.string().optional(),lastError:F.string().optional()}),Qm=F.object({results:Qs.array(),errorMessage:F.string(),errorStack:F.string().optional()}),eh=F.object({results:Qs.array(),goal:F.string(),errorMessage:F.string()}),th=F.object({failedResults:Qs.array(),nextStepsSerialized:F.string().array(),currentUrl:F.string(),currentPageState:F.string(),currentScreenshot:F.string()}),D1=F.object({description:F.string(),type:F.union([F.literal("locator"),F.literal("assertion"),F.literal("ai-action")]),excerpt:F.string()});import{z as Mi}from"zod";var z1=Mi.object({goal:Mi.string()}),nh=Mi.object({keywords:Mi.array(Mi.string())});import{z as yt}from"zod";var Hc=yt.object({content:yt.string(),ids:yt.string().array(),tokenLength:yt.number()}),pC=yt.object({chunks:Hc.array()}),$1=yt.object({ids:yt.string().array(),score:yt.number(),tokenLength:yt.number()}),W1=pC.extend({description:yt.string().describe("Input to pass to RAG engine"),tokenLimit:yt.number()}),rh=yt.object({ids:yt.number().array()}),oh=yt.object({indices:yt.number().array()});var ih=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Ar}from"zod";var sh=Ar.object({id:Ar.string().uuid(),skipped:Ar.boolean().optional(),envKey:Ar.string().optional().describe("key in the environment to save the result of this step to")}),$c=sh.merge(Is).extend({type:Ar.literal("REQUEST")}),Wc=sh.merge(Ps).extend({type:Ar.literal("JAVASCRIPT")}),Gc=Ar.discriminatedUnion("type",[Wc,$c]);import{z as qt}from"zod";import{z as Ir}from"zod";var uC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Pe=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var da=Ir.string().min(1).max(255).superRefine((n,e)=>{try{bo(n)}catch(t){return e.addIssue({code:Ir.ZodIssueCode.custom,message:t.message,fatal:!0}),Ir.NEVER}});function bo(n){if(n=n.toLowerCase().trim(),n.length===0||n.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(n))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(n.endsWith("-")||n.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(n.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(n))throw new Error(`"${n}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(n)||/^\s|\s$/.test(n))throw new Error("Name cannot start or end with a space or dot.");if(n.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(n==="none")throw new Error("Name cannot be 'none'.");if(n.match(uC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var pa=Ir.preprocess(n=>n===null?"":n,Ir.union([Ir.string().url(),Ir.literal("")])).optional();var ah=qt.object({id:qt.string(),name:da,description:qt.string().optional().nullish(),baseUrl:pa.nullish(),schemaVersion:qt.string(),advanced:qt.unknown().optional(),retries:qt.number(),envs:qt.array(sa).nullish(),parameters:ia.nullish()}),mC=qt.object({createdAt:qt.coerce.date(),updatedAt:qt.coerce.date(),schedule:So.nullish(),notification:yo.nullish(),createdBy:qt.string(),organizationId:qt.string()}),hC=ah.merge(mC),dU=hC.extend({steps:Gc.array()}),pU=ah.extend({steps:Gc.array()});import{z as Lt}from"zod";var lh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date(),status:Lt.nativeEnum(Ie),message:Lt.string().optional(),data:Lt.unknown().optional()}),fC=lh.merge(Wc).extend({type:Lt.literal("JAVASCRIPT")}),SC=lh.merge($c).extend({type:Lt.literal("REQUEST")}),yC=Lt.discriminatedUnion("type",[fC,SC]),ch=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date().nullish(),status:Lt.nativeEnum(re),results:yC.array(),failureReason:Lt.string().nullish(),failureDetails:Js.nullish()});import{z as Ot}from"zod";var bC=Ot.object({id:Ot.string(),organizationId:Ot.string(),createdAt:Ot.coerce.date(),updatedAt:Ot.coerce.date(),createdBy:Ot.string(),scheduledAt:Ot.coerce.date().nullish(),startedAt:Ot.coerce.date().nullish(),finishedAt:Ot.coerce.date().nullish(),status:Ot.nativeEnum(re),trigger:Ot.nativeEnum(Pt),results:ch.array().nullish(),apiTestName:Ot.string().nullish(),apiTestPath:Ot.string().nullish(),apiTestId:Ot.string().nullish()}),wU=bC.pick({status:!0,startedAt:!0,finishedAt:!0});var Pr=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Pr||{}),dh=3;function wC(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Fi(n){if(!wC(n))switch(n){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Di(n){switch(n.type){case"AI_EXTRACT":return 3;case"AI_ASSERTION":return dh;case"AI_WAIT":return 3;case"CAPTCHA":return 3;case"VISUAL_DIFF":return 3;case"CLICK":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"TYPE":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"SELECT_OPTION":return n.useSelector?0:1;case"HOVER":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"DRAG":return n.useSelector?0:1;case"ELEMENT_CHECK":return n.useSelector?0:1;case"MOUSE_DRAG":return n.useSelector?0:1;case"FOCUS":return n.useSelector?0:1;case"BLUR":return n.useSelector?0:1;case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":return n.target?.type==="description"?1:0;case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var wo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function Vc(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as vC,splitCookiesString as xC}from"set-cookie-parser";import{z as de}from"zod";var qc=de.object({name:de.string(),value:de.string(),url:de.string().optional(),domain:de.string().optional(),path:de.string().optional(),expires:de.number().default(Date.now()/1e3+60*60*24*365),httpOnly:de.boolean().optional(),secure:de.boolean().default(!0),sameSite:de.union([de.literal("Strict"),de.literal("Lax"),de.literal("None")]).default("None")});function ua(n,e){let t=[],r=xC(n);for(let o of r){let i=vC(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let s;if(i.sameSite){let p=i.sameSite.trim().toLowerCase();if(p==="strict")s="Strict";else if(p==="lax")s="Lax";else if(p==="none")s="None";else throw new Error(`Invalid sameSite setting in cookie: ${p}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let a=qc.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:s});t.push(a);let l=[a.name,...Object.keys(a)].map(p=>p.toLowerCase()),c=o.match(/\b(\S+)=([^;]*)/g);if(c)for(let p of c){let[d,u]=p.split("=");if(!d||!u)throw new Error(`Invalid key-value pair in cookie: ${p}`);l.includes(d.toLowerCase())||t.push({...a,name:d,value:u})}}return t}var TC=de.object({origin:de.string(),localStorage:de.array(de.object({name:de.string(),value:de.string()}))}),EC=de.object({entries:de.record(de.string(),de.array(de.tuple([de.unknown(),de.unknown()]))),version:de.number().optional()}),ma=de.object({cookies:qc.array().optional(),origins:TC.array().optional(),idb:de.record(de.string(),EC).optional().describe("key is db name")});function ha(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=qc.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var HU=new Set(Object.values(Be));var CC={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_WAIT:"AI wait",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"Local storage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",SUCCESS:"Done"},$U={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_WAIT:[],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],SUCCESS:[]},WU={AI_ACTION:"Ask AI achieve a specific goal. Caches the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI whether something is true on the page, retrying until a configurable timeout.",AI_WAIT:"Wait until AI considers a condition to be true.",CLICK:"Click on an element on the page based on a description.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page based on a description.",HOVER:"Hover over an element on the page based on a description.",FILE_UPLOAD:"Automatically upload a file when the next file chooser is activated.",FOCUS:"Focus an element on the page based on a description.",BLUR:"Remove focus from an element on the page based on a description.",SELECT_OPTION:"Select an option from an HTML Select <select> element based on a description.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session",LOCAL_STORAGE:"Set a local storage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JSON snapshot including cookies, local storage, and IndexDB entries.",AUTH_SAVE:"Save auth state (cookies, local storage) into a JavaScript object format usable by 'Load auth state'.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's state using pre-built conditions, including URL and content checks.",WAIT_FOR_URL:"Wait for the active page's URL to match a specific URL or glob pattern. If a new tab is opened, this command will wait for the new tab's URL to match instead.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as qU,en as KU}from"@faker-js/faker";import{z as $}from"zod";var ph=55555,ZU=$.object({body:$.string(),to:$.string(),from:$.string()}),QU=$.object({from:$.string().optional(),to:$.string(),timeout:$.number().optional(),beforeDate:$.string().pipe($.coerce.date()).or($.date()).optional(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional()}),eB=$.object({to:$.string(),from:$.string(),subject:$.string(),body:$.string()}),tB=$.object({inbox:$.string(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional(),timeout:$.number().optional(),trimWhitespace:$.boolean().optional()}),nB=$.object({inbox:$.string(),limit:$.number().optional(),afterDate:$.string().pipe($.coerce.date()).or($.date()).optional(),trimWhitespace:$.boolean().optional()});var uh=$.object({result:$.unknown(),variableUpdates:$.record($.string(),$.unknown()).optional(),persistentVariableUpdates:$.record($.string(),$.unknown()).optional(),error:$.string().optional(),success:$.boolean()}),rB=$.object({id:$.string().optional(),orgId:$.string(),momenticLambdaAuthHash:$.string(),code:$.string(),fragment:$.boolean(),state:Oi,timeoutMs:$.number().optional()}),Kn=15e3;import*as pt from"zod";ye(pt);var RC=pt.object({url:pt.string(),lineNumber:pt.number(),columnNumber:pt.number()}).openapi({ref:"CodeLocation"}),ga=pt.object({timestamp:pt.number(),text:pt.string(),type:pt.string(),tabIndex:pt.number(),args:pt.unknown().array().optional(),url:pt.string().optional(),location:RC.optional()}).openapi({ref:"ConsoleLog"}),mh=ga.array(),AC=mh.array();import*as Yc from"zod";import{z as A}from"zod";var IC=A.object({name:A.string(),version:A.string(),comment:A.string().optional()}),PC=A.object({name:A.string(),version:A.string(),comment:A.string().optional()}),LC=A.object({onContentLoad:A.number().optional(),onLoad:A.number().optional(),comment:A.string().optional()}),gh=A.object({startedDateTime:A.string(),id:A.string(),title:A.string().optional(),pageTimings:LC,comment:A.string().optional()}),OC=A.array(gh),kC=A.object({name:A.string(),value:A.string(),path:A.string().optional(),domain:A.string().optional(),expires:A.string().optional(),httpOnly:A.boolean().optional(),secure:A.boolean().optional(),comment:A.string().optional()}),fh=A.array(kC),NC=A.object({name:A.string(),value:A.string(),comment:A.string().optional()}),Sh=A.array(NC),_C=A.object({name:A.string(),value:A.string(),comment:A.string().optional()}),MC=A.array(_C),FC=A.object({name:A.string(),value:A.string().optional(),fileName:A.string().optional(),contentType:A.string().optional(),comment:A.string().optional()}),DC=A.array(FC),UC=A.object({mimeType:A.string(),params:DC,text:A.string(),comment:A.string().optional()}),BC=A.object({method:A.string(),url:A.string(),httpVersion:A.string().optional(),cookies:fh,headers:Sh,queryString:MC,postData:UC.optional(),headersSize:A.number().optional(),bodySize:A.number().optional(),comment:A.string().optional()}),zC=A.object({size:A.number().optional(),compression:A.number().optional(),mimeType:A.string().optional(),text:A.string().optional(),encoding:A.string().optional(),comment:A.string().optional()}),jC=A.object({status:A.number(),statusText:A.string(),httpVersion:A.string().optional(),cookies:fh,headers:Sh,content:zC,redirectURL:A.string().optional(),headersSize:A.number().optional(),bodySize:A.number().optional(),comment:A.string().optional()}),hh=A.object({expires:A.string().optional(),lastAccess:A.string(),eTag:A.string(),hitCount:A.number(),comment:A.string().optional()}),HC=A.object({beforeRequest:hh.optional(),afterRequest:hh.optional(),comment:A.string().optional()}),$C=A.object({blocked:A.number().optional(),dns:A.number().optional(),connect:A.number().optional(),send:A.number(),wait:A.number(),receive:A.number(),ssl:A.number().optional(),comment:A.string().optional()}),yh=A.object({pageref:A.string().optional(),startedDateTime:A.string(),time:A.number().optional(),request:BC,response:jC.optional(),cache:HC.optional(),timings:$C,serverIPAddress:A.string().optional(),connection:A.string().optional(),comment:A.string().optional(),_resourceType:A.string().optional()}),WC=A.array(yh),GC=A.object({version:A.string().default("1.1"),creator:IC.optional(),browser:PC.optional(),pages:OC.optional(),entries:WC,comment:A.string().optional()}),VC=A.object({log:GC}),bh=A.record(A.string(),gh),wh=A.record(A.string(),yh);function Kc(n,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(n).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime()),entries:Object.values(e).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime())}}}ye(Yc);var qC=Yc.object({logsPerPage:ga.array().array(),harPages:bh.optional(),harEntries:wh.optional()}).openapi({ref:"DebugData"});var Lr=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var fa=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function vh(n){for(let e of Object.values(le))if(n.includes(e))return e}var R=class extends Error{reason;constructor(e,t,r){let o=!1;for(let i of Object.values(le))if(t.startsWith(i)){o=!0,e=i;break}if(r?.errOptions?.cause)super(o?t:`${e}: ${t}`,r?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,r?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:r?.lastScreenshotBuffer,enumerable:!1})}getLastScreenshotBuffer(){return"lastScreenshotBuffer"in this?this.lastScreenshotBuffer:void 0}toString(){return this.message}toJSON(){return{message:this.message}}},Yn=class extends Error{decisions;constructor(e,t,r={}){super(e,r),this.decisions=t,this.name="NoElementsFoundError"}toString(){return`${this.message}
8
8
  Decisions:
9
9
  ${this.decisions.map(e=>e.toString()).join(`
10
- `)}`}};function wh(n){return!(n instanceof Error)||n.message.includes("locator resolved to visible")?!1:!!(n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("body >")||n.message.includes("Element is not attached to the DOM"))}function fa(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator")&&n.message.includes("data-momentic-id")&&!n.message.includes("locator resolved")&&!n.message.includes("waiting for element to be"):!1}var Ui=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCssDataError"}};import{cloneDeep as VC}from"lodash-es";import{z as ut}from"zod";var on=(b=>(b.AutoExpandIframes="auto_expand_iframes",b.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",b.EditorRecordButton="editor_record_button",b.EditorClickRecordButton="editor_click_record_button",b.EditorLintStep="editor_lint_test_single_step",b.FailureRecoveryEnabled="failure_recovery_enabled",b.FakerConstantSeed="faker_constant_seed",b.FilterZeroOpacityElements="filter_zero_opacity_elements",b.GlobalLocatorRedirect="global_locator_redirect",b.IconKnowledgeBase="icon_knowledge_base",b.MiniModelInitialAssertion="mini_model_initial_assertion",b.MiniModelInitialLocator="mini_model_initial_locator",b.ShowBillingMetricsV2="show_billing_metrics_v2",b.ShowTestPlans="show_test_plans",b.RagV2="rag_v2",b.RagKeywordOptimization="rag_keyword_optimization",b.UseNewHeadlessChrome="use_new_chrome_headless",b.UseNewHeadlessChromium="use_new_chrome_headless_chromium",b.VisualActions="visual_actions",b))(on||{});var Sa=ut.union([ut.string(),ut.number(),ut.boolean(),ut.null(),ut.record(ut.string(),ut.lazy(()=>Sa)),ut.array(ut.lazy(()=>Sa))]),Bi=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=VC(this.flags);return Object.entries(e).forEach(([t,r])=>{typeof r=="boolean"&&Object.values(on).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},HB=new Bi({},{}),$B=ut.object({globalOverrides:ut.record(ut.string()).optional(),agentConfig:ut.record(ut.string(),ut.string()).optional()});var Jc={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},vh=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],GB=Object.keys(Jc);import*as xh from"zod";var qB=xh.custom().refine(n=>n&&n.length>0).refine(n=>n&&n[0]instanceof File,{message:"Please upload a valid file."});import{z as Jn}from"zod";var JB=Jn.object({id:Jn.string(),name:Jn.string(),createdAt:Jn.coerce.date(),createdBy:Jn.string(),updatedAt:Jn.coerce.date(),updatedBy:Jn.string().nullable(),organizationId:Jn.string()});import{z as V}from"zod";import{z as We}from"zod";var kt=We.object({id:We.string(),name:ca,baseUrl:da,description:We.string().optional().nullish(),schemaVersion:We.string(),advanced:fo,retries:We.number(),envs:We.array(ia).nullish(),parameters:oa.nullish(),disabled:We.boolean().optional(),labels:We.array(We.string()).optional().catch([])}),rz=kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),qC=We.object({labels:We.array(We.string()).optional(),outputs:Bm.nullish()}),Kt=kt.merge(qC),KC=We.object({createdAt:We.coerce.date(),updatedAt:We.coerce.date(),updatedBy:We.string().nullable(),schedule:So,notification:yo,createdBy:We.string(),organizationId:We.string(),folderId:We.string().nullable().optional()}),YC=kt.merge(KC),oz=YC.merge(uo),zi=kt.merge(uo),iz=kt.merge(xr);var Th=V.object({platformSep:V.string(),fullPathSegments:V.string().array(),relativePath:V.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:V.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:V.coerce.date(),createdAt:V.coerce.date()}),hz=V.array(Th.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),gz=V.array(Th.extend({id:V.string(),name:V.string(),content:yc})),fz=zi.merge(Kt),Eh=V.object({schemaVersion:V.string(),stepLists:uo}),Ch=Kt.partial().merge(kt.pick({id:!0})),Rh=V.object({name:V.string(),description:V.string().optional(),baseUrl:V.string().url().optional(),environment:V.string().optional(),browserType:V.nativeEnum(Rr).optional(),viewport:na.optional(),folderPath:V.string().optional()}),Sz=zi.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),Ah=V.object({name:V.string()}),yz=V.object({relativeFilePath:V.string()}),Ih=V.object({name:V.string(),description:V.string(),enabled:V.boolean(),steps:V.lazy(()=>ve.array()),testFilePath:V.string().describe("relative to the project root"),folderPath:V.string().optional().describe("user selected folder path")}),Ph=V.object({description:V.string()});var bz=V.array(qs),Lh=V.object({defaultEnv:V.string().optional().describe("name of the default env, or undefined to unset")}),Oh=V.object({configFilePath:V.string().describe("full path on disk")}),wz=V.string().array(),vz=V.object({message:V.string(),newRelativeTestPath:V.string().optional()});var ji=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],kh=ji.map(n=>`**/${n}/**`);import wn from"chalk";var JC=["app","version","env","namespace","host"];function Ge(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!JC.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var Xc=class n{minLogLevel;logBindings;constructor(e,t){this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...r){if(e<this.minLogLevel)return;let o;Array.isArray(r[0])?(o=r[0],r=r.slice(1)):typeof r[0]=="object"&&!(r[0]instanceof Error)&&Object.entries(r[0]).length&&(o={...r[0],...this.logBindings},r=r.slice(1));let i=[];if(i.push(...r),console.log(t(...i)),o&&!Array.isArray(o)){let s=Object.entries(o);for(let[a,l]of s){let c=l;l instanceof Error?c=l.message:typeof l=="object"&&(c=JSON.stringify(l,void 0,2),c=c.split(`
10
+ `)}`}};function xh(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator"):!1}function Jc(n){return!(n instanceof Error)||n.message.includes("locator resolved to visible")?!1:!!(n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("body >")||n.message.includes("Element is not attached to the DOM"))}function Bi(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator")&&n.message.includes("data-momentic-id")&&!n.message.includes("locator resolved")&&!n.message.includes("waiting for element to be"):!1}var Ui=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCssDataError"}};import{cloneDeep as KC}from"lodash-es";import{z as ut}from"zod";var on=(b=>(b.AutoExpandIframes="auto_expand_iframes",b.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",b.EditorRecordButton="editor_record_button",b.EditorClickRecordButton="editor_click_record_button",b.EditorLintStep="editor_lint_test_single_step",b.FailureRecoveryEnabled="failure_recovery_enabled",b.FakerConstantSeed="faker_constant_seed",b.FilterZeroOpacityElements="filter_zero_opacity_elements",b.GlobalLocatorRedirect="global_locator_redirect",b.IconKnowledgeBase="icon_knowledge_base",b.MiniModelInitialAssertion="mini_model_initial_assertion",b.MiniModelInitialLocator="mini_model_initial_locator",b.ShowBillingMetricsV2="show_billing_metrics_v2",b.ShowTestPlans="show_test_plans",b.RagV2="rag_v2",b.RagKeywordOptimization="rag_keyword_optimization",b.UseNewHeadlessChrome="use_new_chrome_headless",b.UseNewHeadlessChromium="use_new_chrome_headless_chromium",b.VisualActions="visual_actions",b))(on||{});var Sa=ut.union([ut.string(),ut.number(),ut.boolean(),ut.null(),ut.record(ut.string(),ut.lazy(()=>Sa)),ut.array(ut.lazy(()=>Sa))]),zi=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=KC(this.flags);return Object.entries(e).forEach(([t,r])=>{typeof r=="boolean"&&Object.values(on).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},GB=new zi({},{}),VB=ut.object({globalOverrides:ut.record(ut.string()).optional(),agentConfig:ut.record(ut.string(),ut.string()).optional()});var Xc={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},Th=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],KB=Object.keys(Xc);import*as Eh from"zod";var JB=Eh.custom().refine(n=>n&&n.length>0).refine(n=>n&&n[0]instanceof File,{message:"Please upload a valid file."});import{z as Jn}from"zod";var QB=Jn.object({id:Jn.string(),name:Jn.string(),createdAt:Jn.coerce.date(),createdBy:Jn.string(),updatedAt:Jn.coerce.date(),updatedBy:Jn.string().nullable(),organizationId:Jn.string()});import{z as V}from"zod";import{z as We}from"zod";var kt=We.object({id:We.string(),name:da,baseUrl:pa,description:We.string().optional().nullish(),schemaVersion:We.string(),advanced:fo,retries:We.number(),envs:We.array(sa).nullish(),parameters:ia.nullish(),disabled:We.boolean().optional(),labels:We.array(We.string()).optional().catch([])}),sz=kt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),YC=We.object({labels:We.array(We.string()).optional(),outputs:jm.nullish()}),Kt=kt.merge(YC),JC=We.object({createdAt:We.coerce.date(),updatedAt:We.coerce.date(),updatedBy:We.string().nullable(),schedule:So,notification:yo,createdBy:We.string(),organizationId:We.string(),folderId:We.string().nullable().optional()}),XC=kt.merge(JC),az=XC.merge(uo),ji=kt.merge(uo),lz=kt.merge(xr);var Ch=V.object({platformSep:V.string(),fullPathSegments:V.string().array(),relativePath:V.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:V.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:V.coerce.date(),createdAt:V.coerce.date()}),Sz=V.array(Ch.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),yz=V.array(Ch.extend({id:V.string(),name:V.string(),content:yc})),bz=ji.merge(Kt),Rh=V.object({schemaVersion:V.string(),stepLists:uo}),Ah=Kt.partial().merge(kt.pick({id:!0})),Ih=V.object({name:V.string(),description:V.string().optional(),baseUrl:V.string().url().optional(),environment:V.string().optional(),browserType:V.nativeEnum(Rr).optional(),viewport:ra.optional(),folderPath:V.string().optional()}),wz=ji.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),Ph=V.object({name:V.string()}),vz=V.object({relativeFilePath:V.string()}),Lh=V.object({name:V.string(),description:V.string(),enabled:V.boolean(),steps:V.lazy(()=>ve.array()),testFilePath:V.string().describe("relative to the project root"),folderPath:V.string().optional().describe("user selected folder path")}),Oh=V.object({description:V.string()});var xz=V.array(Ks),kh=V.object({defaultEnv:V.string().optional().describe("name of the default env, or undefined to unset")}),Nh=V.object({configFilePath:V.string().describe("full path on disk")}),Tz=V.string().array(),Ez=V.object({message:V.string(),newRelativeTestPath:V.string().optional()});var Hi=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],_h=Hi.map(n=>`**/${n}/**`);import wn from"chalk";var ZC=["app","version","env","namespace","host"];function Ge(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!ZC.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var Zc=class n{minLogLevel;logBindings;constructor(e,t){this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...r){if(e<this.minLogLevel)return;let o;Array.isArray(r[0])?(o=r[0],r=r.slice(1)):typeof r[0]=="object"&&!(r[0]instanceof Error)&&Object.entries(r[0]).length&&(o={...r[0],...this.logBindings},r=r.slice(1));let i=[];if(i.push(...r),console.log(t(...i)),o&&!Array.isArray(o)){let s=Object.entries(o);for(let[a,l]of s){let c=l;l instanceof Error?c=l.message:typeof l=="object"&&(c=JSON.stringify(l,void 0,2),c=c.split(`
11
11
  `).map((p,d)=>d>0?` ${p}`:p).join(`
12
12
  `)),console.log(t(` ${a}:`,c))}}else if(o)for(let s of o){let a=s;typeof s=="object"&&(a=JSON.stringify(s,void 0,2),a=a.split(`
13
13
  `).map((l,c)=>c>0?` ${l}`:l).join(`
14
- `)),console.log(" ",t(a))}}setMinLevel(e){this.minLogLevel=e}log(...e){this.logWithLevel(1,wn.reset,...e)}info(...e){this.logWithLevel(1,wn.blue,...e)}debug(...e){this.logWithLevel(0,wn.dim,...e)}warn(...e){this.logWithLevel(2,wn.yellow,...e)}error(...e){this.logWithLevel(3,wn.red,...e)}success(...e){this.logWithLevel(4,wn.green,...e)}dimmed(...e){this.logWithLevel(1,wn.dim,...e)}underline(...e){this.logWithLevel(2,wn.underline,...e)}bold(...e){this.logWithLevel(2,wn.bold,...e)}grey(...e){this.logWithLevel(0,wn.grey,...e)}child(e){return new n(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},y=new Xc(1,{}),Or={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Or,flush:()=>{},bindings:()=>({})},ya={},kr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...s)=>{let a=ya[e];a?clearTimeout(a.timer):(a={count:0,totalCount:0},ya[e]=a),a.totalCount++,a.count<t&&(a.count++,n.debug(o,i,...s)),a.timer=setTimeout(()=>{let l=ya[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete ya[e]},r)};import{z as Je}from"zod";var Nh=Je.object({id:Je.string(),createdAt:Je.coerce.date(),createdBy:Je.string(),organizationId:Je.string(),name:Je.string(),description:Je.string().nullish(),enabled:Je.boolean(),schemaVersion:Je.string().describe("Schema version for steps"),parameters:Je.string().array().nullish().describe("Parameter list"),defaultParameters:Je.record(Je.string(),Je.string()).nullish(),defaultCacheKey:Je.string().nullish(),defaultCacheTtl:Je.number().nullish(),defaultCacheAllInvocations:Je.boolean().nullish(),autoAuth:Je.boolean().nullish(),advanced:hc.nullish()}),Nz=Nh.extend({steps:Je.lazy(()=>Ke.array())}),_h=5*60*1e3,Zc=At.merge(Nh.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as Fz}from"date-fns-tz";import{z as _n}from"zod";var Qc=_n.object({failureRecovery:_n.boolean().optional(),aiAction:_n.boolean().optional()}),Bz=_n.object({ai:Qc.optional(),githubAppInstallationId:_n.number().nullish(),githubReleaseAppInstallationId:_n.number().nullish(),gitlabAppAccessToken:_n.string().nullish().optional(),gitlabAppBaseUrl:_n.string().nullish().optional(),qaseAccessToken:_n.string().nullish().optional()});import*as T from"zod";var tj=T.object({error:T.boolean(),reason:T.string(),message:T.string()}),nj=Vt.merge(jc),Mh=ks,rj=Vt.merge(jc);var oj=Vt.merge(Ym).extend({useConsensus:T.boolean().optional(),attemptNumber:T.number().optional()}),ed=ku,ij=Vt.merge(Jm),Fh=Gu,sj=Vt.merge(Vm),Dh=Wu,aj=Vt.merge(qm),Uh=$u,lj=Vt.merge(Km);var cj=T.object({testPaths:T.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:T.string().optional(),all:T.boolean().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional(),testInputMatrix:T.record(T.string(),T.string()).array().optional()}),Bh=T.object({queuedTests:T.unknown().array(),runIds:T.string().uuid().array(),runGroupId:T.string().optional()}),zh=zi,jh=T.string().array(),dj=T.union([T.object({paths:T.string().array().describe("run specific test paths (e.g. todo-test)"),all:T.boolean().describe("run all tests").optional()}),T.object({path:T.string().describe("deprecated; present for backcompat")})]),Hh=T.object({tests:T.record(T.string().describe("Test name"),T.string().describe("Test YAML")),modules:T.record(T.string().describe("Module name"),T.string().describe("Module YAML"))}),XC=T.object({test:T.string().describe("test YAML"),modules:T.record(T.string().describe("moduleId"),T.string().describe("module YAML"))}),pj=XC.array(),uj=T.object({testId:T.string(),schemaVersion:T.string()}).merge(xr),mj=T.object({entries:T.array(vc),testId:T.string()}),hj=T.object({steps:T.array(T.record(T.unknown())),testId:T.string(),schemaVersion:T.string(),organizationId:T.string()}),$h=Hu,Wh=T.object({trigger:T.nativeEnum(Pt),status:T.nativeEnum(re),startedAt:T.coerce.date().optional(),gitCommitSha:T.string().optional(),gitCommitShaShort:T.string().optional(),gitCommitTimestamp:T.coerce.date().optional(),gitBranchName:T.string().optional(),gitOriginUrl:T.string().optional(),gitCommitMessage:T.string().optional(),gitCommitAuthorName:T.string().optional(),githubRepository:T.string().optional(),gitlabProjectPath:T.string().optional(),pipelineId:T.string().optional(),cliVersion:T.string().optional()}),Gh=T.object({id:T.string()}),Vh=T.object({status:T.nativeEnum(re),updatedAt:T.coerce.date().optional(),finishedAt:T.coerce.date().optional()}),qh=T.object({stepsSnapshot:T.array(T.record(T.unknown())).optional(),runGroupId:T.string().optional(),testId:T.string(),testName:T.string(),resolvedBaseUrl:T.string().optional(),environmentName:T.string().optional(),labels:T.array(T.string()).optional(),cliVersion:T.string().optional(),trigger:T.nativeEnum(Pt),schemaVersion:T.string().optional(),section:T.nativeEnum(sa).optional()}),Kh=T.object({id:T.string()}),ZC=zc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),Yh=ZC.array(),Jh=zc.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),Xh=T.object({id:T.string()}),Zh=T.object({status:T.nativeEnum(re),finishedAt:T.coerce.date().optional()}).merge(Qs),gj=T.object({screenshot:T.string()}),Qh=T.object({key:T.string()}),eg=T.object({orgId:T.string(),userId:T.string()}),tg=T.array(Gs),ng=T.record(T.string(),T.union([T.string(),T.boolean()])),fj=T.object({paths:T.string().array(),env:T.string().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional()}),rg=T.object({suiteRunIds:T.string().array(),runGroupIds:T.string().array()}),Sj=T.object({suiteRunIds:T.string().array()}),og=Gm.array(),yj=T.object({runGroupIds:T.string().array()}),vo=T.object({uploadUrl:T.string()}),bj=Vt.merge(Xm),wj=Vt.merge(Qm),vj=Vt.merge(Zm),QC=T.object({testId:T.string().optional().default(""),testName:T.string().optional().default(""),suiteId:T.string().optional().default(""),suiteName:T.string().optional().default(""),creditsUsed:T.number().optional(),usedBy:T.string().optional()}),eR=T.object({transactionId:T.string(),timestamp:T.string(),event:T.nativeEnum(Pr),properties:QC}),xj=eR.array(),ig=Nm.omit({steps:!0}).extend({steps:T.array(T.record(T.string(),T.unknown())).describe("unparsed ResolvedStep[]")}),Tj=T.object({limit:T.number().max(10).optional(),afterTime:T.number().optional()}),sg=zm.array(),Ej=T.object({applied:T.boolean().optional(),appliedAt:T.coerce.date().optional()}),Cj=Vt.extend({chunks:Hc.array(),description:T.string().describe("Input to pass to AI"),type:T.union([T.literal("locator"),T.literal("assertion"),T.literal("ai-action")]),softTokenLimit:T.number(),hardTokenLimit:T.number()}),ag=vo.extend({id:T.string()}),lg=T.object({runGroupId:T.string()}),cg=T.object({featureFlags:T.record(T.string(),T.boolean().or(T.string())),featureFlagPayloads:T.record(T.string(),Sa)});import{z as xe}from"zod";var dg=xe.object({orgId:xe.string(),cacheKeys:xe.string().array()}),Ij=xe.object({keyParams:dg,clientMetadata:xe.string(),lockAcquisitionTimeoutMs:xe.number().optional()}),pg=xe.object({acquired:xe.boolean(),acquiredByMetadata:xe.string(),keyPrefix:xe.string()}),Pj=xe.object({keyPrefix:xe.string(),result:xe.string(),ttlMs:xe.number()}),Lj=xe.union([xe.object({keyPrefix:xe.string()}),dg]),tR=xe.object({remainingTtlMs:xe.number(),value:xe.string().nullish()}),Oj=xe.object({results:xe.record(xe.string(),tR),activeLocks:xe.string().array()}),ug=0,mg=5*60*1e3;import{z as sn}from"zod";var hg="test",gg="module",Nt=(t=>(t.TEST=`${hg}.yaml`,t.MODULE=`${gg}.yaml`,t))(Nt||{}),he=(o=>(o.TEST=`momentic/${hg}`,o.MODULE=`momentic/${gg}`,o.FIXTURE="momentic/fixture",o.ENVIRONMENT="momentic/environment",o))(he||{}),Bj=kt.merge(xr),td=At.extend({steps:sn.array(sn.record(sn.string(),sn.unknown())),schemaVersion:sn.string()}),zj=td.extend({fileType:sn.literal(he.MODULE)}),jj=sn.object({test:sn.string().describe("YAML for the test, including metadata and steps"),modules:sn.record(sn.string(),sn.string()).describe("Map of module name to YAML for the module")});import{z as ot}from"zod";var nR=ot.object({version:ot.string(),json:ot.record(ot.unknown()),hash:ot.string()}),fg=ot.record(ot.unknown()),Gj=ot.object({newSvgs:ot.array(nR),metadata:fg.optional()}),rR=ot.object({version:ot.string(),json:ot.record(ot.unknown()).nullish(),hash:ot.string(),description:ot.string().nullish(),metadata:fg.nullish()}),Sg=ot.record(ot.string().describe("icon hash"),rR);import{validator as Jj}from"@exodus/schemasafe";var yg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as lH}from"zod";import{z as ba}from"zod";var pH=ba.object({repositoriesIndexed:ba.boolean(),indexingInProgress:ba.boolean(),indexesOutdated:ba.boolean()});import{z as Le}from"zod";var nd=Le.object({assertion:Le.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),oR=Le.object({instruction:Le.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:nd.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),bg=oR.extend({subSteps:Le.lazy(()=>bg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),wg=Le.object({name:Le.string().describe("Short name describing the test plan"),description:Le.string().nullish().transform(n=>n??void 0).describe("Longer form description of the high level goal of the test plan")}),vg=wg.extend({id:Le.string(),createdAt:Le.coerce.date(),updatedAt:Le.coerce.date(),updatedBy:Le.string(),createdBy:Le.string(),test:Le.object({id:Le.string(),name:Le.string()}).nullish().transform(n=>n??void 0)}),gH=vg.extend({testGenRuns:Le.tuple([]).or(Le.tuple([Le.object({id:Le.string(),startedAt:Le.coerce.date(),status:Le.nativeEnum(re)})]))}),xg=Le.object({preConditions:nd.array().nullish().transform(n=>n??[]),postConditions:nd.array().nullish().transform(n=>n??[]),steps:bg.array().nullish().transform(n=>n??[])}),fH=vg.extend({plan:xg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),iR=wg.extend({plan:xg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),SH=iR.array().nullish().transform(n=>n??[]);import{z as Oe}from"zod";var sR=Oe.object({step:ve,status:Oe.nativeEnum(re),startedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date().optional(),healMetadata:Oe.object({healType:Oe.nativeEnum(Ai).or(Oe.literal("AI")),healedAt:Oe.coerce.date()}).optional(),beforeSnapshotId:Oe.string().uuid().optional(),afterSnapshotId:Oe.string().uuid().optional(),message:Oe.string().optional()}),RH=sR.extend({status:Oe.nativeEnum(Ie),finishedAt:Oe.coerce.date()}),AH=Oe.object({startedAt:Oe.coerce.date()}).merge(Zh),aR=Jh.merge(qh).extend({startedAt:Oe.coerce.date(),attempts:Oe.number()}),IH=aR.extend({finishedAt:Oe.coerce.date()}),lR=Wh.merge(Vh).extend({startedAt:Oe.coerce.date(),cliVersion:Oe.string()}),rd=lR.extend({updatedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date()});var M="v1";var cR=9e4,dR=15e3,an=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function pR(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var od=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){return{"Content-Type":"application/json"}}async sendRequest(e,t,r=3,o=cR){let i=r,s,a={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(s=l,this.logger&&this.logger.warn({...a,err:l},`Got error response from Momentic server${r>0?", retrying":""}`),l instanceof an&&l.status>=400&&l.status<500||r===0)throw l;let c=1500,p=i-r,d=Math.min(c*Math.pow(2,p-1),dR);await new Promise(u=>setTimeout(u,d))}throw s}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,s=setTimeout(()=>i.abort(),r),a=()=>i.abort();t.signal&&t.signal.addEventListener("abort",a);try{let l=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:this.getHeaders(),signal:i.signal});if(!l.ok){let p=await pR(l);throw new an(l.status,p,`Request to ${e} failed with status ${l.status}: ${p}`)}let c;if(l.status===204)c={};else{let p=await l.text();try{c=JSON.parse(p)}catch{c=p}}return this.logger&&!t.noLog&&c&&this.logger.debug({result:c,status:l.status,...o},"Got response from Momentic server"),c}finally{clearTimeout(s),t.signal&&t.signal.removeEventListener("abort",a)}}},_t=class extends od{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var it=class extends _t{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${M}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:r}=eg.parse(e);return{orgId:t,userId:r}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${M}/runs/status`,{method:"POST",body:e,noLog:!0});return Yh.parse(t)}async createRunGroup(e){let t=await this.sendRequest(`/${M}/run-groups`,{method:"POST",body:e,noLog:!0},10);return Gh.parse(t)}async updateRunGroup(e,t){await this.sendRequest(`/${M}/run-groups/${e}`,{method:"PATCH",body:t,noLog:!0},5)}async createRun(e){let t=await this.sendRequest(`/${M}/runs`,{method:"POST",body:e,noLog:!0},10);return Kh.parse(t)}async updateRun(e,t){await this.sendRequest(`/${M}/runs/${e}`,{method:"PATCH",body:t,noLog:!0},5)}async createRunAttempt(e){let t=await this.sendRequest(`/${M}/runs/${e}/attempts`,{method:"POST",noLog:!0},10);return Xh.parse(t)}async updateRunAttempt(e,t,r){await this.sendRequest(`/${M}/runs/${e}/attempts/${t}`,{method:"PATCH",body:r,noLog:!0},5)}async getTest(e){let t=await this.sendRequest(`/${M}/tests/${e}`,{method:"GET"});return zh.parse(t)}async getAllTestIds(){let e=await this.sendRequest(`/${M}/tests`,{method:"GET"});return jh.parse(e)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${M}/tests/export`,{method:"POST",body:e});return Hh.parse(t)}async updateTestWithYAML(e){await this.sendRequest(`/${M}/tests/update`,{method:"POST",body:e})}async updateStepCaches(e){await this.sendRequest(`/${M}/cache`,{method:"PATCH",body:e})}async getStepCacheForTest(e){let t=await this.sendRequest(`/${M}/cache`,{method:"POST",body:e},10);return $h.parse(t)}async queueTests(e){let t=await this.sendRequest(`/${M}/tests/queue`,{method:"POST",body:e});return Bh.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${M}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return Qh.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${M}/environments`,{method:"GET"});return tg.parse(e)}async getEnvironment(e){let t=await this.sendRequest(`/${M}/environments/${e}`,{method:"GET"});return Gs.parse(t)}async getAllFeatureFlags(){let e=await this.sendRequest(`/${M}/auth/flags`,{method:"GET",noLog:!0},10);return ng.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${M}/result-cache/lock`,{method:"POST",body:e,signal:t});return pg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${M}/result-cache/lock`,{method:"DELETE",body:{key:e}})}async deleteCacheResult(e){await this.sendRequest(`/${M}/result-cache/entry`,{method:"DELETE",body:e})}async setCacheResult(e){await this.sendRequest(`/${M}/result-cache/entry`,{method:"PATCH",body:e})}async getCacheResult(e){try{return await this.sendRequest(`/${M}/result-cache/entry`,{method:"POST",body:e})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${M}/suites/queue`,{method:"POST",body:e});return rg.parse(t)}async bulkGetSuiteStatus(e){let t={suiteRunIds:e},r=await this.sendRequest(`/${M}/suites/status`,{method:"POST",body:t,noLog:!0});return og.parse(r)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${M}/run-groups/status`,{method:"POST",body:t,noLog:!0});return Hm.array().parse(r)}async updateCacheLastUsedDate(e,t){try{await this.sendRequest(`/${M}/cache/lastUsedAt`,{method:"PATCH",body:e,noLog:!0})}catch(r){t.error({err:r},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${M}/test-fragments/`,{method:"POST",body:e})}catch(r){t.error({err:r},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,r){try{await this.sendRequest(`/${M}/snapshots/${t}/screenshot`,{method:"POST",body:r,noLog:!0})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${M}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0});return vo.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${M}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0});return vo.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${M}/snapshots/${t}/html`,{method:"POST",noLog:!0});return vo.parse(r)}async generateA11yTreeSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${M}/snapshots/${t}/a11y`,{method:"POST",noLog:!0});return vo.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${M}/billing/events`,{method:"POST",body:t,noLog:!0},10,5e3)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${M}/test-fragments/${e}`,{method:"GET",noLog:!0});return ig.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${M}/test-fragments/${e}`,{method:"PATCH",body:t})}async getPastTestResults(e,t){let r=await this.sendRequest(`/${M}/results/tests/${e}`,{method:"POST",body:t});return sg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${M}/results/uploads`,{method:"POST",noLog:!0});return ag.parse(e)}async startProcessingResultsUpload(e){let t=await this.sendRequest(`/${M}/results/uploads/${e}/process`,{method:"POST",noLog:!0});return lg.parse(t)}async fetchIconKnowledgeBase(e,t){try{let r=await this.sendRequest(`/${M}/knowledge-base/icons`,{method:"GET",noLog:!0});return Sg.parse(r)}catch(r){return t.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t,r){try{await this.sendRequest(`/${M}/icon-knowledge-base/icons`,{method:"POST",body:t,noLog:!0},3,5e3)}catch(o){r.error({err:o},"Failed to save new icons to icon knowledge base")}}async getAllFlagsAndPayloads(){let e=await this.sendRequest(`/${M}/feature-flags`,{method:"GET",noLog:!0},3,5e3);return cg.parse(e)}};import{randomUUID as Tg}from"crypto";var wa=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvent(e,t,r){try{return await this.apiClient.reportBillableEvents(e,[{event:t,timestamp:new Date().toISOString(),transactionId:r?.eventId??Tg(),properties:Vc({},r)}])}catch(o){e.error({err:o},"Failed to report billable event")}}async reportCreditsUsed(e,t,r,o){if(r)try{return await this.apiClient.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:o?.eventId??Tg(),properties:Vc({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function xo(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var va=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:s}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),a=await xo(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:s}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),a=await xo(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.statusText}`)}catch(s){e.error({err:s},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await xo(o,"text/html",r);if(!i.ok)throw new Error(`Failed to upload network logs: ${i.statusText}`)}catch(o){e.error({err:o},"Failed to upload html snapshot")}}async storeScreenshot(e,t,r){try{await this.client.uploadSnapshotScreenshot(e,t,{screenshot:r.toString("base64")})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async storeA11yTreeSnapshot(e,t,r){return Promise.resolve()}async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}};function id(n){let e={parentChain:[]};return xa(n,e),e}function xa(n,e){let{onPresetAction:t,onSimpleStepContainer:r,onConditional:o,earlyStop:i}=n;for(let s of n.steps)switch(s.type){case"PRESET_ACTION":if(t(s,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(s,e)&&i)return!0;e.parentChain.push(s);for(let l of s.blocks)if(t(l.assertion,e)&&i||xa({...n,steps:l.steps},e)&&i)return!0;if(xa({...n,steps:s.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(r?.(s,e)&&i)return!0;if(s.steps){if(e.parentChain.push(s),xa({...n,steps:s.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(r?.(s,e)&&i)return!0;break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(s)}}function Eg(n,e,t,r){let o=Array.from(e),i=Array.from(r);for(let a=0;a<o.length;a++){if(o[a]!==i[a])return!1;i.shift()}return!!uR([n],t,i).result}function uR(n,e,t=[]){let r,o=[],i=(s,a)=>{let l=JSON.stringify(a.parentChain.map(p=>p.id)),c=t.length===0?!0:JSON.stringify(t)===l;return s.id===e&&c?(r=s,o=a.parentChain,!0):!1};return id({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Cg(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?Ta(r,e):typeof r=="object"&&Cg(r,e))}}function Ta(n,e){for(let t of n)t&&(Array.isArray(t)?Ta(t,e):typeof t=="object"&&Cg(t,e))}function To({steps:n,topLevel:e=!0,...t}){let{stepCacheEntries:r,logger:o,keyPrefix:i}=t,s=[],a=[],l=0,c=(d,u)=>{try{let m=br.parse(u.value);if(m.type!==d.type){o.warn({parsedCacheEntry:m,command:d},"Not using step cache due to type mismatch"),a.push(u.key);return}d.cache=m.cache,s.push(u.key)}catch(m){a.push(u.key),o.error({err:m,cacheEntry:u},"Not using step cache due to parsing error")}},p=(d,u)=>{let m=mR(d.id,u),h=m.find(g=>!!r[g]);h?c(d,r[h]):a.push(m[0])};for(let d of n)switch(d.type){case"RESOLVED_MODULE":{l+=d.steps.length;let{hits:m,misses:h}=To({...t,steps:d.steps,keyPrefix:i?`${i}:${d.id}`:d.id,topLevel:!1});s=s.concat(m),a=a.concat(h);break}case"IFRAME":case"SECTION":case"AI_ACTION":{if(l+=d.steps?.length??0,!d.steps?.length)break;let{hits:m,misses:h}=To({...t,steps:d.steps,topLevel:!1});s=s.concat(m),a=a.concat(h);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!dc.includes(d.command.type)||d.command.type==="TYPE"&&!d.command.target||d.command.type==="MOUSE_DRAG"&&!d.command.target||"cache"in d.command&&d.command.cache)continue;l++,p(d.command,i);break}case"CONDITIONAL":{for(let m of d.blocks){l++,p(m.assertion.command,i),l+=m.steps.length;let{hits:h,misses:g}=To({...t,steps:m.steps,topLevel:!1});s=s.concat(h),a=a.concat(g);break}if(d.elseSteps){l+=d.elseSteps.length;let{hits:m,misses:h}=To({...t,steps:d.elseSteps,topLevel:!1});s=s.concat(m),a=a.concat(h)}break}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(d)}return e&&l&&a.length>0&&o.warn({totalSteps:l,cacheMisses:a,cacheHits:s,cacheEntries:r.length},"Step cache did not fully resolve"),{hits:s,misses:a}}function Rg(n,e){return e?`${e}:${n}`:n}function mR(n,e){let t=[],r=e?.split(":")??[];for(let o=r.length;o>=0;o--){let i=[...r.slice(o),n];t.push(i.join(":"))}return t.reverse(),t}function Ag(n){let{moduleStepParents:e=[],moduleIdParents:t=[]}=n;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
15
- ${JSON.stringify(t)}`);let r=[];if(!n.skipIntermediateEntries)for(let o=e.length;o>0;o--){let i=t[o-1],s=e.slice(o,e.length).join(":");r.push({key:Rg(n.id,s),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:Rg(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function Ig(n){switch(n.type){case"DRAG":{if(n.fromTarget.type==="coordinates"||n.toTarget.type==="coordinates"||!n.fromTarget?.a11yData||!n.toTarget?.a11yData)return;n.cache={fromTarget:n.fromTarget.a11yData,toTarget:n.toTarget.a11yData},delete n.fromTarget.a11yData,delete n.toTarget.a11yData;return}case"MOUSE_DRAG":case"HOVER":case"SCROLL_UP":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SELECT_OPTION":case"TYPE":case"VISUAL_DIFF":case"CLICK":case"FOCUS":case"ELEMENT_CHECK":case"BLUR":{if(n.target?.type==="coordinates"||!n.target?.a11yData)return;n.cache={target:n.target.a11yData},delete n.target.a11yData;return}default:return}}function Pg(n){let e=new Set;return Ta(n,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let r=t.moduleId;typeof r=="string"&&!e.has(r)&&e.add(r)}}),e}function Lg(n,e,t){e.length&&(n.type==="DRAG"?e.length!==2||!e.every(r=>r.cache)?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):n.fromTarget.type==="description"&&n.toTarget.type==="description"&&(n.cache={fromTarget:e[0].cache,toTarget:e[1].cache}):e.length!==1||!e[0]?.cache?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):"target"in n&&n.target&&n.target.type==="description"&&(n.cache={target:e[0].cache}))}function Me(n,e,t=!1){return n.length<e?n:n.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Xn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},Zn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},sd={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},ad={EXISTS:"does not exists",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function hR(n){switch(n.type){case"ELEMENT_CONTENT":return`${n.negated?Zn[n.operation]:Xn[n.operation]} '${n.value}'`;case"ELEMENT_ATTRIBUTE":{let t=n.negated?Zn[n.operation]:Xn[n.operation];return n.operation==="EXISTS"?`attribute '${n.attr}' ${t}`:`attribute '${n.attr}' ${t} '${n.value}'`}case"ELEMENT_EXISTENCE":return n.negated?ad[n.condition]:sd[n.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var uG={CONTENT:"The page"};function gR(n){switch(n.type){case"VALUE":return`the option with value ${n.value}`;case"LABEL":return`the option with label ${n.label}`;case"INDEX":return`the option at index ${n.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function ld(n){switch(n.type){case"SUBSTRING":return`match substring '${n.url}'`;case"REGEX":return`match regex '${n.regex}'`;case"GLOB":return`match glob '${n.glob}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function fR(n){switch(n.type){case"CONTENT":return`${n.negated?Zn.CONTAINS:Xn.CONTAINS} '${n.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.type)}}function Nr(n){switch(n.type){case"SUCCESS":return n.condition?.assertion?`Check success condition: ${n.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${n.goal}`;case"NAVIGATE":return`Go to URL: ${Me(n.url,30)}`;case"DIALOG":return`Automatically ${n.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"WAIT":return`Wait for ${n.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(n.target?.type==="coordinates")return`Click at coordinates: ${dt(n.target)}`;let t="";return n.target?.elementDescriptor.length?t=` on element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` on element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Click${t}`}case"FOCUS":return`Focus ${dt(n.target)}`;case"BLUR":return`Focus ${dt(n.target)}`;case"DRAG":return`Drag ${dt(n.fromTarget)} onto ${dt(n.toTarget)}`;case"MOUSE_DRAG":return n.target?.type==="description"&&n.target.elementDescriptor?`Click and drag ${dt(n.target)} by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`:`Click and drag mouse by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`;case"TYPE":{let t="";return n.target?.type==="coordinates"?t=` in element at coordinates: ${dt(n.target)}`:n.target?.elementDescriptor.length?t=` in element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` in element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Type '${n.value}'${t||""}`}case"HOVER":{let t="";return n.target.type==="coordinates"?t=` over coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` over element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` over element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Hover${t}`}case"PRESS":return`Press ${n.value}`;case"SELECT_OPTION":{let t="",r=n.option??gR(n.choice);return n.target.type==="coordinates"?t=` from element at coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` from: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` from: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${r}'${t}`}case"TAB":if(n.url)return`Switch to tab with substring: ${n.url}`;if(n.action)switch(n.action.type){case"SUBSTRING":return`Switch to tab with substring: ${n.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${n.action.pattern}`;case"INDEX":return`Switch to tab at index: ${n.action.index}`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${n.url}`;case"REQUEST":return`Send ${n.method} request to ${n.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${n.url}`;case"COOKIE":return`Set cookie: ${n.value}`;case"LOCAL_STORAGE":return`Set local storage: ${n.key}: ${n.value}`;case"JAVASCRIPT":return`Run JavaScript: ${Me(n.code,30)}`;case"AI_ASSERTION":return`Assertion: '${n.assertion}'`;case"AI_WAIT":return`Wait until assertion is true: '${n.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${n.target?`for element: ${dt(n.target)}`:"for entire page"}`;case"FILE_UPLOAD":return n.fileSource.type==="URL"?`Upload file: ${n.fileSource.url}`:`Upload file: ${n.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Assert the element ${dt(n.target)} ${hR(n.assertion)}`;case"PAGE_CHECK":return`Assert the page ${fR(n.assertion)}`;case"WAIT_FOR_URL":return n.url?`Wait for page URL to match: ${n.url}`:n.matcher?`Wait for page URL to ${ld(n.matcher)}`:"Wait for page URL to match";case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return n.pattern?`Register a listener for network requests that match ${n.pattern}`:"Register a listener for network requests";case"AWAIT_LISTENER":return n.key?`Wait for the listener ${n.key} to resolve`:"Wait for a listener to resolve";default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Og(n){let e=[];for(let t of n){t.sort((s,a)=>s.timestamp-a.timestamp);let r=[],o,i=1;for(let s of t)o&&o.text===s.text&&o.type===s.type&&JSON.stringify(o.args??null)===JSON.stringify(s.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:r.push(o)),o=s,i=1);o&&r.push(o),e.push(r)}return e}import{cloneDeep as fG,unset as SG}from"lodash-es";function ln(n){switch(n.type){case"AI_ACTION":return`AI action: ${Me(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Me(n.text,100)}`;case"PRESET_ACTION":return Nr(n.command);case"MODULE":return`Module: ${n.id}`;case"RESOLVED_MODULE":return`Module: ${n.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${n.description?`with goal: ${Me(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var SR="[FAILED]";async function kg(n,e,t,r){if(t)if(t.startsWith("http")){let i=await(await fetch(t)).arrayBuffer();return`data:image/jpeg;base64,${Buffer.from(i).toString("base64")}`}else return t.startsWith("data:")?t:`data:image/jpeg;base64,${t}`;else if(r){let o=await e.getScreenshot(n,r);if(o)return`data:image/jpeg;base64,${Buffer.from(o).toString("base64")}`}}async function Ea(n,e,t,{numScreenshots:r=1,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:s=!1,recursive:a=!0}){let l=[],c;for(let p=0;p<t.length;p++){let d=t[p],u=a?_r(d):ln(d),m={description:`Step ${p}: ${u}`,startedAt:d.startedAt,finishedAt:d.finishedAt,beforeUrl:d.beforeUrl,afterUrl:d.afterUrl,message:d.message!=="Successfully executed preset action."?d.message:void 0,index:o?p:void 0};if(d.status==="FAILED"){m.description=`${SR} ${m.description}`,o&&(c=p);try{let h=$m.array().parse(d.details);for(let g of h)"pageState"in g&&s&&(m.pageState=g.pageState)}catch{}}r>0&&p>=t.length-r&&(m.afterScreenshot=await kg(n,e,d.afterScreenshot,d.afterSnapshot),i&&(m.beforeScreenshot=await kg(n,e,d.beforeScreenshot,d.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function _r(n){let e=ln(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
14
+ `)),console.log(" ",t(a))}}setMinLevel(e){this.minLogLevel=e}log(...e){this.logWithLevel(1,wn.reset,...e)}info(...e){this.logWithLevel(1,wn.blue,...e)}debug(...e){this.logWithLevel(0,wn.dim,...e)}warn(...e){this.logWithLevel(2,wn.yellow,...e)}error(...e){this.logWithLevel(3,wn.red,...e)}success(...e){this.logWithLevel(4,wn.green,...e)}dimmed(...e){this.logWithLevel(1,wn.dim,...e)}underline(...e){this.logWithLevel(2,wn.underline,...e)}bold(...e){this.logWithLevel(2,wn.bold,...e)}grey(...e){this.logWithLevel(0,wn.grey,...e)}child(e){return new n(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},y=new Zc(1,{}),Or={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Or,flush:()=>{},bindings:()=>({})},ya={},kr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...s)=>{let a=ya[e];a?clearTimeout(a.timer):(a={count:0,totalCount:0},ya[e]=a),a.totalCount++,a.count<t&&(a.count++,n.debug(o,i,...s)),a.timer=setTimeout(()=>{let l=ya[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete ya[e]},r)};import{z as Je}from"zod";var Mh=Je.object({id:Je.string(),createdAt:Je.coerce.date(),createdBy:Je.string(),organizationId:Je.string(),name:Je.string(),description:Je.string().nullish(),enabled:Je.boolean(),schemaVersion:Je.string().describe("Schema version for steps"),parameters:Je.string().array().nullish().describe("Parameter list"),defaultParameters:Je.record(Je.string(),Je.string()).nullish(),defaultCacheKey:Je.string().nullish(),defaultCacheTtl:Je.number().nullish(),defaultCacheAllInvocations:Je.boolean().nullish(),autoAuth:Je.boolean().nullish(),advanced:hc.nullish()}),Fz=Mh.extend({steps:Je.lazy(()=>Ke.array())}),Fh=5*60*1e3,Qc=At.merge(Mh.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as Bz}from"date-fns-tz";import{z as _n}from"zod";var ed=_n.object({failureRecovery:_n.boolean().optional(),aiAction:_n.boolean().optional()}),Hz=_n.object({ai:ed.optional(),githubAppInstallationId:_n.number().nullish(),githubReleaseAppInstallationId:_n.number().nullish(),gitlabAppAccessToken:_n.string().nullish().optional(),gitlabAppBaseUrl:_n.string().nullish().optional(),qaseAccessToken:_n.string().nullish().optional()});import*as T from"zod";var oj=T.object({error:T.boolean(),reason:T.string(),message:T.string()}),ij=Vt.merge(jc),Dh=Ns,sj=Vt.merge(jc);var aj=Vt.merge(Xm).extend({useConsensus:T.boolean().optional(),attemptNumber:T.number().optional()}),td=Nu,lj=Vt.merge(Zm),Uh=qu,cj=Vt.merge(Km),Bh=Vu,dj=Vt.merge(Ym),zh=Gu,pj=Vt.merge(Jm);var uj=T.object({testPaths:T.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:T.string().optional(),all:T.boolean().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional(),testInputMatrix:T.record(T.string(),T.string()).array().optional()}),jh=T.object({queuedTests:T.unknown().array(),runIds:T.string().uuid().array(),runGroupId:T.string().optional()}),Hh=ji,$h=T.string().array(),mj=T.union([T.object({paths:T.string().array().describe("run specific test paths (e.g. todo-test)"),all:T.boolean().describe("run all tests").optional()}),T.object({path:T.string().describe("deprecated; present for backcompat")})]),Wh=T.object({tests:T.record(T.string().describe("Test name"),T.string().describe("Test YAML")),modules:T.record(T.string().describe("Module name"),T.string().describe("Module YAML"))}),QC=T.object({test:T.string().describe("test YAML"),modules:T.record(T.string().describe("moduleId"),T.string().describe("module YAML"))}),hj=QC.array(),gj=T.object({testId:T.string(),schemaVersion:T.string()}).merge(xr),fj=T.object({entries:T.array(vc),testId:T.string()}),Sj=T.object({steps:T.array(T.record(T.unknown())),testId:T.string(),schemaVersion:T.string(),organizationId:T.string()}),Gh=Wu,Vh=T.object({trigger:T.nativeEnum(Pt),status:T.nativeEnum(re),startedAt:T.coerce.date().optional(),gitCommitSha:T.string().optional(),gitCommitShaShort:T.string().optional(),gitCommitTimestamp:T.coerce.date().optional(),gitBranchName:T.string().optional(),gitOriginUrl:T.string().optional(),gitCommitMessage:T.string().optional(),gitCommitAuthorName:T.string().optional(),githubRepository:T.string().optional(),gitlabProjectPath:T.string().optional(),pipelineId:T.string().optional(),cliVersion:T.string().optional()}),qh=T.object({id:T.string()}),Kh=T.object({status:T.nativeEnum(re),updatedAt:T.coerce.date().optional(),finishedAt:T.coerce.date().optional()}),Yh=T.object({stepsSnapshot:T.array(T.record(T.unknown())).optional(),runGroupId:T.string().optional(),testId:T.string(),testName:T.string(),resolvedBaseUrl:T.string().optional(),environmentName:T.string().optional(),labels:T.array(T.string()).optional(),cliVersion:T.string().optional(),trigger:T.nativeEnum(Pt),schemaVersion:T.string().optional(),section:T.nativeEnum(aa).optional()}),Jh=T.object({id:T.string()}),eR=zc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),Xh=eR.array(),Zh=zc.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),Qh=T.object({id:T.string()}),eg=T.object({status:T.nativeEnum(re),finishedAt:T.coerce.date().optional()}).merge(ea),yj=T.object({screenshot:T.string()}),tg=T.object({key:T.string()}),ng=T.object({orgId:T.string(),userId:T.string()}),rg=T.array(Vs),og=T.record(T.string(),T.union([T.string(),T.boolean()])),bj=T.object({paths:T.string().array(),env:T.string().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional()}),ig=T.object({suiteRunIds:T.string().array(),runGroupIds:T.string().array()}),wj=T.object({suiteRunIds:T.string().array()}),sg=qm.array(),vj=T.object({runGroupIds:T.string().array()}),vo=T.object({uploadUrl:T.string()}),xj=Vt.merge(Qm),Tj=Vt.merge(th),Ej=Vt.merge(eh),tR=T.object({testId:T.string().optional().default(""),testName:T.string().optional().default(""),suiteId:T.string().optional().default(""),suiteName:T.string().optional().default(""),creditsUsed:T.number().optional(),usedBy:T.string().optional()}),nR=T.object({transactionId:T.string(),timestamp:T.string(),event:T.nativeEnum(Pr),properties:tR}),Cj=nR.array(),ag=Mm.omit({steps:!0}).extend({steps:T.array(T.record(T.string(),T.unknown())).describe("unparsed ResolvedStep[]")}),Rj=T.object({limit:T.number().max(10).optional(),afterTime:T.number().optional()}),lg=Hm.array(),Aj=T.object({applied:T.boolean().optional(),appliedAt:T.coerce.date().optional()}),Ij=Vt.extend({chunks:Hc.array(),description:T.string().describe("Input to pass to AI"),type:T.union([T.literal("locator"),T.literal("assertion"),T.literal("ai-action")]),softTokenLimit:T.number(),hardTokenLimit:T.number()}),cg=vo.extend({id:T.string()}),dg=T.object({runGroupId:T.string()}),pg=T.object({featureFlags:T.record(T.string(),T.boolean().or(T.string())),featureFlagPayloads:T.record(T.string(),Sa)});import{z as xe}from"zod";var ug=xe.object({orgId:xe.string(),cacheKeys:xe.string().array()}),Oj=xe.object({keyParams:ug,clientMetadata:xe.string(),lockAcquisitionTimeoutMs:xe.number().optional()}),mg=xe.object({acquired:xe.boolean(),acquiredByMetadata:xe.string(),keyPrefix:xe.string()}),kj=xe.object({keyPrefix:xe.string(),result:xe.string(),ttlMs:xe.number()}),Nj=xe.union([xe.object({keyPrefix:xe.string()}),ug]),rR=xe.object({remainingTtlMs:xe.number(),value:xe.string().nullish()}),_j=xe.object({results:xe.record(xe.string(),rR),activeLocks:xe.string().array()}),hg=0,gg=5*60*1e3;import{z as sn}from"zod";var fg="test",Sg="module",Nt=(t=>(t.TEST=`${fg}.yaml`,t.MODULE=`${Sg}.yaml`,t))(Nt||{}),he=(o=>(o.TEST=`momentic/${fg}`,o.MODULE=`momentic/${Sg}`,o.FIXTURE="momentic/fixture",o.ENVIRONMENT="momentic/environment",o))(he||{}),Hj=kt.merge(xr),nd=At.extend({steps:sn.array(sn.record(sn.string(),sn.unknown())),schemaVersion:sn.string()}),$j=nd.extend({fileType:sn.literal(he.MODULE)}),Wj=sn.object({test:sn.string().describe("YAML for the test, including metadata and steps"),modules:sn.record(sn.string(),sn.string()).describe("Map of module name to YAML for the module")});import{z as ot}from"zod";var oR=ot.object({version:ot.string(),json:ot.record(ot.unknown()),hash:ot.string()}),yg=ot.record(ot.unknown()),Kj=ot.object({newSvgs:ot.array(oR),metadata:yg.optional()}),iR=ot.object({version:ot.string(),json:ot.record(ot.unknown()).nullish(),hash:ot.string(),description:ot.string().nullish(),metadata:yg.nullish()}),bg=ot.record(ot.string().describe("icon hash"),iR);import{validator as Qj}from"@exodus/schemasafe";var wg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as pH}from"zod";import{z as ba}from"zod";var hH=ba.object({repositoriesIndexed:ba.boolean(),indexingInProgress:ba.boolean(),indexesOutdated:ba.boolean()});import{z as Le}from"zod";var rd=Le.object({assertion:Le.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),sR=Le.object({instruction:Le.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:rd.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),vg=sR.extend({subSteps:Le.lazy(()=>vg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),xg=Le.object({name:Le.string().describe("Short name describing the test plan"),description:Le.string().nullish().transform(n=>n??void 0).describe("Longer form description of the high level goal of the test plan")}),Tg=xg.extend({id:Le.string(),createdAt:Le.coerce.date(),updatedAt:Le.coerce.date(),updatedBy:Le.string(),createdBy:Le.string(),test:Le.object({id:Le.string(),name:Le.string()}).nullish().transform(n=>n??void 0)}),yH=Tg.extend({testGenRuns:Le.tuple([]).or(Le.tuple([Le.object({id:Le.string(),startedAt:Le.coerce.date(),status:Le.nativeEnum(re)})]))}),Eg=Le.object({preConditions:rd.array().nullish().transform(n=>n??[]),postConditions:rd.array().nullish().transform(n=>n??[]),steps:vg.array().nullish().transform(n=>n??[])}),bH=Tg.extend({plan:Eg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),aR=xg.extend({plan:Eg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),wH=aR.array().nullish().transform(n=>n??[]);import{z as Oe}from"zod";var lR=Oe.object({step:ve,status:Oe.nativeEnum(re),startedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date().optional(),healMetadata:Oe.object({healType:Oe.nativeEnum(Ai).or(Oe.literal("AI")),healedAt:Oe.coerce.date()}).optional(),beforeSnapshotId:Oe.string().uuid().optional(),afterSnapshotId:Oe.string().uuid().optional(),message:Oe.string().optional()}),PH=lR.extend({status:Oe.nativeEnum(Ie),finishedAt:Oe.coerce.date()}),LH=Oe.object({startedAt:Oe.coerce.date()}).merge(eg),cR=Zh.merge(Yh).extend({startedAt:Oe.coerce.date(),attempts:Oe.number()}),OH=cR.extend({finishedAt:Oe.coerce.date()}),dR=Vh.merge(Kh).extend({startedAt:Oe.coerce.date(),cliVersion:Oe.string()}),od=dR.extend({updatedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date()});var M="v1";var pR=9e4,uR=15e3,an=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function mR(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var id=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){return{"Content-Type":"application/json"}}async sendRequest(e,t,r=3,o=pR){let i=r,s,a={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(s=l,this.logger&&this.logger.warn({...a,err:l},`Got error response from Momentic server${r>0?", retrying":""}`),l instanceof an&&l.status>=400&&l.status<500||r===0)throw l;let c=1500,p=i-r,d=Math.min(c*Math.pow(2,p-1),uR);await new Promise(u=>setTimeout(u,d))}throw s}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,s=setTimeout(()=>i.abort(),r),a=()=>i.abort();t.signal&&t.signal.addEventListener("abort",a);try{let l=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:this.getHeaders(),signal:i.signal});if(!l.ok){let p=await mR(l);throw new an(l.status,p,`Request to ${e} failed with status ${l.status}: ${p}`)}let c;if(l.status===204)c={};else{let p=await l.text();try{c=JSON.parse(p)}catch{c=p}}return this.logger&&!t.noLog&&c&&this.logger.debug({result:c,status:l.status,...o},"Got response from Momentic server"),c}finally{clearTimeout(s),t.signal&&t.signal.removeEventListener("abort",a)}}},_t=class extends id{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var it=class extends _t{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${M}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:r}=ng.parse(e);return{orgId:t,userId:r}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${M}/runs/status`,{method:"POST",body:e,noLog:!0});return Xh.parse(t)}async createRunGroup(e){let t=await this.sendRequest(`/${M}/run-groups`,{method:"POST",body:e,noLog:!0},10);return qh.parse(t)}async updateRunGroup(e,t){await this.sendRequest(`/${M}/run-groups/${e}`,{method:"PATCH",body:t,noLog:!0},5)}async createRun(e){let t=await this.sendRequest(`/${M}/runs`,{method:"POST",body:e,noLog:!0},10);return Jh.parse(t)}async updateRun(e,t){await this.sendRequest(`/${M}/runs/${e}`,{method:"PATCH",body:t,noLog:!0},5)}async createRunAttempt(e){let t=await this.sendRequest(`/${M}/runs/${e}/attempts`,{method:"POST",noLog:!0},10);return Qh.parse(t)}async updateRunAttempt(e,t,r){await this.sendRequest(`/${M}/runs/${e}/attempts/${t}`,{method:"PATCH",body:r,noLog:!0},5)}async getTest(e){let t=await this.sendRequest(`/${M}/tests/${e}`,{method:"GET"});return Hh.parse(t)}async getAllTestIds(){let e=await this.sendRequest(`/${M}/tests`,{method:"GET"});return $h.parse(e)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${M}/tests/export`,{method:"POST",body:e});return Wh.parse(t)}async updateTestWithYAML(e){await this.sendRequest(`/${M}/tests/update`,{method:"POST",body:e})}async updateStepCaches(e){await this.sendRequest(`/${M}/cache`,{method:"PATCH",body:e})}async getStepCacheForTest(e){let t=await this.sendRequest(`/${M}/cache`,{method:"POST",body:e},10);return Gh.parse(t)}async queueTests(e){let t=await this.sendRequest(`/${M}/tests/queue`,{method:"POST",body:e});return jh.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${M}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return tg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${M}/environments`,{method:"GET"});return rg.parse(e)}async getEnvironment(e){let t=await this.sendRequest(`/${M}/environments/${e}`,{method:"GET"});return Vs.parse(t)}async getAllFeatureFlags(){let e=await this.sendRequest(`/${M}/auth/flags`,{method:"GET",noLog:!0},10);return og.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${M}/result-cache/lock`,{method:"POST",body:e,signal:t});return mg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${M}/result-cache/lock`,{method:"DELETE",body:{key:e}})}async deleteCacheResult(e){await this.sendRequest(`/${M}/result-cache/entry`,{method:"DELETE",body:e})}async setCacheResult(e){await this.sendRequest(`/${M}/result-cache/entry`,{method:"PATCH",body:e})}async getCacheResult(e){try{return await this.sendRequest(`/${M}/result-cache/entry`,{method:"POST",body:e})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${M}/suites/queue`,{method:"POST",body:e});return ig.parse(t)}async bulkGetSuiteStatus(e){let t={suiteRunIds:e},r=await this.sendRequest(`/${M}/suites/status`,{method:"POST",body:t,noLog:!0});return sg.parse(r)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${M}/run-groups/status`,{method:"POST",body:t,noLog:!0});return Wm.array().parse(r)}async updateCacheLastUsedDate(e,t){try{await this.sendRequest(`/${M}/cache/lastUsedAt`,{method:"PATCH",body:e,noLog:!0})}catch(r){t.error({err:r},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${M}/test-fragments/`,{method:"POST",body:e})}catch(r){t.error({err:r},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,r){try{await this.sendRequest(`/${M}/snapshots/${t}/screenshot`,{method:"POST",body:r,noLog:!0})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${M}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0});return vo.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${M}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0});return vo.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${M}/snapshots/${t}/html`,{method:"POST",noLog:!0});return vo.parse(r)}async generateA11yTreeSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${M}/snapshots/${t}/a11y`,{method:"POST",noLog:!0});return vo.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${M}/billing/events`,{method:"POST",body:t,noLog:!0},10,5e3)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${M}/test-fragments/${e}`,{method:"GET",noLog:!0});return ag.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${M}/test-fragments/${e}`,{method:"PATCH",body:t})}async getPastTestResults(e,t){let r=await this.sendRequest(`/${M}/results/tests/${e}`,{method:"POST",body:t});return lg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${M}/results/uploads`,{method:"POST",noLog:!0});return cg.parse(e)}async startProcessingResultsUpload(e){let t=await this.sendRequest(`/${M}/results/uploads/${e}/process`,{method:"POST",noLog:!0});return dg.parse(t)}async fetchIconKnowledgeBase(e,t){try{let r=await this.sendRequest(`/${M}/knowledge-base/icons`,{method:"GET",noLog:!0});return bg.parse(r)}catch(r){return t.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t,r){try{await this.sendRequest(`/${M}/icon-knowledge-base/icons`,{method:"POST",body:t,noLog:!0},3,5e3)}catch(o){r.error({err:o},"Failed to save new icons to icon knowledge base")}}async getAllFlagsAndPayloads(){let e=await this.sendRequest(`/${M}/feature-flags`,{method:"GET",noLog:!0},3,5e3);return pg.parse(e)}};import{randomUUID as Cg}from"crypto";var wa=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvent(e,t,r){try{return await this.apiClient.reportBillableEvents(e,[{event:t,timestamp:new Date().toISOString(),transactionId:r?.eventId??Cg(),properties:Vc({},r)}])}catch(o){e.error({err:o},"Failed to report billable event")}}async reportCreditsUsed(e,t,r,o){if(r)try{return await this.apiClient.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:o?.eventId??Cg(),properties:Vc({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function xo(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var va=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:s}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),a=await xo(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:s}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),a=await xo(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.statusText}`)}catch(s){e.error({err:s},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await xo(o,"text/html",r);if(!i.ok)throw new Error(`Failed to upload network logs: ${i.statusText}`)}catch(o){e.error({err:o},"Failed to upload html snapshot")}}async storeScreenshot(e,t,r){try{await this.client.uploadSnapshotScreenshot(e,t,{screenshot:r.toString("base64")})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async storeA11yTreeSnapshot(e,t,r){return Promise.resolve()}async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}};function sd(n){let e={parentChain:[]};return xa(n,e),e}function xa(n,e){let{onPresetAction:t,onSimpleStepContainer:r,onConditional:o,earlyStop:i}=n;for(let s of n.steps)switch(s.type){case"PRESET_ACTION":if(t(s,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(s,e)&&i)return!0;e.parentChain.push(s);for(let l of s.blocks)if(t(l.assertion,e)&&i||xa({...n,steps:l.steps},e)&&i)return!0;if(xa({...n,steps:s.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(r?.(s,e)&&i)return!0;if(s.steps){if(e.parentChain.push(s),xa({...n,steps:s.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(r?.(s,e)&&i)return!0;break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(s)}}function Rg(n,e,t,r){let o=Array.from(e),i=Array.from(r);for(let a=0;a<o.length;a++){if(o[a]!==i[a])return!1;i.shift()}return!!hR([n],t,i).result}function hR(n,e,t=[]){let r,o=[],i=(s,a)=>{let l=JSON.stringify(a.parentChain.map(p=>p.id)),c=t.length===0?!0:JSON.stringify(t)===l;return s.id===e&&c?(r=s,o=a.parentChain,!0):!1};return sd({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Ag(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?Ta(r,e):typeof r=="object"&&Ag(r,e))}}function Ta(n,e){for(let t of n)t&&(Array.isArray(t)?Ta(t,e):typeof t=="object"&&Ag(t,e))}function To({steps:n,topLevel:e=!0,...t}){let{stepCacheEntries:r,logger:o,keyPrefix:i}=t,s=[],a=[],l=0,c=(d,u)=>{try{let m=br.parse(u.value);if(m.type!==d.type){o.warn({parsedCacheEntry:m,command:d},"Not using step cache due to type mismatch"),a.push(u.key);return}d.cache=m.cache,s.push(u.key)}catch(m){a.push(u.key),o.error({err:m,cacheEntry:u},"Not using step cache due to parsing error")}},p=(d,u)=>{let m=gR(d.id,u),h=m.find(g=>!!r[g]);h?c(d,r[h]):a.push(m[0])};for(let d of n)switch(d.type){case"RESOLVED_MODULE":{l+=d.steps.length;let{hits:m,misses:h}=To({...t,steps:d.steps,keyPrefix:i?`${i}:${d.id}`:d.id,topLevel:!1});s=s.concat(m),a=a.concat(h);break}case"IFRAME":case"SECTION":case"AI_ACTION":{if(l+=d.steps?.length??0,!d.steps?.length)break;let{hits:m,misses:h}=To({...t,steps:d.steps,topLevel:!1});s=s.concat(m),a=a.concat(h);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!dc.includes(d.command.type)||d.command.type==="TYPE"&&!d.command.target||d.command.type==="MOUSE_DRAG"&&!d.command.target||"cache"in d.command&&d.command.cache)continue;l++,p(d.command,i);break}case"CONDITIONAL":{for(let m of d.blocks){l++,p(m.assertion.command,i),l+=m.steps.length;let{hits:h,misses:g}=To({...t,steps:m.steps,topLevel:!1});s=s.concat(h),a=a.concat(g);break}if(d.elseSteps){l+=d.elseSteps.length;let{hits:m,misses:h}=To({...t,steps:d.elseSteps,topLevel:!1});s=s.concat(m),a=a.concat(h)}break}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(d)}return e&&l&&a.length>0&&o.warn({totalSteps:l,cacheMisses:a,cacheHits:s,cacheEntries:r.length},"Step cache did not fully resolve"),{hits:s,misses:a}}function Ig(n,e){return e?`${e}:${n}`:n}function gR(n,e){let t=[],r=e?.split(":")??[];for(let o=r.length;o>=0;o--){let i=[...r.slice(o),n];t.push(i.join(":"))}return t.reverse(),t}function Pg(n){let{moduleStepParents:e=[],moduleIdParents:t=[]}=n;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
15
+ ${JSON.stringify(t)}`);let r=[];if(!n.skipIntermediateEntries)for(let o=e.length;o>0;o--){let i=t[o-1],s=e.slice(o,e.length).join(":");r.push({key:Ig(n.id,s),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:Ig(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function Lg(n){switch(n.type){case"DRAG":{if(n.fromTarget.type==="coordinates"||n.toTarget.type==="coordinates"||!n.fromTarget?.a11yData||!n.toTarget?.a11yData)return;n.cache={fromTarget:n.fromTarget.a11yData,toTarget:n.toTarget.a11yData},delete n.fromTarget.a11yData,delete n.toTarget.a11yData;return}case"MOUSE_DRAG":case"HOVER":case"SCROLL_UP":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SELECT_OPTION":case"TYPE":case"VISUAL_DIFF":case"CLICK":case"FOCUS":case"ELEMENT_CHECK":case"BLUR":{if(n.target?.type==="coordinates"||!n.target?.a11yData)return;n.cache={target:n.target.a11yData},delete n.target.a11yData;return}default:return}}function Og(n){let e=new Set;return Ta(n,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let r=t.moduleId;typeof r=="string"&&!e.has(r)&&e.add(r)}}),e}function kg(n,e,t){e.length&&(n.type==="DRAG"?e.length!==2||!e.every(r=>r.cache)?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):n.fromTarget.type==="description"&&n.toTarget.type==="description"&&(n.cache={fromTarget:e[0].cache,toTarget:e[1].cache}):e.length!==1||!e[0]?.cache?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):"target"in n&&n.target&&n.target.type==="description"&&(n.cache={target:e[0].cache}))}function Me(n,e,t=!1){return n.length<e?n:n.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Xn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},Zn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ad={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},ld={EXISTS:"does not exists",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function fR(n){switch(n.type){case"ELEMENT_CONTENT":return`${n.negated?Zn[n.operation]:Xn[n.operation]} '${n.value}'`;case"ELEMENT_ATTRIBUTE":{let t=n.negated?Zn[n.operation]:Xn[n.operation];return n.operation==="EXISTS"?`attribute '${n.attr}' ${t}`:`attribute '${n.attr}' ${t} '${n.value}'`}case"ELEMENT_EXISTENCE":return n.negated?ld[n.condition]:ad[n.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var gG={CONTENT:"The page"};function SR(n){switch(n.type){case"VALUE":return`the option with value ${n.value}`;case"LABEL":return`the option with label ${n.label}`;case"INDEX":return`the option at index ${n.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function cd(n){switch(n.type){case"SUBSTRING":return`match substring '${n.url}'`;case"REGEX":return`match regex '${n.regex}'`;case"GLOB":return`match glob '${n.glob}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function yR(n){switch(n.type){case"CONTENT":return`${n.negated?Zn.CONTAINS:Xn.CONTAINS} '${n.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.type)}}function Nr(n){switch(n.type){case"SUCCESS":return n.condition?.assertion?`Check success condition: ${n.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${n.goal}`;case"NAVIGATE":return`Go to URL: ${Me(n.url,30)}`;case"DIALOG":return`Automatically ${n.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"WAIT":return`Wait for ${n.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(n.target?.type==="coordinates")return`Click at coordinates: ${dt(n.target)}`;let t="";return n.target?.elementDescriptor.length?t=` on element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` on element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Click${t}`}case"FOCUS":return`Focus ${dt(n.target)}`;case"BLUR":return`Focus ${dt(n.target)}`;case"DRAG":return`Drag ${dt(n.fromTarget)} onto ${dt(n.toTarget)}`;case"MOUSE_DRAG":return n.target?.type==="description"&&n.target.elementDescriptor?`Click and drag ${dt(n.target)} by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`:`Click and drag mouse by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`;case"TYPE":{let t="";return n.target?.type==="coordinates"?t=` in element at coordinates: ${dt(n.target)}`:n.target?.elementDescriptor.length?t=` in element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` in element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Type '${n.value}'${t||""}`}case"HOVER":{let t="";return n.target.type==="coordinates"?t=` over coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` over element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` over element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Hover${t}`}case"PRESS":return`Press ${n.value}`;case"SELECT_OPTION":{let t="",r=n.option??SR(n.choice);return n.target.type==="coordinates"?t=` from element at coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` from: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` from: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${r}'${t}`}case"TAB":if(n.url)return`Switch to tab with substring: ${n.url}`;if(n.action)switch(n.action.type){case"SUBSTRING":return`Switch to tab with substring: ${n.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${n.action.pattern}`;case"INDEX":return`Switch to tab at index: ${n.action.index}`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${n.url}`;case"REQUEST":return`Send ${n.method} request to ${n.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${n.url}`;case"COOKIE":return`Set cookie: ${n.value}`;case"LOCAL_STORAGE":return`Set local storage: ${n.key}: ${n.value}`;case"JAVASCRIPT":return`Run JavaScript: ${Me(n.code,30)}`;case"AI_ASSERTION":return`Assertion: '${n.assertion}'`;case"AI_WAIT":return`Wait until assertion is true: '${n.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${n.target?`for element: ${dt(n.target)}`:"for entire page"}`;case"FILE_UPLOAD":return n.fileSource.type==="URL"?`Upload file: ${n.fileSource.url}`:`Upload file: ${n.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Assert the element ${dt(n.target)} ${fR(n.assertion)}`;case"PAGE_CHECK":return`Assert the page ${yR(n.assertion)}`;case"WAIT_FOR_URL":return n.url?`Wait for page URL to match: ${n.url}`:n.matcher?`Wait for page URL to ${cd(n.matcher)}`:"Wait for page URL to match";case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return n.pattern?`Register a listener for network requests that match ${n.pattern}`:"Register a listener for network requests";case"AWAIT_LISTENER":return n.key?`Wait for the listener ${n.key} to resolve`:"Wait for a listener to resolve";default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Ng(n){let e=[];for(let t of n){t.sort((s,a)=>s.timestamp-a.timestamp);let r=[],o,i=1;for(let s of t)o&&o.text===s.text&&o.type===s.type&&JSON.stringify(o.args??null)===JSON.stringify(s.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:r.push(o)),o=s,i=1);o&&r.push(o),e.push(r)}return e}import{cloneDeep as bG,unset as wG}from"lodash-es";function ln(n){switch(n.type){case"AI_ACTION":return`AI action: ${Me(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${Me(n.text,100)}`;case"PRESET_ACTION":return Nr(n.command);case"MODULE":return`Module: ${n.id}`;case"RESOLVED_MODULE":return`Module: ${n.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${n.description?`with goal: ${Me(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var bR="[FAILED]";async function _g(n,e,t,r){if(t)if(t.startsWith("http")){let i=await(await fetch(t)).arrayBuffer();return`data:image/jpeg;base64,${Buffer.from(i).toString("base64")}`}else return t.startsWith("data:")?t:`data:image/jpeg;base64,${t}`;else if(r){let o=await e.getScreenshot(n,r);if(o)return`data:image/jpeg;base64,${Buffer.from(o).toString("base64")}`}}async function Ea(n,e,t,{numScreenshots:r=1,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:s=!1,recursive:a=!0}){let l=[],c;for(let p=0;p<t.length;p++){let d=t[p],u=a?_r(d):ln(d),m={description:`Step ${p}: ${u}`,startedAt:d.startedAt,finishedAt:d.finishedAt,beforeUrl:d.beforeUrl,afterUrl:d.afterUrl,message:d.message!=="Successfully executed preset action."?d.message:void 0,index:o?p:void 0};if(d.status==="FAILED"){m.description=`${bR} ${m.description}`,o&&(c=p);try{let h=Gm.array().parse(d.details);for(let g of h)"pageState"in g&&s&&(m.pageState=g.pageState)}catch{}}r>0&&p>=t.length-r&&(m.afterScreenshot=await _g(n,e,d.afterScreenshot,d.afterSnapshot),i&&(m.beforeScreenshot=await _g(n,e,d.beforeScreenshot,d.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function _r(n){let e=ln(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
16
16
  `;for(let t=0;t<n.results.length;t++)e+=Ve(`Sub-step ${t} in AI action:
17
17
  `,2),e+=`${Ve(_r(n.results[t]),2)}
18
18
  `,e+=Ve(`${"=".repeat(10)}
@@ -38,12 +38,12 @@ ${JSON.stringify(t)}`);let r=[];if(!n.skipIntermediateEntries)for(let o=e.length
38
38
  `,e+=Ve(`${"=".repeat(10)}
39
39
  `,2);return e}default:return(r=>{throw new Error("You missed a case in the switch above")})(n)}}function Ve(n,e){return n.split(`
40
40
  `).map(t=>" ".repeat(e)+t).join(`
41
- `)}function Ng(n,e){try{if(!n)return n;if(typeof n=="string")return Me(n,3e4);if(typeof n=="object"){let{jsonString:t}=Pi(JSON.stringify(n,(r,o)=>e?.includes(r)||typeof o=="string"&&o.length>3e4?"REDACTED":o),2e4);return JSON.parse(t)}return n}catch{return n}}import{cloneDeep as MG}from"lodash-es";var yR=/^(?!.*\S+\s+\S+).*$/,bR=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,wR=/style="([^"]*)/g,vR=/data-[\w-]+/g,xR=n=>{switch(n.type){case"AI_WAIT":case"AI_ASSERTION":return{type:n.type,assertion:n.assertion};case"DRAG":if(n.fromTarget.type==="description")return{type:n.type,description:n.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(n.target?.type==="description")return{type:n.type,description:n.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function _g(n){let e=xR(n),t=e.type==="AI_ASSERTION"||e.type==="AI_WAIT"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:yR.test(t)&&bR.test(t)?{thoughts:"Too few words in the command description. Please add more words to the description.",category:"FEW_WORDS"}:wR.test(t)?{thoughts:"Style tag is not allowed in the command description. Please remove it and describe the command in a different way.",category:"STYLE_TAG"}:vR.test(t)?{thoughts:"Hardcoded data attributes are not recommend in the command description. If the attribute doesn't directly match the quotes, autohealing will fail.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:"The description contains the same word as the command type. Please remove it since the type of command is already known.",category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}function Mg(n,e){if(!(!n.envs||!n.envs.length)){for(let t of n.envs){let r=t;e in t&&(r[e]&&(t.default=!0),delete r.defaultOnCloud,delete r.defaultOnLocal)}n.envs.some(t=>t.default)||(n.envs[0].default=!0)}}import{cloneDeep as af}from"lodash-es";import AR from"diff-lines";import Ra,{gte as IR}from"semver";var Fg={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>(n=n.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),n=n.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),n)};var Dg={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,r=t[t.length-1];return r&&r.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var TR=["target","fromTarget","toTarget"];function Ug(n){for(let e of TR){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var Bg={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":return Ug(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])Ug(r);return e}default:return e}})};import{v4 as ER}from"uuid";var zg={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=ER()),e;default:return e}})};import{v4 as jg}from"uuid";var Hg={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??jg(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??jg()}})),delete e.commands),e;default:return e}})};var $g={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as CR}from"uuid";var Wg={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>("id"in e&&typeof e.id=="string"||(e.id=CR()),e))};import{v4 as Gg}from"uuid";var Vg={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=Gg())}return e.id=Gg(),e})};var qg={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as RR}from"uuid";var Kg={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=RR()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var Yg={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var Jg={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Xg(t),e})};function Xg(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){Xg(n[e]);return}if(typeof n[e]!="string")return;let t=n[e];e==="code"?n[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(n[e]=t.replace(/inputs\./g,"env."))})}var Zg={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var Qg={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var ef={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var tf={name:"Migrate AI assertions to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async n=>n.map(e=>{if(e.type!=="AI_ASSERTION")return e;let r={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...r};return delete o.text,o}),stopOnFailure:!0};var Ca=new Set(["CLICK","TYPE","SELECT_OPTION"]),nf={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type,o=t?.elementDescriptor;return(o!==void 0||Ca.has(r))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(s=>{let a=s?.elementDescriptor,l=s?.type;(a!==void 0||Ca.has(l))&&(s.target={elementDescriptor:a??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(s=>{let a=s.command,l=a?.elementDescriptor,c=a?.type;(l!==void 0||Ca.has(c))&&(a.target={elementDescriptor:l??""}),s.commands&&Array.isArray(s.commands)&&s.commands.forEach(d=>{let u=d?.elementDescriptor,m=d?.type;(u!==void 0||Ca.has(m))&&(d.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var rf={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(r=>{if(r&&typeof r=="object"){let o=r;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var of={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type;return r?.startsWith("PRESET_")&&(t.type=r.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let s=i.type;s?.startsWith("PRESET_")&&(i.type=s.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let s=i.command,a=s?.type;a?.startsWith("PRESET_")&&(s.type=a.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(c=>{let p=c.type;p?.startsWith("PRESET_")&&(c.type=p.slice(7))})}),e}),stopOnFailure:!0};var Mr=[tf,rf,of,nf,Fg,Dg,Bg,zg,Hg,$g,Wg,Vg,qg,Kg,Yg,Jg,Zg,Qg,ef];if(He!==Mr[Mr.length-1].toVersion)throw new Error("Please bump LATEST_VERSION in types package after adding a migration");Mr.forEach((n,e)=>{if(!Ra.valid(n.toVersion)||!Ra.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Ra.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Mr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function PR(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var Hi=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:s}=n,a=Mr.findIndex(p=>Ra.gt(p.toVersion,i));if(a===-1)return{steps:o,newVersion:i};let l=i;for(let p=a;p<Mr.length;p++){if(r&&IR(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let d=Mr[p],u={id:s,migration:d.name,toVersion:d.toVersion};try{o=await sf(o,d),l=d.toVersion}catch(m){throw t.error({err:m,...u},"Migration failed"),new Error(`Step migration ${d.name} failed: ${m}`)}}let c=AR(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return c.trim()&&t.debug({diffs:c,id:s},"Migration diffs"),{newVersion:l,steps:o}};async function sf(n,e){let t=await e.execute(n);for(let r of t)for(let o of Object.keys(r)){if(!e.recursiveKeys.has(o))continue;let i=r[o];!i||!Array.isArray(i)||PR(i)&&(r[o]=await sf(i,e))}return t}async function lf({rawSteps:n,metadata:e,logger:t,callbacks:r}){Mg(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:s}=await Aa({rawSteps:n.steps,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o}),a={...e,steps:i,schemaVersion:s};for(let l of["beforeSteps","afterSteps"]){let c=n[l];if(!c)continue;let{resolvedSteps:p}=await Aa({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});a[l]=p}return{resolvedTest:a,moduleIds:Array.from(Object.keys(o))}}async function cd(n,e,t){let{newVersion:r,steps:o}=await Hi({metadata:n,steps:e,logger:t});try{return{steps:Ke.array().parse(o),newVersion:r}}catch(i){throw t.error({type:"zod",err:i,newVersion:r,id:n.id,steps:o},"Failed to parse test steps while migrating test"),new ga(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Aa({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:s}=await cd(e,n,t),a=[];for(let l of s)a.push(await $i({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:a,newSchemaVersion:i}}async function $i({step:n,callbacks:e,logger:t,resolvedModuleCache:r}){switch(n.type){case"AI_ACTION":return n;case"AI_ACTION_DYNAMIC":return n;case"PRESET_ACTION":return n;case"MODULE":{let l=n.moduleId,c=r[l];if(c)return{...af(c),...n,type:"RESOLVED_MODULE"};let p=await e.onFetchModule({id:l,logger:t});if(!p)throw new Error(`Could not find module with id ${l}`);let{newVersion:d,steps:u}=await Hi({metadata:{id:l,schemaVersion:p.schemaVersion},steps:p.steps,logger:t}),m;try{m=Ke.array().parse(u)}catch(f){throw t.error({type:"zod",err:f,steps:u,newVersion:d,id:l},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>$i({step:f,callbacks:e,logger:t,resolvedModuleCache:r})))}catch(f){throw t.error({err:f,...n},`Failed to recursively resolve module '${p.name}': ${f}`),f}let g={...p,steps:h};return r[l]=af(g),{...g,...n,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let l of n.blocks){let c=[];for(let p of l.steps)c.push(await $i({step:p,callbacks:e,logger:t,resolvedModuleCache:r}));o.push({...l,steps:c})}let i;if(n.elseSteps){i=[];for(let l of n.elseSteps)i.push(await $i({step:l,callbacks:e,logger:t,resolvedModuleCache:r}))}return{...n,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let s=[];for(let l of n.steps)s.push(await $i({step:l,callbacks:e,logger:t,resolvedModuleCache:r}));return{...n,steps:s};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function LR(n){return typeof n=="object"&&n!==null}function Mn(n){if(Array.isArray(n))return n.map(Mn);if(LR(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=Mn(r))}),e}return n}import{cloneDeep as cf}from"lodash-es";import{v4 as dd}from"uuid";async function mt(n){let e=new Map,t=new Set,r=cf(n.stepLists.steps),o=await Fr({...n,steps:r,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let a=cf(n.stepLists[s]);if(!a)continue;let l=await Fr({...n,steps:a,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...l.cachesToSave),i.moduleUpdates.push(...l.moduleUpdates),i.stepsToSave[s]=l.stepsToSave}return i}async function Fr({steps:n,...e}){let{seenModules:t,cacheCreationParams:r,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:s,shouldCreateNewModuleId:a}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let c of n)switch(delete c.index,delete c.aiSuggested,c.id=e.createNewStepIds?dd():c.id,c.type){case"PRESET_ACTION":{let d=c.command;d.id=r?.createNewCacheIds?dd():d.id,Ig(d),"cache"in d&&d.cache&&(r&&(l.cachesToSave=l.cachesToSave.concat(Ag({id:d.id,orgId:r.orgId,testId:r.testId,value:br.parse(d),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete d.cache),d.thoughts&&delete d.thoughts,l.stepsToSave.push({...c,command:d});break}case"RESOLVED_MODULE":{let d=r?.createNewCacheIds?dd():c.id,u=c.moduleId;s.has(u)?u=s.get(u):a!==void 0&&(u=await a(c),s.set(c.moduleId,u));let{cachesToSave:m,stepsToSave:h,moduleUpdates:g}=await Fr({...e,steps:c.steps,cacheCreationParams:r?{...r,createNewCacheIds:!1}:void 0,moduleStepParents:[...i,d],moduleIdParents:[...o,u],skipCacheIntermediateEntries:r?.createNewCacheIds});l.moduleUpdates=l.moduleUpdates.concat(g),l.cachesToSave=l.cachesToSave.concat(m),t.has(u)||(t.add(u),l.moduleUpdates.push({...At.parse(c),steps:Ke.array().parse(h),moduleId:u}));let f={type:"MODULE",moduleId:u,inputs:c.inputs,id:d,skipped:c.skipped,cacheConfig:c.cacheConfig,envKey:c.envKey};l.stepsToSave.push(f);break}case"AI_ACTION":{if(!c.steps){l.stepsToSave.push(c);break}let{stepsToSave:d,cachesToSave:u}=await Fr({...e,steps:c.steps});try{c.steps=Rt.array().parse(d)}catch(m){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${m}`)}l.stepsToSave.push(c),l.cachesToSave=l.cachesToSave.concat(u);break}case"AI_ACTION_DYNAMIC":{l.stepsToSave.push(c);break}case"CONDITIONAL":{let d=[];for(let m of c.blocks){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Fr({...e,steps:m.steps});d.push({...m,steps:h}),l.cachesToSave=l.cachesToSave.concat(g),l.moduleUpdates=l.moduleUpdates.concat(f)}let u={...c,elseSteps:void 0,blocks:d};if(c.elseSteps){let{stepsToSave:m,cachesToSave:h,moduleUpdates:g}=await Fr({...e,steps:c.elseSteps});u.elseSteps=m,l.cachesToSave=l.cachesToSave.concat(h),l.moduleUpdates=l.moduleUpdates.concat(g)}l.stepsToSave.push(u);break}case"IFRAME":case"SECTION":{let{stepsToSave:d,cachesToSave:u,moduleUpdates:m}=await Fr({...e,steps:c.steps}),h={...c,steps:d};l.moduleUpdates=l.moduleUpdates.concat(m),l.stepsToSave.push(h),l.cachesToSave=l.cachesToSave.concat(u);break}default:return(d=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(c)}return l}import{cloneDeep as OR}from"lodash-es";import{stringify as df}from"yaml";async function pf(n,e=new Set){let t={id:n.id,name:n.name,description:n.description,baseUrl:n.baseUrl,schemaVersion:n.schemaVersion,advanced:n.advanced,retries:n.retries,envs:n.envs,disabled:n.disabled,labels:n.labels},r={},o=await kR({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:r,processedModuleNames:e}),i={fileType:he.TEST,...t,beforeSteps:o.beforeSteps&&o.beforeSteps.length>0?o.beforeSteps:void 0,steps:o.steps,afterSteps:o.afterSteps&&o.afterSteps.length>0?o.afterSteps:void 0};return{test:df(i),modules:r}}async function kR({originalStepLists:n,modules:e,processedModuleNames:t}){let r=OR(n);Object.values(r).forEach(s=>{NR(s??[])});let{stepsToSave:o,moduleUpdates:i}=await mt({stepLists:r});for(let s of i)t.has(s.name)||(e[s.name]=_R(s),t.add(s.name));return o}function NR(n){id({steps:n,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function _R(n){let e=At.parse(n),t={fileType:he.MODULE,...e,schemaVersion:He,steps:n.steps};return df(t)}async function ne(n,e){return new Promise((t,r)=>{if(e?.aborted){r(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n);function i(){clearTimeout(o),e?.removeEventListener("abort",i),r(e?.reason)}})}async function Wi({promiseGenerator:n,signal:e,codePath:t,logger:r}){let i=Date.now(),s=setInterval(()=>{if(e?.aborted){clearInterval(s);return}r?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((a,l)=>{function c(){clearInterval(s),e?.removeEventListener("abort",c),l(e?.reason)}if(e?.aborted){l(e?.reason),clearInterval(s);return}e?.addEventListener("abort",c),(async()=>{try{a(await n())}catch(p){l(p)}finally{clearInterval(s),e?.removeEventListener("abort",c)}})()})}async function Dr({promiseGenerator:n,timeoutMs:e,codePath:t,logger:r,signal:o}){let i=!1,s=new AbortController,a=()=>{s.abort()},l=setTimeout(()=>{i||s.abort()},e);o?.addEventListener("abort",a);try{return await Wi({promiseGenerator:n,signal:s.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",a),clearTimeout(l)}}function Ia(n){let e=[];for(let t of n)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let r={...t,type:"MODULE"};e.push(kn.parse(r));break}case"IFRAME":case"SECTION":{let r={...t,steps:Ia(t.steps)};e.push(Ke.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Ia(o.steps)})),elseSteps:t.elseSteps?Ia(t.elseSteps):void 0};e.push(vr.parse(r));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Pa(n){return Ia([n])[0]}import MR from"picomatch";var pd=(n,e,t)=>{t?.caseInsensitive&&(n=n.toLowerCase());let r;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;r=n.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;r=n===e.glob||MR(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r};var Eo=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}async saveStepCacheEntries(e,t,r){try{await this.client.updateStepCaches({entries:e,testId:t})}catch(o){r.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){let t=await this.client.getStepCacheForTest({testId:e.testId,organizationId:e.organizationId,steps:e.steps,schemaVersion:e.schemaVersion}),{hits:r}=To({steps:e.steps,stepCacheEntries:t,logger:e.logger});this.client.updateCacheLastUsedDate(r,e.logger)}fetchIconKnowledgeBase(e,t){return this.client.fetchIconKnowledgeBase(e,t)}saveNewIcons(e,t,r){return this.client.saveNewIcons(e,t,r)}};import{Faker as FR,en as DR}from"@faker-js/faker";var Co="v1",Qn=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 FR({locale:DR}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Co}/tools/ai/generate`,{method:"POST",body:t}).catch(r=>{throw r instanceof an?new Error(r.rawError):new Error(`Failed to send AI generation: ${r.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Co}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Co}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Co}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Co}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Co}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};import{z as UR}from"zod";var Ro=class extends _t{constructor(e){super(e)}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return nh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${M}/web-agent/recommend-chunks`,{method:"POST",body:e,signal:t.abortSignal});return th.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${M}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return UR.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Dh.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return ed.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return Fh.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return ed.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${M}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Mh.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${M}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let r=await this.sendRequest(`/${M}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Tc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${M}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Uh.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return xc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${M}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return _c.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${M}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return eh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${M}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return qu.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${M}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Ku.parse(r)}};var Ur=class extends _t{async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${M}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Ou.parse(r)}async constructIframeRegex(e,t={}){let r=await this.sendRequest(`/${M}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t?.signal});return Lu.parse(r)}};var La=class{constructor(e){this.client=e}async uploadResultsArchive(e){let{uploadUrl:t,id:r}=await this.client.generateTestResultsUploadUrl(),o=await xo(t,"application/zip",e);if(!o.ok)throw new Error(`Failed to upload test results: ${await o.text()}`);let{runGroupId:i}=await this.client.startProcessingResultsUpload(r);return i}};import{PostHog as BR}from"posthog-node";async function uf(n,e){let t,r=0,o=3,i,s;for(;r<o;)try{let a=await n.getAllFlagsAndPayloads(e);i=a.featureFlags,s=a.featureFlagPayloads;break}catch(a){t=a,r++,await new Promise(l=>setTimeout(l,500*r))}if(i&&s)return{flags:i,payloads:s};throw t}var Ao=class n extends Bi{constructor(t,r,o,i){super(o,i);this.client=t;this.orgId=r}static async init(t,r){let o=r??new BR("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:i,payloads:s}=await uf(o,t);return new n(o,t,i,s)}async refresh(){let{flags:t,payloads:r}=await uf(this.client,this.orgId);this.flags=t,this.payloads=r}};import{Server as yL}from"socket.io";import{cloneDeep as zR}from"lodash-es";var jR={showOverlay:!1},ud=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:r,clientIp:o,sessionId:i,browserbaseSessionId:s}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:s,browserBehavior:zR(jR)}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(s){t.error({err:s},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(s){t.error({err:s},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}},X=new ud;function mf(n,e,t){let r=Date.now(),o=Date.now(),i,s,a,l,c=!1,p=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=a;a=void 0;let S=h.url(),x=g.toEditorDisplayCopy();JSON.stringify(x)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:s??[],context:x,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=x}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:f,sessionId:e},"Error grabbing browser state")}},d=setInterval(()=>{let h=X.getSession(e),g=h?.controller?.browser;if(!g||g.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(d);return}p(g,h.context)},1e3),u=(h,g)=>!!(JSON.stringify(h)!==JSON.stringify(s)||g.logsPerPage.some(f=>f.length>0)||g.harPages&&Object.keys(g.harPages).length>0||g.harEntries&&Object.keys(g.harEntries).length>0),m=setInterval(async()=>{let g=X.getSession(e)?.controller?.browser;if(!g||g.closed){clearInterval(m);return}else if(c)return;c=!0;try{let f=await g.getAllFrameUrls(),S=g.retrieveAndClearDebugData();u(f,S)&&(s=f,a=S,o=Date.now())}catch(f){t.warn({err:f},"Failed to fetch extended details")}finally{c=!1}},2500);return{timers:[d,m]}}var er={};var HR=n=>()=>{let{sessionId:e}=n.metadata;er[e]?.abort?.abort()},hf={event:"cancelApiTest",createHandler:HR};import{CookieJar as iA}from"tough-cookie";import{randomUUID as JR}from"crypto";import{faker as $R}from"@faker-js/faker";import WR from"assert";import GR from"axios";import VR from"moment";import*as qR from"otpauth";import KR from"pg";var Io=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var gf=n=>{let e=n.reason===void 0?new DOMException("This operation was aborted.","AbortError"):n.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};async function U(n,e){let{milliseconds:t,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,s,a;return new Promise((l,c)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:d}=e;d.aborted&&c(gf(d)),a=()=>{c(gf(d))},d.addEventListener("abort",a)}if(t===Number.POSITIVE_INFINITY){n.then(l,c);return}let p=new Io;s=i.setTimeout.call(void 0,()=>{if(r){try{l(r())}catch(d){c(d)}return}"cancel"in n&&typeof n.cancel=="function"&&n.cancel(),o instanceof Error?c(o):(p.message=o??`Promise timed out after ${t} milliseconds`,c(p))},t),(async()=>{try{l(await n)}catch(d){c(d)}})()}).catch(l=>{throw l}).finally(()=>{s!==void 0&&i.clearTimeout.call(void 0,s),a!==void 0&&e.signal&&e.signal.removeEventListener("abort",a)})}async function ff(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=pa(r,e);t.push(...o)}),t}var YR=Object.getPrototypeOf(async function(){}).constructor;async function Sf(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,s={},a=(f,S)=>{o[f]=S,s[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},p;r.includes("Octokit")&&(p=(await import("@octokit/rest")).Octokit);let d;r.includes("createAppAuth")&&(d=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new YR("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(GR,VR,i.fakerInstance??$R,WR,KR,p,d,qR,ff,o,a,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await U(u(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal})}catch(f){t.error(`[${n}] Error executing code: ${f}`),m=!1,f instanceof Io?g=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:g=f instanceof Error?f.message:`${f}`}return{result:h,variableUpdates:s,persistentVariableUpdates:l,success:m,error:g}}async function yf({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:s=Kn}){let a=JR(),l=await Sf(a,{code:n,options:{fragment:e,timeoutMs:s},bindings:t.toObjectCopy(),tools:r,signal:i},o);return y.debug(`[${a}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as XR,randomUUID as ZR}from"crypto";import QR from"fetch-retry";var eA=QR(global.fetch,{retries:3,retryOn:function(n,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(n){return Math.pow(2,n)*500}}),bf=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,wf=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function vf({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=Kn,retries:i=2,signal:s,logger:a}){if(!bf)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,p=0;if(!wf)throw new Error("Missing lambda auth secret.");let d=XR("sha256",wf).update(n).digest("hex");for(;p<=i;){p++,s?.throwIfAborted();let m={id:ZR(),orgId:n,momenticLambdaAuthHash:d,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await U(eA(bf,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:s}),!l)throw new Error("Got empty response from code evaluation server");if(!l.ok)throw new Error(`Code evaluation server returned error code ${l.status}`);c=void 0;break}catch(h){c=h}}if(c)throw a.error({err:c},"Failed to evaluate code remotely"),c;if(!l)throw new Error(`An unexpected code evaluation error occurred${c?`: ${c}`:""}`);let u;try{u=dh.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Fn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await vf(n);else if(n.localTools)e=await yf({...n,localTools:n.localTools});else throw new Error("No code evaluation environment available");if(e.error)throw new Error(`Code evaluation error: ${e.error}`);if(e.variableUpdates)for(let[t,r]of Object.entries(e.variableUpdates))n.context.setVariable(t,r);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await n.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,r]of Object.entries(e.persistentVariableUpdates))n.context.setVariable(t,r)}return e.result}async function Dt(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:s,retries:a=2,timeoutMs:l=Kn,allowUndefined:c=!1}=n,p=/{{(.*?)}}/g,d=t.matchAll(p),u=t;for(let m of d){if(m.length<2)continue;let h=m[1].trim(),g;try{g=await Fn({orgId:e,code:h,fragment:!0,context:r,timeoutMs:l,logger:o,retries:a,localTools:n.localTools,signal:i,flagStore:s})}catch(S){throw o.error({err:S,value:t},"Error evaluating template string"),S}if(g===void 0&&!c)throw new R("UserConfigurationError",`Template fragment '${h}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let f=typeof g=="string"?g:`${g}`;f=f.replaceAll(/\$/g,"$$$$"),u=u.replace(m[0],f)}return u}async function Po(n){return xf(n)}async function xf({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o="",replacements:i={},...s}){for(let a in n){if(e.includes(a))continue;let l=!1;if(t)if(t.includes(a))l=!0;else continue;let c=n[a],p=o?`${o}.${a}`:a;if(typeof c=="string"&&c.includes("{{")){let d=await Dt({s:c,context:r,...s});if(c===d)continue;i[p]=c,n[a]=d}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await xf({obj:c,bannedKeys:e,context:r,prefixPath:p,replacements:i,allowList:l?void 0:t,...s})}return i}import nA from"fetch-cookie";import{cloneDeep as rA}from"lodash-es";var Oa=(n,e)=>{try{let{hostname:t,pathname:r}=new URL(n),{hostname:o,pathname:i}=new URL(e);return t!==o||r!==i}catch{return!1}},Lo=n=>{try{return new URL(n),!0}catch{return!1}},Tf=n=>!n.toLowerCase().startsWith("http"),Oo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function tr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}var tA=3e4;async function ka({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??tA/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),s=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{s.append(m,h)});let a=s.toString(),l;if(Lo(n.url)&&(l=n.url),t&&Oo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let p=await U((async()=>{let m=a?`${l}?${a}`:l;try{return await r(m,{headers:i,method:n.method,body:n.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!p.ok){let m;try{m=await p.text()}catch(h){m=`Failed to read response body: ${h}`}throw new R("ActionFailureError",`Fetch request failed with status ${p.status}: ${m}`)}let d={};p.headers.forEach((m,h)=>{d[h]=m});let u={status:p.status,headers:d};return p.headers.get("content-type")?.includes("json")?u.json=await p.json():p.headers.get("content-type")?.includes("text")&&(u.text=await p.text()),u}async function Ef(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,s=rA(i);await Po({obj:s,orgId:o,bannedKeys:["code"],...e});let a=await oA(n);return s.envKey&&a.data&&r.setVariable(s.envKey,a.data),a}async function oA(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:s}=e,a=new Date;switch(r.type){case"JAVASCRIPT":{let c=await Fn({code:r.code,orgId:o,fragment:!!r.fragment,timeoutMs:r.timeout?r.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(p){return{...r,startedAt:a,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${p instanceof Error?p.message:`${p}`}`}}return{...r,startedAt:a,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=nA(fetch,s),p=await ka({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:a,finishedAt:new Date,status:"SUCCESS",message:"Request executed successfully",data:p}}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}async function Cf(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:s,baseUrl:a}=e,{test:l,step:c}=r,p={startedAt:new Date,status:"RUNNING",results:[]},d=p.results,u=new iA,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await Ef({inputs:{step:h,baseUrl:a,orgId:s},fixtures:m})}catch(S){o?.aborted?f={...h,startedAt:g,finishedAt:new Date,status:"CANCELLED",message:"Step cancelled by user."}:f={...h,startedAt:g,finishedAt:new Date,status:"FAILED",message:`Step failed: ${S instanceof Error?S.message:`${S}`}`}}if(d.push(f),c.onFinished?.({result:f,cookies:ma(u,new URL(a).hostname)}),l.updateAttemptProgress?.({results:d}),f.status!=="SUCCESS"){p.status=f.status==="CANCELLED"?"CANCELLED":"FAILED";break}}return p.status==="RUNNING"&&(p.status="PASSED"),p.finishedAt=new Date,l.onFinished?.(),p}async function Rf(n){let{socket:e,storage:t}=n,r=n.socket.id,{testId:o}=e.handshake.query;if(typeof o!="string")throw new Error(`Received invalid test ID that does not parse as a string: ${o}`);let i=await t.getOrgId({type:"api-test",testId:o}),{baseUrl:s,envName:a,environmentVariables:l}=await md({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),c={type:"api-test",orgId:await n.storage.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new It({baseUrl:s||"",currentUrl:s||"",variablesFromEnvironment:l,envName:a})};return er[r]=c,c}async function md({testId:n,orgId:e,logger:t,storage:r,authorization:o}){let i=await r.fetchApiTestMetadata(n,e,t);if(!i)throw new Error(`Failed to fetch API test metadata for test ID: ${n}`);let s;o?.type==="API_KEY"&&(s=new Qn({httpClient:new _t({...o,logger:t}),fakerSeed:void 0}));let a=i.envs?.find(d=>d.default),l;a&&(l=await r.fetchEnvironment(e,a.name,t));let c=i.baseUrl||l?.variables?.[Ae];if(!c)throw new Error("Base URL is empty in both API test options and the configured environment");let p={...l?.variables};return{baseUrl:c,envName:l?.name,environmentVariables:p,localCodeEvalTools:s}}var sA=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:s,storage:a,logger:l,flagStoreFactory:c}=n,{orgId:p,testId:d,sessionId:u}=i,m=l.child({testId:d,orgId:p,sessionId:u}),h=er[u];if(!h)throw new Error(`No api testing session with id ${u} could be found. Please reconnect and try again.`);let g=new AbortController;h.abort=g;let f=h.latestContext,{localCodeEvalTools:S,baseUrl:x}=await md({testId:d,orgId:p,logger:m,storage:a,authorization:o}),b={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(p)},C=await Cf({inputs:{steps:r,orgId:p,baseUrl:x},fixtures:b,callbacks:{test:{onFinished:()=>{s.emit("apiTestFinished")}},step:{onStarted:I=>{s.emit("apiStepStarted",I)},onFinished:I=>{s.emit("apiStepFinished",I)}}}});t({result:C})},Af={event:"executeApiTest",createHandler:sA};var aA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{e.info({sessionId:t},"Cancel event received");let r=X.getSession(t);if(!r)throw new Error("No active session found");try{r.controller.setClosed()}catch{}}},If={event:"cancel",createHandler:aA};var lA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=X.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let a=await s.getBrowserState({skipWait:!0});o({a11yTree:a.serialize()})}catch(a){e.error({err:a},"Error fetching a11y tree from the browser"),o({err:a.message})}}},Pf={event:"fetchA11yTree",createHandler:lA};var cA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=X.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let a=await s.html();o({html:a})}catch(a){e.error({err:a},"Error fetching DOM from the browser"),a.name==="TimeoutError"?o({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):o({err:a.message})}}},Lf={event:"fetchDom",createHandler:cA};var dA=({metadata:n,logger:e})=>{let{sessionId:t,type:r}=n;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),r==="e2e"?X.removeSession(t,e):r==="api-test"&&delete er[t]}},Of={event:"disconnect",createHandler:dA};function Yt(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=pA(t);uA(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await mA(i,e,r,o)}catch(s){n.logger.error({result:n.result,err:s},"Error hoisting scalar result metadata")}})())}function pA(n){let e=n[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertion){t=e;break}break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!e.results.length){t=e;break}e=e.results[e.results.length-1];break;default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(t)break}let r=n[n.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!r.results.length){o=r;break}r=r.results[r.results.length-1];break;default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function uA(n,e,t){e&&(n.beforeUrl=e.beforeUrl),t&&(n.afterUrl=t.afterUrl,n.data=t.data,t.status!=="SUCCESS"&&(n.message=t.message))}async function mA(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Gi from"os";import hA from"v8";var kf,vn,hd=Gi.platform(),gA=Gi.cpus().map(n=>({model:n.model,speed:n.speed}));function Nf(n){n.debug({platform:hd,cpuMetadata:gA},"Platform and CPU clock speed metadata");let e=()=>{try{let t=!1,r=fA(),o=SA();r.freeMemory<1e6&&(t=!0);let i=hA.getHeapStatistics(),s=i.used_heap_size,a=i.heap_size_limit;s/a>.9&&(t=!0),t?n.warn({platform:hd,memory:r,cpu:o,heapStats:i},"Critical resource usage metrics detected"):n.debug({platform:hd,memory:r,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),setInterval(e,1e4)}function fA(){let n=Gi.totalmem(),e=Gi.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function SA(){let n=Gi.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of n)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!vn)return vn=t,null;let r={user:t.user-vn.user,nice:t.nice-vn.nice,sys:t.sys-vn.sys,idle:t.idle-vn.idle,irq:t.irq-vn.irq,total:t.total-vn.total};return kf={measurementTime:e,intervalMs:e-vn.measurementTime,user:r.user/r.total*100,nice:r.nice/r.total*100,sys:r.sys/r.total*100,idle:r.idle/r.total*100,irq:r.irq/r.total*100,total:100-r.idle/r.total*100},vn=t,kf}import{hostname as xA}from"os";async function Mf(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:s}=n,{logger:a,abortSignal:l}=s;if(e.target&&!Vn(e.target))throw new Error("Element assertion with x/y is not supported yet");let c=e.assertion.type==="ELEMENT_EXISTENCE"&&e.assertion.negated,p=Date.now(),d=0,u,m=500;for(;d<2||Date.now()-p<r;){d++,d>1&&await ne(m,l),l?.throwIfAborted();try{let{newTarget:h,elementInteractedDisplayString:g,result:f}=await o({ctx:s.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>yA(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:c?"NEGATED_CHECK":void 0}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(a.warn({err:h},"Element assertion ended in error, retrying..."),!(h instanceof R)||h.reason!="ActionFailureError")throw h;u={success:!1,err:h}}}if(!u)throw new Error(`Failed to evaluate manual element assertion in ${r}ms.`);return u}async function yA(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,s;switch(r.type){case"ELEMENT_CONTENT":{let a=await n.textContent()??"";if(s={elementTextContent:Me(a,500,!0)},!_f(a,r.value,r.operation,!!r.negated)){let l=r.negated?Xn[r.operation]:Zn[r.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${r.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{s={elementOuterHtml:Me(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await n.getAttribute(r.attr,{timeout:3e3})??""}catch(l){i=new R("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!_f(a,r.value,r.operation,!!r.negated)){let l=r.negated?Xn[r.operation]:Zn[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new R("AssertionFailureError",`The attribute ${r.attr} ${l}: ${a}`):new R("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(r.condition){case"VISIBLE":{o=await n.isVisible({timeout:bn*1e3});break}case"EDITABLE":{o=await n.isEditable({timeout:bn*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await n.isEnabled({timeout:bn*1e3});break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.condition)}if(o=r.negated?!o:o,!o){let a=r.negated?sd[r.condition]:ad[r.condition];i=new R("AssertionFailureError",`The element ${a}`)}break}}return{success:o,data:s,err:i}}function _f(n,e,t,r){let o;switch(t){case"CONTAINS":{o=n.includes(e);break}case"EQUALS":{o=n.trim()===e.trim();break}case"STARTS_WITH":{o=n.trim().startsWith(e);break}case"EXISTS":{o=n.trim().length>0;break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return r?!o:o}import{Jimp as bA}from"jimp";async function Vi(n,e){let t=await n.screenshot(e),r=await bA.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as Ff}from"jimp";import gd from"jpeg-js";import wA from"pixelmatch";async function Df({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:s,screenshotStorage:a}){if(t.target&&!Vn(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:s});let l={clearHighlights:!0,hideCaret:!0},c;t.target?.elementDescriptor?c=(await i({ctx:n,tracer:e,command:t,target:t.target,cache:t.cache?.target??t.target?.a11yData,action:async W=>Vi(o,{locator:W.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Vi(o,l);let p=await a.prepareGoldenScreenshotForComparison(s,t,c);if((c.height!==p.height||c.width!==p.width)&&s.debug({currHeight:c.height,currWidth:c.width,savedHeight:p.height,savedWidth:p.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-p.height)>10||Math.abs(c.width-p.width)>10){let D=`${c.width}x${c.height}`,W=`${p.width}x${p.height}`;return{fail:!0,thoughts:`Current screenshot (${D}) does not match saved screenshot dimensions (${W}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:p.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await Ff.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await Ff.fromBuffer(p.buffer),h={width:p.width,height:p.height},g,f=u.width*u.height,S=h.width*h.height,x=Math.abs(u.height-h.height),b=Math.abs(u.width-h.width);if(f>S){let D=d.cover({w:h.width,h:h.height});c.buffer=await D.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let D=m.cover({w:u.width,h:u.height});p.buffer=await D.getBuffer("image/jpeg"),g="saved"}let w={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},E=t.threshold??.1,I=wA(gd.decode(p.buffer).data,gd.decode(c.buffer).data,w.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,N=I>E*100,P=`Visual diff of ${I.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${E*100}%.`;if(g&&(P+=` The ${g} screenshot was cropped since it was taller by ${x} pixels and wider by ${b} pixels.`),N)throw new R("ActionFailureError",P);return{fail:N,thoughts:P,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:gd.encode(w,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var vA=5e3;async function Na({timeout:n=bn,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,s=0,a=500;for(;s-t<r;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await Uf(e),s=Date.now();let c=s-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ne(a,e.signal),a=Math.min(Math.floor(a*1.5),vA);else return i}return i=await Uf(e),i}async function Uf({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,s;try{let a;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(Bf,{value:n.value,negated:!!n.negated,returnHtml:!1});i=l.some(c=>c.evaluation),a=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:a}=await e.evaluateFunctionInPage(Bf,{value:n.value,negated:!!n.negated,returnHtml:!0}));if(!i){let l=n.negated?Xn.CONTAINS:Zn.CONTAINS;s=new R("AssertionFailureError",`The page ${l} '${n.value}'.`),o=a}}catch(a){s=new R("AssertionFailureError",`Failed to evaluate page content assertion: ${a instanceof Error?a.message:`${a}`}`)}return{success:i,err:s,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"})(n.type)}}function Bf({value:n,negated:e,returnHtml:t}){let r=document.documentElement.outerHTML,o=r.includes(n)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?r:void 0}}var fd=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:s,controller:a}=n.fixtures,l=a.browser,{orgId:c,runId:p}=n.inputs,d=a.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),r.debug({inputs:t,moduleId:e.moduleId},"Set module inputs"));let u,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Dt({orgId:c,s:f,context:o,logger:r,localTools:s,signal:d,flagStore:a.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([b,w])=>`${b}:${w}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let x=Date.now();for(;Date.now()-x<_h;){d?.throwIfAborted();let b=await i.getCacheResult(g);if(b){r.debug({cacheResult:b},"Got result from module execution cache"),u=_a(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(b),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let w=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${xA()};runId:${p}`},d);if(w.acquired){h=w.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ne(2500+Math.random()*1e4,d)}}try{if(!u)u=await TA(n);else if(e.autoAuth){let f=ua.safeParse(u.data);if(!f.success)throw new R("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(f.data);let S=!1,x=e.advanced?.cacheInvalidation;if(x&&x.type==="PAGE_CHECK"){let b={type:"CONTENT",value:x.substring},w=await Na({timeout:bn,assertion:b,browser:l,flagStore:a.flagStore,logger:r,signal:d});w.success?r.debug({invalResult:w},"Cached result still valid after page check, continuing..."):(r.info({invalResult:w},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),fd(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await EA({step:e,result:u,browser:a.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},TA=async n=>{let{step:e,tracer:t}=n.moduleParams,r=_a(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:s}=await nr(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=s,r.status=i,r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,nestedResults:s,result:r,logger:n.fixtures.logger}),r};function _a(n,e,t){let r={};return Object.entries(e).forEach(([i,s])=>{r[i]=JSON.stringify(s)}),{type:"MODULE",id:n.id,moduleId:n.moduleId,moduleName:n.name,startedAt:new Date,cacheConfig:n.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:t}}async function zf({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:s}){let a={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){r.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}a[l]=await Fn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:s,flagStore:o})}return a}catch(l){throw s?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function EA({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let s=n.cacheConfig?.cacheExpiryMs;(!s||s===ug)&&(s=n.defaultCacheTtl??mg);let a;n.autoAuth?a=JSON.stringify(await t.saveAuthState()):e.data!==void 0?a=JSON.stringify(e.data):a='""',o.debug({cacheKeyPrefix:r,ttlMs:s,truncatedCacheResultJson:Ng(a)},"Setting module cache result"),await i.setCacheResult({result:a,keyPrefix:r,ttlMs:s})}async function rr(n,e,t){let r=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,s="FAILED",a;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(a="Step aborted by user.",s="CANCELLED"):o instanceof R?a=`${o}`:a=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=_a(n,{},"FAILED");return l.message=a,l.startedAt=r,l.finishedAt=i,l}return{...Pa(n),startedAt:r,finishedAt:i,status:s,data:null,message:a,results:[]}}}async function nr(n,e){let t=!1;try{return n&&!n.state.failureRecoveryDisabled&&(n.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{n&&t&&(n.state.failureRecoveryDisabled=void 0)}}import{randomUUID as jf}from"crypto";import{cloneDeep as RA}from"lodash-es";function Ma(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var Fa=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:s}=n.fixtures,{collectDebugData:a}=n.options,{testMetadata:l,suiteMetadata:c}=n.inputs,p=e.command.type,d=r.child({commandType:p,stepId:e.id,commandId:e.command.id}),u=Di(e.command);n.work.asyncTasks.push(s.reportCreditsUsed(d,p,u,{testId:l?.id,testName:l?.name,suiteId:c?.id,suiteName:c?.name}));let m=o.browser.url(),h=new Date,g,f=jf(),S=jf();if(a)try{g=await o.browser.screenshot({retries:1,clearHighlights:!0});let C=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:d,snapshotId:f,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(d,f,C))}catch(C){d.debug({err:C},"Failed to take screenshot before step, likely because the page is still loading. This is non-fatal and does not affect the test.")}let x,b,w,E=la();try{let C=await o.executePresetCommand(E,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),w=C.afterScreenshotOverride;let{proposedStep:I}=AA({work:n.work,step:e,newTargets:C.newTargets,logger:d}),N=new Date,P=o.browser.url();b={beforeUrl:m,afterUrl:P,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},x={...e,message:C.thoughts??IA(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:P,finishedAt:N,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[b],details:E.details,proposedStep:I},"assertion"in e.command&&(x.message=C.thoughts||"Assertion passed.")}catch(C){d.error({message:C.message,stack:C.stack},`Failed executing preset step ${Nr(e.command)}`);let I=o.browser.url(),N=new Date,P=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(w=C.getLastScreenshotBuffer()),b={beforeUrl:m,afterUrl:I,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P},x={...e,startedAt:h,finishedAt:N,beforeUrl:m,afterUrl:I,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P,failureReason:C instanceof R?C.reason:void 0,results:[b],details:E.details}}if(a)try{w||(w=await o.browser.screenshot({retries:1}));let C=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:d,snapshotId:S,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(d,S,C))}catch(C){d.debug({err:C},"Failed store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return b.beforeSnapshot=f,x.beforeSnapshot=f,b.afterSnapshot=S,x.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:d,snapshotId:f,screenshot:g}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(d,f,g))),w&&(t.attachAfterScreenshot({logger:d,snapshotId:S,screenshot:w}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(d,S,w))),x};function AA({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;Lg(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let s={...o,target:{...o.target,elementDescriptor:i}},a={...RA(e),command:s};return Ma(n,{type:"DESCRIPTION_UPDATE",thoughts:`Updated element description after the original element could not be found on the page. New element location reasoning: ${t[0]?.thoughts}`}),{proposedStep:a}}return{proposedStep:void 0}}function IA(n){if(n?.length){if(n.length===1&&n[0]?.thoughts)return n[0].thoughts;if(n.length===2&&n.every(e=>e.thoughts))return`Located first element: ${n[0]?.thoughts}
42
- Located second element: ${n[1]?.thoughts}`}}var Sd=["ability","able","aboard","about","above","accept","accident","according","account","accurate","acres","across","act","action","active","activity","actual","actually","add","addition","additional","adjective","adult","adventure","advice","affect","afraid","after","afternoon","again","against","age","ago","agree","ahead","aid","air","airplane","alike","alive","all","allow","almost","alone","along","aloud","alphabet","already","also","although","am","among","amount","ancient","angle","angry","animal","announced","another","answer","ants","any","anybody","anyone","anything","anyway","anywhere","apart","apartment","appearance","apple","applied","appropriate","are","area","arm","army","around","arrange","arrangement","arrive","arrow","art","article","as","aside","ask","asleep","at","ate","atmosphere","atom","atomic","attached","attack","attempt","attention","audience","author","automobile","available","average","avoid","aware","away","baby","back","bad","badly","bag","balance","ball","balloon","band","bank","bar","bare","bark","barn","base","baseball","basic","basis","basket","bat","battle","be","bean","bear","beat","beautiful","beauty","became","because","become","becoming","bee","been","before","began","beginning","begun","behavior","behind","being","believed","bell","belong","below","belt","bend","beneath","bent","beside","best","bet","better","between","beyond","bicycle","bigger","biggest","bill","birds","birth","birthday","bit","bite","black","blank","blanket","blew","blind","block","blood","blow","blue","board","boat","body","bone","book","border","born","both","bottle","bottom","bound","bow","bowl","box","boy","brain","branch","brass","brave","bread","break","breakfast","breath","breathe","breathing","breeze","brick","bridge","brief","bright","bring","broad","broke","broken","brother","brought","brown","brush","buffalo","build","building","built","buried","burn","burst","bus","bush","business","busy","but","butter","buy","by","cabin","cage","cake","call","calm","came","camera","camp","can","canal","cannot","cap","capital","captain","captured","car","carbon","card","care","careful","carefully","carried","carry","case","cast","castle","cat","catch","cattle","caught","cause","cave","cell","cent","center","central","century","certain","certainly","chain","chair","chamber","chance","change","changing","chapter","character","characteristic","charge","chart","check","cheese","chemical","chest","chicken","chief","child","children","choice","choose","chose","chosen","church","circle","circus","citizen","city","class","classroom","claws","clay","clean","clear","clearly","climate","climb","clock","close","closely","closer","cloth","clothes","clothing","cloud","club","coach","coal","coast","coat","coffee","cold","collect","college","colony","color","column","combination","combine","come","comfortable","coming","command","common","community","company","compare","compass","complete","completely","complex","composed","composition","compound","concerned","condition","congress","connected","consider","consist","consonant","constantly","construction","contain","continent","continued","contrast","control","conversation","cook","cookies","cool","copper","copy","corn","corner","correct","correctly","cost","cotton","could","count","country","couple","courage","course","court","cover","cow","cowboy","crack","cream","create","creature","crew","crop","cross","crowd","cry","cup","curious","current","curve","customs","cut","cutting","daily","damage","dance","danger","dangerous","dark","darkness","date","daughter","dawn","day","dead","deal","dear","death","decide","declared","deep","deeply","deer","definition","degree","depend","depth","describe","desert","design","desk","detail","determine","develop","development","diagram","diameter","did","die","differ","difference","different","difficult","difficulty","dig","dinner","direct","direction","directly","dirt","dirty","disappear","discover","discovery","discuss","discussion","disease","dish","distance","distant","divide","division","do","doctor","does","dog","doing","doll","dollar","done","donkey","door","dot","double","doubt","down","dozen","draw","drawn","dream","dress","drew","dried","drink","drive","driven","driver","driving","drop","dropped","drove","dry","duck","due","dug","dull","during","dust","duty","each","eager","ear","earlier","early","earn","earth","easier","easily","east","easy","eat","eaten","edge","education","effect","effort","egg","eight","either","electric","electricity","element","elephant","eleven","else","empty","end","enemy","energy","engine","engineer","enjoy","enough","enter","entire","entirely","environment","equal","equally","equator","equipment","escape","especially","essential","establish","even","evening","event","eventually","ever","every","everybody","everyone","everything","everywhere","evidence","exact","exactly","examine","example","excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise","exist","expect","experience","experiment","explain","explanation","explore","express","expression","extra","eye","face","facing","fact","factor","factory","failed","fair","fairly","fall","fallen","familiar","family","famous","far","farm","farmer","farther","fast","fastened","faster","fat","father","favorite","fear","feathers","feature","fed","feed","feel","feet","fell","fellow","felt","fence","few","fewer","field","fierce","fifteen","fifth","fifty","fight","fighting","figure","fill","film","final","finally","find","fine","finest","finger","finish","fire","fireplace","firm","first","fish","five","fix","flag","flame","flat","flew","flies","flight","floating","floor","flow","flower","fly","fog","folks","follow","food","foot","football","for","force","foreign","forest","forget","forgot","forgotten","form","former","fort","forth","forty","forward","fought","found","four","fourth","fox","frame","free","freedom","frequently","fresh","friend","friendly","frighten","frog","from","front","frozen","fruit","fuel","full","fully","fun","function","funny","fur","furniture","further","future","gain","game","garage","garden","gas","gasoline","gate","gather","gave","general","generally","gentle","gently","get","getting","giant","gift","girl","give","given","giving","glad","glass","globe","go","goes","gold","golden","gone","good","goose","got","government","grabbed","grade","gradually","grain","grandfather","grandmother","graph","grass","gravity","gray","great","greater","greatest","greatly","green","grew","ground","group","grow","grown","growth","guard","guess","guide","gulf","gun","habit","had","hair","half","halfway","hall","hand","handle","handsome","hang","happen","happened","happily","happy","harbor","hard","harder","hardly","has","hat","have","having","hay","he","headed","heading","health","heard","hearing","heart","heat","heavy","height","held","hello","help","helpful","her","herd","here","herself","hidden","hide","high","higher","highest","highway","hill","him","himself","his","history","hit","hold","hole","hollow","home","honor","hope","horn","horse","hospital","hot","hour","house","how","however","huge","human","hundred","hung","hungry","hunt","hunter","hurried","hurry","hurt","husband","ice","idea","identity","if","ill","image","imagine","immediately","importance","important","impossible","improve","in","inch","include","including","income","increase","indeed","independent","indicate","individual","industrial","industry","influence","information","inside","instance","instant","instead","instrument","interest","interior","into","introduced","invented","involved","iron","is","island","it","its","itself","jack","jar","jet","job","join","joined","journey","joy","judge","jump","jungle","just","keep","kept","key","kids","kill","kind","kitchen","knew","knife","know","knowledge","known","label","labor","lack","lady","laid","lake","lamp","land","language","large","larger","largest","last","late","later","laugh","law","lay","layers","lead","leader","leaf","learn","least","leather","leave","leaving","led","left","leg","length","lesson","let","letter","level","library","lie","life","lift","light","like","likely","limited","line","lion","lips","liquid","list","listen","little","live","living","load","local","locate","location","log","lonely","long","longer","look","loose","lose","loss","lost","lot","loud","love","lovely","low","lower","luck","lucky","lunch","lungs","lying","machine","machinery","mad","made","magic","magnet","mail","main","mainly","major","make","making","man","managed","manner","manufacturing","many","map","mark","market","married","mass","massage","master","material","mathematics","matter","may","maybe","me","meal","mean","means","meant","measure","meat","medicine","meet","melted","member","memory","men","mental","merely","met","metal","method","mice","middle","might","mighty","mile","military","milk","mill","mind","mine","minerals","minute","mirror","missing","mission","mistake","mix","mixture","model","modern","molecular","moment","money","monkey","month","mood","moon","more","morning","most","mostly","mother","motion","motor","mountain","mouse","mouth","move","movement","movie","moving","mud","muscle","music","musical","must","my","myself","mysterious","nails","name","nation","national","native","natural","naturally","nature","near","nearby","nearer","nearest","nearly","necessary","neck","needed","needle","needs","negative","neighbor","neighborhood","nervous","nest","never","new","news","newspaper","next","nice","night","nine","no","nobody","nodded","noise","none","noon","nor","north","nose","not","note","noted","nothing","notice","noun","now","number","numeral","nuts","object","observe","obtain","occasionally","occur","ocean","of","off","offer","office","officer","official","oil","old","older","oldest","on","once","one","only","onto","open","operation","opinion","opportunity","opposite","or","orange","orbit","order","ordinary","organization","organized","origin","original","other","ought","our","ourselves","out","outer","outline","outside","over","own","owner","oxygen","pack","package","page","paid","pain","paint","pair","palace","pale","pan","paper","paragraph","parallel","parent","park","part","particles","particular","particularly","partly","parts","party","pass","passage","past","path","pattern","pay","peace","pen","pencil","people","per","percent","perfect","perfectly","perhaps","period","person","personal","pet","phrase","physical","piano","pick","picture","pictured","pie","piece","pig","pile","pilot","pine","pink","pipe","pitch","place","plain","plan","plane","planet","planned","planning","plant","plastic","plate","plates","play","pleasant","please","pleasure","plenty","plural","plus","pocket","poem","poet","poetry","point","pole","police","policeman","political","pond","pony","pool","poor","popular","population","porch","port","position","positive","possible","possibly","post","pot","potatoes","pound","pour","powder","power","powerful","practical","practice","prepare","present","president","press","pressure","pretty","prevent","previous","price","pride","primitive","principal","principle","printed","private","prize","probably","problem","process","produce","product","production","program","progress","promised","proper","properly","property","protection","proud","prove","provide","public","pull","pupil","pure","purple","purpose","push","put","putting","quarter","queen","question","quick","quickly","quiet","quietly","quite","rabbit","race","radio","railroad","rain","raise","ran","ranch","range","rapidly","rate","rather","raw","rays","reach","read","reader","ready","real","realize","rear","reason","recall","receive","recent","recently","recognize","record","red","refer","refused","region","regular","related","relationship","religious","remain","remarkable","remember","remove","repeat","replace","replied","report","represent","require","research","respect","rest","result","return","review","rhyme","rhythm","rice","rich","ride","riding","right","ring","rise","rising","river","road","roar","rock","rocket","rocky","rod","roll","roof","room","root","rope","rose","rough","round","route","row","rubbed","rubber","rule","ruler","run","running","rush","sad","saddle","safe","safety","said","sail","sale","salmon","salt","same","sand","sang","sat","satellites","satisfied","save","saved","saw","say","scale","scared","scene","school","science","scientific","scientist","score","screen","sea","search","season","seat","second","secret","section","see","seed","seeing","seems","seen","seldom","select","selection","sell","send","sense","sent","sentence","separate","series","serious","serve","service","sets","setting","settle","settlers","seven","several","shade","shadow","shake","shaking","shall","shallow","shape","share","sharp","she","sheep","sheet","shelf","shells","shelter","shine","shinning","ship","shirt","shoe","shoot","shop","shore","short","shorter","shot","should","shoulder","shout","show","shown","shut","sick","sides","sight","sign","signal","silence","silent","silk","silly","silver","similar","simple","simplest","simply","since","sing","single","sink","sister","sit","sitting","situation","six","size","skill","skin","sky","slabs","slave","sleep","slept","slide","slight","slightly","slip","slipped","slope","slow","slowly","small","smaller","smallest","smell","smile","smoke","smooth","snake","snow","so","soap","social","society","soft","softly","soil","solar","sold","soldier","solid","solution","solve","some","somebody","somehow","someone","something","sometime","somewhere","son","song","soon","sort","sound","source","south","southern","space","speak","special","species","specific","speech","speed","spell","spend","spent","spider","spin","spirit","spite","split","spoken","sport","spread","spring","square","stage","stairs","stand","standard","star","stared","start","state","statement","station","stay","steady","steam","steel","steep","stems","step","stepped","stick","stiff","still","stock","stomach","stone","stood","stop","stopped","store","storm","story","stove","straight","strange","stranger","straw","stream","street","strength","stretch","strike","string","strip","strong","stronger","struck","structure","struggle","stuck","student","studied","studying","subject","substance","success","successful","such","sudden","suddenly","sugar","suggest","suit","sum","summer","sun","sunlight","supper","supply","support","suppose","sure","surface","surprise","surrounded","swam","sweet","swept","swim","swimming","swing","swung","syllable","symbol","system","table","tail","take","taken","tales","talk","tall","tank","tape","task","taste","taught","tax","tea","teach","teacher","team","tears","teeth","telephone","television","tell","temperature","ten","tent","term","terrible","test","than","thank","that","thee","them","themselves","then","theory","there","therefore","these","they","thick","thin","thing","think","third","thirty","this","those","thou","though","thought","thousand","thread","three","threw","throat","through","throughout","throw","thrown","thumb","thus","thy","tide","tie","tight","tightly","till","time","tin","tiny","tip","tired","title","to","tobacco","today","together","told","tomorrow","tone","tongue","tonight","too","took","tool","top","topic","torn","total","touch","toward","tower","town","toy","trace","track","trade","traffic","trail","train","transportation","trap","travel","treated","tree","triangle","tribe","trick","tried","trip","troops","tropical","trouble","truck","trunk","truth","try","tube","tune","turn","twelve","twenty","twice","two","type","typical","uncle","under","underline","understanding","unhappy","union","unit","universe","unknown","unless","until","unusual","up","upon","upper","upward","us","use","useful","using","usual","usually","valley","valuable","value","vapor","variety","various","vast","vegetable","verb","vertical","very","vessels","victory","view","village","visit","visitor","voice","volume","vote","vowel","voyage","wagon","wait","walk","wall","want","war","warm","warn","was","wash","waste","watch","water","wave","way","we","weak","wealth","wear","weather","week","weigh","weight","welcome","well","went","were","west","western","wet","whale","what","whatever","wheat","wheel","when","whenever","where","wherever","whether","which","while","whispered","whistle","white","who","whole","whom","whose","why","wide","widely","wife","wild","will","willing","win","wind","window","wing","winter","wire","wise","wish","with","within","without","wolf","women","won","wonder","wonderful","wood","wooden","wool","word","wore","work","worker","world","worried","worry","worse","worth","would","wrapped","write","writer","writing","written","wrong","wrote","yard","year","yellow","yes","yesterday","yet","you","young","younger","your","yourself","youth","zero","zebra","zipper","zoo","zulu"];function Hf(n){return new Array(n).fill(0).map(()=>Sd[Math.floor(Math.random()*Sd.length)]).join("-")}async function $f({codePath:n,screenshotBuff:e,storage:t,logger:r}){if(e)try{let o=await t.uploadScreenshot(e);return r.debug({screenshotUrl:o,codePath:n},"Saved screenshot for debugging"),o}catch(o){r.error({err:o,codePath:n},"Failed to save screenshot for debugging")}}async function xn({frameConfig:n,action:e,browser:t}){let r=t.getActiveFrameConfig();n?t.setActiveFrameConfig(n):r?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(r)}}var Da="MOMENTIC_RUN_ID",Wf="FINAL_SCREENSHOT_URL";import{cloneDeep as DA}from"lodash-es";async function Gf(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=Pa(e),a=e.elseSteps,l=!0,c=[],p,d=la();for(let f=0;f<e.blocks.length;f++){r.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let x=await Fa({...n,presetParams:{tracer:t,step:S.assertion}});c.push(x),r.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,a=S.steps,p=x}catch(x){r.info({err:x},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(a)l&&r.info("No conditions resolved to true, executing the else block steps");else return r.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped"),{...s,status:"SUCCESS",startedAt:i,data:c[c.length-1]?.data,message:c[c.length-1]?.message,results:[],finishedAt:new Date,details:d.details};r.info(`Executing ${a.length} steps in the selected conditional block`);let u=await n.conditionalParams.tracer.startSubSteps(),m=await n.executeStepList({...n,listParams:{steps:a,containerName:"conditional block",tracer:u}}),g={...s,assertion:p,...m,startedAt:i,finishedAt:new Date};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:r}),g}import{randomUUID as Vf}from"crypto";var qf=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await PA(n);r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=Vf();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=Vf();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},PA=async n=>{let{step:e,tracer:t}=n.aiStepParams,{controller:r,context:o,logger:i}=n.fixtures,s={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new R("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let l=await t.startSubSteps(),{status:c}=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"AI action",results:s.results,tracer:l}});return s.finishedAt=new Date,s.status=c,s}catch(l){i.warn({err:l},"Failed executing saved deprecated AI action steps");let c=r.executeAbortController.signal.aborted;s.message=l instanceof Error?l.message:`${l}`,s.status=c?"CANCELLED":"FAILED"}return s};import{randomUUID as yd}from"crypto";var Kf=15,LA=7,Yf=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await OA(n);r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=yd();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=yd();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},OA=async n=>{let{step:e,tracer:t}=n.aiStepParams,{testMetadata:r,orgId:o}=n.inputs,{controller:i,context:s,logger:a,codeEvalTools:l}=n.fixtures,{step:c}=n.callbacks,p=`${e.id}-${Date.now()}`,d=a.child({stepId:e.id,langfuseSessionId:p}),u={...e,startedAt:new Date,beforeTestContext:s.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await Dt({orgId:o,s:e.text,context:s,logger:d,localTools:l,flagStore:i.flagStore});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,x=0,b,w;for(;;){if(S>Kf)return u.message=`Exceeded the maximum number of commands allowed per AI step (${Kf})`,u.status="FAILED",u;if(i.executeAbortController.signal.aborted)return u.message="Test execution was cancelled",u.status="CANCELLED",u;c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let E=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:p,lastError:w}),{evaluation:C,reasoning:I,summary:N}=E;d.info(E,"Got AI evaluation");let P=u.results[S-1]?.id;switch(C.type){case"DONE":return u.message=`Our AI evaluator confirmed all tasks are complete: ${I}`,u.status="SUCCESS",P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:`${N}
41
+ `)}function Mg(n,e){try{if(!n)return n;if(typeof n=="string")return Me(n,3e4);if(typeof n=="object"){let{jsonString:t}=Pi(JSON.stringify(n,(r,o)=>e?.includes(r)||typeof o=="string"&&o.length>3e4?"REDACTED":o),2e4);return JSON.parse(t)}return n}catch{return n}}import{cloneDeep as UG}from"lodash-es";var wR=/^(?!.*\S+\s+\S+).*$/,vR=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,xR=/style="([^"]*)/g,TR=/data-[\w-]+/g,ER=n=>{switch(n.type){case"AI_WAIT":case"AI_ASSERTION":return{type:n.type,assertion:n.assertion};case"DRAG":if(n.fromTarget.type==="description")return{type:n.type,description:n.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(n.target?.type==="description")return{type:n.type,description:n.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function Fg(n){let e=ER(n),t=e.type==="AI_ASSERTION"||e.type==="AI_WAIT"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:wR.test(t)&&vR.test(t)?{thoughts:"Too few words in the command description. Please add more words to the description.",category:"FEW_WORDS"}:xR.test(t)?{thoughts:"Style tag is not allowed in the command description. Please remove it and describe the command in a different way.",category:"STYLE_TAG"}:TR.test(t)?{thoughts:"Hardcoded data attributes are not recommend in the command description. If the attribute doesn't directly match the quotes, autohealing will fail.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:"The description contains the same word as the command type. Please remove it since the type of command is already known.",category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}function Dg(n,e){if(!(!n.envs||!n.envs.length)){for(let t of n.envs){let r=t;e in t&&(r[e]&&(t.default=!0),delete r.defaultOnCloud,delete r.defaultOnLocal)}n.envs.some(t=>t.default)||(n.envs[0].default=!0)}}import{cloneDeep as cf}from"lodash-es";import PR from"diff-lines";import Ra,{gte as LR}from"semver";var Ug={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>(n=n.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),n=n.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),n)};var Bg={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,r=t[t.length-1];return r&&r.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var CR=["target","fromTarget","toTarget"];function zg(n){for(let e of CR){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var jg={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":return zg(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])zg(r);return e}default:return e}})};import{v4 as RR}from"uuid";var Hg={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=RR()),e;default:return e}})};import{v4 as $g}from"uuid";var Wg={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??$g(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??$g()}})),delete e.commands),e;default:return e}})};var Gg={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as AR}from"uuid";var Vg={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>("id"in e&&typeof e.id=="string"||(e.id=AR()),e))};import{v4 as qg}from"uuid";var Kg={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=qg())}return e.id=qg(),e})};var Yg={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as IR}from"uuid";var Jg={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=IR()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var Xg={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var Zg={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Qg(t),e})};function Qg(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){Qg(n[e]);return}if(typeof n[e]!="string")return;let t=n[e];e==="code"?n[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(n[e]=t.replace(/inputs\./g,"env."))})}var ef={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var tf={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var nf={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var rf={name:"Migrate AI assertions to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async n=>n.map(e=>{if(e.type!=="AI_ASSERTION")return e;let r={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...r};return delete o.text,o}),stopOnFailure:!0};var Ca=new Set(["CLICK","TYPE","SELECT_OPTION"]),of={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type,o=t?.elementDescriptor;return(o!==void 0||Ca.has(r))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(s=>{let a=s?.elementDescriptor,l=s?.type;(a!==void 0||Ca.has(l))&&(s.target={elementDescriptor:a??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(s=>{let a=s.command,l=a?.elementDescriptor,c=a?.type;(l!==void 0||Ca.has(c))&&(a.target={elementDescriptor:l??""}),s.commands&&Array.isArray(s.commands)&&s.commands.forEach(d=>{let u=d?.elementDescriptor,m=d?.type;(u!==void 0||Ca.has(m))&&(d.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var sf={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(r=>{if(r&&typeof r=="object"){let o=r;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var af={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type;return r?.startsWith("PRESET_")&&(t.type=r.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let s=i.type;s?.startsWith("PRESET_")&&(i.type=s.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let s=i.command,a=s?.type;a?.startsWith("PRESET_")&&(s.type=a.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(c=>{let p=c.type;p?.startsWith("PRESET_")&&(c.type=p.slice(7))})}),e}),stopOnFailure:!0};var Mr=[rf,sf,af,of,Ug,Bg,jg,Hg,Wg,Gg,Vg,Kg,Yg,Jg,Xg,Zg,ef,tf,nf];if(He!==Mr[Mr.length-1].toVersion)throw new Error("Please bump LATEST_VERSION in types package after adding a migration");Mr.forEach((n,e)=>{if(!Ra.valid(n.toVersion)||!Ra.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Ra.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Mr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function OR(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var $i=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:s}=n,a=Mr.findIndex(p=>Ra.gt(p.toVersion,i));if(a===-1)return{steps:o,newVersion:i};let l=i;for(let p=a;p<Mr.length;p++){if(r&&LR(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let d=Mr[p],u={id:s,migration:d.name,toVersion:d.toVersion};try{o=await lf(o,d),l=d.toVersion}catch(m){throw t.error({err:m,...u},"Migration failed"),new Error(`Step migration ${d.name} failed: ${m}`)}}let c=PR(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return c.trim()&&t.debug({diffs:c,id:s},"Migration diffs"),{newVersion:l,steps:o}};async function lf(n,e){let t=await e.execute(n);for(let r of t)for(let o of Object.keys(r)){if(!e.recursiveKeys.has(o))continue;let i=r[o];!i||!Array.isArray(i)||OR(i)&&(r[o]=await lf(i,e))}return t}async function df({rawSteps:n,metadata:e,logger:t,callbacks:r}){Dg(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:s}=await Aa({rawSteps:n.steps,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o}),a={...e,steps:i,schemaVersion:s};for(let l of["beforeSteps","afterSteps"]){let c=n[l];if(!c)continue;let{resolvedSteps:p}=await Aa({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});a[l]=p}return{resolvedTest:a,moduleIds:Array.from(Object.keys(o))}}async function dd(n,e,t){let{newVersion:r,steps:o}=await $i({metadata:n,steps:e,logger:t});try{return{steps:Ke.array().parse(o),newVersion:r}}catch(i){throw t.error({type:"zod",err:i,newVersion:r,id:n.id,steps:o},"Failed to parse test steps while migrating test"),new fa(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Aa({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:s}=await dd(e,n,t),a=[];for(let l of s)a.push(await Wi({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:a,newSchemaVersion:i}}async function Wi({step:n,callbacks:e,logger:t,resolvedModuleCache:r}){switch(n.type){case"AI_ACTION":return n;case"AI_ACTION_DYNAMIC":return n;case"PRESET_ACTION":return n;case"MODULE":{let l=n.moduleId,c=r[l];if(c)return{...cf(c),...n,type:"RESOLVED_MODULE"};let p=await e.onFetchModule({id:l,logger:t});if(!p)throw new Error(`Could not find module with id ${l}`);let{newVersion:d,steps:u}=await $i({metadata:{id:l,schemaVersion:p.schemaVersion},steps:p.steps,logger:t}),m;try{m=Ke.array().parse(u)}catch(f){throw t.error({type:"zod",err:f,steps:u,newVersion:d,id:l},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>Wi({step:f,callbacks:e,logger:t,resolvedModuleCache:r})))}catch(f){throw t.error({err:f,...n},`Failed to recursively resolve module '${p.name}': ${f}`),f}let g={...p,steps:h};return r[l]=cf(g),{...g,...n,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let l of n.blocks){let c=[];for(let p of l.steps)c.push(await Wi({step:p,callbacks:e,logger:t,resolvedModuleCache:r}));o.push({...l,steps:c})}let i;if(n.elseSteps){i=[];for(let l of n.elseSteps)i.push(await Wi({step:l,callbacks:e,logger:t,resolvedModuleCache:r}))}return{...n,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let s=[];for(let l of n.steps)s.push(await Wi({step:l,callbacks:e,logger:t,resolvedModuleCache:r}));return{...n,steps:s};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function kR(n){return typeof n=="object"&&n!==null}function Mn(n){if(Array.isArray(n))return n.map(Mn);if(kR(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=Mn(r))}),e}return n}import{cloneDeep as pf}from"lodash-es";import{v4 as pd}from"uuid";async function mt(n){let e=new Map,t=new Set,r=pf(n.stepLists.steps),o=await Fr({...n,steps:r,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let a=pf(n.stepLists[s]);if(!a)continue;let l=await Fr({...n,steps:a,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...l.cachesToSave),i.moduleUpdates.push(...l.moduleUpdates),i.stepsToSave[s]=l.stepsToSave}return i}async function Fr({steps:n,...e}){let{seenModules:t,cacheCreationParams:r,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:s,shouldCreateNewModuleId:a}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let c of n)switch(delete c.index,delete c.aiSuggested,c.id=e.createNewStepIds?pd():c.id,c.type){case"PRESET_ACTION":{let d=c.command;d.id=r?.createNewCacheIds?pd():d.id,Lg(d),"cache"in d&&d.cache&&(r&&(l.cachesToSave=l.cachesToSave.concat(Pg({id:d.id,orgId:r.orgId,testId:r.testId,value:br.parse(d),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete d.cache),d.thoughts&&delete d.thoughts,l.stepsToSave.push({...c,command:d});break}case"RESOLVED_MODULE":{let d=r?.createNewCacheIds?pd():c.id,u=c.moduleId;s.has(u)?u=s.get(u):a!==void 0&&(u=await a(c),s.set(c.moduleId,u));let{cachesToSave:m,stepsToSave:h,moduleUpdates:g}=await Fr({...e,steps:c.steps,cacheCreationParams:r?{...r,createNewCacheIds:!1}:void 0,moduleStepParents:[...i,d],moduleIdParents:[...o,u],skipCacheIntermediateEntries:r?.createNewCacheIds});l.moduleUpdates=l.moduleUpdates.concat(g),l.cachesToSave=l.cachesToSave.concat(m),t.has(u)||(t.add(u),l.moduleUpdates.push({...At.parse(c),steps:Ke.array().parse(h),moduleId:u}));let f={type:"MODULE",moduleId:u,inputs:c.inputs,id:d,skipped:c.skipped,cacheConfig:c.cacheConfig,envKey:c.envKey};l.stepsToSave.push(f);break}case"AI_ACTION":{if(!c.steps){l.stepsToSave.push(c);break}let{stepsToSave:d,cachesToSave:u}=await Fr({...e,steps:c.steps});try{c.steps=Rt.array().parse(d)}catch(m){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${m}`)}l.stepsToSave.push(c),l.cachesToSave=l.cachesToSave.concat(u);break}case"AI_ACTION_DYNAMIC":{l.stepsToSave.push(c);break}case"CONDITIONAL":{let d=[];for(let m of c.blocks){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Fr({...e,steps:m.steps});d.push({...m,steps:h}),l.cachesToSave=l.cachesToSave.concat(g),l.moduleUpdates=l.moduleUpdates.concat(f)}let u={...c,elseSteps:void 0,blocks:d};if(c.elseSteps){let{stepsToSave:m,cachesToSave:h,moduleUpdates:g}=await Fr({...e,steps:c.elseSteps});u.elseSteps=m,l.cachesToSave=l.cachesToSave.concat(h),l.moduleUpdates=l.moduleUpdates.concat(g)}l.stepsToSave.push(u);break}case"IFRAME":case"SECTION":{let{stepsToSave:d,cachesToSave:u,moduleUpdates:m}=await Fr({...e,steps:c.steps}),h={...c,steps:d};l.moduleUpdates=l.moduleUpdates.concat(m),l.stepsToSave.push(h),l.cachesToSave=l.cachesToSave.concat(u);break}default:return(d=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(c)}return l}import{cloneDeep as NR}from"lodash-es";import{stringify as uf}from"yaml";async function mf(n,e=new Set){let t={id:n.id,name:n.name,description:n.description,baseUrl:n.baseUrl,schemaVersion:n.schemaVersion,advanced:n.advanced,retries:n.retries,envs:n.envs,disabled:n.disabled,labels:n.labels},r={},o=await _R({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:r,processedModuleNames:e}),i={fileType:he.TEST,...t,beforeSteps:o.beforeSteps&&o.beforeSteps.length>0?o.beforeSteps:void 0,steps:o.steps,afterSteps:o.afterSteps&&o.afterSteps.length>0?o.afterSteps:void 0};return{test:uf(i),modules:r}}async function _R({originalStepLists:n,modules:e,processedModuleNames:t}){let r=NR(n);Object.values(r).forEach(s=>{MR(s??[])});let{stepsToSave:o,moduleUpdates:i}=await mt({stepLists:r});for(let s of i)t.has(s.name)||(e[s.name]=FR(s),t.add(s.name));return o}function MR(n){sd({steps:n,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function FR(n){let e=At.parse(n),t={fileType:he.MODULE,...e,schemaVersion:He,steps:n.steps};return uf(t)}async function ne(n,e){return new Promise((t,r)=>{if(e?.aborted){r(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n);function i(){clearTimeout(o),e?.removeEventListener("abort",i),r(e?.reason)}})}async function Gi({promiseGenerator:n,signal:e,codePath:t,logger:r}){let i=Date.now(),s=setInterval(()=>{if(e?.aborted){clearInterval(s);return}r?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((a,l)=>{function c(){clearInterval(s),e?.removeEventListener("abort",c),l(e?.reason)}if(e?.aborted){l(e?.reason),clearInterval(s);return}e?.addEventListener("abort",c),(async()=>{try{a(await n())}catch(p){l(p)}finally{clearInterval(s),e?.removeEventListener("abort",c)}})()})}async function Dr({promiseGenerator:n,timeoutMs:e,codePath:t,logger:r,signal:o}){let i=!1,s=new AbortController,a=()=>{s.abort()},l=setTimeout(()=>{i||s.abort()},e);o?.addEventListener("abort",a);try{return await Gi({promiseGenerator:n,signal:s.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",a),clearTimeout(l)}}function Ia(n){let e=[];for(let t of n)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let r={...t,type:"MODULE"};e.push(kn.parse(r));break}case"IFRAME":case"SECTION":{let r={...t,steps:Ia(t.steps)};e.push(Ke.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Ia(o.steps)})),elseSteps:t.elseSteps?Ia(t.elseSteps):void 0};e.push(vr.parse(r));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Pa(n){return Ia([n])[0]}import DR from"picomatch";var ud=(n,e,t)=>{t?.caseInsensitive&&(n=n.toLowerCase());let r;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;r=n.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;r=n===e.glob||DR(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r};var Eo=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}async saveStepCacheEntries(e,t,r){try{await this.client.updateStepCaches({entries:e,testId:t})}catch(o){r.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){let t=await this.client.getStepCacheForTest({testId:e.testId,organizationId:e.organizationId,steps:e.steps,schemaVersion:e.schemaVersion}),{hits:r}=To({steps:e.steps,stepCacheEntries:t,logger:e.logger});this.client.updateCacheLastUsedDate(r,e.logger)}fetchIconKnowledgeBase(e,t){return this.client.fetchIconKnowledgeBase(e,t)}saveNewIcons(e,t,r){return this.client.saveNewIcons(e,t,r)}};import{Faker as UR,en as BR}from"@faker-js/faker";var Co="v1",Qn=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 UR({locale:BR}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Co}/tools/ai/generate`,{method:"POST",body:t}).catch(r=>{throw r instanceof an?new Error(r.rawError):new Error(`Failed to send AI generation: ${r.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Co}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Co}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Co}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Co}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Co}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof an?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};import{z as zR}from"zod";var Ro=class extends _t{constructor(e){super(e)}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return oh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${M}/web-agent/recommend-chunks`,{method:"POST",body:e,signal:t.abortSignal});return rh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${M}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return zR.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Bh.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return td.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return Uh.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return td.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${M}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Dh.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${M}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let r=await this.sendRequest(`/${M}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Tc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${M}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return zh.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${M}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return xc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${M}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return _c.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${M}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return nh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${M}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Yu.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${M}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Ju.parse(r)}};var Ur=class extends _t{async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${M}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return ku.parse(r)}async constructIframeRegex(e,t={}){let r=await this.sendRequest(`/${M}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t?.signal});return Ou.parse(r)}};var La=class{constructor(e){this.client=e}async uploadResultsArchive(e){let{uploadUrl:t,id:r}=await this.client.generateTestResultsUploadUrl(),o=await xo(t,"application/zip",e);if(!o.ok)throw new Error(`Failed to upload test results: ${await o.text()}`);let{runGroupId:i}=await this.client.startProcessingResultsUpload(r);return i}};import{PostHog as jR}from"posthog-node";async function hf(n,e){let t,r=0,o=3,i,s;for(;r<o;)try{let a=await n.getAllFlagsAndPayloads(e);i=a.featureFlags,s=a.featureFlagPayloads;break}catch(a){t=a,r++,await new Promise(l=>setTimeout(l,100*r))}if(i&&s)return{flags:i,payloads:s};throw t}var Ao=class n extends zi{constructor(t,r,o,i){super(o,i);this.client=t;this.orgId=r}static async init(t,r){let o=r??new jR("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:i,payloads:s}=await hf(o,t);return new n(o,t,i,s)}async refresh(){let{flags:t,payloads:r}=await hf(this.client,this.orgId);this.flags=t,this.payloads=r}};import{Server as xL}from"socket.io";import{cloneDeep as HR}from"lodash-es";var $R={showOverlay:!1},md=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:r,clientIp:o,sessionId:i,browserbaseSessionId:s}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:s,browserBehavior:HR($R)}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(s){t.error({err:s},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(s){t.error({err:s},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}},X=new md;function gf(n,e,t){let r=Date.now(),o=Date.now(),i,s,a,l,c=!1,p=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=a;a=void 0;let S=h.url(),x=g.toEditorDisplayCopy();JSON.stringify(x)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:s??[],context:x,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=x}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:f,sessionId:e},"Error grabbing browser state")}},d=setInterval(()=>{let h=X.getSession(e),g=h?.controller?.browser;if(!g||g.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(d);return}p(g,h.context)},1e3),u=(h,g)=>!!(JSON.stringify(h)!==JSON.stringify(s)||g.logsPerPage.some(f=>f.length>0)||g.harPages&&Object.keys(g.harPages).length>0||g.harEntries&&Object.keys(g.harEntries).length>0),m=setInterval(async()=>{let g=X.getSession(e)?.controller?.browser;if(!g||g.closed){clearInterval(m);return}else if(c)return;c=!0;try{let f=await g.getAllFrameUrls(),S=g.retrieveAndClearDebugData();u(f,S)&&(s=f,a=S,o=Date.now())}catch(f){t.warn({err:f},"Failed to fetch extended details")}finally{c=!1}},2500);return{timers:[d,m]}}var er={};var WR=n=>()=>{let{sessionId:e}=n.metadata;er[e]?.abort?.abort()},ff={event:"cancelApiTest",createHandler:WR};import{CookieJar as aA}from"tough-cookie";import{randomUUID as ZR}from"crypto";import{faker as GR}from"@faker-js/faker";import VR from"assert";import qR from"axios";import KR from"moment";import*as YR from"otpauth";import JR from"pg";var Io=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var Sf=n=>{let e=n.reason===void 0?new DOMException("This operation was aborted.","AbortError"):n.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};async function U(n,e){let{milliseconds:t,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,s,a;return new Promise((l,c)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:d}=e;d.aborted&&c(Sf(d)),a=()=>{c(Sf(d))},d.addEventListener("abort",a)}if(t===Number.POSITIVE_INFINITY){n.then(l,c);return}let p=new Io;s=i.setTimeout.call(void 0,()=>{if(r){try{l(r())}catch(d){c(d)}return}"cancel"in n&&typeof n.cancel=="function"&&n.cancel(),o instanceof Error?c(o):(p.message=o??`Promise timed out after ${t} milliseconds`,c(p))},t),(async()=>{try{l(await n)}catch(d){c(d)}})()}).catch(l=>{throw l}).finally(()=>{s!==void 0&&i.clearTimeout.call(void 0,s),a!==void 0&&e.signal&&e.signal.removeEventListener("abort",a)})}async function yf(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=ua(r,e);t.push(...o)}),t}var XR=Object.getPrototypeOf(async function(){}).constructor;async function bf(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,s={},a=(f,S)=>{o[f]=S,s[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},p;r.includes("Octokit")&&(p=(await import("@octokit/rest")).Octokit);let d;r.includes("createAppAuth")&&(d=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new XR("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(qR,KR,i.fakerInstance??GR,VR,JR,p,d,YR,yf,o,a,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await U(u(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal})}catch(f){t.error(`[${n}] Error executing code: ${f}`),m=!1,f instanceof Io?g=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:g=f instanceof Error?f.message:`${f}`}return{result:h,variableUpdates:s,persistentVariableUpdates:l,success:m,error:g}}async function wf({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:s=Kn}){let a=ZR(),l=await bf(a,{code:n,options:{fragment:e,timeoutMs:s},bindings:t.toObjectCopy(),tools:r,signal:i},o);return y.debug(`[${a}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as QR,randomUUID as eA}from"crypto";import tA from"fetch-retry";var nA=tA(global.fetch,{retries:3,retryOn:function(n,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(n){return Math.pow(2,n)*500}}),vf=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,xf=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function Tf({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=Kn,retries:i=2,signal:s,logger:a}){if(!vf)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,p=0;if(!xf)throw new Error("Missing lambda auth secret.");let d=QR("sha256",xf).update(n).digest("hex");for(;p<=i;){p++,s?.throwIfAborted();let m={id:eA(),orgId:n,momenticLambdaAuthHash:d,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await U(nA(vf,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:s}),!l)throw new Error("Got empty response from code evaluation server");if(!l.ok)throw new Error(`Code evaluation server returned error code ${l.status}`);c=void 0;break}catch(h){c=h}}if(c)throw a.error({err:c},"Failed to evaluate code remotely"),c;if(!l)throw new Error(`An unexpected code evaluation error occurred${c?`: ${c}`:""}`);let u;try{u=uh.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Fn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await Tf(n);else if(n.localTools)e=await wf({...n,localTools:n.localTools});else throw new Error("No code evaluation environment available");if(e.error)throw new Error(`Code evaluation error: ${e.error}`);if(e.variableUpdates)for(let[t,r]of Object.entries(e.variableUpdates))n.context.setVariable(t,r);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await n.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,r]of Object.entries(e.persistentVariableUpdates))n.context.setVariable(t,r)}return e.result}async function Dt(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:s,retries:a=2,timeoutMs:l=Kn,allowUndefined:c=!1}=n,p=/{{(.*?)}}/g,d=t.matchAll(p),u=t;for(let m of d){if(m.length<2)continue;let h=m[1].trim(),g;try{g=await Fn({orgId:e,code:h,fragment:!0,context:r,timeoutMs:l,logger:o,retries:a,localTools:n.localTools,signal:i,flagStore:s})}catch(S){throw o.error({err:S,value:t},"Error evaluating template string"),S}if(g===void 0&&!c)throw new R("UserConfigurationError",`Template fragment '${h}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let f=typeof g=="string"?g:`${g}`;f=f.replaceAll(/\$/g,"$$$$"),u=u.replace(m[0],f)}return u}async function Po(n){return Ef(n)}async function Ef({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o="",replacements:i={},...s}){for(let a in n){if(e.includes(a))continue;let l=!1;if(t)if(t.includes(a))l=!0;else continue;let c=n[a],p=o?`${o}.${a}`:a;if(typeof c=="string"&&c.includes("{{")){let d=await Dt({s:c,context:r,...s});if(c===d)continue;i[p]=c,n[a]=d}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await Ef({obj:c,bannedKeys:e,context:r,prefixPath:p,replacements:i,allowList:l?void 0:t,...s})}return i}import oA from"fetch-cookie";import{cloneDeep as iA}from"lodash-es";var Oa=(n,e)=>{try{let{hostname:t,pathname:r}=new URL(n),{hostname:o,pathname:i}=new URL(e);return t!==o||r!==i}catch{return!1}},Lo=n=>{try{return new URL(n),!0}catch{return!1}},Cf=n=>!n.toLowerCase().startsWith("http"),Oo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function tr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}var rA=3e4;async function ka({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??rA/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),s=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{s.append(m,h)});let a=s.toString(),l;if(Lo(n.url)&&(l=n.url),t&&Oo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let p=await U((async()=>{let m=a?`${l}?${a}`:l;try{return await r(m,{headers:i,method:n.method,body:n.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!p.ok){let m;try{m=await p.text()}catch(h){m=`Failed to read response body: ${h}`}throw new R("ActionFailureError",`Fetch request failed with status ${p.status}: ${m}`)}let d={};p.headers.forEach((m,h)=>{d[h]=m});let u={status:p.status,headers:d};return p.headers.get("content-type")?.includes("json")?u.json=await p.json():p.headers.get("content-type")?.includes("text")&&(u.text=await p.text()),u}async function Rf(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,s=iA(i);await Po({obj:s,orgId:o,bannedKeys:["code"],...e});let a=await sA(n);return s.envKey&&a.data&&r.setVariable(s.envKey,a.data),a}async function sA(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:s}=e,a=new Date;switch(r.type){case"JAVASCRIPT":{let c=await Fn({code:r.code,orgId:o,fragment:!!r.fragment,timeoutMs:r.timeout?r.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(p){return{...r,startedAt:a,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${p instanceof Error?p.message:`${p}`}`}}return{...r,startedAt:a,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=oA(fetch,s),p=await ka({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:a,finishedAt:new Date,status:"SUCCESS",message:"Request executed successfully",data:p}}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}async function Af(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:s,baseUrl:a}=e,{test:l,step:c}=r,p={startedAt:new Date,status:"RUNNING",results:[]},d=p.results,u=new aA,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await Rf({inputs:{step:h,baseUrl:a,orgId:s},fixtures:m})}catch(S){o?.aborted?f={...h,startedAt:g,finishedAt:new Date,status:"CANCELLED",message:"Step cancelled by user."}:f={...h,startedAt:g,finishedAt:new Date,status:"FAILED",message:`Step failed: ${S instanceof Error?S.message:`${S}`}`}}if(d.push(f),c.onFinished?.({result:f,cookies:ha(u,new URL(a).hostname)}),l.updateAttemptProgress?.({results:d}),f.status!=="SUCCESS"){p.status=f.status==="CANCELLED"?"CANCELLED":"FAILED";break}}return p.status==="RUNNING"&&(p.status="PASSED"),p.finishedAt=new Date,l.onFinished?.(),p}async function If(n){let{socket:e,storage:t}=n,r=n.socket.id,{testId:o}=e.handshake.query;if(typeof o!="string")throw new Error(`Received invalid test ID that does not parse as a string: ${o}`);let i=await t.getOrgId({type:"api-test",testId:o}),{baseUrl:s,envName:a,environmentVariables:l}=await hd({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),c={type:"api-test",orgId:await n.storage.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new It({baseUrl:s||"",currentUrl:s||"",variablesFromEnvironment:l,envName:a})};return er[r]=c,c}async function hd({testId:n,orgId:e,logger:t,storage:r,authorization:o}){let i=await r.fetchApiTestMetadata(n,e,t);if(!i)throw new Error(`Failed to fetch API test metadata for test ID: ${n}`);let s;o?.type==="API_KEY"&&(s=new Qn({httpClient:new _t({...o,logger:t}),fakerSeed:void 0}));let a=i.envs?.find(d=>d.default),l;a&&(l=await r.fetchEnvironment(e,a.name,t));let c=i.baseUrl||l?.variables?.[Ae];if(!c)throw new Error("Base URL is empty in both API test options and the configured environment");let p={...l?.variables};return{baseUrl:c,envName:l?.name,environmentVariables:p,localCodeEvalTools:s}}var lA=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:s,storage:a,logger:l,flagStoreFactory:c}=n,{orgId:p,testId:d,sessionId:u}=i,m=l.child({testId:d,orgId:p,sessionId:u}),h=er[u];if(!h)throw new Error(`No api testing session with id ${u} could be found. Please reconnect and try again.`);let g=new AbortController;h.abort=g;let f=h.latestContext,{localCodeEvalTools:S,baseUrl:x}=await hd({testId:d,orgId:p,logger:m,storage:a,authorization:o}),b={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(p)},C=await Af({inputs:{steps:r,orgId:p,baseUrl:x},fixtures:b,callbacks:{test:{onFinished:()=>{s.emit("apiTestFinished")}},step:{onStarted:I=>{s.emit("apiStepStarted",I)},onFinished:I=>{s.emit("apiStepFinished",I)}}}});t({result:C})},Pf={event:"executeApiTest",createHandler:lA};var cA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{e.info({sessionId:t},"Cancel event received");let r=X.getSession(t);if(!r)throw new Error("No active session found");try{r.controller.setClosed()}catch{}}},Lf={event:"cancel",createHandler:cA};var dA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=X.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let a=await s.getBrowserState({skipWait:!0});o({a11yTree:a.serialize()})}catch(a){e.error({err:a},"Error fetching a11y tree from the browser"),o({err:a.message})}}},Of={event:"fetchA11yTree",createHandler:dA};var pA=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=X.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let a=await s.html();o({html:a})}catch(a){e.error({err:a},"Error fetching DOM from the browser"),a.name==="TimeoutError"?o({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):o({err:a.message})}}},kf={event:"fetchDom",createHandler:pA};var uA=({metadata:n,logger:e})=>{let{sessionId:t,type:r}=n;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),r==="e2e"?X.removeSession(t,e):r==="api-test"&&delete er[t]}},Nf={event:"disconnect",createHandler:uA};function Yt(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=mA(t);hA(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await gA(i,e,r,o)}catch(s){n.logger.error({result:n.result,err:s},"Error hoisting scalar result metadata")}})())}function mA(n){let e=n[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertion){t=e;break}break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!e.results.length){t=e;break}e=e.results[e.results.length-1];break;default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(t)break}let r=n[n.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!r.results.length){o=r;break}r=r.results[r.results.length-1];break;default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function hA(n,e,t){e&&(n.beforeUrl=e.beforeUrl),t&&(n.afterUrl=t.afterUrl,n.data=t.data,t.status!=="SUCCESS"&&(n.message=t.message))}async function gA(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Vi from"os";import fA from"v8";var _f,vn,gd=Vi.platform(),SA=Vi.cpus().map(n=>({model:n.model,speed:n.speed}));function Mf(n){n.debug({platform:gd,cpuMetadata:SA},"Platform and CPU clock speed metadata");let e=()=>{try{let t=!1,r=yA(),o=bA();r.freeMemory<1e6&&(t=!0);let i=fA.getHeapStatistics(),s=i.used_heap_size,a=i.heap_size_limit;s/a>.9&&(t=!0),t?n.warn({platform:gd,memory:r,cpu:o,heapStats:i},"Critical resource usage metrics detected"):n.debug({platform:gd,memory:r,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),setInterval(e,1e4)}function yA(){let n=Vi.totalmem(),e=Vi.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function bA(){let n=Vi.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of n)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!vn)return vn=t,null;let r={user:t.user-vn.user,nice:t.nice-vn.nice,sys:t.sys-vn.sys,idle:t.idle-vn.idle,irq:t.irq-vn.irq,total:t.total-vn.total};return _f={measurementTime:e,intervalMs:e-vn.measurementTime,user:r.user/r.total*100,nice:r.nice/r.total*100,sys:r.sys/r.total*100,idle:r.idle/r.total*100,irq:r.irq/r.total*100,total:100-r.idle/r.total*100},vn=t,_f}import{hostname as EA}from"os";async function Df(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:s}=n,{logger:a,abortSignal:l}=s;if(e.target&&!Vn(e.target))throw new Error("Element assertion with x/y is not supported yet");let c=e.assertion.type==="ELEMENT_EXISTENCE"&&e.assertion.negated,p=Date.now(),d=0,u,m=500;for(;d<2||Date.now()-p<r;){d++,d>1&&await ne(m,l),l?.throwIfAborted();try{let{newTarget:h,elementInteractedDisplayString:g,result:f}=await o({ctx:s.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>wA(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:c?"NEGATED_CHECK":void 0}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(a.warn({err:h},"Element assertion ended in error, retrying..."),!(h instanceof R)||h.reason!="ActionFailureError")throw h;u={success:!1,err:h}}}if(!u)throw new Error(`Failed to evaluate manual element assertion in ${r}ms.`);return u}async function wA(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,s;switch(r.type){case"ELEMENT_CONTENT":{let a=await n.textContent()??"";if(s={elementTextContent:Me(a,500,!0)},!Ff(a,r.value,r.operation,!!r.negated)){let l=r.negated?Xn[r.operation]:Zn[r.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${r.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{s={elementOuterHtml:Me(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await n.getAttribute(r.attr,{timeout:3e3})??""}catch(l){i=new R("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!Ff(a,r.value,r.operation,!!r.negated)){let l=r.negated?Xn[r.operation]:Zn[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new R("AssertionFailureError",`The attribute ${r.attr} ${l}: ${a}`):new R("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(r.condition){case"VISIBLE":{o=await n.isVisible({timeout:bn*1e3});break}case"EDITABLE":{o=await n.isEditable({timeout:bn*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await n.isEnabled({timeout:bn*1e3});break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.condition)}if(o=r.negated?!o:o,!o){let a=r.negated?ad[r.condition]:ld[r.condition];i=new R("AssertionFailureError",`The element ${a}`)}break}}return{success:o,data:s,err:i}}function Ff(n,e,t,r){let o;switch(t){case"CONTAINS":{o=n.includes(e);break}case"EQUALS":{o=n.trim()===e.trim();break}case"STARTS_WITH":{o=n.trim().startsWith(e);break}case"EXISTS":{o=n.trim().length>0;break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return r?!o:o}import{Jimp as vA}from"jimp";async function qi(n,e){let t=await n.screenshot(e),r=await vA.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as Uf}from"jimp";import fd from"jpeg-js";import xA from"pixelmatch";async function Bf({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:s,screenshotStorage:a}){if(t.target&&!Vn(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:s});let l={clearHighlights:!0,hideCaret:!0},c;t.target?.elementDescriptor?c=(await i({ctx:n,tracer:e,command:t,target:t.target,cache:t.cache?.target??t.target?.a11yData,action:async W=>qi(o,{locator:W.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await qi(o,l);let p=await a.prepareGoldenScreenshotForComparison(s,t,c);if((c.height!==p.height||c.width!==p.width)&&s.debug({currHeight:c.height,currWidth:c.width,savedHeight:p.height,savedWidth:p.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-p.height)>10||Math.abs(c.width-p.width)>10){let D=`${c.width}x${c.height}`,W=`${p.width}x${p.height}`;return{fail:!0,thoughts:`Current screenshot (${D}) does not match saved screenshot dimensions (${W}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:p.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await Uf.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await Uf.fromBuffer(p.buffer),h={width:p.width,height:p.height},g,f=u.width*u.height,S=h.width*h.height,x=Math.abs(u.height-h.height),b=Math.abs(u.width-h.width);if(f>S){let D=d.cover({w:h.width,h:h.height});c.buffer=await D.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let D=m.cover({w:u.width,h:u.height});p.buffer=await D.getBuffer("image/jpeg"),g="saved"}let w={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},E=t.threshold??.1,I=xA(fd.decode(p.buffer).data,fd.decode(c.buffer).data,w.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,N=I>E*100,P=`Visual diff of ${I.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${E*100}%.`;if(g&&(P+=` The ${g} screenshot was cropped since it was taller by ${x} pixels and wider by ${b} pixels.`),N)throw new R("ActionFailureError",P);return{fail:N,thoughts:P,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:fd.encode(w,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var TA=5e3;async function Na({timeout:n=bn,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,s=0,a=500;for(;s-t<r;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await zf(e),s=Date.now();let c=s-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ne(a,e.signal),a=Math.min(Math.floor(a*1.5),TA);else return i}return i=await zf(e),i}async function zf({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,s;try{let a;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(jf,{value:n.value,negated:!!n.negated,returnHtml:!1});i=l.some(c=>c.evaluation),a=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:a}=await e.evaluateFunctionInPage(jf,{value:n.value,negated:!!n.negated,returnHtml:!0}));if(!i){let l=n.negated?Xn.CONTAINS:Zn.CONTAINS;s=new R("AssertionFailureError",`The page ${l} '${n.value}'.`),o=a}}catch(a){s=new R("AssertionFailureError",`Failed to evaluate page content assertion: ${a instanceof Error?a.message:`${a}`}`)}return{success:i,err:s,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"})(n.type)}}function jf({value:n,negated:e,returnHtml:t}){let r=document.documentElement.outerHTML,o=r.includes(n)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?r:void 0}}var Sd=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:s,controller:a}=n.fixtures,l=a.browser,{orgId:c,runId:p}=n.inputs,d=a.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),r.debug({inputs:t,moduleId:e.moduleId},"Set module inputs"));let u,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Dt({orgId:c,s:f,context:o,logger:r,localTools:s,signal:d,flagStore:a.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([b,w])=>`${b}:${w}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let x=Date.now();for(;Date.now()-x<Fh;){d?.throwIfAborted();let b=await i.getCacheResult(g);if(b){r.debug({cacheResult:b},"Got result from module execution cache"),u=_a(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(b),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let w=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${EA()};runId:${p}`},d);if(w.acquired){h=w.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ne(2500+Math.random()*1e4,d)}}try{if(!u)u=await CA(n);else if(e.autoAuth){let f=ma.safeParse(u.data);if(!f.success)throw new R("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(f.data);let S=!1,x=e.advanced?.cacheInvalidation;if(x&&x.type==="PAGE_CHECK"){let b={type:"CONTENT",value:x.substring},w=await Na({timeout:bn,assertion:b,browser:l,flagStore:a.flagStore,logger:r,signal:d});w.success?r.debug({invalResult:w},"Cached result still valid after page check, continuing..."):(r.info({invalResult:w},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),Sd(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await RA({step:e,result:u,browser:a.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},CA=async n=>{let{step:e,tracer:t}=n.moduleParams,r=_a(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:s}=await nr(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=s,r.status=i,r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,nestedResults:s,result:r,logger:n.fixtures.logger}),r};function _a(n,e,t){let r={};return Object.entries(e).forEach(([i,s])=>{r[i]=JSON.stringify(s)}),{type:"MODULE",id:n.id,moduleId:n.moduleId,moduleName:n.name,startedAt:new Date,cacheConfig:n.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:t}}async function Hf({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:s}){let a={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){r.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}a[l]=await Fn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:s,flagStore:o})}return a}catch(l){throw s?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function RA({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let s=n.cacheConfig?.cacheExpiryMs;(!s||s===hg)&&(s=n.defaultCacheTtl??gg);let a;n.autoAuth?a=JSON.stringify(await t.saveAuthState()):e.data!==void 0?a=JSON.stringify(e.data):a='""',o.debug({cacheKeyPrefix:r,ttlMs:s,truncatedCacheResultJson:Mg(a)},"Setting module cache result"),await i.setCacheResult({result:a,keyPrefix:r,ttlMs:s})}async function rr(n,e,t){let r=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,s="FAILED",a;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(a="Step aborted by user.",s="CANCELLED"):o instanceof R?a=`${o}`:a=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=_a(n,{},"FAILED");return l.message=a,l.startedAt=r,l.finishedAt=i,l}return{...Pa(n),startedAt:r,finishedAt:i,status:s,data:null,message:a,results:[]}}}async function nr(n,e){let t=!1;try{return n&&!n.state.failureRecoveryDisabled&&(n.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{n&&t&&(n.state.failureRecoveryDisabled=void 0)}}import{randomUUID as $f}from"crypto";import{cloneDeep as IA}from"lodash-es";function Ma(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var Fa=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:s}=n.fixtures,{collectDebugData:a}=n.options,{testMetadata:l,suiteMetadata:c}=n.inputs,p=e.command.type,d=r.child({commandType:p,stepId:e.id,commandId:e.command.id}),u=Di(e.command);n.work.asyncTasks.push(s.reportCreditsUsed(d,p,u,{testId:l?.id,testName:l?.name,suiteId:c?.id,suiteName:c?.name}));let m=o.browser.url(),h=new Date,g,f=$f(),S=$f();if(a)try{g=await o.browser.screenshot({retries:1,clearHighlights:!0});let C=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:d,snapshotId:f,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(d,f,C))}catch(C){d.debug({err:C},"Failed to take screenshot before step, likely because the page is still loading. This is non-fatal and does not affect the test.")}let x,b,w,E=ca();try{let C=await o.executePresetCommand(E,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),w=C.afterScreenshotOverride;let{proposedStep:I}=PA({work:n.work,step:e,newTargets:C.newTargets,logger:d}),N=new Date,P=o.browser.url();b={beforeUrl:m,afterUrl:P,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},x={...e,message:C.thoughts??LA(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:P,finishedAt:N,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[b],details:E.details,proposedStep:I},"assertion"in e.command&&(x.message=C.thoughts||"Assertion passed.")}catch(C){d.error({message:C.message,stack:C.stack},`Failed executing preset step ${Nr(e.command)}`);let I=o.browser.url(),N=new Date,P=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(w=C.getLastScreenshotBuffer()),b={beforeUrl:m,afterUrl:I,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P},x={...e,startedAt:h,finishedAt:N,beforeUrl:m,afterUrl:I,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P,failureReason:C instanceof R?C.reason:void 0,results:[b],details:E.details}}if(a)try{w||(w=await o.browser.screenshot({retries:1}));let C=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:d,snapshotId:S,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(d,S,C))}catch(C){d.debug({err:C},"Failed store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return b.beforeSnapshot=f,x.beforeSnapshot=f,b.afterSnapshot=S,x.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:d,snapshotId:f,screenshot:g}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(d,f,g))),w&&(t.attachAfterScreenshot({logger:d,snapshotId:S,screenshot:w}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(d,S,w))),x};function PA({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;kg(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let s={...o,target:{...o.target,elementDescriptor:i}},a={...IA(e),command:s};return Ma(n,{type:"DESCRIPTION_UPDATE",thoughts:`Updated element description after the original element could not be found on the page. New element location reasoning: ${t[0]?.thoughts}`}),{proposedStep:a}}return{proposedStep:void 0}}function LA(n){if(n?.length){if(n.length===1&&n[0]?.thoughts)return n[0].thoughts;if(n.length===2&&n.every(e=>e.thoughts))return`Located first element: ${n[0]?.thoughts}
42
+ Located second element: ${n[1]?.thoughts}`}}var yd=["ability","able","aboard","about","above","accept","accident","according","account","accurate","acres","across","act","action","active","activity","actual","actually","add","addition","additional","adjective","adult","adventure","advice","affect","afraid","after","afternoon","again","against","age","ago","agree","ahead","aid","air","airplane","alike","alive","all","allow","almost","alone","along","aloud","alphabet","already","also","although","am","among","amount","ancient","angle","angry","animal","announced","another","answer","ants","any","anybody","anyone","anything","anyway","anywhere","apart","apartment","appearance","apple","applied","appropriate","are","area","arm","army","around","arrange","arrangement","arrive","arrow","art","article","as","aside","ask","asleep","at","ate","atmosphere","atom","atomic","attached","attack","attempt","attention","audience","author","automobile","available","average","avoid","aware","away","baby","back","bad","badly","bag","balance","ball","balloon","band","bank","bar","bare","bark","barn","base","baseball","basic","basis","basket","bat","battle","be","bean","bear","beat","beautiful","beauty","became","because","become","becoming","bee","been","before","began","beginning","begun","behavior","behind","being","believed","bell","belong","below","belt","bend","beneath","bent","beside","best","bet","better","between","beyond","bicycle","bigger","biggest","bill","birds","birth","birthday","bit","bite","black","blank","blanket","blew","blind","block","blood","blow","blue","board","boat","body","bone","book","border","born","both","bottle","bottom","bound","bow","bowl","box","boy","brain","branch","brass","brave","bread","break","breakfast","breath","breathe","breathing","breeze","brick","bridge","brief","bright","bring","broad","broke","broken","brother","brought","brown","brush","buffalo","build","building","built","buried","burn","burst","bus","bush","business","busy","but","butter","buy","by","cabin","cage","cake","call","calm","came","camera","camp","can","canal","cannot","cap","capital","captain","captured","car","carbon","card","care","careful","carefully","carried","carry","case","cast","castle","cat","catch","cattle","caught","cause","cave","cell","cent","center","central","century","certain","certainly","chain","chair","chamber","chance","change","changing","chapter","character","characteristic","charge","chart","check","cheese","chemical","chest","chicken","chief","child","children","choice","choose","chose","chosen","church","circle","circus","citizen","city","class","classroom","claws","clay","clean","clear","clearly","climate","climb","clock","close","closely","closer","cloth","clothes","clothing","cloud","club","coach","coal","coast","coat","coffee","cold","collect","college","colony","color","column","combination","combine","come","comfortable","coming","command","common","community","company","compare","compass","complete","completely","complex","composed","composition","compound","concerned","condition","congress","connected","consider","consist","consonant","constantly","construction","contain","continent","continued","contrast","control","conversation","cook","cookies","cool","copper","copy","corn","corner","correct","correctly","cost","cotton","could","count","country","couple","courage","course","court","cover","cow","cowboy","crack","cream","create","creature","crew","crop","cross","crowd","cry","cup","curious","current","curve","customs","cut","cutting","daily","damage","dance","danger","dangerous","dark","darkness","date","daughter","dawn","day","dead","deal","dear","death","decide","declared","deep","deeply","deer","definition","degree","depend","depth","describe","desert","design","desk","detail","determine","develop","development","diagram","diameter","did","die","differ","difference","different","difficult","difficulty","dig","dinner","direct","direction","directly","dirt","dirty","disappear","discover","discovery","discuss","discussion","disease","dish","distance","distant","divide","division","do","doctor","does","dog","doing","doll","dollar","done","donkey","door","dot","double","doubt","down","dozen","draw","drawn","dream","dress","drew","dried","drink","drive","driven","driver","driving","drop","dropped","drove","dry","duck","due","dug","dull","during","dust","duty","each","eager","ear","earlier","early","earn","earth","easier","easily","east","easy","eat","eaten","edge","education","effect","effort","egg","eight","either","electric","electricity","element","elephant","eleven","else","empty","end","enemy","energy","engine","engineer","enjoy","enough","enter","entire","entirely","environment","equal","equally","equator","equipment","escape","especially","essential","establish","even","evening","event","eventually","ever","every","everybody","everyone","everything","everywhere","evidence","exact","exactly","examine","example","excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise","exist","expect","experience","experiment","explain","explanation","explore","express","expression","extra","eye","face","facing","fact","factor","factory","failed","fair","fairly","fall","fallen","familiar","family","famous","far","farm","farmer","farther","fast","fastened","faster","fat","father","favorite","fear","feathers","feature","fed","feed","feel","feet","fell","fellow","felt","fence","few","fewer","field","fierce","fifteen","fifth","fifty","fight","fighting","figure","fill","film","final","finally","find","fine","finest","finger","finish","fire","fireplace","firm","first","fish","five","fix","flag","flame","flat","flew","flies","flight","floating","floor","flow","flower","fly","fog","folks","follow","food","foot","football","for","force","foreign","forest","forget","forgot","forgotten","form","former","fort","forth","forty","forward","fought","found","four","fourth","fox","frame","free","freedom","frequently","fresh","friend","friendly","frighten","frog","from","front","frozen","fruit","fuel","full","fully","fun","function","funny","fur","furniture","further","future","gain","game","garage","garden","gas","gasoline","gate","gather","gave","general","generally","gentle","gently","get","getting","giant","gift","girl","give","given","giving","glad","glass","globe","go","goes","gold","golden","gone","good","goose","got","government","grabbed","grade","gradually","grain","grandfather","grandmother","graph","grass","gravity","gray","great","greater","greatest","greatly","green","grew","ground","group","grow","grown","growth","guard","guess","guide","gulf","gun","habit","had","hair","half","halfway","hall","hand","handle","handsome","hang","happen","happened","happily","happy","harbor","hard","harder","hardly","has","hat","have","having","hay","he","headed","heading","health","heard","hearing","heart","heat","heavy","height","held","hello","help","helpful","her","herd","here","herself","hidden","hide","high","higher","highest","highway","hill","him","himself","his","history","hit","hold","hole","hollow","home","honor","hope","horn","horse","hospital","hot","hour","house","how","however","huge","human","hundred","hung","hungry","hunt","hunter","hurried","hurry","hurt","husband","ice","idea","identity","if","ill","image","imagine","immediately","importance","important","impossible","improve","in","inch","include","including","income","increase","indeed","independent","indicate","individual","industrial","industry","influence","information","inside","instance","instant","instead","instrument","interest","interior","into","introduced","invented","involved","iron","is","island","it","its","itself","jack","jar","jet","job","join","joined","journey","joy","judge","jump","jungle","just","keep","kept","key","kids","kill","kind","kitchen","knew","knife","know","knowledge","known","label","labor","lack","lady","laid","lake","lamp","land","language","large","larger","largest","last","late","later","laugh","law","lay","layers","lead","leader","leaf","learn","least","leather","leave","leaving","led","left","leg","length","lesson","let","letter","level","library","lie","life","lift","light","like","likely","limited","line","lion","lips","liquid","list","listen","little","live","living","load","local","locate","location","log","lonely","long","longer","look","loose","lose","loss","lost","lot","loud","love","lovely","low","lower","luck","lucky","lunch","lungs","lying","machine","machinery","mad","made","magic","magnet","mail","main","mainly","major","make","making","man","managed","manner","manufacturing","many","map","mark","market","married","mass","massage","master","material","mathematics","matter","may","maybe","me","meal","mean","means","meant","measure","meat","medicine","meet","melted","member","memory","men","mental","merely","met","metal","method","mice","middle","might","mighty","mile","military","milk","mill","mind","mine","minerals","minute","mirror","missing","mission","mistake","mix","mixture","model","modern","molecular","moment","money","monkey","month","mood","moon","more","morning","most","mostly","mother","motion","motor","mountain","mouse","mouth","move","movement","movie","moving","mud","muscle","music","musical","must","my","myself","mysterious","nails","name","nation","national","native","natural","naturally","nature","near","nearby","nearer","nearest","nearly","necessary","neck","needed","needle","needs","negative","neighbor","neighborhood","nervous","nest","never","new","news","newspaper","next","nice","night","nine","no","nobody","nodded","noise","none","noon","nor","north","nose","not","note","noted","nothing","notice","noun","now","number","numeral","nuts","object","observe","obtain","occasionally","occur","ocean","of","off","offer","office","officer","official","oil","old","older","oldest","on","once","one","only","onto","open","operation","opinion","opportunity","opposite","or","orange","orbit","order","ordinary","organization","organized","origin","original","other","ought","our","ourselves","out","outer","outline","outside","over","own","owner","oxygen","pack","package","page","paid","pain","paint","pair","palace","pale","pan","paper","paragraph","parallel","parent","park","part","particles","particular","particularly","partly","parts","party","pass","passage","past","path","pattern","pay","peace","pen","pencil","people","per","percent","perfect","perfectly","perhaps","period","person","personal","pet","phrase","physical","piano","pick","picture","pictured","pie","piece","pig","pile","pilot","pine","pink","pipe","pitch","place","plain","plan","plane","planet","planned","planning","plant","plastic","plate","plates","play","pleasant","please","pleasure","plenty","plural","plus","pocket","poem","poet","poetry","point","pole","police","policeman","political","pond","pony","pool","poor","popular","population","porch","port","position","positive","possible","possibly","post","pot","potatoes","pound","pour","powder","power","powerful","practical","practice","prepare","present","president","press","pressure","pretty","prevent","previous","price","pride","primitive","principal","principle","printed","private","prize","probably","problem","process","produce","product","production","program","progress","promised","proper","properly","property","protection","proud","prove","provide","public","pull","pupil","pure","purple","purpose","push","put","putting","quarter","queen","question","quick","quickly","quiet","quietly","quite","rabbit","race","radio","railroad","rain","raise","ran","ranch","range","rapidly","rate","rather","raw","rays","reach","read","reader","ready","real","realize","rear","reason","recall","receive","recent","recently","recognize","record","red","refer","refused","region","regular","related","relationship","religious","remain","remarkable","remember","remove","repeat","replace","replied","report","represent","require","research","respect","rest","result","return","review","rhyme","rhythm","rice","rich","ride","riding","right","ring","rise","rising","river","road","roar","rock","rocket","rocky","rod","roll","roof","room","root","rope","rose","rough","round","route","row","rubbed","rubber","rule","ruler","run","running","rush","sad","saddle","safe","safety","said","sail","sale","salmon","salt","same","sand","sang","sat","satellites","satisfied","save","saved","saw","say","scale","scared","scene","school","science","scientific","scientist","score","screen","sea","search","season","seat","second","secret","section","see","seed","seeing","seems","seen","seldom","select","selection","sell","send","sense","sent","sentence","separate","series","serious","serve","service","sets","setting","settle","settlers","seven","several","shade","shadow","shake","shaking","shall","shallow","shape","share","sharp","she","sheep","sheet","shelf","shells","shelter","shine","shinning","ship","shirt","shoe","shoot","shop","shore","short","shorter","shot","should","shoulder","shout","show","shown","shut","sick","sides","sight","sign","signal","silence","silent","silk","silly","silver","similar","simple","simplest","simply","since","sing","single","sink","sister","sit","sitting","situation","six","size","skill","skin","sky","slabs","slave","sleep","slept","slide","slight","slightly","slip","slipped","slope","slow","slowly","small","smaller","smallest","smell","smile","smoke","smooth","snake","snow","so","soap","social","society","soft","softly","soil","solar","sold","soldier","solid","solution","solve","some","somebody","somehow","someone","something","sometime","somewhere","son","song","soon","sort","sound","source","south","southern","space","speak","special","species","specific","speech","speed","spell","spend","spent","spider","spin","spirit","spite","split","spoken","sport","spread","spring","square","stage","stairs","stand","standard","star","stared","start","state","statement","station","stay","steady","steam","steel","steep","stems","step","stepped","stick","stiff","still","stock","stomach","stone","stood","stop","stopped","store","storm","story","stove","straight","strange","stranger","straw","stream","street","strength","stretch","strike","string","strip","strong","stronger","struck","structure","struggle","stuck","student","studied","studying","subject","substance","success","successful","such","sudden","suddenly","sugar","suggest","suit","sum","summer","sun","sunlight","supper","supply","support","suppose","sure","surface","surprise","surrounded","swam","sweet","swept","swim","swimming","swing","swung","syllable","symbol","system","table","tail","take","taken","tales","talk","tall","tank","tape","task","taste","taught","tax","tea","teach","teacher","team","tears","teeth","telephone","television","tell","temperature","ten","tent","term","terrible","test","than","thank","that","thee","them","themselves","then","theory","there","therefore","these","they","thick","thin","thing","think","third","thirty","this","those","thou","though","thought","thousand","thread","three","threw","throat","through","throughout","throw","thrown","thumb","thus","thy","tide","tie","tight","tightly","till","time","tin","tiny","tip","tired","title","to","tobacco","today","together","told","tomorrow","tone","tongue","tonight","too","took","tool","top","topic","torn","total","touch","toward","tower","town","toy","trace","track","trade","traffic","trail","train","transportation","trap","travel","treated","tree","triangle","tribe","trick","tried","trip","troops","tropical","trouble","truck","trunk","truth","try","tube","tune","turn","twelve","twenty","twice","two","type","typical","uncle","under","underline","understanding","unhappy","union","unit","universe","unknown","unless","until","unusual","up","upon","upper","upward","us","use","useful","using","usual","usually","valley","valuable","value","vapor","variety","various","vast","vegetable","verb","vertical","very","vessels","victory","view","village","visit","visitor","voice","volume","vote","vowel","voyage","wagon","wait","walk","wall","want","war","warm","warn","was","wash","waste","watch","water","wave","way","we","weak","wealth","wear","weather","week","weigh","weight","welcome","well","went","were","west","western","wet","whale","what","whatever","wheat","wheel","when","whenever","where","wherever","whether","which","while","whispered","whistle","white","who","whole","whom","whose","why","wide","widely","wife","wild","will","willing","win","wind","window","wing","winter","wire","wise","wish","with","within","without","wolf","women","won","wonder","wonderful","wood","wooden","wool","word","wore","work","worker","world","worried","worry","worse","worth","would","wrapped","write","writer","writing","written","wrong","wrote","yard","year","yellow","yes","yesterday","yet","you","young","younger","your","yourself","youth","zero","zebra","zipper","zoo","zulu"];function Wf(n){return new Array(n).fill(0).map(()=>yd[Math.floor(Math.random()*yd.length)]).join("-")}async function Gf({codePath:n,screenshotBuff:e,storage:t,logger:r}){if(e)try{let o=await t.uploadScreenshot(e);return r.debug({screenshotUrl:o,codePath:n},"Saved screenshot for debugging"),o}catch(o){r.error({err:o,codePath:n},"Failed to save screenshot for debugging")}}async function xn({frameConfig:n,action:e,browser:t}){let r=t.getActiveFrameConfig();n?t.setActiveFrameConfig(n):r?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(r)}}var Da="MOMENTIC_RUN_ID",Vf="FINAL_SCREENSHOT_URL";import{cloneDeep as BA}from"lodash-es";async function qf(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=Pa(e),a=e.elseSteps,l=!0,c=[],p,d=ca();for(let f=0;f<e.blocks.length;f++){r.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let x=await Fa({...n,presetParams:{tracer:t,step:S.assertion}});c.push(x),r.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,a=S.steps,p=x}catch(x){r.info({err:x},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(a)l&&r.info("No conditions resolved to true, executing the else block steps");else return r.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped"),{...s,status:"SUCCESS",startedAt:i,data:c[c.length-1]?.data,message:c[c.length-1]?.message,results:[],finishedAt:new Date,details:d.details};r.info(`Executing ${a.length} steps in the selected conditional block`);let u=await n.conditionalParams.tracer.startSubSteps(),m=await n.executeStepList({...n,listParams:{steps:a,containerName:"conditional block",tracer:u}}),g={...s,assertion:p,...m,startedAt:i,finishedAt:new Date};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:r}),g}import{randomUUID as Kf}from"crypto";var Yf=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await OA(n);r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=Kf();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=Kf();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},OA=async n=>{let{step:e,tracer:t}=n.aiStepParams,{controller:r,context:o,logger:i}=n.fixtures,s={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new R("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let l=await t.startSubSteps(),{status:c}=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"AI action",results:s.results,tracer:l}});return s.finishedAt=new Date,s.status=c,s}catch(l){i.warn({err:l},"Failed executing saved deprecated AI action steps");let c=r.executeAbortController.signal.aborted;s.message=l instanceof Error?l.message:`${l}`,s.status=c?"CANCELLED":"FAILED"}return s};import{randomUUID as bd}from"crypto";var Jf=15,kA=7,Xf=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await NA(n);r.finishedAt=new Date,Yt({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=bd();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=bd();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},NA=async n=>{let{step:e,tracer:t}=n.aiStepParams,{testMetadata:r,orgId:o}=n.inputs,{controller:i,context:s,logger:a,codeEvalTools:l}=n.fixtures,{step:c}=n.callbacks,p=`${e.id}-${Date.now()}`,d=a.child({stepId:e.id,langfuseSessionId:p}),u={...e,startedAt:new Date,beforeTestContext:s.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await Dt({orgId:o,s:e.text,context:s,logger:d,localTools:l,flagStore:i.flagStore});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,x=0,b,w;for(;;){if(S>Jf)return u.message=`Exceeded the maximum number of commands allowed per AI step (${Jf})`,u.status="FAILED",u;if(i.executeAbortController.signal.aborted)return u.message="Test execution was cancelled",u.status="CANCELLED",u;c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let E=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:p,lastError:w}),{evaluation:C,reasoning:I,summary:N}=E;d.info(E,"Got AI evaluation");let P=u.results[S-1]?.id;switch(C.type){case"DONE":return u.message=`Our AI evaluator confirmed all tasks are complete: ${I}`,u.status="SUCCESS",P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:`${N}
43
43
  ${I}`}),u;case"RIGHT_TRACK":{b=void 0,S===0?c.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:I}):P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:I});break}case"WRONG_TRACK":{if(b=`${I}
44
- ${C.feedback}`,x++,x>=LA)return u.message=`Our AI agent requires additional information to achieve this goal:
44
+ ${C.feedback}`,x++,x>=kA)return u.message=`Our AI agent requires additional information to achieve this goal:
45
45
  ${I}
46
- ${C.feedback}`,u.status="FAILED",c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:u.message}),u;P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return u.message=`Our AI evaluator determined this task cannot be achieved: ${I}`,u.status="FAILED",c.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:u.message}),u}let D=setTimeout(()=>{c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:b},`Generating new sub-command ${S} within AI action`);let W,_;try{({command:W,reasoning:_}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:d,actionHint:b,langfuseSessionId:p})),d.info({command:W,reasoning:_},"Got proposed command")}finally{clearTimeout(D)}if(W.type==="FAILURE")return clearTimeout(D),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${_}`,u;let B={id:yd(),type:"PRESET_ACTION",command:W},L={substepIndex:S+1,message:_||"Generated new command."};c.onDynamicCommandGenerated?.({...L,step:B,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${S} within AI step: ${Nr(W)}`);let j=await t.startSubSteps(),ee=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[B],tracer:j}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let me=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(ee),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${me.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:Nr(W),elementInteracted:ee.results[0]?.elementInteracted,thoughts:_});let tt={substepIndex:S,output:{...ee,message:ee.message??"Successfully executed preset action."},step:B,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(tt),await t.finish({output:Xs.parse(ee),step:ee,message:ee.message}),ee.status==="FAILED")if(u.status="FAILED",u.message=ee.message,x<3)x++,w=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${ee.message}`;else return u;else if(ee.status==="CANCELLED")return u.status="CANCELLED",u.message=ee.message,u;S++}};async function Xf(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=NA(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await kA(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Jf({screenshot:n,controller:e,currentPageState:t,newStep:r,patch:o,logger:i}){if(r.aiSuggested=!0,r.type==="PRESET_ACTION"&&"cache"in r.command&&r.command.cache&&"target"in r.command.cache&&"target"in r.command&&r.command.target?.type==="description")try{let s=r.command.cache.target.id,a=await e.getReverseMappedDescription({browserState:t,targetId:s,disableCache:!1,screenshot:n});r.command.target.elementDescriptor=a}catch(s){i.error({err:s},"Error while reverse mapping target in failure recovery")}r.type==="PRESET_ACTION"&&(r.command.thoughts=o.thoughts)}async function kA(n){let{fixtures:e,work:t,failureRecoveryParams:r}=n,{controller:o,logger:i}=e,{results:s,failedStep:a,nextSteps:l,tracer:c}=r;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let p=o.browser.url(),d=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,u=(await o.browser.getBrowserState({skipWait:!0})).serialize(),{results:m}=await Ea(i,e.debugDataStorage,s,{numScreenshots:3,addIndices:!0}),h=l.map(b=>ln(b)),g=await o.runFailureRecovery({currentUrl:p,currentScreenshot:d,failedResults:m,currentPageState:u,nextStepsSerialized:h});if(g.scenario==="INELIGIBLE"||!g.patch)return null;let f=[];if(g.patch.op==="add"){let b=g.patch.value;if(!b)throw new Error("No value in add patch in failure recovery");await Jf({screenshot:d,controller:o,currentPageState:u,newStep:b,patch:g.patch,logger:i}),f=[b,a]}else if(g.patch.op==="replace"){let b=g.patch.value;if(!b)throw new Error("No value in replace patch in failure recovery");await Jf({screenshot:d,controller:o,currentPageState:u,newStep:b,patch:g.patch,logger:i}),f=[b]}else if(g.patch.op==="remove"&&a.type==="PRESET_ACTION"&&["AI_ASSERTION","PAGE_CHECK"].includes(a.command.type))throw new Error("Cannot modify assertion step in failure recovery");let S=await c.startSubSteps(),x;if(f.length){x=await nr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let b of x.results)b.aiSuggested&&b.type==="PRESET_ACTION"&&(b.message=`AI suggested step: ${b.command.thoughts}`)}else x={status:"SUCCESS",results:[],proposedSteps:[]};return Ma(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,x}function NA(n){if(!n)return"No failed result";if(n.type!=="PRESET_ACTION")return"Not a preset action";let e=n.message;return e?e.includes("AbortError:")?"AbortError":km.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function Zf(n){let{step:e,tracer:t}=n.frameParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let a;try{let p=await t.startSubSteps();a=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"frame step list",tracer:p}})}finally{o.browser.setActiveFrameConfig(s)}let c={...e,...a,startedAt:i,finishedAt:new Date};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:a.results,result:c,logger:r}),c}import{randomUUID as Ua}from"crypto";import _A from"fast-json-patch";import{cloneDeep as MA}from"lodash-es";async function Qf(n){let e=n.failedResults,t=[],{sectionParams:r,fixtures:o,work:i,startingUrl:s,startingContextSnapshot:a,tracer:l}=n,{step:c}=r,{controller:p,logger:d,debugDataStorage:u}=o,m=c?.autohealingConfig,h=m?.restartBehavior??{type:"GO_TO_SECTION_START"},g=m?.attempts??1;for(let f=0;f<g;f++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let S=MA(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:x}=await Ea(d,u,e.results,{numScreenshots:4}),b=await p.runSectionAutohealing({results:x,errorMessage:e.terminalResult?.message,goal:c.description});S=_A.applyPatch(S,b.patches).newDocument;let w=It.fromSnapshot({snapshot:a,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await FA({logger:d,controller:p,tracer:l,context:w,restartConfig:h,startingUrl:s});let E=await nr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures,context:w},listParams:{steps:S,containerName:"auto-healed step list",tracer:l}}));if(t.push(E.results),E.status==="SUCCESS")return{successfulHealing:{proposedStep:{...c,steps:S},listResult:E,context:w},healingAttempts:t};e=E}return{healingAttempts:t}}async function FA({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let s={id:Ua(),type:"PRESET_ACTION",command:{id:Ua(),type:"NAVIGATE",url:r.url}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}case"GO_TO_SECTION_START":{let s={id:Ua(),type:"PRESET_ACTION",command:{id:Ua(),type:"NAVIGATE",url:i}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}}}function eS(n,e){switch(n||(n="ON_FAILURE"),n){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Bu(e.command.type))}}async function tS(n){let{step:e,tracer:t}=n.sectionParams,{logger:r,controller:o,context:i}=n.fixtures,s=new Date,a=o.browser.url(),l=i.toObjectCopy(),c=await t.startSubSteps(),p=async()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:"section step list",tracer:c}}),d=e.autohealingConfig?await nr(n.work,p):await p(),u,m;if(d.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&eS(e.autohealingConfig.trigger,d.terminalResult)){let g=await t.startSubSteps(),f=await Qf({...n,startingContextSnapshot:l,startingUrl:a,failedResults:d,tracer:g});f.successfulHealing&&(u=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,n.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:s,finishedAt:new Date,proposedStep:u,healingAttempts:m};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:d.results,result:h,logger:r}),h}async function Tn(n){let{results:e=[],containerName:t,steps:r,tracer:o}=n.listParams,{logger:i,context:s,controller:a,codeEvalTools:l,billingReporter:c,analytics:p}=n.fixtures,d=o.getParentStepIdChain(),{orgId:u,fromStep:m,toStep:h}=n.inputs,g=n.work,f=[],S="SUCCESS",x,b=0;for(b;b<r.length;b++){let w=r[b],E,C=ln(w);if(w.skipped)continue;if(g.fastForwardingToStep&&m){let ce=JSON.stringify(d);if(w.id===m.fromStepId&&ce===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Eg(w,d,m.fromStepId,m.parentStepIdChain))continue}let I=new Date,N=p.child({step_id:w.id});N.track({type:"execution:step_start",step_type:w.type==="RESOLVED_MODULE"?"MODULE":w.type,command_type:"command"in w?w.command.type:void 0}),i.info({step:w},`Executing step ${b+1}/${r.length} in ${t}: ${C}`);let P=await o.startStep({logger:i,step:w}),D=DA(w),W=s.toRedactedDisplayCopy(),_=a.browser.url(),B=a.executeAbortController.signal,L=Fi(w.type);g.asyncTasks.push(c.reportCreditsUsed(i,w.type,L,{testId:n.inputs.testMetadata?.id,testName:n.inputs.testMetadata?.name,suiteId:n.inputs.suiteMetadata?.id,suiteName:n.inputs.suiteMetadata?.name}));let j,O;switch(w.type){case"PRESET_ACTION":{j="Preset action",O=await rr(w,async()=>await Fa({...n,presetParams:{tracer:P,step:w}}),B),"proposedStep"in O&&O.proposedStep&&(E=O.proposedStep,O.proposedStep=void 0);break}case"AI_ACTION":{j="AI action",O=await rr(w,()=>qf({...n,aiStepParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"AI_ACTION_DYNAMIC":{j="AI action",O=await rr(w,()=>Yf({...n,aiStepParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"RESOLVED_MODULE":{j=`Module (${w.name})`,O=await rr(w,async()=>{let ce=await zf({orgId:u,step:w,context:s,logger:i,flagStore:a.flagStore,codeEvalTools:l,signal:B});return fd({...n,executeStepList:Tn,moduleParams:{step:w,resolvedInputs:ce,tracer:P}})},B);break}case"CONDITIONAL":{j="Conditional step",O=await rr(w,()=>Gf({...n,conditionalParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"IFRAME":{j="Frame step",O=await rr(w,()=>Zf({...n,frameParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"SECTION":{j="Section";let ce=await rr(w,()=>tS({...n,sectionParams:{step:w,tracer:P},executeStepList:Tn}),B);"proposedStep"in ce&&ce.proposedStep&&(E=ce.proposedStep,ce.proposedStep=void 0),O=ce;break}default:return(Se=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(w)}O.beforeUrl=O.beforeUrl??_,O.beforeTestContext=W,w.envKey&&s.setVariable(w.envKey,O.data);let ee=a.browser.url();s.setCurrentUrl(ee),O.afterUrl=O.afterUrl??ee,O.afterTestContext=s.toRedactedDisplayCopy(),e.push(O),await UA({startedAt:I,stepTypeName:j,result:O,callbacks:n.callbacks,analytics:N,globalWorkRef:n.work,tracer:P});let me;if(O.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let ce=await Xf({...n,executeStepList:Tn,failureRecoveryParams:{failedStep:D,nextSteps:r.slice(b+1),results:e,tracer:P}});ce&&ce.status==="SUCCESS"&&(me=ce.proposedSteps,e.push(...ce.results))}if(me?f.push(...me):E?f.push(E):f.push(w),g.fastForwardingToStep&&m&&m.fromStepId===w.id&&JSON.stringify(d)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),O.status!=="SUCCESS"&&!me||a.closed){S=O.status,x=O;break}else if(h&&w.id===h.toStepId&&JSON.stringify(d)===JSON.stringify(h.parentStepIdChain)){a.setClosed();break}}return{status:S,results:e,terminalResult:x,proposedSteps:f}}async function UA({startedAt:n,stepTypeName:e,result:t,analytics:r,tracer:o}){let i=e.toLowerCase(),s=e.charAt(0).toUpperCase()+e.slice(1),a=new Date,l="";switch(t.status){case"SUCCESS":l=t.message??`${s} executed successfully.`,r.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;case"FAILED":l=t.message??`${s} failed.`,r.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime(),fail_reason:t.message??`${s} failed.`});break;case"CANCELLED":l=t.message??`${s} cancelled.`,r.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;default:throw new Error(`Unexpected ${i} status: ${t.status}`)}await o.finish({step:t,message:l,output:Xs.parse(t)})}import{randomUUID as nS}from"crypto";async function rS(n){let e=new Date;try{return await n.navigate({url:n.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(t){let r={id:nS(),type:"PRESET_ACTION",status:t.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:t.message,startedAt:e,finishedAt:new Date,results:[],command:{id:nS(),type:"NAVIGATE",url:n.baseUrl}};return{status:t.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:r}}}var Ba=async n=>{let{orgId:e,runId:t,runAttemptId:r,testMetadata:o,steps:i,beforeSteps:s,afterSteps:a}=n.inputs;n.fixtures.logger=n.fixtures.logger.child({orgId:e,runId:t,runAttemptId:r,testId:o?.id}),n.fixtures.analytics=n.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=n.fixtures,{onTestComplete:p,onTestSuccess:d}=n.callbacks.test;if(n.options.reinitializeBrowser){let h=await rS(c.browser);if(c.executeAbortController.signal.aborted)return h.status="CANCELLED",await p?.(),h;if(h.status==="FAILED")return await p?.(),h}let u;u=Nf(l);let m;try{return l.info(`Starting run for Momentic test '${o?.name??"Unnamed test"}'`),m=await BA(n),m}finally{if(l.info({status:m?.status},"Momentic test final result"),clearInterval(u),await p?.(),m?.status==="PASSED")try{await d?.({steps:i,beforeSteps:s,afterSteps:a})}catch(h){l.warn({err:h},"Error running test success handler, continuing...")}}},BA=async n=>{let{tracer:e}=n.testParams,{runId:t,runAttemptId:r,testMetadata:o,fromStep:i,toStep:s,steps:a,beforeSteps:l,afterSteps:c,orgId:p}=n.inputs,{logger:d,controller:u,context:m,storage:h}=n.fixtures,{collectDebugData:g,disableHealing:f}=n.options;m.setCurrentUrl(u.browser.url());let S="test",x=a,b=[],w=f||i!==void 0||s!==void 0||void 0,E={results:b,state:{failureRecoveryDisabled:w,autoHealingDisabled:w},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===s?.toStepId?(S="filtered step",E.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",E.fastForwardingToStep=!0):s?S="partial steps list until step":(S="entire test",C=!0);let I;if(C&&l&&l.length>0){let{status:L,results:j}=await oS(l,"beforeSteps",n);if(L!=="PASSED")return g&&iS({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:d,status:L}),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:j,results:[]}))),{status:L,beforeResults:j,results:[]}}d.debug({stepsToExecute:x,fromStep:i,toStep:s},`Starting step execution for ${S}`);let N=await e.startStepList(),{status:P,terminalResult:D,proposedSteps:W}=await Tn({...n,work:E,listParams:{steps:x,containerName:S,results:b,tracer:N}}),_;if(C&&c&&c.length>0){d.debug("Starting step execution for after step list");try{let{results:L}=await oS(c,"afterSteps",n);_=L}catch(L){d.error({err:L},"Failed to execute after steps list, continuing...")}}if(g&&iS({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:d,status:P}),await Promise.allSettled(E.asyncTasks),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:b,beforeResults:I,afterResults:_}))),P==="FAILED")return{status:"FAILED",results:b,beforeResults:I,afterResults:_,failedStepResult:D};if(P==="CANCELLED")return{status:"CANCELLED",results:b,beforeResults:I,afterResults:_};let B;if(W&&E.state.healingDetails&&o){let L=Hf(3);await n.callbacks.test.onProposedTestSteps?.({name:L,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:W,details:E.state.healingDetails,purpose:"AUTO_HEALING"}),B={orgId:n.inputs.orgId,name:L}}return{proposedTest:B,status:"PASSED",results:b,beforeResults:I,afterResults:_}};async function oS(n,e,t){let r=t.fixtures.logger,o=await t.testParams.tracer.startStepList();r.debug({stepsToExecute:n},`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0}},s={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0,onProposedTestSteps:void 0}},{status:a,results:l}=await Tn({...t,work:i,callbacks:s,listParams:{steps:n,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let c;return a==="SUCCESS"?c="PASSED":a==="CANCELLED"?c="CANCELLED":c="FAILED",{status:c,results:l}}function iS({tracer:n,debugDataStorage:e,work:t,controller:r,storage:o,logger:i,context:s,runId:a,runAttemptId:l,status:c}){let p=r.browser.retrieveAndClearDebugData(),d=Og(p.logsPerPage),u=Kc(p.harPages||{},p.harEntries||{});n.attachConsoleLogs({logger:i,logs:d}),n.attachNetworkLogs({logger:i,logs:u}),t.asyncTasks.push((async()=>{try{let m=await r.browser.screenshot({}),h=await $f({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await U(r.browser.html(),{milliseconds:2e3});s.setVariable(Wf,h),c!=="PASSED"&&c!=="SUCCESS"&&(i.debug({finalPageHtml:g},"Final page state HTML"),i.debug({finalScreenshotUrl:h},"Uploaded final screenshot URL"))}catch{}})(),l?e.storeConsoleLogsForRunAttempt(i,a,l,d):Promise.resolve(null),l?e.storeNetworkLogsForRunAttempt(i,a,l,u):Promise.resolve(null))}async function za({advanced:n,customHeaders:e,envVariables:t,envName:r,baseUrl:o,logger:i,localTools:s,orgId:a,flagStore:l}){let c=ra.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let p=new It({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await Po({obj:c,context:p,bannedKeys:[],allowList:Um,localTools:s,logger:i,orgId:a,flagStore:l});try{return ra.parse(c)}catch(d){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}import{cloneDeep as tL}from"lodash-es";var bd={vimiumJs:'var K=Object.defineProperty;var P=Object.getOwnPropertySymbols;var z=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var F=(t,e,n)=>e in t?K(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,D=(t,e)=>{for(var n in e||(e={}))z.call(e,n)&&F(t,n,e[n]);if(P)for(var n of P(e))B.call(e,n)&&F(t,n,e[n]);return t};var g=(t,e,n)=>(F(t,typeof e!="symbol"?e+"":e,n),n);var _=(t,e,n)=>new Promise((o,r)=>{var i=s=>{try{d(n.next(s))}catch(l){r(l)}},a=s=>{try{d(n.throw(s))}catch(l){r(l)}},d=s=>s.done?o(s.value):Promise.resolve(s.value).then(i,a);d((n=n.apply(t,e)).next())});var E=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=E);var k={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?[k.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 N={_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=E(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=E(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(k.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),a=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>a,a};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let a of Array.from(t.children)){i=window.getComputedStyle(a,null);let d=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(d)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(a,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=k.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,a,d,s=o.coords.split(",").map(p=>parseInt(p,10)),l=o.shape.toLowerCase();if(["rect","rectangle"].includes(l))s.length==4&&([r,a,i,d]=s);else if(["circle","circ"].includes(l)){if(s.length==3){let[p,w,v]=s,u=v/Math.sqrt(2);r=p-u,i=p+u,a=w-u,d=w+u}}else l==="default"?s.length==2&&([r,a,i,d]=[0,0,t.width,t.height]):s.length>=4&&([r,a,i,d]=s);let c=k.translate(k.create(r,a,i,d),t.left,t.top);c=this.cropRectToVisible(c),c&&!isNaN(c.top)&&!isNaN(c.left)&&!isNaN(c.width)&&!isNaN(c.height)&&n.push({element:o,rect:c})}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(e){}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:a}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&a===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return N.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||(n!=null?n.parentNode:void 0),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 O={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){var r,i;let e={};this.addAttributes(t,this.commonAttributes,e);let n=((i=(r=t.tagName).toLowerCase)==null?void 0:i.call(r))||"";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,D({tag:n,attributes:e},o&&{content:o}))},getContent(t){var n,o;let e=((o=(n=t.tagName).toLowerCase)==null?void 0:o.call(n))||"";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){var o,r;if((((r=(o=t.tagName).toLowerCase)==null?void 0:r.call(o))||"")=="label"&&t.hasAttribute("for")){let i=t.getAttribute("for"),a=document.getElementById(i);a&&(e.target=this.describe(a))}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 x=null,C=()=>G()||document.scrollingElement||document.body,W=function(t){return t?t<0?-1:1:0},U={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},X=function(t,e,n){if(N.isString(n)){let o=n;return o==="viewSize"&&t===C()?e==="x"?window.innerWidth:window.innerHeight:t[U[e][o]]}else return n},V=function(t,e,n){let o=U[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},q=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},T=function(t,e,n,o){let r=o*X(t,e,n)||-1;return r=W(r),V(t,e,r)&&V(t,e,-r)},$=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),T(t,e,n,o)&&q(t,e)},j=function(t=null){let e;if(!t){let n=C();if(T(n,"y",1,1)||T(n,"y",-1,1))return n;t=document.body||C()}if(T(t,"y",1,1)||T(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=j(e.element);if(o)return o}return null}},L={init(){x=null},isScrollableElement(t){return x||(x=C()&&j()||C()),t!==x&&$(t)}},G=function(){let t=J[window.location.host];if(t)return document.querySelector(t)},J={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=L;var A=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",E(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",E(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:A});var R=class{constructor(e){g(this,"element");g(this,"image");g(this,"rect");g(this,"linkText");g(this,"showLinkText");g(this,"reason");g(this,"secondClassCitizen");g(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},M={getLocalHintsForElement(t){var p,w,v;let e=((w=(p=t.tagName).toLowerCase)==null?void 0:w.call(p))||"",n=!1,o=!1,r=!1,i=[],a=[],d=null;if(e==="img"){let u=t.getAttribute("usemap");if(u){let h=t.getClientRects();u=u.replace(/^#/,"").replace(\'"\',\'\\\\"\');let m=document.querySelector(`map[name="${u}"]`);if(m&&h.length>0){n=!0;let y=m.getElementsByTagName("area"),S=f.getClientRectsForAreas(h[0],y);S=S.map(I=>Object.assign(I,{image:t})),a.push(...S)}}}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 h=[];for(let m of["","data-","x-"])for(let y of["-",":","_"])h.push(`${m}ng${y}click`);return function(m){for(let y of h)if(m.hasAttribute(y))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let u=t.getAttribute("role"),h=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(u!=null&&h.includes(u.toLowerCase()))n=!0;else{let m=t.getAttribute("contentEditable");m!=null&&["","contenteditable","true","plaintext-only"].includes(m.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let u=t.getAttribute("jsaction").split(";");for(let h of u){let m=h.trim().split(":");if(m.length>=1&&m.length<=2){let[y,S,I]=m.length===1?["click",...m[0].trim().split("."),"_"]:[m[0],...m[1].trim().split("."),"_"];n||(n=y==="click"&&S!=="none"&&I!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||(n=!t.disabled&&!t.readOnly);break;case"input":n||(n=!(((v=t.getAttribute("type"))==null?void 0:v.toLowerCase())=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t)));break;case"button":case"select":n||(n=!t.disabled);break;case"object":case"embed":n=!0;break;case"label":n||(n=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0);break;case"body":n||(n=t===document.body&&!A()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?d="Frame.":void 0),n||(n=t===document.body&&A()&&L.isScrollableElement(t)?d="Scroll.":void 0);break;case"img":n||(n=["zoom-in","zoom-out"].includes(t.style.cursor));break;case"div":case"ol":case"ul":n||(n=t.clientHeight<t.scrollHeight&&L.isScrollableElement(t)?d="Scroll.":void 0);break;case"details":n=!0,d="Open.";break}let l=t.getAttribute("class");!n&&(l!=null&&l.toLowerCase().includes("button"))&&(n=!0,r=!0);let c=t.getAttribute("tabindex"),b=c?parseInt(c):-1;if(!n&&!(b<0)&&!isNaN(b)&&(n=!0,o=!0),n)if(a.length>0){let u=a.map(h=>new R({element:h.element,image:t,rect:h.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:d}));i.push(...u)}else{let u=f.getVisibleClientRect(t,!0);if(u!==null){let h=new R({element:t,rect:u,secondClassCitizen:o,possibleFalsePositive:r,reason:d});i.push(h)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?M.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,l)=>{l==null&&(l=[]);for(let c of Array.from(s.querySelectorAll("*")))l.push(c),c.shadowRoot&&e(c.shadowRoot,l);return l},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let l=this.getLocalHintsForElement(s);o.push(...l)}o=o.reverse();let r=[1,2,3];o=o.filter((s,l)=>{if(!s.possibleFalsePositive)return!0;let b=Math.max(0,l-6);for(;b<l;){let p=o[b].element;for(let w of r)if(p=p==null?void 0:p.parentElement,p===s.element)return!1;b+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let l=s.rect,c=M.getElementFromPoint(l.left+l.width*.5,l.top+l.height*.5);if(c&&(s.element.contains(c)||c.contains(s.element))||s.element.localName=="area"&&c==s.image)return!0;let p=[l.top+.1,l.bottom-.1],w=[l.left+.1,l.right-.1];for(let v of p)for(let u of w){let h=M.getElementFromPoint(u,v);if(h&&(s.element.contains(h)||h.contains(s.element)))return!0}});i.reverse();let{top:a,left:d}=f.getViewportTopLeft();for(let s of i)s.rect.top+=a,s.rect.left+=d;return i}};var H=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}capture(){return _(this,null,function*(){this.reset(),this.createMarkers(),this.displayMarkers()})}createMarkers(){this.hints=M.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{var i,a;let o=f.createElement("div"),r=(a=(i=e.element.attributes["data-momentic-id"])==null?void 0:i.value)!=null?a:void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",Z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(O.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},Z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=H;\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:`var __defProp = Object.defineProperty;
46
+ ${C.feedback}`,u.status="FAILED",c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:u.message}),u;P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return u.message=`Our AI evaluator determined this task cannot be achieved: ${I}`,u.status="FAILED",c.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:u.message}),u}let D=setTimeout(()=>{c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:b},`Generating new sub-command ${S} within AI action`);let W,_;try{({command:W,reasoning:_}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:d,actionHint:b,langfuseSessionId:p})),d.info({command:W,reasoning:_},"Got proposed command")}finally{clearTimeout(D)}if(W.type==="FAILURE")return clearTimeout(D),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${_}`,u;let B={id:bd(),type:"PRESET_ACTION",command:W},L={substepIndex:S+1,message:_||"Generated new command."};c.onDynamicCommandGenerated?.({...L,step:B,parentStepId:e.id}),d.info({commandId:W.id},`Executing sub-command ${S} within AI step: ${Nr(W)}`);let j=await t.startSubSteps(),ee=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[B],tracer:j}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let me=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(ee),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${me.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:Nr(W),elementInteracted:ee.results[0]?.elementInteracted,thoughts:_});let tt={substepIndex:S,output:{...ee,message:ee.message??"Successfully executed preset action."},step:B,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(tt),await t.finish({output:Zs.parse(ee),step:ee,message:ee.message}),ee.status==="FAILED")if(u.status="FAILED",u.message=ee.message,x<3)x++,w=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${ee.message}`;else return u;else if(ee.status==="CANCELLED")return u.status="CANCELLED",u.message=ee.message,u;S++}};async function Qf(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=MA(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await _A(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Zf({screenshot:n,controller:e,currentPageState:t,newStep:r,patch:o,logger:i}){if(r.aiSuggested=!0,r.type==="PRESET_ACTION"&&"cache"in r.command&&r.command.cache&&"target"in r.command.cache&&"target"in r.command&&r.command.target?.type==="description")try{let s=r.command.cache.target.id,a=await e.getReverseMappedDescription({browserState:t,targetId:s,disableCache:!1,screenshot:n});r.command.target.elementDescriptor=a}catch(s){i.error({err:s},"Error while reverse mapping target in failure recovery")}r.type==="PRESET_ACTION"&&(r.command.thoughts=o.thoughts)}async function _A(n){let{fixtures:e,work:t,failureRecoveryParams:r}=n,{controller:o,logger:i}=e,{results:s,failedStep:a,nextSteps:l,tracer:c}=r;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let p=o.browser.url(),d=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,u=(await o.browser.getBrowserState({skipWait:!0})).serialize(),{results:m}=await Ea(i,e.debugDataStorage,s,{numScreenshots:3,addIndices:!0}),h=l.map(b=>ln(b)),g=await o.runFailureRecovery({currentUrl:p,currentScreenshot:d,failedResults:m,currentPageState:u,nextStepsSerialized:h});if(g.scenario==="INELIGIBLE"||!g.patch)return null;let f=[];if(g.patch.op==="add"){let b=g.patch.value;if(!b)throw new Error("No value in add patch in failure recovery");await Zf({screenshot:d,controller:o,currentPageState:u,newStep:b,patch:g.patch,logger:i}),f=[b,a]}else if(g.patch.op==="replace"){let b=g.patch.value;if(!b)throw new Error("No value in replace patch in failure recovery");await Zf({screenshot:d,controller:o,currentPageState:u,newStep:b,patch:g.patch,logger:i}),f=[b]}else if(g.patch.op==="remove"&&a.type==="PRESET_ACTION"&&["AI_ASSERTION","PAGE_CHECK"].includes(a.command.type))throw new Error("Cannot modify assertion step in failure recovery");let S=await c.startSubSteps(),x;if(f.length){x=await nr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let b of x.results)b.aiSuggested&&b.type==="PRESET_ACTION"&&(b.message=`AI suggested step: ${b.command.thoughts}`)}else x={status:"SUCCESS",results:[],proposedSteps:[]};return Ma(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,x}function MA(n){if(!n)return"No failed result";if(n.type!=="PRESET_ACTION")return"Not a preset action";let e=n.message;return e?e.includes("AbortError:")?"AbortError":_m.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function eS(n){let{step:e,tracer:t}=n.frameParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let a;try{let p=await t.startSubSteps();a=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"frame step list",tracer:p}})}finally{o.browser.setActiveFrameConfig(s)}let c={...e,...a,startedAt:i,finishedAt:new Date};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:a.results,result:c,logger:r}),c}import{randomUUID as Ua}from"crypto";import FA from"fast-json-patch";import{cloneDeep as DA}from"lodash-es";async function tS(n){let e=n.failedResults,t=[],{sectionParams:r,fixtures:o,work:i,startingUrl:s,startingContextSnapshot:a,tracer:l}=n,{step:c}=r,{controller:p,logger:d,debugDataStorage:u}=o,m=c?.autohealingConfig,h=m?.restartBehavior??{type:"GO_TO_SECTION_START"},g=m?.attempts??1;for(let f=0;f<g;f++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let S=DA(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:x}=await Ea(d,u,e.results,{numScreenshots:4}),b=await p.runSectionAutohealing({results:x,errorMessage:e.terminalResult?.message,goal:c.description});S=FA.applyPatch(S,b.patches).newDocument;let w=It.fromSnapshot({snapshot:a,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await UA({logger:d,controller:p,tracer:l,context:w,restartConfig:h,startingUrl:s});let E=await nr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures,context:w},listParams:{steps:S,containerName:"auto-healed step list",tracer:l}}));if(t.push(E.results),E.status==="SUCCESS")return{successfulHealing:{proposedStep:{...c,steps:S},listResult:E,context:w},healingAttempts:t};e=E}return{healingAttempts:t}}async function UA({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let s={id:Ua(),type:"PRESET_ACTION",command:{id:Ua(),type:"NAVIGATE",url:r.url}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}case"GO_TO_SECTION_START":{let s={id:Ua(),type:"PRESET_ACTION",command:{id:Ua(),type:"NAVIGATE",url:i}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}}}function nS(n,e){switch(n||(n="ON_FAILURE"),n){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&ju(e.command.type))}}async function rS(n){let{step:e,tracer:t}=n.sectionParams,{logger:r,controller:o,context:i}=n.fixtures,s=new Date,a=o.browser.url(),l=i.toObjectCopy(),c=await t.startSubSteps(),p=async()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:"section step list",tracer:c}}),d=e.autohealingConfig?await nr(n.work,p):await p(),u,m;if(d.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&nS(e.autohealingConfig.trigger,d.terminalResult)){let g=await t.startSubSteps(),f=await tS({...n,startingContextSnapshot:l,startingUrl:a,failedResults:d,tracer:g});f.successfulHealing&&(u=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,n.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:s,finishedAt:new Date,proposedStep:u,healingAttempts:m};return Yt({asyncTasks:n.work.asyncTasks,nestedResults:d.results,result:h,logger:r}),h}async function Tn(n){let{results:e=[],containerName:t,steps:r,tracer:o}=n.listParams,{logger:i,context:s,controller:a,codeEvalTools:l,billingReporter:c,analytics:p}=n.fixtures,d=o.getParentStepIdChain(),{orgId:u,fromStep:m,toStep:h}=n.inputs,g=n.work,f=[],S="SUCCESS",x,b=0;for(b;b<r.length;b++){let w=r[b],E,C=ln(w);if(w.skipped)continue;if(g.fastForwardingToStep&&m){let ce=JSON.stringify(d);if(w.id===m.fromStepId&&ce===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Rg(w,d,m.fromStepId,m.parentStepIdChain))continue}let I=new Date,N=p.child({step_id:w.id});N.track({type:"execution:step_start",step_type:w.type==="RESOLVED_MODULE"?"MODULE":w.type,command_type:"command"in w?w.command.type:void 0}),i.info({step:w},`Executing step ${b+1}/${r.length} in ${t}: ${C}`);let P=await o.startStep({logger:i,step:w}),D=BA(w),W=s.toRedactedDisplayCopy(),_=a.browser.url(),B=a.executeAbortController.signal,L=Fi(w.type);g.asyncTasks.push(c.reportCreditsUsed(i,w.type,L,{testId:n.inputs.testMetadata?.id,testName:n.inputs.testMetadata?.name,suiteId:n.inputs.suiteMetadata?.id,suiteName:n.inputs.suiteMetadata?.name}));let j,O;switch(w.type){case"PRESET_ACTION":{j="Preset action",O=await rr(w,async()=>await Fa({...n,presetParams:{tracer:P,step:w}}),B),"proposedStep"in O&&O.proposedStep&&(E=O.proposedStep,O.proposedStep=void 0);break}case"AI_ACTION":{j="AI action",O=await rr(w,()=>Yf({...n,aiStepParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"AI_ACTION_DYNAMIC":{j="AI action",O=await rr(w,()=>Xf({...n,aiStepParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"RESOLVED_MODULE":{j=`Module (${w.name})`,O=await rr(w,async()=>{let ce=await Hf({orgId:u,step:w,context:s,logger:i,flagStore:a.flagStore,codeEvalTools:l,signal:B});return Sd({...n,executeStepList:Tn,moduleParams:{step:w,resolvedInputs:ce,tracer:P}})},B);break}case"CONDITIONAL":{j="Conditional step",O=await rr(w,()=>qf({...n,conditionalParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"IFRAME":{j="Frame step",O=await rr(w,()=>eS({...n,frameParams:{step:w,tracer:P},executeStepList:Tn}),B);break}case"SECTION":{j="Section";let ce=await rr(w,()=>rS({...n,sectionParams:{step:w,tracer:P},executeStepList:Tn}),B);"proposedStep"in ce&&ce.proposedStep&&(E=ce.proposedStep,ce.proposedStep=void 0),O=ce;break}default:return(Se=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(w)}O.beforeUrl=O.beforeUrl??_,O.beforeTestContext=W,w.envKey&&s.setVariable(w.envKey,O.data);let ee=a.browser.url();s.setCurrentUrl(ee),O.afterUrl=O.afterUrl??ee,O.afterTestContext=s.toRedactedDisplayCopy(),e.push(O),await zA({startedAt:I,stepTypeName:j,result:O,callbacks:n.callbacks,analytics:N,globalWorkRef:n.work,tracer:P});let me;if(O.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let ce=await Qf({...n,executeStepList:Tn,failureRecoveryParams:{failedStep:D,nextSteps:r.slice(b+1),results:e,tracer:P}});ce&&ce.status==="SUCCESS"&&(me=ce.proposedSteps,e.push(...ce.results))}if(me?f.push(...me):E?f.push(E):f.push(w),g.fastForwardingToStep&&m&&m.fromStepId===w.id&&JSON.stringify(d)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),O.status!=="SUCCESS"&&!me||a.closed){S=O.status,x=O;break}else if(h&&w.id===h.toStepId&&JSON.stringify(d)===JSON.stringify(h.parentStepIdChain)){a.setClosed();break}}return{status:S,results:e,terminalResult:x,proposedSteps:f}}async function zA({startedAt:n,stepTypeName:e,result:t,analytics:r,tracer:o}){let i=e.toLowerCase(),s=e.charAt(0).toUpperCase()+e.slice(1),a=new Date,l="";switch(t.status){case"SUCCESS":l=t.message??`${s} executed successfully.`,r.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;case"FAILED":l=t.message??`${s} failed.`,r.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime(),fail_reason:t.message??`${s} failed.`});break;case"CANCELLED":l=t.message??`${s} cancelled.`,r.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;default:throw new Error(`Unexpected ${i} status: ${t.status}`)}await o.finish({step:t,message:l,output:Zs.parse(t)})}import{randomUUID as oS}from"crypto";async function iS(n){let e=new Date;try{return await n.navigate({url:n.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(t){let r={id:oS(),type:"PRESET_ACTION",status:t.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:t.message,startedAt:e,finishedAt:new Date,results:[],command:{id:oS(),type:"NAVIGATE",url:n.baseUrl}};return{status:t.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:r}}}var Ba=async n=>{let{orgId:e,runId:t,runAttemptId:r,testMetadata:o,steps:i,beforeSteps:s,afterSteps:a}=n.inputs;n.fixtures.logger=n.fixtures.logger.child({orgId:e,runId:t,runAttemptId:r,testId:o?.id}),n.fixtures.analytics=n.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=n.fixtures,{onTestComplete:p,onTestSuccess:d}=n.callbacks.test;if(n.options.reinitializeBrowser){let h=await iS(c.browser);if(c.executeAbortController.signal.aborted)return h.status="CANCELLED",await p?.(),h;if(h.status==="FAILED")return await p?.(),h}let u;u=Mf(l);let m;try{return l.info(`Starting run for Momentic test '${o?.name??"Unnamed test"}'`),m=await jA(n),m}finally{if(l.info({status:m?.status},"Momentic test final result"),clearInterval(u),await p?.(),m?.status==="PASSED")try{await d?.({steps:i,beforeSteps:s,afterSteps:a})}catch(h){l.warn({err:h},"Error running test success handler, continuing...")}}},jA=async n=>{let{tracer:e}=n.testParams,{runId:t,runAttemptId:r,testMetadata:o,fromStep:i,toStep:s,steps:a,beforeSteps:l,afterSteps:c,orgId:p}=n.inputs,{logger:d,controller:u,context:m,storage:h}=n.fixtures,{collectDebugData:g,disableHealing:f}=n.options;m.setCurrentUrl(u.browser.url());let S="test",x=a,b=[],w=f||i!==void 0||s!==void 0||void 0,E={results:b,state:{failureRecoveryDisabled:w,autoHealingDisabled:w},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===s?.toStepId?(S="filtered step",E.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",E.fastForwardingToStep=!0):s?S="partial steps list until step":(S="entire test",C=!0);let I;if(C&&l&&l.length>0){let{status:L,results:j}=await sS(l,"beforeSteps",n);if(L!=="PASSED")return g&&aS({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:d,status:L}),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:j,results:[]}))),{status:L,beforeResults:j,results:[]}}d.debug({stepsToExecute:x,fromStep:i,toStep:s},`Starting step execution for ${S}`);let N=await e.startStepList(),{status:P,terminalResult:D,proposedSteps:W}=await Tn({...n,work:E,listParams:{steps:x,containerName:S,results:b,tracer:N}}),_;if(C&&c&&c.length>0){d.debug("Starting step execution for after step list");try{let{results:L}=await sS(c,"afterSteps",n);_=L}catch(L){d.error({err:L},"Failed to execute after steps list, continuing...")}}if(g&&aS({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:d,status:P}),await Promise.allSettled(E.asyncTasks),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:b,beforeResults:I,afterResults:_}))),P==="FAILED")return{status:"FAILED",results:b,beforeResults:I,afterResults:_,failedStepResult:D};if(P==="CANCELLED")return{status:"CANCELLED",results:b,beforeResults:I,afterResults:_};let B;if(W&&E.state.healingDetails&&o){let L=Wf(3);await n.callbacks.test.onProposedTestSteps?.({name:L,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:W,details:E.state.healingDetails,purpose:"AUTO_HEALING"}),B={orgId:n.inputs.orgId,name:L}}return{proposedTest:B,status:"PASSED",results:b,beforeResults:I,afterResults:_}};async function sS(n,e,t){let r=t.fixtures.logger,o=await t.testParams.tracer.startStepList();r.debug({stepsToExecute:n},`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0}},s={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0,onProposedTestSteps:void 0}},{status:a,results:l}=await Tn({...t,work:i,callbacks:s,listParams:{steps:n,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let c;return a==="SUCCESS"?c="PASSED":a==="CANCELLED"?c="CANCELLED":c="FAILED",{status:c,results:l}}function aS({tracer:n,debugDataStorage:e,work:t,controller:r,storage:o,logger:i,context:s,runId:a,runAttemptId:l,status:c}){let p=r.browser.retrieveAndClearDebugData(),d=Ng(p.logsPerPage),u=Kc(p.harPages||{},p.harEntries||{});n.attachConsoleLogs({logger:i,logs:d}),n.attachNetworkLogs({logger:i,logs:u}),t.asyncTasks.push((async()=>{try{let m=await r.browser.screenshot({}),h=await Gf({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await U(r.browser.html(),{milliseconds:2e3});s.setVariable(Vf,h),c!=="PASSED"&&c!=="SUCCESS"&&(i.debug({finalPageHtml:g},"Final page state HTML"),i.debug({finalScreenshotUrl:h},"Uploaded final screenshot URL"))}catch{}})(),l?e.storeConsoleLogsForRunAttempt(i,a,l,d):Promise.resolve(null),l?e.storeNetworkLogsForRunAttempt(i,a,l,u):Promise.resolve(null))}async function za({advanced:n,customHeaders:e,envVariables:t,envName:r,baseUrl:o,logger:i,localTools:s,orgId:a,flagStore:l}){let c=oa.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let p=new It({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await Po({obj:c,context:p,bannedKeys:[],allowList:zm,localTools:s,logger:i,orgId:a,flagStore:l});try{return oa.parse(c)}catch(d){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}import{cloneDeep as iL}from"lodash-es";var wd={vimiumJs:'var K=Object.defineProperty;var P=Object.getOwnPropertySymbols;var z=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var F=(t,e,n)=>e in t?K(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,D=(t,e)=>{for(var n in e||(e={}))z.call(e,n)&&F(t,n,e[n]);if(P)for(var n of P(e))B.call(e,n)&&F(t,n,e[n]);return t};var g=(t,e,n)=>(F(t,typeof e!="symbol"?e+"":e,n),n);var _=(t,e,n)=>new Promise((o,r)=>{var i=s=>{try{d(n.next(s))}catch(l){r(l)}},a=s=>{try{d(n.throw(s))}catch(l){r(l)}},d=s=>s.done?o(s.value):Promise.resolve(s.value).then(i,a);d((n=n.apply(t,e)).next())});var E=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=E);var k={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?[k.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 N={_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=E(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=E(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(k.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),a=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>a,a};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let a of Array.from(t.children)){i=window.getComputedStyle(a,null);let d=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(d)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(a,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=k.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,a,d,s=o.coords.split(",").map(p=>parseInt(p,10)),l=o.shape.toLowerCase();if(["rect","rectangle"].includes(l))s.length==4&&([r,a,i,d]=s);else if(["circle","circ"].includes(l)){if(s.length==3){let[p,w,v]=s,u=v/Math.sqrt(2);r=p-u,i=p+u,a=w-u,d=w+u}}else l==="default"?s.length==2&&([r,a,i,d]=[0,0,t.width,t.height]):s.length>=4&&([r,a,i,d]=s);let c=k.translate(k.create(r,a,i,d),t.left,t.top);c=this.cropRectToVisible(c),c&&!isNaN(c.top)&&!isNaN(c.left)&&!isNaN(c.width)&&!isNaN(c.height)&&n.push({element:o,rect:c})}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(e){}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:a}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&a===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return N.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||(n!=null?n.parentNode:void 0),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 O={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){var r,i;let e={};this.addAttributes(t,this.commonAttributes,e);let n=((i=(r=t.tagName).toLowerCase)==null?void 0:i.call(r))||"";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,D({tag:n,attributes:e},o&&{content:o}))},getContent(t){var n,o;let e=((o=(n=t.tagName).toLowerCase)==null?void 0:o.call(n))||"";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){var o,r;if((((r=(o=t.tagName).toLowerCase)==null?void 0:r.call(o))||"")=="label"&&t.hasAttribute("for")){let i=t.getAttribute("for"),a=document.getElementById(i);a&&(e.target=this.describe(a))}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 x=null,C=()=>G()||document.scrollingElement||document.body,W=function(t){return t?t<0?-1:1:0},U={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},X=function(t,e,n){if(N.isString(n)){let o=n;return o==="viewSize"&&t===C()?e==="x"?window.innerWidth:window.innerHeight:t[U[e][o]]}else return n},V=function(t,e,n){let o=U[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},q=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},T=function(t,e,n,o){let r=o*X(t,e,n)||-1;return r=W(r),V(t,e,r)&&V(t,e,-r)},$=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),T(t,e,n,o)&&q(t,e)},j=function(t=null){let e;if(!t){let n=C();if(T(n,"y",1,1)||T(n,"y",-1,1))return n;t=document.body||C()}if(T(t,"y",1,1)||T(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=j(e.element);if(o)return o}return null}},L={init(){x=null},isScrollableElement(t){return x||(x=C()&&j()||C()),t!==x&&$(t)}},G=function(){let t=J[window.location.host];if(t)return document.querySelector(t)},J={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=L;var A=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",E(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",E(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:A});var R=class{constructor(e){g(this,"element");g(this,"image");g(this,"rect");g(this,"linkText");g(this,"showLinkText");g(this,"reason");g(this,"secondClassCitizen");g(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},M={getLocalHintsForElement(t){var p,w,v;let e=((w=(p=t.tagName).toLowerCase)==null?void 0:w.call(p))||"",n=!1,o=!1,r=!1,i=[],a=[],d=null;if(e==="img"){let u=t.getAttribute("usemap");if(u){let h=t.getClientRects();u=u.replace(/^#/,"").replace(\'"\',\'\\\\"\');let m=document.querySelector(`map[name="${u}"]`);if(m&&h.length>0){n=!0;let y=m.getElementsByTagName("area"),S=f.getClientRectsForAreas(h[0],y);S=S.map(I=>Object.assign(I,{image:t})),a.push(...S)}}}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 h=[];for(let m of["","data-","x-"])for(let y of["-",":","_"])h.push(`${m}ng${y}click`);return function(m){for(let y of h)if(m.hasAttribute(y))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let u=t.getAttribute("role"),h=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(u!=null&&h.includes(u.toLowerCase()))n=!0;else{let m=t.getAttribute("contentEditable");m!=null&&["","contenteditable","true","plaintext-only"].includes(m.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let u=t.getAttribute("jsaction").split(";");for(let h of u){let m=h.trim().split(":");if(m.length>=1&&m.length<=2){let[y,S,I]=m.length===1?["click",...m[0].trim().split("."),"_"]:[m[0],...m[1].trim().split("."),"_"];n||(n=y==="click"&&S!=="none"&&I!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||(n=!t.disabled&&!t.readOnly);break;case"input":n||(n=!(((v=t.getAttribute("type"))==null?void 0:v.toLowerCase())=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t)));break;case"button":case"select":n||(n=!t.disabled);break;case"object":case"embed":n=!0;break;case"label":n||(n=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0);break;case"body":n||(n=t===document.body&&!A()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?d="Frame.":void 0),n||(n=t===document.body&&A()&&L.isScrollableElement(t)?d="Scroll.":void 0);break;case"img":n||(n=["zoom-in","zoom-out"].includes(t.style.cursor));break;case"div":case"ol":case"ul":n||(n=t.clientHeight<t.scrollHeight&&L.isScrollableElement(t)?d="Scroll.":void 0);break;case"details":n=!0,d="Open.";break}let l=t.getAttribute("class");!n&&(l!=null&&l.toLowerCase().includes("button"))&&(n=!0,r=!0);let c=t.getAttribute("tabindex"),b=c?parseInt(c):-1;if(!n&&!(b<0)&&!isNaN(b)&&(n=!0,o=!0),n)if(a.length>0){let u=a.map(h=>new R({element:h.element,image:t,rect:h.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:d}));i.push(...u)}else{let u=f.getVisibleClientRect(t,!0);if(u!==null){let h=new R({element:t,rect:u,secondClassCitizen:o,possibleFalsePositive:r,reason:d});i.push(h)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?M.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,l)=>{l==null&&(l=[]);for(let c of Array.from(s.querySelectorAll("*")))l.push(c),c.shadowRoot&&e(c.shadowRoot,l);return l},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let l=this.getLocalHintsForElement(s);o.push(...l)}o=o.reverse();let r=[1,2,3];o=o.filter((s,l)=>{if(!s.possibleFalsePositive)return!0;let b=Math.max(0,l-6);for(;b<l;){let p=o[b].element;for(let w of r)if(p=p==null?void 0:p.parentElement,p===s.element)return!1;b+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let l=s.rect,c=M.getElementFromPoint(l.left+l.width*.5,l.top+l.height*.5);if(c&&(s.element.contains(c)||c.contains(s.element))||s.element.localName=="area"&&c==s.image)return!0;let p=[l.top+.1,l.bottom-.1],w=[l.left+.1,l.right-.1];for(let v of p)for(let u of w){let h=M.getElementFromPoint(u,v);if(h&&(s.element.contains(h)||h.contains(s.element)))return!0}});i.reverse();let{top:a,left:d}=f.getViewportTopLeft();for(let s of i)s.rect.top+=a,s.rect.left+=d;return i}};var H=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}capture(){return _(this,null,function*(){this.reset(),this.createMarkers(),this.displayMarkers()})}createMarkers(){this.hints=M.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{var i,a;let o=f.createElement("div"),r=(a=(i=e.element.attributes["data-momentic-id"])==null?void 0:i.value)!=null?a:void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",Z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(O.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},Z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=H;\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:`var __defProp = Object.defineProperty;
47
47
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
48
48
  var __hasOwnProp = Object.prototype.hasOwnProperty;
49
49
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -440,17 +440,22 @@ function addEvaluateCssSelectorsScript() {
440
440
  return { logs };
441
441
  }
442
442
  const serializedCandidate = customWindow.serializeElementOnlyWithText(bestElement);
443
- const serializedCandidateOld = customWindow.serializeElementOnlyWithText(
444
- bestElement,
445
- {
446
- removeStateAttributes: false,
447
- removeAutoGeneratedId: false,
448
- removeDataImageSrc: false
449
- }
450
- );
451
443
  const ratioThreshold = ldistThreshold;
452
- const lRatioNew = customWindow.ldist(serializedCandidate, serializedNodeWithText) / Math.min(serializedCandidate.length, serializedNodeWithText.length);
453
- const lRatioOld = customWindow.ldist(serializedCandidateOld, serializedNodeWithText) / Math.min(serializedCandidateOld.length, serializedNodeWithText.length);
444
+ const lRatio = customWindow.ldist(serializedCandidate, serializedNodeWithText) / Math.min(serializedCandidate.length, serializedNodeWithText.length);
445
+ const serializedNodeWithTextWithoutClass = serializedNodeWithText.replace(
446
+ /class="[^>]+"/g,
447
+ ""
448
+ );
449
+ const serializedCandidateWithoutClass = customWindow.serializeElementOnlyWithText(bestElement, {
450
+ removeClassName: true
451
+ });
452
+ const lRatioWithoutClass = customWindow.ldist(
453
+ serializedCandidateWithoutClass,
454
+ serializedNodeWithTextWithoutClass
455
+ ) / Math.min(
456
+ serializedCandidateWithoutClass.length,
457
+ serializedNodeWithTextWithoutClass.length
458
+ );
454
459
  logs.push(
455
460
  \`Evaluating best candidate (\${bestElementSelectors.length} matches):
456
461
 
@@ -458,9 +463,9 @@ function addEvaluateCssSelectorsScript() {
458
463
 
459
464
  Candidate: \${serializedCandidate.slice(0, 150)}
460
465
 
461
- Candidate (old serialization): \${serializedCandidateOld.slice(0, 150)}\`
466
+ Candidate (without class): \${serializedCandidateWithoutClass.slice(0, 150)}\`
462
467
  );
463
- const finalLDistRatio = Math.min(lRatioNew, lRatioOld);
468
+ const finalLDistRatio = Math.min(lRatio, lRatioWithoutClass);
464
469
  if (finalLDistRatio > ratioThreshold) {
465
470
  logs.push(
466
471
  \`Best candidate has failing l-dist ratio of \${finalLDistRatio}\`
@@ -880,6 +885,30 @@ function addFindElementInBodyOrShadowDomScript() {
880
885
  }
881
886
 
882
887
  // src/html/utils.ts
888
+ var _momenticGlobalConsonantSet = /* @__PURE__ */ new Set([
889
+ "b",
890
+ "c",
891
+ "d",
892
+ "f",
893
+ "g",
894
+ "h",
895
+ "j",
896
+ "k",
897
+ "l",
898
+ "m",
899
+ "n",
900
+ "p",
901
+ "q",
902
+ "r",
903
+ "s",
904
+ "t",
905
+ "v",
906
+ "w",
907
+ "x",
908
+ "y",
909
+ "z"
910
+ ]);
911
+ var _momenticGlobalVowelSet = /* @__PURE__ */ new Set(["a", "e", "i", "o", "u", "y"]);
883
912
  function checkIsNameAutogenerated(text) {
884
913
  var _a, _b, _c, _d, _e, _f, _g, _h;
885
914
  if (text.length > 75) {
@@ -908,11 +937,25 @@ function checkIsNameAutogenerated(text) {
908
937
  if (consonants / vowels > 5) {
909
938
  return true;
910
939
  }
911
- const vowelChars = /* @__PURE__ */ new Set(["a", "e", "i", "o", "u", "y"]);
940
+ let maxConsonantCount = 0;
941
+ let currentConsonantCount = 0;
942
+ for (const char of text.toLowerCase()) {
943
+ if (_momenticGlobalConsonantSet.has(char)) {
944
+ currentConsonantCount++;
945
+ if (currentConsonantCount > maxConsonantCount) {
946
+ maxConsonantCount = currentConsonantCount;
947
+ }
948
+ } else {
949
+ currentConsonantCount = 0;
950
+ }
951
+ }
952
+ if (maxConsonantCount > 4) {
953
+ return true;
954
+ }
912
955
  let maxVowelCount = 0;
913
956
  let currentVowelCount = 0;
914
957
  for (const char of text.toLowerCase()) {
915
- if (char >= "a" && char <= "z" && !vowelChars.has(char)) {
958
+ if (char >= "a" && char <= "z" && !_momenticGlobalVowelSet.has(char)) {
916
959
  currentVowelCount++;
917
960
  if (currentVowelCount > maxVowelCount) {
918
961
  maxVowelCount = currentVowelCount;
@@ -949,7 +992,8 @@ function processElementAttributes(element, opts) {
949
992
  sortAttributes = true,
950
993
  removeStateAttributes = true,
951
994
  removeAutoGeneratedId = true,
952
- removeDataImageSrc = true
995
+ removeDataImageSrc = true,
996
+ removeClassName = false
953
997
  } = opts != null ? opts : {};
954
998
  const bannedClassSubstrings = (_b = (_a = customWindow.momenticConstants) == null ? void 0 : _a.bannedClassSubstrings) != null ? _b : [];
955
999
  if (!bannedClassSubstrings.length) {
@@ -986,10 +1030,17 @@ function processElementAttributes(element, opts) {
986
1030
  }
987
1031
  switch (attr) {
988
1032
  case "class": {
1033
+ if (removeClassName) {
1034
+ element.removeAttribute(attr);
1035
+ break;
1036
+ }
989
1037
  const classesToKeep = [];
990
1038
  let i = 0;
991
1039
  for (const classVal of attrVal.split(" ")) {
992
1040
  i++;
1041
+ if (i > 10) {
1042
+ break;
1043
+ }
993
1044
  if (bannedClassSubstrings.some((bad) => classVal.includes(bad))) {
994
1045
  continue;
995
1046
  }
@@ -1238,62 +1289,26 @@ function serializeElementOnlyWithText(originalElement, opts) {
1238
1289
  }
1239
1290
  return html;
1240
1291
  }
1241
- function isNodeUniqueEnoughForDirectMatch(element, checkChildren = true) {
1242
- if (element.textContent && element.textContent.trim().length > 15) {
1292
+ function isNodeUniqueEnoughForDirectMatch(element) {
1293
+ if (element.textContent && element.textContent.trim().length > 0) {
1243
1294
  return {
1244
- reason: "Text content is reasonably long",
1295
+ reason: "Contains text content",
1245
1296
  ok: true
1246
1297
  };
1247
1298
  }
1248
- if (element.outerHTML.length > 100) {
1299
+ const elmClone = element.cloneNode(false);
1300
+ processElementAttributes(elmClone);
1301
+ const attrNames = elmClone.getAttributeNames();
1302
+ let result = "";
1303
+ for (const attr of attrNames) {
1304
+ result += \` \${attr}="\${elmClone.getAttribute(attr)}"\`;
1305
+ }
1306
+ if (result.length > 25) {
1249
1307
  return {
1250
- reason: "Outer HTML is reasonably long",
1308
+ reason: "Attributes are reasonably long",
1251
1309
  ok: true
1252
1310
  };
1253
1311
  }
1254
- const attributes = element.getAttributeNames();
1255
- let attemptedAttrs = 0;
1256
- for (let i = 0; i < attributes.length; i++) {
1257
- const name = attributes[i];
1258
- if (name === "data-momentic-id" || name === "aria-keyshortcuts") {
1259
- continue;
1260
- }
1261
- attemptedAttrs++;
1262
- if (attemptedAttrs > 3) {
1263
- break;
1264
- }
1265
- const value = element.getAttribute(name);
1266
- const matchingElements = document.querySelectorAll(
1267
- \`\${element.tagName.toLowerCase()}[\${name}=\${JSON.stringify(value)}]\`
1268
- );
1269
- if (matchingElements.length === 1) {
1270
- return {
1271
- reason: \`Unique attribute \${name}\`,
1272
- ok: true
1273
- };
1274
- }
1275
- }
1276
- if (element.childNodes.length > 0 && checkChildren) {
1277
- let i = 0;
1278
- for (const child of element.childNodes) {
1279
- i++;
1280
- if (i > 3) {
1281
- break;
1282
- }
1283
- if (child.nodeType === Node.ELEMENT_NODE) {
1284
- const { ok, reason } = isNodeUniqueEnoughForDirectMatch(
1285
- child,
1286
- false
1287
- );
1288
- if (ok) {
1289
- return {
1290
- reason: \`Child is unique: \${reason}\`,
1291
- ok: true
1292
- };
1293
- }
1294
- }
1295
- }
1296
- }
1297
1312
  return {
1298
1313
  reason: "Not unique enough",
1299
1314
  ok: false
@@ -1952,10 +1967,20 @@ var findClosestElementByLDist = ({
1952
1967
  let closestNode = void 0;
1953
1968
  let closestNodeId = void 0;
1954
1969
  let closestNodeForm = void 0;
1955
- let closestDistance = Infinity;
1956
1970
  let equalNodeForm = void 0;
1957
- const bannedTags = /* @__PURE__ */ new Set(["script", "style", "body", "head"]);
1971
+ const bannedTags = /* @__PURE__ */ new Set([
1972
+ "script",
1973
+ "style",
1974
+ "body",
1975
+ "head",
1976
+ "iframe",
1977
+ "canvas"
1978
+ ]);
1958
1979
  for (const element of allElements) {
1980
+ if (Date.now() - checkStart > 1e3) {
1981
+ logs.push(\`Stopped direct HTML comparison after 1 second\`);
1982
+ break;
1983
+ }
1959
1984
  if (element.nodeType !== Node.ELEMENT_NODE) {
1960
1985
  continue;
1961
1986
  }
@@ -1963,30 +1988,23 @@ var findClosestElementByLDist = ({
1963
1988
  continue;
1964
1989
  }
1965
1990
  const serializedCandidate = customWindow.serializeElementOnlyWithText(element);
1966
- if (Math.abs(serializedCandidate.length - nodeOnlySerializedHtml.length) > 100) {
1991
+ if (serializedCandidate.length !== nodeOnlySerializedHtml.length) {
1967
1992
  continue;
1968
1993
  }
1969
- if (Date.now() - checkStart > 1e3) {
1970
- logs.push(\`Stopped direct HTML comparison after 1 second\`);
1971
- break;
1994
+ if (serializedCandidate !== nodeOnlySerializedHtml) {
1995
+ continue;
1972
1996
  }
1973
- const dist = customWindow.ldist(
1974
- nodeOnlySerializedHtml,
1975
- serializedCandidate
1976
- );
1977
- if (dist < closestDistance) {
1978
- closestDistance = dist;
1997
+ if (!closestNode) {
1979
1998
  closestNode = element;
1980
1999
  closestNodeForm = serializedCandidate;
1981
2000
  closestNodeId = (_b = element.getAttribute("data-momentic-id")) != null ? _b : void 0;
1982
- equalNodeForm = void 0;
1983
- } else if (dist === closestDistance) {
2001
+ } else {
1984
2002
  equalNodeForm = serializedCandidate;
1985
2003
  }
1986
2004
  }
1987
2005
  if (equalNodeForm) {
1988
2006
  return {
1989
- error: \`[MOMENTIC] Multiple HTML elements with same distance (\${closestDistance}) found:
2007
+ error: \`[MOMENTIC] Multiple HTML elements equal to the original were found:
1990
2008
  \${equalNodeForm.slice(0, 150)}
1991
2009
  ==================
1992
2010
  \${closestNodeForm == null ? void 0 : closestNodeForm.slice(0, 150)}
@@ -2006,7 +2024,7 @@ var findClosestElementByLDist = ({
2006
2024
  return {
2007
2025
  dataMomenticId: closestNodeId,
2008
2026
  mPathSelector: visualFlagOn && closestNode ? (_c = customWindow.getMPathSelector) == null ? void 0 : _c.call(customWindow, closestNode) : void 0,
2009
- closestDistance,
2027
+ closestDistance: 0,
2010
2028
  closestNodeSerialized: closestNodeForm,
2011
2029
  logs
2012
2030
  };
@@ -3518,59 +3536,59 @@ function registerAllMomenticListeners() {
3518
3536
 
3519
3537
  // src/html/index.ts
3520
3538
  registerAllMomenticListeners();
3521
- `,cssGeneratorLibJs:'// Taken from https://cdn.jsdelivr.net/npm/css-selector-generator@3.6.8/build/index.min.js\n!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CssSelectorGenerator=e():t.CssSelectorGenerator=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(t){return"object"==typeof t&&null!==t&&t.nodeType===Node.ELEMENT_NODE}t.r(e),t.d(e,{default:()=>K,getCssSelector:()=>J});const o={NONE:"",DESCENDANT:" ",CHILD:" > "},r={id:"id",class:"class",tag:"tag",attribute:"attribute",nthchild:"nthchild",nthoftype:"nthoftype"},i="CssSelectorGenerator";function c(t="unknown problem",...e){console.warn(`${i}: ${t}`,...e)}const u={selectors:[r.id,r.class,r.tag,r.attribute],includeTag:!1,whitelist:[],blacklist:[],combineWithinSelector:!0,combineBetweenSelectors:!0,root:null,maxCombinations:Number.POSITIVE_INFINITY,maxCandidates:Number.POSITIVE_INFINITY};function s(t){return t instanceof RegExp}function a(t){return["string","function"].includes(typeof t)||s(t)}function l(t){return Array.isArray(t)?t.filter(a):[]}function f(t){const e=[Node.DOCUMENT_NODE,Node.DOCUMENT_FRAGMENT_NODE,Node.ELEMENT_NODE];return function(t){return t instanceof Node}(t)&&e.includes(t.nodeType)}function d(t,e){if(f(t))return t.contains(e)||c("element root mismatch","Provided root does not contain the element. This will most likely result in producing a fallback selector using element\'s real root node. If you plan to use the selector using provided root (e.g. `root.querySelector`), it will nto work as intended."),t;const n=e.getRootNode({composed:!1});return f(n)?(n!==document&&c("shadow root inferred","You did not provide a root and the element is a child of Shadow DOM. This will produce a selector using ShadowRoot as a root. If you plan to use the selector using document as a root (e.g. `document.querySelector`), it will not work as intended."),n):e.ownerDocument.querySelector(":root")}function m(t){return"number"==typeof t?t:Number.POSITIVE_INFINITY}function p(t=[]){const[e=[],...n]=t;return 0===n.length?e:n.reduce(((t,e)=>t.filter((t=>e.includes(t)))),e)}function h(t){return[].concat(...t)}function g(t){const e=t.map((t=>{if(s(t))return e=>t.test(e);if("function"==typeof t)return e=>{const n=t(e);return"boolean"!=typeof n?(c("pattern matcher function invalid","Provided pattern matching function does not return boolean. It\'s result will be ignored.",t),!1):n};if("string"==typeof t){const e=new RegExp("^"+t.replace(/[|\\\\{}()[\\]^$+?.]/g,"\\\\$&").replace(/\\*/g,".+")+"$");return t=>e.test(t)}return c("pattern matcher invalid","Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.",t),()=>!1}));return t=>e.some((e=>e(t)))}function y(t,e,n){const o=Array.from(d(n,t[0]).querySelectorAll(e));return o.length===t.length&&t.every((t=>o.includes(t)))}function b(t,e){e=null!=e?e:function(t){return t.ownerDocument.querySelector(":root")}(t);const o=[];let r=t;for(;n(r)&&r!==e;)o.push(r),r=r.parentElement;return o}function N(t,e){return p(t.map((t=>b(t,e))))}const S=", ",E=new RegExp(["^$","\\\\s"].join("|")),w=new RegExp(["^$"].join("|")),I=[r.nthoftype,r.tag,r.id,r.class,r.attribute,r.nthchild],v=g(["class","id","ng-*"]);function T({name:t}){return`[${t}]`}function C({name:t,value:e}){return`[${t}=\'${e}\']`}function O({nodeName:t,nodeValue:e}){return{name:V(t),value:V(e)}}function x(t){const e=Array.from(t.attributes).filter((e=>function({nodeName:t},e){const n=e.tagName.toLowerCase();return!(["input","option"].includes(n)&&"value"===t||v(t))}(e,t))).map(O);return[...e.map(T),...e.map(C)]}function j(t){return(t.getAttribute("class")||"").trim().split(/\\s+/).filter((t=>!w.test(t))).map((t=>`.${V(t)}`))}function A(t){const e=t.getAttribute("id")||"",n=`#${V(e)}`,o=t.getRootNode({composed:!1});return!E.test(e)&&y([t],n,o)?[n]:[]}function $(t){const e=t.parentNode;if(e){const o=Array.from(e.childNodes).filter(n).indexOf(t);if(o>-1)return[`:nth-child(${o+1})`]}return[]}function D(t){return[V(t.tagName.toLowerCase())]}function R(t){const e=[...new Set(h(t.map(D)))];return 0===e.length||e.length>1?[]:[e[0]]}function P(t){const e=R([t])[0],n=t.parentElement;if(n){const o=Array.from(n.children).filter((t=>t.tagName.toLowerCase()===e)),r=o.indexOf(t);if(r>-1)return[`${e}:nth-of-type(${r+1})`]}return[]}function _(t=[],{maxResults:e=Number.POSITIVE_INFINITY}={}){return Array.from(function*(t=[],{maxResults:e=Number.POSITIVE_INFINITY}={}){let n=0,o=L(1);for(;o.length<=t.length&&n<e;){n+=1;const e=o.map((e=>t[e]));yield e,o=k(o,t.length-1)}}(t,{maxResults:e}))}function k(t=[],e=0){const n=t.length;if(0===n)return[];const o=[...t];o[n-1]+=1;for(let t=n-1;t>=0;t--)if(o[t]>e){if(0===t)return L(n+1);o[t-1]++,o[t]=o[t-1]+1}return o[n-1]>e?L(n+1):o}function L(t=1){return Array.from(Array(t).keys())}const M=":".charCodeAt(0).toString(16).toUpperCase(),F=/[ !"#$%&\'()\\[\\]{|}<>*+,./;=?@^`~\\\\]/;function V(t=""){var e,n;return null!==(n=null===(e=null===CSS||void 0===CSS?void 0:CSS.escape)||void 0===e?void 0:e.call(CSS,t))&&void 0!==n?n:function(t=""){return t.split("").map((t=>":"===t?`\\\\${M} `:F.test(t)?`\\\\${t}`:escape(t).replace(/%/g,"\\\\"))).join("")}(t)}const Y={tag:R,id:function(t){return 0===t.length||t.length>1?[]:A(t[0])},class:function(t){return p(t.map(j))},attribute:function(t){return p(t.map(x))},nthchild:function(t){return p(t.map($))},nthoftype:function(t){return p(t.map(P))}},q={tag:D,id:A,class:j,attribute:x,nthchild:$,nthoftype:P};function B(t){return t.includes(r.tag)||t.includes(r.nthoftype)?[...t]:[...t,r.tag]}function G(t={}){const e=[...I];return t[r.tag]&&t[r.nthoftype]&&e.splice(e.indexOf(r.tag),1),e.map((e=>{return(o=t)[n=e]?o[n].join(""):"";var n,o})).join("")}function H(t,e,n="",r){const i=function(t,e){return""===e?t:function(t,e){return[...t.map((t=>e+o.DESCENDANT+t)),...t.map((t=>e+o.CHILD+t))]}(t,e)}(function(t,e,n){const o=function(t,e){const{blacklist:n,whitelist:o,combineWithinSelector:r,maxCombinations:i}=e,c=g(n),u=g(o);return function(t){const{selectors:e,includeTag:n}=t,o=[].concat(e);return n&&!o.includes("tag")&&o.push("tag"),o}(e).reduce(((e,n)=>{const o=function(t,e){var n;return(null!==(n=Y[e])&&void 0!==n?n:()=>[])(t)}(t,n),s=function(t=[],e,n){return t.filter((t=>n(t)||!e(t)))}(o,c,u),a=function(t=[],e){return t.sort(((t,n)=>{const o=e(t),r=e(n);return o&&!r?-1:!o&&r?1:0}))}(s,u);return e[n]=r?_(a,{maxResults:i}):a.map((t=>[t])),e}),{})}(t,n),r=function(t,e){return function(t){const{selectors:e,combineBetweenSelectors:n,includeTag:o,maxCandidates:r}=t,i=n?_(e,{maxResults:r}):e.map((t=>[t]));return o?i.map(B):i}(e).map((e=>function(t,e){const n={};return t.forEach((t=>{const o=e[t];o.length>0&&(n[t]=o)})),function(t={}){let e=[];return Object.entries(t).forEach((([t,n])=>{e=n.flatMap((n=>0===e.length?[{[t]:n}]:e.map((e=>Object.assign(Object.assign({},e),{[t]:n})))))})),e}(n).map(G)}(e,t))).filter((t=>t.length>0))}(o,n),i=h(r);return[...new Set(i)]}(t,r.root,r),n);for(const e of i)if(y(t,e,r.root))return e;return null}function W(t){return{value:t,include:!1}}function U({selectors:t,operator:e}){let n=[...I];t[r.tag]&&t[r.nthoftype]&&(n=n.filter((t=>t!==r.tag)));let o="";return n.forEach((e=>{(t[e]||[]).forEach((({value:t,include:e})=>{e&&(o+=t)}))})),e+o}function z(t){return[":root",...b(t).reverse().map((t=>{const e=function(t,e,n=o.NONE){const r={};return e.forEach((e=>{Reflect.set(r,e,function(t,e){return q[e](t)}(t,e).map(W))})),{element:t,operator:n,selectors:r}}(t,[r.nthchild],o.CHILD);return e.selectors.nthchild.forEach((t=>{t.include=!0})),e})).map(U)].join("")}function J(t,e={}){const o=function(t){(t instanceof NodeList||t instanceof HTMLCollection)&&(t=Array.from(t));const e=(Array.isArray(t)?t:[t]).filter(n);return[...new Set(e)]}(t),i=function(t,e={}){const n=Object.assign(Object.assign({},u),e);return{selectors:(o=n.selectors,Array.isArray(o)?o.filter((t=>{return e=r,n=t,Object.values(e).includes(n);var e,n})):[]),whitelist:l(n.whitelist),blacklist:l(n.blacklist),root:d(n.root,t),combineWithinSelector:!!n.combineWithinSelector,combineBetweenSelectors:!!n.combineBetweenSelectors,includeTag:!!n.includeTag,maxCombinations:m(n.maxCombinations),maxCandidates:m(n.maxCandidates)};var o}(o[0],e);let c="",s=i.root;function a(){return function(t,e,n="",o){if(0===t.length)return null;const r=[t.length>1?t:[],...N(t,e).map((t=>[t]))];for(const t of r){const e=H(t,0,n,o);if(e)return{foundElements:t,selector:e}}return null}(o,s,c,i)}let f=a();for(;f;){const{foundElements:t,selector:e}=f;if(y(o,e,i.root))return e;s=t[0],c=e,f=a()}return o.length>1?o.map((t=>J(t,i))).join(S):function(t){return t.map(z).join(S)}(o)}const K=J;return e})()));'};import{execSync as SP}from"child_process";import{randomUUID as Ry}from"crypto";import{existsSync as el,mkdirSync as yP,readFileSync as bP,writeFileSync as wP}from"fs";import{Jimp as vP}from"jimp";import xP from"js-beautify";import{cloneDeep as TP}from"lodash-es";var sS={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(sS);var aS=sS;var lS={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(lS);var cS=lS;var Jt=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},ko,qi,Br,wd=class{constructor(...e){ko.set(this,new Map),qi.set(this,new Map),Br.set(this,new Map);for(let t of e)this.define(t)}define(e,t=!1){for(let[r,o]of Object.entries(e)){r=r.toLowerCase(),o=o.map(a=>a.toLowerCase()),Jt(this,Br,"f").has(r)||Jt(this,Br,"f").set(r,new Set);let i=Jt(this,Br,"f").get(r),s=!0;for(let a of o){let l=a.startsWith("*");if(a=l?a.slice(1):a,i?.add(a),s&&Jt(this,qi,"f").set(r,a),s=!1,l)continue;let c=Jt(this,ko,"f").get(a);if(c&&c!=r&&!t)throw new Error(`"${r} -> ${a}" conflicts with "${c} -> ${a}". Pass \`force=true\` to override this definition.`);Jt(this,ko,"f").set(a,r)}}return this}getType(e){if(typeof e!="string")return null;let t=e.replace(/^.*[/\\]/,"").toLowerCase(),r=t.replace(/^.*\./,"").toLowerCase(),o=t.length<e.length;return!(r.length<t.length-1)&&o?null:Jt(this,ko,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&Jt(this,qi,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:Jt(this,Br,"f").get(e.toLowerCase())??null}_freeze(){this.define=()=>{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let e of Jt(this,Br,"f").values())Object.freeze(e);return this}_getTestState(){return{types:Jt(this,ko,"f"),extensions:Jt(this,qi,"f")}}};ko=new WeakMap,qi=new WeakMap,Br=new WeakMap;var vd=wd;var dS=new vd(cS,aS)._freeze();import{homedir as Iy,hostname as EP,platform as CP}from"os";import{basename as RP,extname as AP,join as Ji,resolve as IP}from"path";import{chromium as Py,devices as PP}from"playwright";import{addExtra as LP}from"playwright-extra";import OP from"puppeteer-extra-plugin-recaptcha";import{v4 as kP}from"uuid";import{rmSync as KS}from"fs";import{basename as BI,join as zI}from"path";import{errors as jI}from"playwright-core";var Dn={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-aria-hidden","data-hidden","data-content-editable-leaf","data-automation-id","data-wf-icon","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-","hidden",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"]};function pS(n){if(n.length>75)return!1;if(n[0]?.match(/[0-9a-zA-Z]/)===null)return!0;if(n.length>10){let d=Math.floor(n.length/8);if((n.match(/[-_:A-Z/ ]/g)??[]).length<d)return!0}if((n.match(/[^0-9a-zA-Z-_.]/g)??[]).length/n.length>.2)return!0;let t=(n.match(/[0-9]/g)??[]).length;if(t/n.length>.3)return!0;let r=(n.toLowerCase().match(/[aeiou]/gi)??[]).length;if((n.toLowerCase().match(/[bcdfghjklmnpqrstvwxyz]/gi)??[]).length/r>5)return!0;let i=new Set(["a","e","i","o","u","y"]),s=0,a=0;for(let d of n.toLowerCase())d>="a"&&d<="z"&&!i.has(d)?(a++,a>s&&(s=a)):a=0;if(s>4)return!0;let l=(n.match(/[A-Z]/g)??[]).length,c=(n.match(/[a-z]/g)??[]).length,p=Math.ceil(n.length*.3);return!!(c&&t&&Math.abs(c-t)<p||c&&l&&Math.abs(c-l)<p)}import{randomUUID as JA}from"crypto";import{cloneDeep as Rd}from"lodash-es";import{randomUUID as VA}from"crypto";var uS=new Set(["about:blank","chrome-error://chromewebdata/"]);var bt="data-momentic-id";var xd=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Td=1e4,Ki=500;function or(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as jA}from"crypto";var HA="v1";function ja(n,e){if(n.tagName.toLowerCase()==="svg"&&!WA(n))try{let t=mS(n,e),r=$A(JSON.stringify(t));return{version:HA,json:t,hash:r}}catch{return}}function $A(n){return jA("md5").update(n).digest("hex")}function mS(n,e){let t=n.tagName.toLowerCase(),r=GA(n);if(t==="image"&&r["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:r,children:[]};for(let i of n.childrenBackendIds){let s=e.backendIdToNode[i];if(s&&s.nodeType===1){let a=mS(s,e);a&&o.children.push(a)}}return o}function WA(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function GA(n){let e={},t=n.attributes;for(let r of Object.keys(t))Dn.visualAttributesForSvgSerialization.includes(r)&&(e[r]=t[r]);return t.id&&n.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var zr={r:147,g:196,b:125,a:.55},fS={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:zr,paddingColor:zr,borderColor:zr,marginColor:zr,eventTargetColor:zr,shapeColor:zr,shapeMarginColor:zr,showInfo:!0,showAccessibilityInfo:!0},Ha=["display","opacity","visibility","height","position"];function SS({snapshot:n,devicePixelRatio:e,logger:t}){let r=n.strings,o=n.documents,i={},s={},a={roots:[],backendIdToNode:i,frameIndexToIframeNode:s};return o.forEach((l,c)=>{let p=qA({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:s,logger:t});a.roots.push(p)}),a}function qA({allDocuments:n,stringConstants:e,devicePixelRatio:t,frameIndex:r,frameIndexToIframeNode:o,backendIdToNode:i,logger:s}){let a=n[r],l=a.layout,c={};l.nodeIndex.forEach((C,I)=>{c[C]=I});let p=l.styles,d=l.bounds??[],u=a.nodes,m=u.contentDocumentIndex??{index:[],value:[]},h=u.backendNodeId??[],g=u.attributes??[],f=u.parentIndex??[],S=u.nodeName??[],x=u.nodeType??[],b=u.pseudoType??{index:[],value:[]},w=u.inputChecked??{index:[]},E=e[a.frameId];for(let C=0;C<h.length;C++){let I=h[C],N=x[C],P=g[C]??[],D=f[C]!==void 0&&f[C]>=0?f[C]:void 0,W=D!==void 0?h[D]:void 0,_=W!==void 0?i[W]:void 0,B=b.index.indexOf(C),L=B!==-1?e[b.value[B]]:void 0,j=c[C],O;j?O=d[j]??[]:O=[];let ee=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!ee){s.warn({backendNodeId:I,frameId:E,frameIndex:r,nodeBounds:O},"DOM node has no tag name");continue}let me={backendNodeId:I,psuedoType:L,nodeType:N,frameIndex:r,parentFrameId:E,ownedFrameId:void 0,bounds:{x:O[0]??null,y:O[1]??null,width:O[2]??null,height:O[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:W??null,tagName:ee,parent:_??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};_&&_.childrenBackendIds.push(I);let tt=m.index.indexOf(C);if(tt!==-1){let Se=m.value[tt];o[Se]=me;let De=n[Se]?.frameId;me.ownedFrameId=De!==void 0?e[De]:void 0}for(let Se of Object.keys(me.bounds)){let De=Se;me.bounds[De]!==null&&(me.bounds[De]/=t)}let ce=j!==void 0?p[j]??[]:[];for(let Se=0;Se<ce.length&&!(Se>=Ha.length);Se++){let De=ce[Se];if(De===void 0||isNaN(De))continue;let nt=e[De];if(nt===void 0)continue;let Ft=Ha[Se];me.computedStyles[Ft]=nt}for(let Se=0;Se<P.length;Se+=2){let De=P[Se],nt=P[Se+1];if(!De||!nt)continue;let Ft=e[De],Pn=e[nt];!Ft||!Pn||(me.attributes[Ft]=Pn)}w.index.includes(C)&&(me.attributes.checked="true"),i[me.backendNodeId]=me}return i[h[0]]}function Cd(n,e){if(n.mPathSelector)return n.mPathSelector;let t=n.parent,r;if(!t)r=n.tagName;else if(n.tagName==="body")r="body";else{let i=t.childrenBackendIds.filter(l=>e.backendIdToNode[l]?.nodeType===1&&!e.backendIdToNode[l]?.psuedoType).indexOf(n.backendNodeId),s=` > ${n.tagName}:nth-child(${i+1})`;r=`${Cd(t,e)}${s}`}return n.mPathSelector=r,r}function hS({originalNode:n,candidate:e,logKey:t,logger:r}){if(!e.bounds)return r.debug({candidate:e},"Filtering out click candidate since it has no bounding box"),!1;let o=n.bounds,i=o.x??0,s=o.width??0,a=o.height??0,l=i+s,c=o.y??0,p=c+(o.height??0),d=e.bounds,u=d.width??0,m=d.height??0,h=d.x??0,g=h+(d.width??0),f=d.y??0,S=f+(d.height??0);return h<l&&g>i&&f<p&&S>c?Math.abs(s-u)<200||Math.abs(a-m)<200?!0:(kr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(kr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function $a(n,e,t){let r=Object.values(e.backendIdToNode),o,i=VA();for(let c of r)if(c.attributes?.[bt]===n){o=c;break}if(!o)return[];let s=[],a=e.backendIdToNode[o.parentBackendNodeId??-1];for(;a&&(a?.momenticIgnored||!hS({originalNode:o,candidate:a,logKey:i,logger:t}));)a=e.backendIdToNode[a.parentBackendNodeId??-1];a&&s.push(a);let l=[o];for(;l.length;){let c=l.shift();for(let p of c.childrenBackendIds??[]){let d=e.backendIdToNode[p];d&&!d.momenticIgnored&&hS({originalNode:o,candidate:d,logKey:i,logger:t})?s.push(d):d&&l.push(d)}}return s}function gS(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var KA=["html","#document","#document-fragment"];function yS({node:n,domGraph:e}){let t=[],r=n,o=gS(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=gS(o,e),!o&&r.frameIndex!==0)throw new Error("No parent node but not in main frame")},s=0;for(;o&&s<1e6;){if(s++,KA.includes(r.tagName)){i();continue}if(r.tagName==="body")t.push("body");else{let l=!1,c=1;for(let p=0;p<o.childrenBackendIds.length;p++){let d=o.childrenBackendIds[p],u=e.backendIdToNode[d];if(d===r.backendNodeId){t.push(`${r.tagName}:nth-child(${c})`),l=!0;break}else u?.nodeType===1&&!u.psuedoType&&c++}if(!l)throw new Error(`Could not find child (${r.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function bS(n,e){let t=n.locator("html"),r=[];for(let o=0;o<e.length;o++){let i=e[o];if(r.push(i),i.startsWith("iframe")){let s=r.join(" > ");r=[],o<e.length-1?t=t.frameLocator(s):t=t.locator(s)}}if(r.length&&(t=t.locator(r.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function wS(n,e){await n.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let t=await n.send({method:"DOM.requestNode",params:{objectId:e},timeout:2e3}),o=(await n.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:2e3})).attributes,i=or(o,bt);if(!i)throw new Error(`Could not find attribute ${bt} for object ${e}`);return i}function vS(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=YA({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function YA(n){let{root:e,domGraph:t,existingHashes:r}=n,o=[],i=[e];for(;i.length;){let s=i.pop();if(s.nodeType===1&&s.tagName.toLowerCase()==="svg"){let a=ja(s,t);a&&!r[a.hash]&&o.push(a)}for(let a of s.childrenBackendIds){let l=t.backendIdToNode[a];l&&i.push(l)}}return o}var XA=["focusable","keyshortcuts","controls","live","relevant","orientation"],ZA=["selected","readonly","modal","required","invalid"],QA=["id","name","role","content"],xS=["absolute","fixed","sticky"],eI=["path"],tI=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator"],nI=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog","ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],rI=["menulistpopup","statictext","inlinetextbox"],oI=80,TS=100,Wa=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],iI=["cite"],sI={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},aI={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},ES={indentLevel:0},Ad=class n{id;role;name;nameSources;tagName;content;properties;internalProperties;dataMomenticId;pathFromRoot;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&!pS(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),pI(this.properties,e.domNode)}mI(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(){if(this.domNode&&this.domNode.tagName==="div"&&!this.domNode.bounds.x&&!this.domNode.bounds.y&&!this.domNode.bounds.width&&!this.domNode.bounds.height||this.domNode&&eI.includes(this.domNode.tagName))return!1;if(tI.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents")return!1;if(this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Dn.alwaysInterestingTruthyPropertyNames.some(t=>!!this.properties[t]))return!0;let e=this.properties.class;return typeof e=="string"&&e.split(" ").some(t=>IS(t))?!0:this.children.every(t=>t.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(t=>t.role==="StaticText")?!0:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(t=>t.startsWith("data"))}serialize(e=ES){let t=Object.assign({},ES,e),{indentLevel:r,noChildren:o,noProperties:i,noId:s,noContent:a,condensedMode:l}=t,c=Rd(this.properties),p=" ".repeat(r),d=this.role||"",u=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(E=>!E.superseded&&E.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(E=>!E.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let E=g.attributeValue?.relatedNodes??[];E.length===1&&E[0].text&&E[0].text===m&&(m="")}let f=Wa.includes(this.role)||iI.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${p}${m}
3522
- `;let S=`${p}<${u}`;!s&&!f&&(S+=` id="${this.id}"`);let x=a??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(x=!0),d&&d!=="generic"&&d!==u&&!(sI[d]??[]).includes(u)&&(S+=` role=${JSON.stringify(d)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!x&&(S+=` content=${JSON.stringify(this.content)}`);let b=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-b>1e3)throw new Error(`Serialization for the HTML element with tag ${u} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(c).forEach(([E,C])=>{if(!XA.includes(E)){{if(ZA.includes(E)&&(!C||C==="false"))return;if(E==="value"&&x&&(c.type==="text"||this.role==="textbox"))return;if(E==="level"&&`${C}`=="1")return;if(E==="url"&&c.src&&u==="img")return;if(E==="url"&&c.href&&u==="a")return;if(E==="editable"&&C==="plaintext")return;if(E==="type"&&C===u)return;if(l&&!aI[E])return}typeof C=="string"?S+=` ${E}="${Me(C,TS,!0)}"`:typeof C=="boolean"?C?S+=` ${E}`:S+=` ${E}={false}`:typeof C<"u"&&(S+=` ${E}={${Me(JSON.stringify(C),TS,!0)}}`)}})}if(u==="::before"||u==="::after"){let E="";for(let C of this.children)E+=C.serialize({...e,indentLevel:r,neighbors:0});return E}let w=e.maxLevel!==void 0&&r/2>=e.maxLevel;if(this.children.length===0||o||w)S+=` />
3523
- `;else{let E="";for(let I of this.children)E+=I.serialize({...e,indentLevel:r+2,neighbors:0});let C=E.trim();C.length<=oI&&!C.includes(`
3539
+ `,cssGeneratorLibJs:'// Taken from https://cdn.jsdelivr.net/npm/css-selector-generator@3.6.8/build/index.min.js\n!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.CssSelectorGenerator=e():t.CssSelectorGenerator=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(t){return"object"==typeof t&&null!==t&&t.nodeType===Node.ELEMENT_NODE}t.r(e),t.d(e,{default:()=>K,getCssSelector:()=>J});const o={NONE:"",DESCENDANT:" ",CHILD:" > "},r={id:"id",class:"class",tag:"tag",attribute:"attribute",nthchild:"nthchild",nthoftype:"nthoftype"},i="CssSelectorGenerator";function c(t="unknown problem",...e){console.warn(`${i}: ${t}`,...e)}const u={selectors:[r.id,r.class,r.tag,r.attribute],includeTag:!1,whitelist:[],blacklist:[],combineWithinSelector:!0,combineBetweenSelectors:!0,root:null,maxCombinations:Number.POSITIVE_INFINITY,maxCandidates:Number.POSITIVE_INFINITY};function s(t){return t instanceof RegExp}function a(t){return["string","function"].includes(typeof t)||s(t)}function l(t){return Array.isArray(t)?t.filter(a):[]}function f(t){const e=[Node.DOCUMENT_NODE,Node.DOCUMENT_FRAGMENT_NODE,Node.ELEMENT_NODE];return function(t){return t instanceof Node}(t)&&e.includes(t.nodeType)}function d(t,e){if(f(t))return t.contains(e)||c("element root mismatch","Provided root does not contain the element. This will most likely result in producing a fallback selector using element\'s real root node. If you plan to use the selector using provided root (e.g. `root.querySelector`), it will nto work as intended."),t;const n=e.getRootNode({composed:!1});return f(n)?(n!==document&&c("shadow root inferred","You did not provide a root and the element is a child of Shadow DOM. This will produce a selector using ShadowRoot as a root. If you plan to use the selector using document as a root (e.g. `document.querySelector`), it will not work as intended."),n):e.ownerDocument.querySelector(":root")}function m(t){return"number"==typeof t?t:Number.POSITIVE_INFINITY}function p(t=[]){const[e=[],...n]=t;return 0===n.length?e:n.reduce(((t,e)=>t.filter((t=>e.includes(t)))),e)}function h(t){return[].concat(...t)}function g(t){const e=t.map((t=>{if(s(t))return e=>t.test(e);if("function"==typeof t)return e=>{const n=t(e);return"boolean"!=typeof n?(c("pattern matcher function invalid","Provided pattern matching function does not return boolean. It\'s result will be ignored.",t),!1):n};if("string"==typeof t){const e=new RegExp("^"+t.replace(/[|\\\\{}()[\\]^$+?.]/g,"\\\\$&").replace(/\\*/g,".+")+"$");return t=>e.test(t)}return c("pattern matcher invalid","Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.",t),()=>!1}));return t=>e.some((e=>e(t)))}function y(t,e,n){const o=Array.from(d(n,t[0]).querySelectorAll(e));return o.length===t.length&&t.every((t=>o.includes(t)))}function b(t,e){e=null!=e?e:function(t){return t.ownerDocument.querySelector(":root")}(t);const o=[];let r=t;for(;n(r)&&r!==e;)o.push(r),r=r.parentElement;return o}function N(t,e){return p(t.map((t=>b(t,e))))}const S=", ",E=new RegExp(["^$","\\\\s"].join("|")),w=new RegExp(["^$"].join("|")),I=[r.nthoftype,r.tag,r.id,r.class,r.attribute,r.nthchild],v=g(["class","id","ng-*"]);function T({name:t}){return`[${t}]`}function C({name:t,value:e}){return`[${t}=\'${e}\']`}function O({nodeName:t,nodeValue:e}){return{name:V(t),value:V(e)}}function x(t){const e=Array.from(t.attributes).filter((e=>function({nodeName:t},e){const n=e.tagName.toLowerCase();return!(["input","option"].includes(n)&&"value"===t||v(t))}(e,t))).map(O);return[...e.map(T),...e.map(C)]}function j(t){return(t.getAttribute("class")||"").trim().split(/\\s+/).filter((t=>!w.test(t))).map((t=>`.${V(t)}`))}function A(t){const e=t.getAttribute("id")||"",n=`#${V(e)}`,o=t.getRootNode({composed:!1});return!E.test(e)&&y([t],n,o)?[n]:[]}function $(t){const e=t.parentNode;if(e){const o=Array.from(e.childNodes).filter(n).indexOf(t);if(o>-1)return[`:nth-child(${o+1})`]}return[]}function D(t){return[V(t.tagName.toLowerCase())]}function R(t){const e=[...new Set(h(t.map(D)))];return 0===e.length||e.length>1?[]:[e[0]]}function P(t){const e=R([t])[0],n=t.parentElement;if(n){const o=Array.from(n.children).filter((t=>t.tagName.toLowerCase()===e)),r=o.indexOf(t);if(r>-1)return[`${e}:nth-of-type(${r+1})`]}return[]}function _(t=[],{maxResults:e=Number.POSITIVE_INFINITY}={}){return Array.from(function*(t=[],{maxResults:e=Number.POSITIVE_INFINITY}={}){let n=0,o=L(1);for(;o.length<=t.length&&n<e;){n+=1;const e=o.map((e=>t[e]));yield e,o=k(o,t.length-1)}}(t,{maxResults:e}))}function k(t=[],e=0){const n=t.length;if(0===n)return[];const o=[...t];o[n-1]+=1;for(let t=n-1;t>=0;t--)if(o[t]>e){if(0===t)return L(n+1);o[t-1]++,o[t]=o[t-1]+1}return o[n-1]>e?L(n+1):o}function L(t=1){return Array.from(Array(t).keys())}const M=":".charCodeAt(0).toString(16).toUpperCase(),F=/[ !"#$%&\'()\\[\\]{|}<>*+,./;=?@^`~\\\\]/;function V(t=""){var e,n;return null!==(n=null===(e=null===CSS||void 0===CSS?void 0:CSS.escape)||void 0===e?void 0:e.call(CSS,t))&&void 0!==n?n:function(t=""){return t.split("").map((t=>":"===t?`\\\\${M} `:F.test(t)?`\\\\${t}`:escape(t).replace(/%/g,"\\\\"))).join("")}(t)}const Y={tag:R,id:function(t){return 0===t.length||t.length>1?[]:A(t[0])},class:function(t){return p(t.map(j))},attribute:function(t){return p(t.map(x))},nthchild:function(t){return p(t.map($))},nthoftype:function(t){return p(t.map(P))}},q={tag:D,id:A,class:j,attribute:x,nthchild:$,nthoftype:P};function B(t){return t.includes(r.tag)||t.includes(r.nthoftype)?[...t]:[...t,r.tag]}function G(t={}){const e=[...I];return t[r.tag]&&t[r.nthoftype]&&e.splice(e.indexOf(r.tag),1),e.map((e=>{return(o=t)[n=e]?o[n].join(""):"";var n,o})).join("")}function H(t,e,n="",r){const i=function(t,e){return""===e?t:function(t,e){return[...t.map((t=>e+o.DESCENDANT+t)),...t.map((t=>e+o.CHILD+t))]}(t,e)}(function(t,e,n){const o=function(t,e){const{blacklist:n,whitelist:o,combineWithinSelector:r,maxCombinations:i}=e,c=g(n),u=g(o);return function(t){const{selectors:e,includeTag:n}=t,o=[].concat(e);return n&&!o.includes("tag")&&o.push("tag"),o}(e).reduce(((e,n)=>{const o=function(t,e){var n;return(null!==(n=Y[e])&&void 0!==n?n:()=>[])(t)}(t,n),s=function(t=[],e,n){return t.filter((t=>n(t)||!e(t)))}(o,c,u),a=function(t=[],e){return t.sort(((t,n)=>{const o=e(t),r=e(n);return o&&!r?-1:!o&&r?1:0}))}(s,u);return e[n]=r?_(a,{maxResults:i}):a.map((t=>[t])),e}),{})}(t,n),r=function(t,e){return function(t){const{selectors:e,combineBetweenSelectors:n,includeTag:o,maxCandidates:r}=t,i=n?_(e,{maxResults:r}):e.map((t=>[t]));return o?i.map(B):i}(e).map((e=>function(t,e){const n={};return t.forEach((t=>{const o=e[t];o.length>0&&(n[t]=o)})),function(t={}){let e=[];return Object.entries(t).forEach((([t,n])=>{e=n.flatMap((n=>0===e.length?[{[t]:n}]:e.map((e=>Object.assign(Object.assign({},e),{[t]:n})))))})),e}(n).map(G)}(e,t))).filter((t=>t.length>0))}(o,n),i=h(r);return[...new Set(i)]}(t,r.root,r),n);for(const e of i)if(y(t,e,r.root))return e;return null}function W(t){return{value:t,include:!1}}function U({selectors:t,operator:e}){let n=[...I];t[r.tag]&&t[r.nthoftype]&&(n=n.filter((t=>t!==r.tag)));let o="";return n.forEach((e=>{(t[e]||[]).forEach((({value:t,include:e})=>{e&&(o+=t)}))})),e+o}function z(t){return[":root",...b(t).reverse().map((t=>{const e=function(t,e,n=o.NONE){const r={};return e.forEach((e=>{Reflect.set(r,e,function(t,e){return q[e](t)}(t,e).map(W))})),{element:t,operator:n,selectors:r}}(t,[r.nthchild],o.CHILD);return e.selectors.nthchild.forEach((t=>{t.include=!0})),e})).map(U)].join("")}function J(t,e={}){const o=function(t){(t instanceof NodeList||t instanceof HTMLCollection)&&(t=Array.from(t));const e=(Array.isArray(t)?t:[t]).filter(n);return[...new Set(e)]}(t),i=function(t,e={}){const n=Object.assign(Object.assign({},u),e);return{selectors:(o=n.selectors,Array.isArray(o)?o.filter((t=>{return e=r,n=t,Object.values(e).includes(n);var e,n})):[]),whitelist:l(n.whitelist),blacklist:l(n.blacklist),root:d(n.root,t),combineWithinSelector:!!n.combineWithinSelector,combineBetweenSelectors:!!n.combineBetweenSelectors,includeTag:!!n.includeTag,maxCombinations:m(n.maxCombinations),maxCandidates:m(n.maxCandidates)};var o}(o[0],e);let c="",s=i.root;function a(){return function(t,e,n="",o){if(0===t.length)return null;const r=[t.length>1?t:[],...N(t,e).map((t=>[t]))];for(const t of r){const e=H(t,0,n,o);if(e)return{foundElements:t,selector:e}}return null}(o,s,c,i)}let f=a();for(;f;){const{foundElements:t,selector:e}=f;if(y(o,e,i.root))return e;s=t[0],c=e,f=a()}return o.length>1?o.map((t=>J(t,i))).join(S):function(t){return t.map(z).join(S)}(o)}const K=J;return e})()));'};import{execSync as vP}from"child_process";import{randomUUID as Iy}from"crypto";import{existsSync as el,mkdirSync as xP,readFileSync as TP,writeFileSync as EP}from"fs";import{Jimp as CP}from"jimp";import RP from"js-beautify";import{cloneDeep as AP}from"lodash-es";var lS={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(lS);var cS=lS;var dS={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(dS);var pS=dS;var Jt=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},ko,Ki,Br,vd=class{constructor(...e){ko.set(this,new Map),Ki.set(this,new Map),Br.set(this,new Map);for(let t of e)this.define(t)}define(e,t=!1){for(let[r,o]of Object.entries(e)){r=r.toLowerCase(),o=o.map(a=>a.toLowerCase()),Jt(this,Br,"f").has(r)||Jt(this,Br,"f").set(r,new Set);let i=Jt(this,Br,"f").get(r),s=!0;for(let a of o){let l=a.startsWith("*");if(a=l?a.slice(1):a,i?.add(a),s&&Jt(this,Ki,"f").set(r,a),s=!1,l)continue;let c=Jt(this,ko,"f").get(a);if(c&&c!=r&&!t)throw new Error(`"${r} -> ${a}" conflicts with "${c} -> ${a}". Pass \`force=true\` to override this definition.`);Jt(this,ko,"f").set(a,r)}}return this}getType(e){if(typeof e!="string")return null;let t=e.replace(/^.*[/\\]/,"").toLowerCase(),r=t.replace(/^.*\./,"").toLowerCase(),o=t.length<e.length;return!(r.length<t.length-1)&&o?null:Jt(this,ko,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&Jt(this,Ki,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:Jt(this,Br,"f").get(e.toLowerCase())??null}_freeze(){this.define=()=>{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let e of Jt(this,Br,"f").values())Object.freeze(e);return this}_getTestState(){return{types:Jt(this,ko,"f"),extensions:Jt(this,Ki,"f")}}};ko=new WeakMap,Ki=new WeakMap,Br=new WeakMap;var xd=vd;var uS=new xd(pS,cS)._freeze();import{homedir as Ly,hostname as IP,platform as PP}from"os";import{basename as LP,extname as OP,join as Xi,resolve as kP}from"path";import{chromium as Oy,devices as NP}from"playwright";import{addExtra as _P}from"playwright-extra";import MP from"puppeteer-extra-plugin-recaptcha";import{v4 as FP}from"uuid";import{rmSync as JS}from"fs";import{basename as $I,join as WI}from"path";import{errors as GI}from"playwright-core";var Dn={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-aria-hidden","data-hidden","data-content-editable-leaf","data-automation-id","data-wf-icon","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-","hidden",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"]};var $A=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),WA=new Set(["a","e","i","o","u","y"]);function mS(n){if(n.length>75)return!1;if(n[0]?.match(/[0-9a-zA-Z]/)===null)return!0;if(n.length>10){let u=Math.floor(n.length/8);if((n.match(/[-_:A-Z/ ]/g)??[]).length<u)return!0}if((n.match(/[^0-9a-zA-Z-_.]/g)??[]).length/n.length>.2)return!0;let t=(n.match(/[0-9]/g)??[]).length;if(t/n.length>.3)return!0;let r=(n.toLowerCase().match(/[aeiou]/gi)??[]).length;if((n.toLowerCase().match(/[bcdfghjklmnpqrstvwxyz]/gi)??[]).length/r>5)return!0;let i=0,s=0;for(let u of n.toLowerCase())$A.has(u)?(s++,s>i&&(i=s)):s=0;if(i>4)return!0;let a=0,l=0;for(let u of n.toLowerCase())u>="a"&&u<="z"&&!WA.has(u)?(l++,l>a&&(a=l)):l=0;if(a>4)return!0;let c=(n.match(/[A-Z]/g)??[]).length,p=(n.match(/[a-z]/g)??[]).length,d=Math.ceil(n.length*.3);return!!(p&&t&&Math.abs(p-t)<d||p&&c&&Math.abs(p-c)<d)}import{randomUUID as eI}from"crypto";import{cloneDeep as Ad}from"lodash-es";import{randomUUID as JA}from"crypto";var hS=new Set(["about:blank","chrome-error://chromewebdata/"]);var bt="data-momentic-id";var Td=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Ed=1e4,Yi=500;function or(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as GA}from"crypto";var VA="v1";function ja(n,e){if(n.tagName.toLowerCase()==="svg"&&!KA(n))try{let t=gS(n,e),r=qA(JSON.stringify(t));return{version:VA,json:t,hash:r}}catch{return}}function qA(n){return GA("md5").update(n).digest("hex")}function gS(n,e){let t=n.tagName.toLowerCase(),r=YA(n);if(t==="image"&&r["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:r,children:[]};for(let i of n.childrenBackendIds){let s=e.backendIdToNode[i];if(s&&s.nodeType===1){let a=gS(s,e);a&&o.children.push(a)}}return o}function KA(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function YA(n){let e={},t=n.attributes;for(let r of Object.keys(t))Dn.visualAttributesForSvgSerialization.includes(r)&&(e[r]=t[r]);return t.id&&n.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var zr={r:147,g:196,b:125,a:.55},yS={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:zr,paddingColor:zr,borderColor:zr,marginColor:zr,eventTargetColor:zr,shapeColor:zr,shapeMarginColor:zr,showInfo:!0,showAccessibilityInfo:!0},Ha=["display","opacity","visibility","height","position"];function bS({snapshot:n,devicePixelRatio:e,logger:t}){let r=n.strings,o=n.documents,i={},s={},a={roots:[],backendIdToNode:i,frameIndexToIframeNode:s};return o.forEach((l,c)=>{let p=XA({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:s,logger:t});a.roots.push(p)}),a}function XA({allDocuments:n,stringConstants:e,devicePixelRatio:t,frameIndex:r,frameIndexToIframeNode:o,backendIdToNode:i,logger:s}){let a=n[r],l=a.layout,c={};l.nodeIndex.forEach((C,I)=>{c[C]=I});let p=l.styles,d=l.bounds??[],u=a.nodes,m=u.contentDocumentIndex??{index:[],value:[]},h=u.backendNodeId??[],g=u.attributes??[],f=u.parentIndex??[],S=u.nodeName??[],x=u.nodeType??[],b=u.pseudoType??{index:[],value:[]},w=u.inputChecked??{index:[]},E=e[a.frameId];for(let C=0;C<h.length;C++){let I=h[C],N=x[C],P=g[C]??[],D=f[C]!==void 0&&f[C]>=0?f[C]:void 0,W=D!==void 0?h[D]:void 0,_=W!==void 0?i[W]:void 0,B=b.index.indexOf(C),L=B!==-1?e[b.value[B]]:void 0,j=c[C],O;j?O=d[j]??[]:O=[];let ee=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!ee){s.warn({backendNodeId:I,frameId:E,frameIndex:r,nodeBounds:O},"DOM node has no tag name");continue}let me={backendNodeId:I,psuedoType:L,nodeType:N,frameIndex:r,parentFrameId:E,ownedFrameId:void 0,bounds:{x:O[0]??null,y:O[1]??null,width:O[2]??null,height:O[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:W??null,tagName:ee,parent:_??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};_&&_.childrenBackendIds.push(I);let tt=m.index.indexOf(C);if(tt!==-1){let Se=m.value[tt];o[Se]=me;let De=n[Se]?.frameId;me.ownedFrameId=De!==void 0?e[De]:void 0}for(let Se of Object.keys(me.bounds)){let De=Se;me.bounds[De]!==null&&(me.bounds[De]/=t)}let ce=j!==void 0?p[j]??[]:[];for(let Se=0;Se<ce.length&&!(Se>=Ha.length);Se++){let De=ce[Se];if(De===void 0||isNaN(De))continue;let nt=e[De];if(nt===void 0)continue;let Ft=Ha[Se];me.computedStyles[Ft]=nt}for(let Se=0;Se<P.length;Se+=2){let De=P[Se],nt=P[Se+1];if(!De||!nt)continue;let Ft=e[De],Pn=e[nt];!Ft||!Pn||(me.attributes[Ft]=Pn)}w.index.includes(C)&&(me.attributes.checked="true"),i[me.backendNodeId]=me}return i[h[0]]}function Rd(n,e){if(n.mPathSelector)return n.mPathSelector;let t=n.parent,r;if(!t)r=n.tagName;else if(n.tagName==="body")r="body";else{let i=t.childrenBackendIds.filter(l=>e.backendIdToNode[l]?.nodeType===1&&!e.backendIdToNode[l]?.psuedoType).indexOf(n.backendNodeId),s=` > ${n.tagName}:nth-child(${i+1})`;r=`${Rd(t,e)}${s}`}return n.mPathSelector=r,r}function fS({originalNode:n,candidate:e,logKey:t,logger:r}){if(!e.bounds)return r.debug({candidate:e},"Filtering out click candidate since it has no bounding box"),!1;let o=n.bounds,i=o.x??0,s=o.width??0,a=o.height??0,l=i+s,c=o.y??0,p=c+(o.height??0),d=e.bounds,u=d.width??0,m=d.height??0,h=d.x??0,g=h+(d.width??0),f=d.y??0,S=f+(d.height??0);return h<l&&g>i&&f<p&&S>c?Math.abs(s-u)<200||Math.abs(a-m)<200?!0:(kr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(kr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function $a(n,e,t){let r=Object.values(e.backendIdToNode),o,i=JA();for(let c of r)if(c.attributes?.[bt]===n){o=c;break}if(!o)return[];let s=[],a=e.backendIdToNode[o.parentBackendNodeId??-1];for(;a&&(a?.momenticIgnored||!fS({originalNode:o,candidate:a,logKey:i,logger:t}));)a=e.backendIdToNode[a.parentBackendNodeId??-1];a&&s.push(a);let l=[o];for(;l.length;){let c=l.shift();for(let p of c.childrenBackendIds??[]){let d=e.backendIdToNode[p];d&&!d.momenticIgnored&&fS({originalNode:o,candidate:d,logKey:i,logger:t})?s.push(d):d&&l.push(d)}}return s}function SS(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var ZA=["html","#document","#document-fragment"];function wS({node:n,domGraph:e}){let t=[],r=n,o=SS(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=SS(o,e),!o&&r.frameIndex!==0)throw new Error("No parent node but not in main frame")},s=0;for(;o&&s<1e6;){if(s++,ZA.includes(r.tagName)){i();continue}if(r.tagName==="body")t.push("body");else{let l=!1,c=1;for(let p=0;p<o.childrenBackendIds.length;p++){let d=o.childrenBackendIds[p],u=e.backendIdToNode[d];if(d===r.backendNodeId){t.push(`${r.tagName}:nth-child(${c})`),l=!0;break}else u?.nodeType===1&&!u.psuedoType&&c++}if(!l)throw new Error(`Could not find child (${r.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function vS(n,e){let t=n.locator("html"),r=[];for(let o=0;o<e.length;o++){let i=e[o];if(r.push(i),i.startsWith("iframe")){let s=r.join(" > ");r=[],o<e.length-1?t=t.frameLocator(s):t=t.locator(s)}}if(r.length&&(t=t.locator(r.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function xS(n,e){await n.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let t=await n.send({method:"DOM.requestNode",params:{objectId:e},timeout:2e3}),o=(await n.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:2e3})).attributes,i=or(o,bt);if(!i)throw new Error(`Could not find attribute ${bt} for object ${e}`);return i}function TS(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=QA({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function QA(n){let{root:e,domGraph:t,existingHashes:r}=n,o=[],i=[e];for(;i.length;){let s=i.pop();if(s.nodeType===1&&s.tagName.toLowerCase()==="svg"){let a=ja(s,t);a&&!r[a.hash]&&o.push(a)}for(let a of s.childrenBackendIds){let l=t.backendIdToNode[a];l&&i.push(l)}}return o}var tI=["focusable","keyshortcuts","controls","live","relevant","orientation"],nI=["selected","readonly","modal","required","invalid"],rI=["id","name","role","content"],ES=["absolute","fixed","sticky"],oI=["path"],iI=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator"],sI=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog","ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],aI=["menulistpopup","statictext","inlinetextbox"],lI=80,CS=100,Wa=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],cI=["cite"],dI={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},pI={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},RS={indentLevel:0},Id=class n{id;role;name;nameSources;tagName;content;properties;internalProperties;dataMomenticId;pathFromRoot;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&!mS(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),gI(this.properties,e.domNode)}SI(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(){if(this.domNode&&this.domNode.tagName==="div"&&!this.domNode.bounds.x&&!this.domNode.bounds.y&&!this.domNode.bounds.width&&!this.domNode.bounds.height||this.domNode&&oI.includes(this.domNode.tagName))return!1;if(iI.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents")return!1;if(this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Dn.alwaysInterestingTruthyPropertyNames.some(t=>!!this.properties[t]))return!0;let e=this.properties.class;return typeof e=="string"&&e.split(" ").some(t=>LS(t))?!0:this.children.every(t=>t.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(t=>t.role==="StaticText")?!0:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(t=>t.startsWith("data"))}serialize(e=RS){let t=Object.assign({},RS,e),{indentLevel:r,noChildren:o,noProperties:i,noId:s,noContent:a,condensedMode:l}=t,c=Ad(this.properties),p=" ".repeat(r),d=this.role||"",u=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(E=>!E.superseded&&E.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(E=>!E.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let E=g.attributeValue?.relatedNodes??[];E.length===1&&E[0].text&&E[0].text===m&&(m="")}let f=Wa.includes(this.role)||cI.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${p}${m}
3540
+ `;let S=`${p}<${u}`;!s&&!f&&(S+=` id="${this.id}"`);let x=a??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(x=!0),d&&d!=="generic"&&d!==u&&!(dI[d]??[]).includes(u)&&(S+=` role=${JSON.stringify(d)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!x&&(S+=` content=${JSON.stringify(this.content)}`);let b=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-b>1e3)throw new Error(`Serialization for the HTML element with tag ${u} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(c).forEach(([E,C])=>{if(!tI.includes(E)){{if(nI.includes(E)&&(!C||C==="false"))return;if(E==="value"&&x&&(c.type==="text"||this.role==="textbox"))return;if(E==="level"&&`${C}`=="1")return;if(E==="url"&&c.src&&u==="img")return;if(E==="url"&&c.href&&u==="a")return;if(E==="editable"&&C==="plaintext")return;if(E==="type"&&C===u)return;if(l&&!pI[E])return}typeof C=="string"?S+=` ${E}="${Me(C,CS,!0)}"`:typeof C=="boolean"?C?S+=` ${E}`:S+=` ${E}={false}`:typeof C<"u"&&(S+=` ${E}={${Me(JSON.stringify(C),CS,!0)}}`)}})}if(u==="::before"||u==="::after"){let E="";for(let C of this.children)E+=C.serialize({...e,indentLevel:r,neighbors:0});return E}let w=e.maxLevel!==void 0&&r/2>=e.maxLevel;if(this.children.length===0||o||w)S+=` />
3541
+ `;else{let E="";for(let I of this.children)E+=I.serialize({...e,indentLevel:r+2,neighbors:0});let C=E.trim();C.length<=lI&&!C.includes(`
3524
3542
  `)?S+=`>${C}</${u}>
3525
3543
  `:S+=`>
3526
3544
  ${E}${p}</${u}>
3527
3545
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let E=this.parent.children.findIndex(N=>N.id===this.id),C=E>0?this.parent.children[E-1]?.serialize({...e,neighbors:0}):"",I=E<this.parent.children.length-1?this.parent.children[E+1]?.serialize({...e,neighbors:0}):"";return`${C||""}
3528
3546
  ${S}
3529
- ${I||""}`}return S}shallowClone(){let e=new n({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:Rd(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=Rd(this.properties),e}},Id=class n{constructor(e,t,r,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=r;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function r(i,s=!1){let a=e.has(`${i.id}`)||i.id===t?.id,l=i.shallowClone(),c=i.children,p=!1,d=[];for(let u of c){let m=r(u,a||p);m&&(d.push(m),m.parent=l,p=!0)}if(l.children=d,a||p)return l;if(Wa.includes(i.role)&&s)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function lI(n){return n.name?.value?`"${n.name.value}"`:n.role?.value&&n.role.value!=="none"&&n.role.value!=="generic"?`"${n.role.value}"`:`"${n.nodeId}"`}function cI(n,e,t,r){return n.bounds.x===null||n.bounds.y===null||n.bounds.height===null||n.bounds.width===null||n.bounds.width===0||n.bounds.height===0?!0:n.bounds.x+n.bounds.width<e.leftBound||n.bounds.x>e.rightBound?(kr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport horizontally"),!1):n.bounds.y+n.bounds.height<e.upperBound||n.bounds.y>e.lowerBound?(kr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport vertically"),!1):n.computedStyles.display==="none"?(t.debug({domNode:n},"Filtering out node since it has display none"),!1):!0}async function CS({node:n,parent:e,frameId:t,frameContext:r,axGraph:o,domGraph:i,inputNodeMap:s,filterZeroOpacity:a,filterByViewport:l,viewportDetails:c,useMPaths:p,cdpClient:d,logger:u,callId:m}){if(!e&&n.parentId)throw new Error(`Got no parent for accessibility node ${n.nodeId}: ${JSON.stringify(n)}`);let h=(_,B={})=>{},g=n.backendDOMNodeId,f=rI.includes((n.role?.value).toLowerCase());if(!f&&g===void 0)return h("Filtering out node since it doesn't exist in the DOM"),[];let S=g?i.backendIdToNode[g]:void 0;if(!f&&!S)try{let _=await U(d.send({method:"DOM.describeNode",params:{backendNodeId:g}}),{milliseconds:750,fallback:()=>{u.debug("Timeout getting node from CDP while processing a11y tree")}});if(_&&_.node.nodeName.toLowerCase()==="slot"&&_.node.distributedNodes?.length)u.debug({redirectedDomNode:S,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:n,cdpResult:_},"Redirecting node to assigned slot");else return h("Filtering out node since it doesn't exist in the DOM",{cdpResult:_}),[]}catch(_){return h("Filtering out node since it doesn't exist in the DOM",{err:_}),[]}if(S&&e&&l&&c&&n.backendDOMNodeId&&!cI(S,c,u,m))return S.momenticIgnored=!0,[];if(S&&S.computedStyles.display==="none")return u.debug({domNode:S},"Filtering out node since it has display none"),S.momenticIgnored=!0,[];if(S&&S.attributes.tabindex==="-1"&&S.tagName.toLowerCase()==="input"&&(S.bounds.width??0)<10&&(S.bounds.height??0)<10)return kr({logger:u,logKey:m,maxCount:5,intervalMs:3e3},{attributes:S.attributes},"Filtering out node since it is likely an invisible input that is non-interactive"),S.momenticIgnored=!0,[];let x=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",b=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",w=new Ad({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:x,nameSources:n.name?.sources,content:b,properties:n.properties,children:[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+lI(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),E=r,C=s[t],I=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let _=r.childFrames.find(j=>j.frameId===S.ownedFrameId),B=o[_?.frameId??""]?.root,L=s[_?.frameId??""];if(_&&B&&L){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let j=B;n.childIds=j.childIds,E=_,C=L,I=_.frameId}}let N=S?.childrenBackendIds?.length??0,P=n.childIds?.length??0;if(N>P&&(!a||S?.computedStyles.opacity!=="0")){let _=n.childIds?.map(L=>C.get(parseInt(L))).filter(Boolean).map(L=>L?.backendDOMNodeId).filter(L=>L!==void 0)??[],B=0;for(let L of S?.childrenBackendIds??[]){if(_.includes(L)){B=(n.childIds?.findIndex(tt=>C.get(parseInt(tt))?.backendDOMNodeId===L)??0)+1;continue}let j=i.backendIdToNode[L];if(!j||j?.tagName.toLowerCase()!=="svg")continue;let O=Math.floor(-1*Math.random()*1e7),ee={nodeId:O.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:L,frameId:I,role:{type:"string",value:"graphics-symbol"}};C.set(O,ee),n.childIds||(n.childIds=[]),n.childIds.splice(B,0,O.toString()),B++}}for(let _ of n.childIds??[]){if(!_)continue;let B=C.get(parseInt(_));if(!B)continue;let L=await CS({node:B,parent:w,domGraph:i,axGraph:o,frameId:I,frameContext:E,inputNodeMap:s,cdpClient:d,logger:u,callId:m,filterByViewport:l,filterZeroOpacity:a,viewportDetails:c,useMPaths:p});L.length&&(w.children=w.children.concat(L))}if(w.role==="StaticText"&&(w.children=[]),w.children.length===1&&w.children[0].role==="StaticText"){let _=w.name,B=w.children[0]?.name;(_===B||!B)&&(w.children=[])}let D=[];for(let _=w.children.length-1;_>=0;_--){let B=w.children[_];if(B.role!=="StaticText"){D.push(B);continue}if(_===0||w.children[_-1].role!=="StaticText"){D.push(B);continue}w.children[_-1].name+=B.name}if(w.children=D.reverse(),w.role==="generic"&&w.children.length===1){let _=w.children[0];if(w.name&&!Wa.includes(_.role)&&w.name===_.name)return S&&(S.momenticIgnored=!0),w.children}if(!w.isInteresting()&&n.parentId)return S&&(S.momenticIgnored=!0),w.children;for(let _ of w.children)_.parent=w;return uI(w),S&&p&&Cd(S,i),[w]}function RS({node:n,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,domGraph:i,useMPaths:s,selectorToNodeMap:a,iconKnowledgeBase:l,startId:c=1}){n.id=c,c+=1,e[n.id]=n,n.dataMomenticId?t[n.dataMomenticId]=n:Wa.includes(n.role);let p=n.backendNodeId,d=p!==void 0?i.backendIdToNode[p]:void 0;if(s&&p&&d&&d.mPathSelector&&(a[d.mPathSelector]=n),l&&d&&d.tagName?.toLowerCase()==="svg"){let u=ja(d,i),m=u?l[u.hash]:void 0,h=m?m.description:void 0;m&&(n.properties["data-momentic-description"]=h)}for(let u of n.children)c=RS({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:s,domGraph:i,selectorToNodeMap:a,iconKnowledgeBase:l});return c}async function AS({rawA11yGraph:n,domGraph:e,startingFrameId:t,logger:r,cdpClient:o,filterByViewport:i,filterZeroOpacity:s,viewportDetails:a,useMPaths:l,frameContext:c,iconKnowledgeBase:p}){let d=t??"root",u=n[d]?.root;if(!u)throw new Error("A11y tree has no root");let m=JA(),h=w=>{let E=w.allNodes.filter(I=>!I.ignoredReasons?.find(P=>nI.includes(P.name))),C=new Map;return E.forEach(I=>{C.set(parseInt(I.nodeId),I)}),C},g={};Object.entries(n).forEach(([w,E])=>{g[w]=h(E)});let f=await CS({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:n,frameId:d,frameContext:c,cdpClient:o,logger:r,callId:m,filterZeroOpacity:s,filterByViewport:i,viewportDetails:a,useMPaths:l});if(f.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(f)}`);if(f.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let S={},x={},b={};return RS({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:x,selectorToNodeMap:b,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:p}),new Id(f[0],S,x,b)}function dI(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!Dn.bannedClassSubstrings.some(s=>i.includes(s))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(IS(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let r=parseInt(e);if(!isNaN(r))return r}catch{}return n==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function pI(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,s])=>{if(Dn.relevantElementAttributes.includes(i)&&!QA.includes(i)&&!n[i]&&!i.startsWith("aria")){let a=dI(i,s,e);a!==null&&(n[i]=a)}});let t,r=[];if(e.computedStyles.position&&xS.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of xS)if(e.attributes.style.includes(`position: ${i}`)){t=i;break}}t&&r.push(`position: ${t}`);let o;(e.computedStyles.opacity&&e.computedStyles.opacity==="0"||e.attributes.style&&e.attributes.style.includes("opacity: 0"))&&(o="opacity: 0"),o&&r.push(o),r.length>0&&(n.style=r.join("; "))}function uI(n){let e=n.properties.class;if(typeof e=="string"&&e.includes("cm-content")){n.children.forEach((i,s)=>{i.properties["cm-line-number"]=`${s+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){n.children.forEach((i,s)=>{i.properties["block-number"]=`${s+1}`}),n.children.length>0&&(n.children[n.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(n.tagName==="table"){let i=[],s=n.children.find(l=>l.tagName==="thead");if(s){let l=s.children.find(c=>c.tagName==="tr");if(l){let c=l.children.filter(p=>p.tagName==="th");c.forEach((p,d)=>{p.properties["col-index"]||(p.properties["col-index"]=d+1),i?.push(Me(p.name,100,!1))}),i?.length!==c.length&&(i=void 0)}}let a=0;for(let l of n.children)if(l.tagName==="tbody")for(let c=0;c<l.children.length;c++){let p=l.children[c];if(p.tagName!=="tr")continue;if(c===0&&!i?.length){let m=p.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>Me(h.name,100,!1)),i.length===m.length)continue;i=void 0}}a+=1,p.properties["row-index"]||(p.properties["row-index"]=a);let d=p.children.filter(m=>m.tagName==="td"||m.tagName==="th"),u=d.length===i?.length;d.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),u&&(m.properties.col||(m.properties.col=i[h])))})}}}function mI(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function IS(n){if(Dn.bannedClassSubstrings.some(e=>n.includes(e)))return!1;if(Dn.alwaysInterestingClassNames.includes(n))return!0;for(let e of Dn.alwaysInterestingClassPrefixes)if(n.startsWith(e))return!0;return!1}var Ga=class n{constructor(e,t,r,o,i){this.session=e;this.logger=t;this.contextGetter=r;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;static async init({logger:e,contextGetter:t,pageGetter:r,defaultTimeoutMs:o}){let i=t(),s=r(),a,l;for(let p=0;p<2;p++)try{a=await U(i.newCDPSession(s),{milliseconds:o*p,fallback:()=>{throw new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${s.url()})`)}});break}catch(d){await ne(500),l=d}if(!a)throw l;let c=new n(a,e,t,r,o);try{await U(c.registerHandlers(a),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(p){throw c.cdpFullyDead=!0,new R("UserInfrastructureError",`Failed to initialize CDP client: ${p}`)}return c}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.debug({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),await e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:r=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await this.cdpInitializingPromise;if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new R("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await U(this.session.send(e,t),{milliseconds:r,message:o??`Chrome command ${e} timed out after ${r}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(s=>i.message.includes(s))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,r=this.pageGetter(),o=await U(this.contextGetter().newCDPSession(r),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${r.url()})`),new R("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${r.url()})`)}});return this.logger.debug(`Created new CDP session for ${r.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await this.registerHandlers(this.session),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await U(t.detach(),{milliseconds:1e3})}catch(r){this.logger.warn({err:r},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};import{mkdirSync as hI,rmSync as PS,statSync as gI}from"fs";import*as Od from"node:fs";import fI from"nodejs-file-downloader";import{tmpdir as SI}from"os";import ir,{basename as yI,dirname as bI}from"path";var kd="file://",Ld=ir.join(SI(),"momentic","downloads"),Pd=1e4,wI=50*1024*1024;async function LS(n){let{uri:e}=n;return e.startsWith(kd)?xI(n):e.startsWith("http")?EI(n):TI(n)}function vI(n,e){let t=ir.join(Ld,n,e.slice(kd.length)),r=ir.join(Ld,n),o=t.startsWith(r);if(!Od.existsSync(t)||!o)throw new R("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function xI({uri:n,orgId:e}){let t=vI(e,n);return{filePath:t,cleanup:()=>{PS(bI(t),{recursive:!0,force:!0})}}}async function TI({uri:n}){let e=ir.resolve(n);if(!Od.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${n}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function EI({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=yI(r.href),i=_d(o),s=ir.extname(i);if(vh.includes(s))throw new Error(`Downloading files with extension ${s} is not allowed.`);let a=Nd(t),l=new fI({url:n,fileName:i,directory:a,maxAttempts:2,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:Pd}),{downloadStatus:c,filePath:p}=await U(l.download(),{milliseconds:Pd,message:`Download timed out after ${Pd}ms`});if(c!=="COMPLETE")throw new Error(`Download ended in non-success status: ${c}`);if(!p)throw new Error("File path of successfully downloaded file was empty");let u=gI(p).size;if(u>wI)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:u,filePath:p,fileName:i},"Downloaded file to disk");let m;return{filePath:p,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>PS(a,{recursive:!0,force:!0}),10*60*1e3)}}}function OS(n,e){return`${kd}${n}/${e}`}function Nd(n){let e=Math.random().toString(36).substring(4),t=ir.join(Ld,n,e);return hI(t,{recursive:!0}),t}function _d(n){let e=ir.extname(n),t=ir.basename(n,e);return n=(t.length>100?t.slice(t.length-100):t)+e,n=n.trim().replaceAll(" ","_"),n}async function cn(n,e){try{return await n.evaluate(r=>window.serializeElementOnlyWithText?.(r,{truncateToLength:500}),void 0,{timeout:1e3})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}var Va=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let s=this.userActions.get(o)?.filter(a=>r-a<=this.windowMs)??[];s.length>0?this.userActions.set(o,s):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(r),!1)}};async function kS(n,e){let t=n.evaluate(async()=>{let i=window,s={};try{let a=await indexedDB.databases();for(let l of a){if(!l.name)continue;let c=await i.exportIdbToObject?.(l.name,l.version);c&&(s[l.name]=c)}return[s,void 0]}catch(a){return[void 0,a.message]}}),[r,o]=await U(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function NS(n,e,t){if(e){t.debug("Importing indexedDB data");try{let r=n.evaluate(async o=>{let i=window;for(let[s,a]of Object.entries(o))await i.importObjectToIdb?.(s,a)},e);await U(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function _S(n,e){try{let t=n.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(r=>{r.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await U(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function MS(n,e,t,r,o){try{await CI(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function CI(n,e,t,r){let o=r.text();o.length>Ki&&(o=o.slice(0,Ki)+"...(TRUNCATED)");let i=[];for(let s of r.args())try{let a=await s.jsonValue(),l=JSON.stringify(a);l.length>Ki?i.push(l.slice(0,Ki)+"...(TRUNCATED)"):(typeof a!="object"||Object.keys(a).length>0)&&i.push(a)}catch{}Md(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function Md(n,e,t,r){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let s=0;s<t;s++)i[s]===void 0&&(i[s]=[])}i[t].length>Td&&(i[t]=i[t].slice(Math.floor(Td/2)),i[t]?.push({url:n.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...r,tabIndex:t,timestamp:o})}async function Un({fn:n,codePath:e,logObject:t,signal:r,logger:o}){r?.throwIfAborted();let i=Date.now(),s=await Wi({promiseGenerator:n,signal:r,codePath:e,logger:o}),a=Date.now();return t[e]=a-i,s}import{randomUUID as RI}from"crypto";var AI="[redacted due to size]",II=1e4;async function zS(n,e,t){let r=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[n]={id:n,startedDateTime:r,title:void 0,pageTimings:{}}}async function jS(n,e,t,r){try{await PI(n,e,t)}catch(o){o.message.includes("browser has been closed")||r.warn({err:o,pageId:n},"Error handling new network request, skipping...")}}function jr(n){return n<0?0:n}function FS(n){return{timings:{blocked:jr(n.domainLookupStart),dns:jr(n.domainLookupEnd-n.domainLookupStart),connect:jr(n.connectEnd-n.connectStart),send:jr(n.responseStart-n.requestStart),wait:0,receive:jr(n.responseEnd-n.responseStart),ssl:jr(n.connectEnd-n.secureConnectionStart)},total:jr(n.responseEnd)}}async function PI(n,e,t){let r=RI(),o=t.timing(),i=new URL(t.url()),s=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),a={...await BS(t),url:i.toString(),method:t.method(),queryString:s,postData:await OI(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:a,timings:FS(o).timings};DS(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await kI(c)}catch{}let g={...await BS(c),status:c.status(),statusText:c.statusText(),content:h,redirectURL:c.headers().location};l.response=g}let p;try{p=await t.sizes(),l.request.bodySize=p.requestBodySize,l.request.headersSize=p.requestHeadersSize}catch{}l.response&&p&&(l.response.bodySize=p.responseBodySize,l.response.headersSize=p.responseHeadersSize,l.response.content.size=p.responseBodySize);let d=t.timing(),{timings:u,total:m}=FS(d);l.time=m,l.timings=u,DS(e,l,r)}function DS(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function US(n){try{return new Date(n).toISOString()}catch{return}}function LI(n){let e={name:"",value:""},t=!0;for(let r of n.split(/; */)){let o=r.indexOf("="),i=o!==-1?r.substring(0,o).trim():r.trim(),s=o!==-1?r.substring(o+1,r.length).trim():"";if(t){t=!1,e.name=En(i),e.value=En(s);continue}i==="Domain"&&(e.domain=En(s)),i==="Expires"&&(e.expires=US(s)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=US(Date.now()+ +s*1e3)),i==="Path"&&(e.path=En(s)),i==="Secure"&&(e.secure=!0)}return e}async function BS(n){let e=await n.headersArray(),t=[];for(let r of e.filter(o=>o.name.toLowerCase()==="cookie"))t.push(...r.value.split(";").map(LI));return{headers:e.map(r=>({name:En(r.name),value:En(r.value)})),cookies:t}}async function OI(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:En(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,s]of o.entries())r.params.push({name:En(i),value:s?En(s):void 0})}return r}async function kI(n){return{mimeType:await n.headerValue("content-type")??void 0,text:En(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function En(n){return n.length>II?AI:n}function HS(){return async n=>{let{fragment:e,code:t,context:r}=n,{env:o}=r||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function qe({root:n,fn:e,arg:t,timeout:r,waitForPageLoad:o,codePath:i}){return await o(),await U(n.evaluate(e,t),{milliseconds:r,message:`Timed out executing code path ${i} after ${r}ms`})}function Fd(){return window.lastCursorPos}import{errors as NI}from"playwright-core";async function Hr({func:n,action:e,logger:t,callbacks:r,retryTimeoutMs:o,targetingResult:i}){let s=Date.now(),a;for(;Date.now()-s<o;)try{return await n(i)}catch(l){let c=l;if(fa(c)){t.warn("Attempting to recover from removed data-momentic-ids by re-adding ids to DOM");let[p]=await Promise.all([n(i),r.getBrowserState({skipWaitForPageLoad:!0,skipWait:!0})]);return p}else if(c instanceof NI.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),a=await _I(c,i.locator,r,t);else throw c}throw a instanceof R?a:new R("ActionFailureError",`Failed to interact with targeted element. Error: ${a.message}`,{errOptions:{cause:a}})}async function _I(n,e,t,r){return n.message.includes("attempt #")?MI(n,e,t,r):FI(n)}async function MI(n,e,t,r){let o=n.message.split(/- retrying \w+ action, attempt #\d+/).filter(l=>l.length>0);if(!o.length)return r.warn({err:n},"Failed to parse Playwright error message for translation, returning raw message"),n;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
3547
+ ${I||""}`}return S}shallowClone(){let e=new n({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:Ad(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=Ad(this.properties),e}},Pd=class n{constructor(e,t,r,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=r;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function r(i,s=!1){let a=e.has(`${i.id}`)||i.id===t?.id,l=i.shallowClone(),c=i.children,p=!1,d=[];for(let u of c){let m=r(u,a||p);m&&(d.push(m),m.parent=l,p=!0)}if(l.children=d,a||p)return l;if(Wa.includes(i.role)&&s)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function uI(n){return n.name?.value?`"${n.name.value}"`:n.role?.value&&n.role.value!=="none"&&n.role.value!=="generic"?`"${n.role.value}"`:`"${n.nodeId}"`}function mI(n,e,t,r){return n.bounds.x===null||n.bounds.y===null||n.bounds.height===null||n.bounds.width===null||n.bounds.width===0||n.bounds.height===0?!0:n.bounds.x+n.bounds.width<e.leftBound||n.bounds.x>e.rightBound?(kr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport horizontally"),!1):n.bounds.y+n.bounds.height<e.upperBound||n.bounds.y>e.lowerBound?(kr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport vertically"),!1):n.computedStyles.display==="none"?(t.debug({domNode:n},"Filtering out node since it has display none"),!1):!0}async function AS({node:n,parent:e,frameId:t,frameContext:r,axGraph:o,domGraph:i,inputNodeMap:s,filterZeroOpacity:a,filterByViewport:l,viewportDetails:c,useMPaths:p,cdpClient:d,logger:u,callId:m}){if(!e&&n.parentId)throw new Error(`Got no parent for accessibility node ${n.nodeId}: ${JSON.stringify(n)}`);let h=(_,B={})=>{},g=n.backendDOMNodeId,f=aI.includes((n.role?.value).toLowerCase());if(!f&&g===void 0)return h("Filtering out node since it doesn't exist in the DOM"),[];let S=g?i.backendIdToNode[g]:void 0;if(!f&&!S)try{let _=await U(d.send({method:"DOM.describeNode",params:{backendNodeId:g}}),{milliseconds:750,fallback:()=>{u.debug("Timeout getting node from CDP while processing a11y tree")}});if(_&&_.node.nodeName.toLowerCase()==="slot"&&_.node.distributedNodes?.length)u.debug({redirectedDomNode:S,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:n,cdpResult:_},"Redirecting node to assigned slot");else return h("Filtering out node since it doesn't exist in the DOM",{cdpResult:_}),[]}catch(_){return h("Filtering out node since it doesn't exist in the DOM",{err:_}),[]}if(S&&e&&l&&c&&n.backendDOMNodeId&&!mI(S,c,u,m))return S.momenticIgnored=!0,[];if(S&&S.computedStyles.display==="none")return u.debug({domNode:S},"Filtering out node since it has display none"),S.momenticIgnored=!0,[];if(S&&S.attributes.tabindex==="-1"&&S.tagName.toLowerCase()==="input"&&(S.bounds.width??0)<10&&(S.bounds.height??0)<10)return kr({logger:u,logKey:m,maxCount:5,intervalMs:3e3},{attributes:S.attributes},"Filtering out node since it is likely an invisible input that is non-interactive"),S.momenticIgnored=!0,[];let x=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",b=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",w=new Id({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:x,nameSources:n.name?.sources,content:b,properties:n.properties,children:[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+uI(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),E=r,C=s[t],I=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let _=r.childFrames.find(j=>j.frameId===S.ownedFrameId),B=o[_?.frameId??""]?.root,L=s[_?.frameId??""];if(_&&B&&L){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let j=B;n.childIds=j.childIds,E=_,C=L,I=_.frameId}}let N=S?.childrenBackendIds?.length??0,P=n.childIds?.length??0;if(N>P&&(!a||S?.computedStyles.opacity!=="0")){let _=n.childIds?.map(L=>C.get(parseInt(L))).filter(Boolean).map(L=>L?.backendDOMNodeId).filter(L=>L!==void 0)??[],B=0;for(let L of S?.childrenBackendIds??[]){if(_.includes(L)){B=(n.childIds?.findIndex(tt=>C.get(parseInt(tt))?.backendDOMNodeId===L)??0)+1;continue}let j=i.backendIdToNode[L];if(!j||j?.tagName.toLowerCase()!=="svg")continue;let O=Math.floor(-1*Math.random()*1e7),ee={nodeId:O.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:L,frameId:I,role:{type:"string",value:"graphics-symbol"}};C.set(O,ee),n.childIds||(n.childIds=[]),n.childIds.splice(B,0,O.toString()),B++}}for(let _ of n.childIds??[]){if(!_)continue;let B=C.get(parseInt(_));if(!B)continue;let L=await AS({node:B,parent:w,domGraph:i,axGraph:o,frameId:I,frameContext:E,inputNodeMap:s,cdpClient:d,logger:u,callId:m,filterByViewport:l,filterZeroOpacity:a,viewportDetails:c,useMPaths:p});L.length&&(w.children=w.children.concat(L))}if(w.role==="StaticText"&&(w.children=[]),w.children.length===1&&w.children[0].role==="StaticText"){let _=w.name,B=w.children[0]?.name;(_===B||!B)&&(w.children=[])}let D=[];for(let _=w.children.length-1;_>=0;_--){let B=w.children[_];if(B.role!=="StaticText"){D.push(B);continue}if(_===0||w.children[_-1].role!=="StaticText"){D.push(B);continue}w.children[_-1].name+=B.name}if(w.children=D.reverse(),w.role==="generic"&&w.children.length===1){let _=w.children[0];if(w.name&&!Wa.includes(_.role)&&w.name===_.name)return S&&(S.momenticIgnored=!0),w.children}if(!w.isInteresting()&&n.parentId)return S&&(S.momenticIgnored=!0),w.children;for(let _ of w.children)_.parent=w;return fI(w),S&&p&&Rd(S,i),[w]}function IS({node:n,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,domGraph:i,useMPaths:s,selectorToNodeMap:a,iconKnowledgeBase:l,startId:c=1}){n.id=c,c+=1,e[n.id]=n,n.dataMomenticId?t[n.dataMomenticId]=n:Wa.includes(n.role);let p=n.backendNodeId,d=p!==void 0?i.backendIdToNode[p]:void 0;if(s&&p&&d&&d.mPathSelector&&(a[d.mPathSelector]=n),l&&d&&d.tagName?.toLowerCase()==="svg"){let u=ja(d,i),m=u?l[u.hash]:void 0,h=m?m.description:void 0;m&&(n.properties["data-momentic-description"]=h)}for(let u of n.children)c=IS({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:s,domGraph:i,selectorToNodeMap:a,iconKnowledgeBase:l});return c}async function PS({rawA11yGraph:n,domGraph:e,startingFrameId:t,logger:r,cdpClient:o,filterByViewport:i,filterZeroOpacity:s,viewportDetails:a,useMPaths:l,frameContext:c,iconKnowledgeBase:p}){let d=t??"root",u=n[d]?.root;if(!u)throw new Error("A11y tree has no root");let m=eI(),h=w=>{let E=w.allNodes.filter(I=>!I.ignoredReasons?.find(P=>sI.includes(P.name))),C=new Map;return E.forEach(I=>{C.set(parseInt(I.nodeId),I)}),C},g={};Object.entries(n).forEach(([w,E])=>{g[w]=h(E)});let f=await AS({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:n,frameId:d,frameContext:c,cdpClient:o,logger:r,callId:m,filterZeroOpacity:s,filterByViewport:i,viewportDetails:a,useMPaths:l});if(f.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(f)}`);if(f.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let S={},x={},b={};return IS({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:x,selectorToNodeMap:b,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:p}),new Pd(f[0],S,x,b)}function hI(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!Dn.bannedClassSubstrings.some(s=>i.includes(s))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(LS(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let r=parseInt(e);if(!isNaN(r))return r}catch{}return n==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function gI(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,s])=>{if(Dn.relevantElementAttributes.includes(i)&&!rI.includes(i)&&!n[i]&&!i.startsWith("aria")){let a=hI(i,s,e);a!==null&&(n[i]=a)}});let t,r=[];if(e.computedStyles.position&&ES.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of ES)if(e.attributes.style.includes(`position: ${i}`)){t=i;break}}t&&r.push(`position: ${t}`);let o;(e.computedStyles.opacity&&e.computedStyles.opacity==="0"||e.attributes.style&&e.attributes.style.includes("opacity: 0"))&&(o="opacity: 0"),o&&r.push(o),r.length>0&&(n.style=r.join("; "))}function fI(n){let e=n.properties.class;if(typeof e=="string"&&e.includes("cm-content")){n.children.forEach((i,s)=>{i.properties["cm-line-number"]=`${s+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){n.children.forEach((i,s)=>{i.properties["block-number"]=`${s+1}`}),n.children.length>0&&(n.children[n.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(n.tagName==="table"){let i=[],s=n.children.find(l=>l.tagName==="thead");if(s){let l=s.children.find(c=>c.tagName==="tr");if(l){let c=l.children.filter(p=>p.tagName==="th");c.forEach((p,d)=>{p.properties["col-index"]||(p.properties["col-index"]=d+1),i?.push(Me(p.name,100,!1))}),i?.length!==c.length&&(i=void 0)}}let a=0;for(let l of n.children)if(l.tagName==="tbody")for(let c=0;c<l.children.length;c++){let p=l.children[c];if(p.tagName!=="tr")continue;if(c===0&&!i?.length){let m=p.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>Me(h.name,100,!1)),i.length===m.length)continue;i=void 0}}a+=1,p.properties["row-index"]||(p.properties["row-index"]=a);let d=p.children.filter(m=>m.tagName==="td"||m.tagName==="th"),u=d.length===i?.length;d.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),u&&(m.properties.col||(m.properties.col=i[h])))})}}}function SI(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function LS(n){if(Dn.bannedClassSubstrings.some(e=>n.includes(e)))return!1;if(Dn.alwaysInterestingClassNames.includes(n))return!0;for(let e of Dn.alwaysInterestingClassPrefixes)if(n.startsWith(e))return!0;return!1}var Ga=class n{constructor(e,t,r,o,i){this.session=e;this.logger=t;this.contextGetter=r;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;static async init({logger:e,contextGetter:t,pageGetter:r,defaultTimeoutMs:o}){let i=t(),s=r(),a,l;for(let p=0;p<2;p++)try{a=await U(i.newCDPSession(s),{milliseconds:o*p,fallback:()=>{throw new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${s.url()})`)}});break}catch(d){await ne(500),l=d}if(!a)throw l;let c=new n(a,e,t,r,o);try{await U(c.registerHandlers(a),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(p){throw c.cdpFullyDead=!0,new R("UserInfrastructureError",`Failed to initialize CDP client: ${p}`)}return c}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.debug({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),await e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:r=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await this.cdpInitializingPromise;if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new R("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await U(this.session.send(e,t),{milliseconds:r,message:o??`Chrome command ${e} timed out after ${r}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(s=>i.message.includes(s))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,r=this.pageGetter(),o=await U(this.contextGetter().newCDPSession(r),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${r.url()})`),new R("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${r.url()})`)}});return this.logger.debug(`Created new CDP session for ${r.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await this.registerHandlers(this.session),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await U(t.detach(),{milliseconds:1e3})}catch(r){this.logger.warn({err:r},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};import{mkdirSync as yI,rmSync as OS,statSync as bI}from"fs";import*as kd from"node:fs";import wI from"nodejs-file-downloader";import{tmpdir as vI}from"os";import ir,{basename as xI,dirname as TI}from"path";var Nd="file://",Od=ir.join(vI(),"momentic","downloads"),Ld=1e4,EI=50*1024*1024;async function kS(n){let{uri:e}=n;return e.startsWith(Nd)?RI(n):e.startsWith("http")?II(n):AI(n)}function CI(n,e){let t=ir.join(Od,n,e.slice(Nd.length)),r=ir.join(Od,n),o=t.startsWith(r);if(!kd.existsSync(t)||!o)throw new R("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function RI({uri:n,orgId:e}){let t=CI(e,n);return{filePath:t,cleanup:()=>{OS(TI(t),{recursive:!0,force:!0})}}}async function AI({uri:n}){let e=ir.resolve(n);if(!kd.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${n}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function II({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=xI(r.href),i=Md(o),s=ir.extname(i);if(Th.includes(s))throw new Error(`Downloading files with extension ${s} is not allowed.`);let a=_d(t),l=new wI({url:n,fileName:i,directory:a,maxAttempts:2,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:Ld}),{downloadStatus:c,filePath:p}=await U(l.download(),{milliseconds:Ld,message:`Download timed out after ${Ld}ms`});if(c!=="COMPLETE")throw new Error(`Download ended in non-success status: ${c}`);if(!p)throw new Error("File path of successfully downloaded file was empty");let u=bI(p).size;if(u>EI)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:u,filePath:p,fileName:i},"Downloaded file to disk");let m;return{filePath:p,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>OS(a,{recursive:!0,force:!0}),10*60*1e3)}}}function NS(n,e){return`${Nd}${n}/${e}`}function _d(n){let e=Math.random().toString(36).substring(4),t=ir.join(Od,n,e);return yI(t,{recursive:!0}),t}function Md(n){let e=ir.extname(n),t=ir.basename(n,e);return n=(t.length>100?t.slice(t.length-100):t)+e,n=n.trim().replaceAll(" ","_"),n}async function cn(n,e){try{return await n.evaluate(r=>window.serializeElementOnlyWithText?.(r,{truncateToLength:500}),void 0,{timeout:1e3})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}var Va=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let s=this.userActions.get(o)?.filter(a=>r-a<=this.windowMs)??[];s.length>0?this.userActions.set(o,s):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(r),!1)}};async function _S(n,e){let t=n.evaluate(async()=>{let i=window,s={};try{let a=await indexedDB.databases();for(let l of a){if(!l.name)continue;let c=await i.exportIdbToObject?.(l.name,l.version);c&&(s[l.name]=c)}return[s,void 0]}catch(a){return[void 0,a.message]}}),[r,o]=await U(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function MS(n,e,t){if(e){t.debug("Importing indexedDB data");try{let r=n.evaluate(async o=>{let i=window;for(let[s,a]of Object.entries(o))await i.importObjectToIdb?.(s,a)},e);await U(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function FS(n,e){try{let t=n.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(r=>{r.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await U(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function DS(n,e,t,r,o){try{await PI(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function PI(n,e,t,r){let o=r.text();o.length>Yi&&(o=o.slice(0,Yi)+"...(TRUNCATED)");let i=[];for(let s of r.args())try{let a=await s.jsonValue(),l=JSON.stringify(a);l.length>Yi?i.push(l.slice(0,Yi)+"...(TRUNCATED)"):(typeof a!="object"||Object.keys(a).length>0)&&i.push(a)}catch{}Fd(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function Fd(n,e,t,r){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let s=0;s<t;s++)i[s]===void 0&&(i[s]=[])}i[t].length>Ed&&(i[t]=i[t].slice(Math.floor(Ed/2)),i[t]?.push({url:n.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...r,tabIndex:t,timestamp:o})}async function Un({fn:n,codePath:e,logObject:t,signal:r,logger:o}){r?.throwIfAborted();let i=Date.now(),s=await Gi({promiseGenerator:n,signal:r,codePath:e,logger:o}),a=Date.now();return t[e]=a-i,s}import{randomUUID as LI}from"crypto";var OI="[redacted due to size]",kI=1e4;async function HS(n,e,t){let r=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[n]={id:n,startedDateTime:r,title:void 0,pageTimings:{}}}async function $S(n,e,t,r){try{await NI(n,e,t)}catch(o){o.message.includes("browser has been closed")||r.warn({err:o,pageId:n},"Error handling new network request, skipping...")}}function jr(n){return n<0?0:n}function US(n){return{timings:{blocked:jr(n.domainLookupStart),dns:jr(n.domainLookupEnd-n.domainLookupStart),connect:jr(n.connectEnd-n.connectStart),send:jr(n.responseStart-n.requestStart),wait:0,receive:jr(n.responseEnd-n.responseStart),ssl:jr(n.connectEnd-n.secureConnectionStart)},total:jr(n.responseEnd)}}async function NI(n,e,t){let r=LI(),o=t.timing(),i=new URL(t.url()),s=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),a={...await jS(t),url:i.toString(),method:t.method(),queryString:s,postData:await MI(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:a,timings:US(o).timings};BS(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await FI(c)}catch{}let g={...await jS(c),status:c.status(),statusText:c.statusText(),content:h,redirectURL:c.headers().location};l.response=g}let p;try{p=await t.sizes(),l.request.bodySize=p.requestBodySize,l.request.headersSize=p.requestHeadersSize}catch{}l.response&&p&&(l.response.bodySize=p.responseBodySize,l.response.headersSize=p.responseHeadersSize,l.response.content.size=p.responseBodySize);let d=t.timing(),{timings:u,total:m}=US(d);l.time=m,l.timings=u,BS(e,l,r)}function BS(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function zS(n){try{return new Date(n).toISOString()}catch{return}}function _I(n){let e={name:"",value:""},t=!0;for(let r of n.split(/; */)){let o=r.indexOf("="),i=o!==-1?r.substring(0,o).trim():r.trim(),s=o!==-1?r.substring(o+1,r.length).trim():"";if(t){t=!1,e.name=En(i),e.value=En(s);continue}i==="Domain"&&(e.domain=En(s)),i==="Expires"&&(e.expires=zS(s)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=zS(Date.now()+ +s*1e3)),i==="Path"&&(e.path=En(s)),i==="Secure"&&(e.secure=!0)}return e}async function jS(n){let e=await n.headersArray(),t=[];for(let r of e.filter(o=>o.name.toLowerCase()==="cookie"))t.push(...r.value.split(";").map(_I));return{headers:e.map(r=>({name:En(r.name),value:En(r.value)})),cookies:t}}async function MI(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:En(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,s]of o.entries())r.params.push({name:En(i),value:s?En(s):void 0})}return r}async function FI(n){return{mimeType:await n.headerValue("content-type")??void 0,text:En(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function En(n){return n.length>kI?OI:n}function WS(){return async n=>{let{fragment:e,code:t,context:r}=n,{env:o}=r||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function qe({root:n,fn:e,arg:t,timeout:r,waitForPageLoad:o,codePath:i}){return await o(),await U(n.evaluate(e,t),{milliseconds:r,message:`Timed out executing code path ${i} after ${r}ms`})}function Dd(){return window.lastCursorPos}import{errors as DI}from"playwright-core";async function Hr({func:n,action:e,logger:t,callbacks:r,retryTimeoutMs:o,targetingResult:i}){let s=Date.now(),a;for(;Date.now()-s<o;)try{return await n(i)}catch(l){let c=l;if(Bi(c)){t.warn("Attempting to recover from removed data-momentic-ids by re-adding ids to DOM");let[p]=await Promise.all([n(i),r.getBrowserState({skipWaitForPageLoad:!0,skipWait:!0})]);return p}else if(c instanceof DI.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),a=await UI(c,i.locator,r,t);else throw c}throw a instanceof R?a:new R("ActionFailureError",`Failed to interact with targeted element. Error: ${a.message}`,{errOptions:{cause:a}})}async function UI(n,e,t,r){return n.message.includes("attempt #")?BI(n,e,t,r):zI(n)}async function BI(n,e,t,r){let o=n.message.split(/- retrying \w+ action, attempt #\d+/).filter(l=>l.length>0);if(!o.length)return r.warn({err:n},"Failed to parse Playwright error message for translation, returning raw message"),n;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
3530
3548
  `,";").replace(/\s+/g," ");let s="",a=await cn(e,r);if(a&&(s=`Target element HTML: ${Me(a,100,!0)}`),i.includes("element is not enabled"))return new R("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${s}`,{errOptions:{cause:n}});if(i.includes("intercepts pointer events")){let l="",c=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(c){let p=(await t.state.getRoot()).locator(`[data-momentic-id="${c}"]`),d=await cn(p,r);d&&(l=`Covering element HTML: ${Me(d,100,!0)}`)}return new R("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${s}
3531
- ${l}`,{errOptions:{cause:n}})}if(i.includes("element is not visible")){let l="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let c=await e.boundingBox({timeout:1e3});c?c.height===0?l="The element you attempted to interact with has zero height.":c.width===0&&(l="The element you attempted to interact with has zero width."):l="The element you attempted to interact with has no bounding box."}catch{}return new R("ActionFailureError",`${l} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${s}`,{errOptions:{cause:n}})}return i.includes("element is outside of the viewport")?new R("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${s}`):n}function FI(n){let e=n.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new R("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:n}});return n}async function $S(n){try{return await DI(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function DI({locator:n,logger:e}){let[t,r]=await n.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await cn(n,e),i=await n.boundingBox({timeout:1e3});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5)return;if(r==="input"&&t)try{let l=n.page().locator(`label[for=${JSON.stringify(t)}]`);return await l.waitFor({state:"visible",timeout:1e3}),{locator:l,relativePoint:void 0}}catch{}let s=await n.evaluate(l=>{let c=window;if(!c.CssSelectorGenerator)return{type:"error",error:"[MOMENTIC] Missing CSS selector libraries"};let p=l.parentElement;if(!p)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.CssSelectorGenerator.getCssSelector(p,{}),u=l.getBoundingClientRect(),m=p.getBoundingClientRect();if(m.width===0||m.height===0)return{type:"error",error:"Parent element has no width or height"};let h={x:Math.min(Math.max(1,u.left-m.left),m.width-1),y:Math.min(Math.max(1,u.top-m.top),m.height-1)};return{type:"result",selector:d,relativePoint:h,serializedForm:p.outerHTML.slice(0,500)}},{timeout:1e3});if(s.type==="error")throw new Error(s.error);let a=n.page().locator(s.selector);return await a.waitFor({state:"visible",timeout:1e3}),e.info({parentElementResult:s,originalElementDisplayString:o},`Redirected click to parent element with selector: ${s.selector}`),{locator:a,relativePoint:s.relativePoint}}var GS=["date","datetime-local","month","time","week"],WS={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function VS(n){try{await U(UI(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function UI({root:n,text:e,options:t,logger:r,callbacks:o}){let i=(await qe({root:n,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transformNativeDateTimeInputFillHelper"})).toLowerCase();if(!WS[i])return;WS[i].test(e)&&r.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,r.debug("Transforming datetime input to use sequential key presses")}async function qa({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await Dd(e,r);let o=n.evaluate(i=>{let s=window;s.momenticIsEligible=d=>{let m=window.getComputedStyle(d,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=d.getBoundingClientRect();return!(!h.height||!h.width)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let a=0;for(;!s.momenticIsEligible(i)&&a<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,a++}let l=i.style.getPropertyValue("outline"),c=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let p=`momentic${Math.floor(Math.random()*1e7)}`;s[p]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",l,c),i.getAttribute("style")||i.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[p](),s.removeHighlightFunctions?.[p]&&delete s.removeHighlightFunctions[p]},5e3)),s.removeHighlightFunctions[p]=s[p]},void 0,{timeout:r});return await U(o,{milliseconds:r}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Dd(n,e=1e3){let t=await n.state.getRoot();await qe({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let s=i.pop();clearTimeout(s)}Object.values(o.removeHighlightFunctions??{}).forEach(s=>{s()})},timeout:e,arg:void 0,waitForPageLoad:n.waitForPageLoad,codePath:"removeAllHighlights"})}async function Bd(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return Hr({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>Ud({...n,targetingResult:t,useVisualClick:e})})}async function HI(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await $I(n,e)}catch(r){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:r,originalError:n},"Error handling click error, rethrowing original error"),n):r}}async function $I(n,e){let{logger:t,redirectionAttempts:r=0,browserCallbacks:o,actionSource:i}=e,s=e.targetingResult.locator,a=o.state.getDomGraph();if(n.message.includes("label")&&n.message.includes("for=")&&n.message.includes("intercepts pointer events")){let l=await s.getAttribute("id",{timeout:1e3});if(!l)throw n;let c=s.page().locator(`[for=${JSON.stringify(l)}]`);return await c.waitFor({state:"visible",timeout:1e3}),t.warn({err:n},"Attempting locator redirection due to input being covered by label"),Ud({...e,targetingResult:{locator:c},redirectionAttempts:r+1})}else if(i==="click"&&a&&n.message.includes("intercepts pointer events")){t.warn({err:n},"Attempting locator redirection due to covering error");let l=await KI(s,a,t);if(l)return Ud({...e,targetingResult:{locator:l},redirectionAttempts:r+1});throw t.error({err:n},"No updated locator could be found to fix covering error, rethrowing"),n}else throw t.error({err:n},"Click error does not match any known recoverable patterns, rethrowing"),n}async function WI(n){let{browserCallbacks:e,logger:t,targetingResult:r,position:o,options:i}=n,s=await e.state.getRoot(),a=s&&s!==r.locator.page()&&"frameElement"in s?await s.frameElement():null,l;try{l=a?await Dr({promiseGenerator:async()=>a.boundingBox(),timeoutMs:3e3,logger:t}):null}catch(c){throw new R("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${c.message}`)}finally{await a?.dispose()}await qI({frameCoordinates:l,logger:t,targetingResult:r,position:o,options:i})}async function GI(n){let{actionSource:e,targetingResult:t,options:r,logger:o}=n,i=n.targetingResult.locator,s=r?.relativePosition??n.position;if(e==="click"&&!s){let l=await $S({locator:i,logger:o});l&&(i=l.locator,s=l.relativePoint??s)}let a=r?.force||t.hints?.force||!1;try{r?.doubleClick?await i.dblclick({button:r.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a}):await i.click({button:r?.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a})}catch(l){let c=l;if(JI(c))o.warn({err:c},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:c},"Error clicking on locator, attempting to recover..."),HI(c,{...n,targetingResult:{...i,locator:i}})}}async function Ud(n){let{options:e,logger:t,browserCallbacks:r,controllerCallbacks:o,useVisualClick:i,targetingResult:s}=n,a=(await r.state.getOpenPages()).map(d=>d.url),l=r.state.url(),c=null;try{c=await s.locator.getAttribute("target",{timeout:1e3})}catch(d){t.warn({err:d},"Failed to get attributes of element about to be clicked, continuing...")}let p;e?.waitForDownload&&(p=(async()=>{let d=e.downloadTimeoutMs??3e4;try{return await s.locator.page().waitForEvent("download",{timeout:d})}catch(u){return u instanceof jI.TimeoutError?new R("ActionFailureError",`Download did not complete in ${d}ms`):new R("ActionFailureError",`Download failed: ${u.message}`)}})());try{await qa({locator:s.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(d){t.warn({err:d},"Error highlighting locator in click, continuing...")}if(i?await WI(n):await GI(n),c==="_blank"){t.debug("Waiting for new page promise due to _blank target");let d=Date.now();for(;(await r.state.getOpenPages()).length<=a.length&&Date.now()-d<2e3;)await ne(500);await r.waitForPageLoad()}if(e?.waitForUrl&&await r.waitForUrl({beforeUrl:l,beforePages:a,matcher:{type:"GLOB",glob:e.waitForUrl}}),e?.waitForDownload)if(p){if(!o?.createIsolatedFolder)throw new R("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let d=await U(p,{milliseconds:e.downloadTimeoutMs??3e4});if(d instanceof Error)throw d;return{downloadedFile:await YI(d,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function VI(n,e){if(e.hints?.clickableXY){let i=(n?.x??0)+e.hints.clickableXY.x,s=(n?.y??0)+e.hints.clickableXY.y;return[{x:i,y:s},"targeting hint"]}let t=await e.locator.boundingBox({timeout:1e3});if(!t)throw new R("ActionFailureError","Element does not have a bounding box");let r=t.x+t.width/2,o=t.y+t.height/2;return[{x:r,y:o},"halfway point of the bounding box"]}async function qI({frameCoordinates:n,logger:e,options:t,targetingResult:r,position:o}){let i,s;if(o){let p=await r.locator.boundingBox({timeout:3e3});i=(n?.x??0)+(p?.x??0)+o.x,s=(n?.y??0)+(p?.y??0)+o.y,e.debug({clickX:i,clickY:s,frameCoordinates:n,position:o},"Clicking using XY: determined click coordinates using predefined position")}else{let[p,d]=await VI(n,r);i=p.x,s=p.y,e.debug({clickX:i,clickY:s,frameCoordinates:n,reason:d,targetingHints:r.hints},`Clicking using XY: determined click coordinates based on ${d}`)}let a=r.locator.page(),l=t?.rightClick?"right":"left",c=t?.delayMs??25;t?.doubleClick?await a.mouse.dblclick(i,s,{button:l,delay:c}):await a.mouse.click(i,s,{button:l,delay:c})}async function KI(n,e,t){let r=await n.evaluate(a=>a.getAttribute("data-momentic-id"));if(!r)return;let o=$a(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[bt]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let s=await cn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:s},"Trying new locator based on parent-direction after covering error"),n}async function YI(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=_d(n.suggestedFilename()),i=e();await n.saveAs(zI(i,o)),KS(r,{force:!0}),setTimeout(()=>{KS(i,{recursive:!0,force:!0})},5*60*1e3);let s=OS(BI(i),o);return t.debug({uri:s,downloadFolder:i},"Saved download to isolated folder"),s}function JI(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as XI}from"os";var ZI={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function QI(){let n=XI();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function YS(n){return JSON.stringify(n.split("+").sort())}function JS(n){let e=QI(),t=YS(n);for(let r of Object.values(ZI))if(Object.values(r).some(o=>YS(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function zd({frame:n,page:e,deltaX:t,directionX:r,deltaY:o,directionY:i,signal:s,callbacks:a}){if(!t&&!o)return;let l=r==="left"?-1:1,c=i==="up"?-1:1;if(n)await qe({root:n,fn:([p,d,u,m])=>window.scrollTo(window.scrollX+(p??window.innerWidth)*u,window.scrollY+(d??window.innerHeight)*m),arg:[t,o,l,c],waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollFrame"});else{let p=e.viewportSize()||rn,d=await qe({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollPageGetHeight"}),[u,m,h]=await qe({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollPage"});await e.mouse.wheel((t??p.width)*l,(o??p.height)*c);let g=Date.now();for(;Date.now()-g<2e3;){s?.throwIfAborted();let f=await U(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[S,x,b]=await U(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let E=w.getBoundingClientRect();return[w.scrollTop,E.x,E.y]}),{milliseconds:1e3});if(f===d&&S===u&&x===m&&b===h)break;d=f,u=S,m=x,h=b,await ne(500)}}}async function No(n,e){let t,r;for(let o=0;o<4;o++)try{return t=n.pages(),await Promise.all(t.map(async i=>{let s="";try{s=e?.getTitles?await i.title():""}catch{s="Unknown page"}return{title:s,url:i.url()}}))}catch(i){r=i,await ne(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var _o="<empty>";function eP(n){return n.includes("doubleclick.net")||n.includes("googletagmanager.com")||n.includes("googlesyndication.com")||n.includes("s.amazon-adsystem.com")||n.includes("smartadserver.com")||n.includes("omnitagjs.com")||n.includes("x.adroll.com")}function ZS(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||eP(n.url)}async function tP(n,e){let t=await n.send({timeout:3e3,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await n.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],s=(await n.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return s.nodeId=o,s}async function Mo({cdpClient:n,page:e,logger:t}){let r={type:"root",childFrames:[],page:e},o=[],[i]=await Promise.all([n.send({timeout:3e3,method:"Page.getFrameTree",params:{}}),n.send({timeout:3e3,method:"DOM.getDocument",params:{}})]),l=(i.frameTree.childFrames??[]).map(async(p,d)=>{if(ZS(p.frame))return null;try{return await QS({cdpClient:n,rawFrameTree:p,indices:[d],parent:r,warnings:o})}catch(u){return o.push(`Failed to get child frame: ${u}`),null}}),c=await Promise.all(l);return r.childFrames=c.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),r}async function QS({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o}){let i=e.frame.id,s=await tP(n,i),a=s.attributes??[],l=null,c=[];for(let m of["src","name","id","title","srcdoc","sandbox"]){let h=or(a,m);h&&(c.push(`${m}=${JSON.stringify(h)}`),m==="src"&&(l=h))}let p={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:i,locationData:{indices:t,attributeSelectors:c},src:l,childFrames:[],parent:r,domNode:s},u=(e.childFrames??[]).map(async(m,h)=>{if(ZS(m.frame))return null;try{return await QS({cdpClient:n,rawFrameTree:m,indices:[...t,h],parent:p,warnings:o})}catch(g){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${g}`),null}});return p.childFrames=(await Promise.all(u)).filter(m=>m!==null),p}async function nP(n){try{return await n.owner().count()===1}catch{return!1}}async function rP(n){try{return await n.count()===1}catch{return!1}}async function Cn(n,e){let t=[],r=n;for(;r.parent.type==="frame";)t.push(r.parent),r=r.parent;t.reverse();let o=e,i=[];for(let c of t){let p=!1;for(let d of[...c.locationData.attributeSelectors,_o]){let u=o.frameLocator(d===_o?"iframe":`iframe[${d}]`);if(await nP(u)){p=!0,o=u,i.push(d);break}}if(!p)throw new R("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${c.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let s;for(let c of[...n.locationData.attributeSelectors,_o]){let p=o.locator(c===_o?"iframe":`iframe[${c}]`);if(await rP(p)){s=p,i.push(c);break}}if(!s)throw new R("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${n.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let a=await s.evaluateHandle(c=>c,{timeout:1e3}),l=await a.asElement().contentFrame();if(!l)throw new R("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await a.dispose(),{frame:l,mPathSelectorTokens:i}}function XS(n,e){let t=[...n],r=[];for(;t.length;){let o=t.shift();e(o)&&r.push(o),t.push(...o.childFrames)}return r}async function ey({page:n,frameTree:e,cache:t}){let r,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let a=o;for(let p=0;p<t.mPathSelectorTokens.length-1;p++){let d=t.mPathSelectorTokens[p];d===_o?a=a.length===1?a[0].childFrames:[]:a=a.filter(u=>u.locationData.attributeSelectors.includes(d)).map(u=>u.childFrames).flat()}let l=[],c=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(c===_o?l=a:l=a.filter(p=>p.locationData.attributeSelectors.includes(c)),l.length===1)return r=l[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let a=new RegExp(t.frameSrcRegex),l=XS(o,c=>!!c.src&&a.test(c.src));if(l.length===1)return r=l[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let a=new RegExp(t.frameUrlRegex),l=XS(o,c=>!!c.url&&a.test(c.url));if(l.length===1)return r=l[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let s=o;for(let a=0;a<t.indices.length-1;a++)s=s[t.indices[a]]?.childFrames??[];if(r=s[t.indices[t.indices.length-1]],r)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${s.length} frames with indices ${t.indices}`),new Yn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function Ka(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function jd(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function ty(n){let e=jd(n),t=n.src??"",r=n.url??"",o=[],i=[],s=[...e.childFrames];for(;s.length;){let a=s.shift();a.src&&o.push(a.src),a.url&&i.push(a.url),s.push(...a.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:r}}function ny(n){return n.type==="auto"?{type:"auto",frameId:n.handle.frameId,url:n.handle.url,src:n.handle.src??"",mPathSelectorTokens:n.mPathSelectorTokens.join(" > ")}:{type:"url",url:n.url}}async function ry({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await oP({frameElementHandle:r,logger:e,signal:t})}catch(o){e.warn({err:o},"Failed to scroll iframe into view, continuing...")}finally{await r?.dispose()}}async function oP({frameElementHandle:n,logger:e,signal:t}){let r=await n.boundingBox();if(!r){e.warn("Active frame element has null bounding box, skipping scroll");return}await Dr({promiseGenerator:async()=>n.evaluate(async(i,{x:s,y:a})=>{window.scrollTo(window.scrollX+s,window.scrollY+a);let l=Date.now(),c,p,d;for(;Date.now()-l<1500;){let u=document.activeElement,m,h,g;if(!u)m=void 0,h=void 0,g=void 0;else{let f=u.getBoundingClientRect();m=u.scrollTop,h=f.x,g=f.y}if(c!==void 0&&p!==void 0&&d!==void 0&&m===c&&h===p&&g===d)break;c=m,p=h,d=g,await new Promise(f=>setTimeout(f,250))}},r),timeoutMs:2e3,codePath:"scrollIframeIntoView",signal:t}),e.info({bb:r},"Successfully scrolled iframe into view")}async function oy({event:n,transformer:e,enricher:t,frame:r,lastScreenshotForRecording:o,logger:i}){let{warnings:s,error:a,properties:l}=n.target;if(a){i.error({error:a,warnings:s},"Error while capturing passive click");return}if(s.length&&i.warn({warnings:s},"Warnings while capturing passive click"),!l)return;let c=r.parentFrame()?r.url():void 0,d=r.page().frames().map(h=>h.url());i.debug({frameUrl:c,...n},"Passive click event captured on element");let u,m;if(c)try{let h=await r.frameElement();u=await U(h?.boundingBox(),{milliseconds:1e3})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:c});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:c}}(async()=>{try{await e.recordElementAction({...n,screenshotBase64:o,frameConfig:m,frameBoundingBox:u})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as Rn}from"crypto";import iP from"js-beautify";var sP=["Shift","CapsLock","Dead","Meta","AudioVolumeUp","AudioVolumeDown"],iy=15e3,Ya=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:r,testId:o,orgId:i,logger:s}){this.signal=e,this.logger=s,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onStepRecorded(a,l)},onActionReceived:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onActionReceived?.(a,l)}},this.generator=r}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Rn(),type:"PRESET_ACTION",command:On(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:r,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,s,a=r.properties.attributes.nodeOnlySerializedHtml.trim(),l=a,c;switch(e.frameConfig?e.frameBoundingBox?c={x:e.frameBoundingBox.x+r.properties.boundingBox.x,y:e.frameBoundingBox.y+r.properties.boundingBox.y,width:r.properties.boundingBox.width,height:r.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):c=r.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}case"SELECT":{i="SELECT_OPTION";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:l},cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let p;e.offset===void 0?(p=this.nextStepOffset,this.nextStepOffset++):p=e.offset,this.callbacks.onActionReceived?.(s,p);let d=e.target.browserState;try{d=iP.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d.length>iy&&(d=d.slice(0,iy))}catch{}let u;try{u=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:r.properties.boundingBox},{disableCache:!1,orgId:this.orgId,loggerTags:{testId:this.testId,...Ge(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),u=a}let m=this.recordedSteps.get(p)?.step??s,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:u},this.callbacks.onStepRecorded({...m,command:h},p)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:r}=e;if(sP.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=On("TYPE");i={id:Rn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=On("PRESS");i={id:Rn(),type:"PRESET_ACTION",command:{...d,value:t}}}let s,a=this.nextStepOffset-1,l=this.recordedSteps.get(a),c=l?.step,p=c?.command;if(r){if(p?.type===i.command.type){let d=p.value,u=i.command.value;i={id:Rn(),type:"PRESET_ACTION",command:{...p,value:i.command.type==="PRESS"?`${d}+${u}`:`${d}${u}`}},s=a}else if(p?.type==="CLICK"&&i.command.type==="TYPE")c.command={...i.command,target:p.target,cache:p.cache},i=l.step,s=a;else if(p?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=p.value;i={id:Rn(),type:"PRESET_ACTION",command:{...p,value:d.slice(0,d.length-1)}},s=a}}s===void 0&&(s=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,s)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_DOWN"&&a.deltaY?(i+=a.deltaY,l=s):a?.type==="SCROLL_UP"&&a.deltaY?(i-=a.deltaY,l=s):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_DOWN":"SCROLL_UP",p=On(c);p.deltaY=Math.abs(i);let d={id:Rn(),type:"PRESET_ACTION",command:p};this.callbacks.onStepRecorded(d,l)},r=()=>{let{deltaX:i}=e;if(!i)return;let s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_RIGHT"&&a.deltaX?(i+=a.deltaX,l=s):a?.type==="SCROLL_LEFT"&&a.deltaX?(i-=a.deltaX,l=s):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",p=On(c);p.deltaX=Math.abs(i);let d={id:Rn(),type:"PRESET_ACTION",command:p};this.callbacks.onStepRecorded(d,l)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(r(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&r())}};var Xa=Iu(xy(),1);var Za=class{defaultTimeoutMs;filterZeroOpacity;logger;cdpClient;pageGetter;abortSignalGetter;flagStore;enricher;iconKnowledgeBase;activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeTrie=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1});lastA11yTreeRoot;lastDomGraph;constructor({defaultTimeoutMs:e,filterZeroOpacity:t,logger:r,cdpClient:o,pageGetter:i,flagStore:s,abortSignalGetter:a,enricher:l,iconKnowledgeBase:c}){this.defaultTimeoutMs=e,this.filterZeroOpacity=t,this.logger=r,this.cdpClient=o,this.pageGetter=i,this.flagStore=s,this.abortSignalGetter=a,this.enricher=l,this.iconKnowledgeBase=c}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeTrie(){return this.lastSelectorToNodeTrie}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeTrie=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1}),this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),r=jd(e),{frame:o,mPathSelectorTokens:i}=await Cn(e,t),s={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,s),{cache:s,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:r,cache:s}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),r=await Mo({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await ey({page:t,frameTree:r,cache:e});return this.logger.debug({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(Ka(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let r;return this.frameConfig.type==="url"?r=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):r={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Ka(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await ry({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await Mo({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[U(r.evaluate(e,t),{milliseconds:2e3})],s=Array.from(o.childFrames);for(;s.length>0;){let l=s.shift();s.push(...l.childFrames),i.push(Cn(l,r).then(({frame:c})=>U(c.evaluate(e,t),{milliseconds:2e3})).catch(c=>(this.logger.warn({err:c,frameUrl:l.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR")))}return(await Promise.all(i)).filter(l=>l!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await Mo({cdpClient:this.cdpClient,page:e,logger:this.logger}),r=Array.from(t.childFrames),o=[];for(;r.length>0;){let i=r.shift();r.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:r}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:r??this.logger})}async getA11yTree(e){let t={},r=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),s,a,l=null;if(this.frameConfig?.type==="url"){if(s=await Un({fn:()=>this.resolveActiveFrameConfig({logger:r,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:r})??void 0,!s)throw new R("ActionFailureError","Got null frame details despite active frame config");a=s.handle,l=a.frameId}else this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")?(a=await Un({fn:()=>Mo({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:r}),l=null):(a={type:"root",page:i,childFrames:[]},l=null);await Un({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:a.childFrames,frameFilter:s?.frame,logger:r}),codePath:"addIdsToElement",logObject:t,signal:o,logger:r});let c=await Un({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:r}),codePath:"domFetch",logObject:t,signal:o,logger:r}),p=await Un({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:a.childFrames,logger:r,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:r}),{tree:d}=await Un({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:p,domGraph:c,startingFrameId:l,frameContext:a,logger:r,iconKnowledgeBase:this.iconKnowledgeBase}),codePath:"a11yProcess",logObject:t,signal:o,logger:r});Object.values(t).some(m=>m>1e3)&&r.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=c;let u=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1});for(let[m,h]of Object.entries(d.selectorToNodeMap))u.add({key:m,value:h});return this.lastSelectorToNodeTrie=u,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:Or,filterByViewport:!1}),Math.random()<.1){let r=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:r&&r.length>4e5?"REDACTED_DUE_TO_SIZE":r},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:r}){if(r.backendNodeId===void 0)throw new Error(`Node with a11y id ${r.id} has no backend node ID: ${r.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[r.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${r.backendNodeId}`);let i=yS({node:o,domGraph:this.domGraph});return bS(e,i)}else return this.getLocatorFromBackendId(t,r.backendNodeId)}async getLocatorFromBackendId(e,t){let r=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:2e3});if(!r||!r.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await wS(this.cdpClient,r.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(r.object)},"Failed to get ID attribute"),i}return e.locator(`[${bt}="${o}"]`)}getNodeUsingMPathSelector(e){let t=this.selectorToNodeTrie.search(e),r=t.find(o=>o.key===e);if(r)return r.value;this.logger.warn({searchResult:t},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:r=this.logger}){let o=Date.now(),i,s,a,l=0;for(;Date.now()-o<this.defaultTimeoutMs;)try{i=await Mo({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),s=await this.getMatchingFrameByUrlWithCdp(i,e),r.debug({frameId:s.handle.frameId,url:s.handle.url,src:s.handle.src,locationData:s.handle.locationData},`Found matching frame using ${s.matchType}`);break}catch(c){if(a=c,c instanceof R&&c.reason==="UserInfrastructureError")throw c;l%3===0&&this.logger.debug({attempt:l,err:c},"Failed to resolve active frame, retrying..."),await ne(500,t)}finally{l++}if(s)return{source:"url",frame:s.frame,handle:s.handle,frameIdentifierStringified:Ka(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw a}async getMatchingFrameByUrlWithCdp(e,t){let r=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),s=[];for(;i.length>0;){let a=i.shift(),l=a.domNode;i.push(...a.childFrames);let c=or(l.attributes??[],"src"),p=l.contentDocument?.documentURL;if(!c&&!p){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[c,p])if(d){if(r.startsWith("/")&&r.endsWith("/")){if(new RegExp(r.slice(1,-1)).test(d)){s.push({handle:a,matchType:"regex",...await Cn(a,o)});break}}else if(r.trim()===d.trim()){s.push({handle:a,matchType:"url",...await Cn(a,o)});break}}}if(s.length===1){let a=s[0];return this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||(a.handle.childFrames=[]),a}else throw s.length>1?new Error(`Found multiple frames with src matching '${r}'. Please use a more specific selector.`):new R("ActionFailureError",`Failed to find frame with src matching: ${r}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:r,startingFrameId:o,frameContext:i,logger:s,iconKnowledgeBase:a}){let l=await AS({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:r,logger:s,cdpClient:this.cdpClient,filterZeroOpacity:this.filterZeroOpacity,filterByViewport:e.filterByViewport,viewportDetails:void 0,iconKnowledgeBase:a,useMPaths:this.flagStore.isBooleanFlagEnabled("visual_actions")});if(!l||!l.root)throw new Error("Accessibility tree appears empty");return{tree:l}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:r,logger:o}){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return;let i=await this.addMomenticIdsHelper(r??e,1);if(!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||r)return;let s=Array.from(t),a=[];for(;s.length>0;){let l=s.shift();s.push(...l.childFrames);let c=async()=>{try{let{frame:p}=await Cn(l,e);i=await this.addMomenticIdsHelper(p,i)}catch(p){o.warn({err:p},"Error adding momentic IDs to child frame, continuing...")}};a.push(c())}await Promise.all(a)}async addMomenticIdsHelper(e,t){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return t;let r=this.logger;return await qe({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:2e3,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.defaultTimeoutMs})}catch(i){r.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"addMomenticIds"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let r=t.hostname.split("."),o=r.length>2?r.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({domNode:e,viewport:t}){let r=e.attributes??[];if(or(r,"aria-hidden")==="true")return!1;let o=or(r,"style");if(o?.includes("display: none")||o?.includes("visibility: hidden"))return!1;await this.cdpClient.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[i,s]=await Promise.all([this.cdpClient.send({timeout:3e3,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:3e3,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!i.model||!i.model.height||!i.model.width)return!1;let a=i.model.content;if(!a||a.length!==8)throw new Error(`Invalid quad data, expected 8 points but got ${a}`);let l={x:a[0],y:a[1]},c={x:a[4],y:a[5]};if(!(l.x<t.clientWidth&&l.y<t.clientHeight&&c.x>0&&c.y>0)||i.model.height<10||i.model.width<10)return!1;for(let d of s.computedStyle)if(d.name==="display"&&d.value==="none"||d.name==="visibility"&&d.value==="hidden"||d.name==="opacity"&&d.value==="0")return!1;return!0}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:r,logger:o=this.logger,signal:i=this.abortSignalGetter()}){let s={},a=[],[l,c]=await Promise.all([Un({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.defaultTimeoutMs*2}),codePath:"a11y-tree-fetch-root",logObject:s,signal:i,logger:o}),e.send({timeout:3e3,method:"Page.getLayoutMetrics",params:{}})]);if(!l)throw new Error("The accessibility tree is empty for the root page or frame. Are you sure it is working properly?");let p=c.cssVisualViewport,d={};if(d[t??"root"]=l,!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return d;let u=Array.from(r),m=[];for(;u.length>0;){let h=u.shift(),g=h.domNode;u.push(...h.childFrames);try{if(!await this.decideChildFrameUnrollEligibility({domNode:g,viewport:p}))continue}catch(S){if(S.message.includes("Could not compute box model"))continue;a.push(`Got error when determining whether to filter frame ${h.frameId} with url ${h.url}, allowing it to be fetched: ${S}`)}let f=async()=>{try{let S=await Un({fn:()=>this.getRawA11yTreeForFrame({frameId:h.frameId,timeoutMs:3e3}),codePath:`a11y-tree-fetch-child-${h.frameId}`,logObject:s,signal:i,logger:o});d[h.frameId]=S}catch(S){o.warn({err:S,url:h.url,src:h.src},`Error getting raw a11y tree for child frame ${h.frameId}, continuing...`)}};m.push(f())}return await Promise.all(m),Object.values(s).some(h=>h>500)&&this.logger.warn(s,"CDP a11y tree fetch took a long time"),a.length>0&&this.logger.warn({warnings:a},"Got warnings when fetching the raw a11y graph"),d}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t}){let r=await this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:2e3});if(!r.node.backendDOMNodeId)throw new Error("Root node has no backend DOM node ID");let o=r.node.backendDOMNodeId,i=await this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:o},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`});if(!i.nodes||i.nodes.length<=1)throw new Error("Document is entirely empty");return{root:i.nodes[0],allNodes:i.nodes}}async getDOMTree({devicePixelRatio:e,signal:t,logger:r}){let o,i=0;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:Ha},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ne(500,t),r.debug({err:s},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new R("InternalWebAgentError","Error fetching DOM tree");return SS({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=ty(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(r);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:r},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var Kd=Ji(Iy(),"momentic","chromium"),NP=Ji(Iy(),"video"),tl=process.env.TWO_CAPTCHA_KEY,Yd=LP(Py);Yd.use(OP({provider:{id:"2captcha",token:tl},visualFeedback:!0}));var dn=class n{static USER_AGENT=PP["Desktop Chrome"].userAgent;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;lastIconKnowledgeBaseUpdateTime=0;mockedServices;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};enricher;storage;flagStore;logger;stateManager;transformer;lastScreenshotForRecording=void 0;baseUrl;originsVisited=new Set;viewport;onTabsChange=void 0;videos=[];constructor({storage:e,flagStore:t,enricher:r,browser:o,context:i,page:s,baseUrl:a,logger:l,mockedServices:c,userBrowserSettings:p,viewport:d,onTabsChange:u,properties:m,clientCallbacks:h,iconKnowledgeBase:g}){if(yg(p),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=r,this.browser=o,this.context=i,this.page=s,this.baseUrl=a,this.logger=l,this.userControlledBrowserSettings=p,this.viewport=d||rn,this.onTabsChange=u,this.properties=m,this.clientCallbacks=h,m.recordVideo){let f=this.page.video();f&&this.videos.push(f)}this.iconKnowledgeBase=g}async registerAbortSignal(e){this.abortSignal=e}async initialize(){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera"]);let e=this.flagStore.getAllFlags(),t=[this.context.addInitScript({content:bd.cssGeneratorLibJs}),this.context.addInitScript({content:bd.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(e)};`})],r=Promise.all(Object.entries(this.mockedServices).map(([s,a])=>this.context.route(s,l=>a.handle(l)))),o=s=>this.handleNewPageEvent(s);this.context.on("page",o),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",o)});let i=Promise.all(t);await Promise.all([i,r]),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&CP()==="darwin"&&SP("system_profiler SPDisplaysDataType").toString().includes("Retina")?(y.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await Ga.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),this.properties.isNewHeadless&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:this.properties.systemDevicePixelRatio,mobile:this.viewport.width>1e3}}),await this.initializeScreencast(),this.stateManager=new Za({defaultTimeoutMs:this.smartWaitingTimeout,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,flagStore:this.flagStore,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,filterZeroOpacity:this.flagStore.isBooleanFlagEnabled("filter_zero_opacity_elements"),iconKnowledgeBase:this.iconKnowledgeBase}),this.contextInitialized=!0}async initializeScreencast(){this.clientCallbacks?.onScreencastFrame&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,r=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=r,this.clientCallbacks?.onScreencastFrame?.(r,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init({baseUrl:e,logger:t,storage:r,flagStore:o,enricher:i,mockedServices:s,userBrowserSettings:a,contextArgs:l,browserbaseConnectUrl:c,onTabsChange:p,recordVideo:d,iconKnowledgeBase:u,callbacks:m}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let h={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:a.browserType==="Google Chrome"?"chrome":void 0},g={viewport:rn,userAgent:a.userAgent??n.USER_AGENT,geolocation:{latitude:37.7749,longitude:-122.4194},locale:"en-US",timezoneId:"America/Los_Angeles",httpCredentials:a.basicAuthorization?{username:a.basicAuthorization.username??"",password:a.basicAuthorization.password??""}:void 0,javaScriptEnabled:a.disableJavaScript?!1:void 0,...l??{}},f=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-features=IsolateOrigins,site-per-process","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream"],S=null,x,b,w={systemDevicePixelRatio:l?.deviceScaleFactor,recordVideo:d};h.headless&&(a.browserType==="Google Chrome"||a.browserType==="Chromium"&&o.isBooleanFlagEnabled("use_new_chrome_headless_chromium"))&&(t.info("Using new chrome headless mode through feature flag override"),f.push("--headless=new"),w.isNewHeadless=!0),process.env.BROWSER_MEMORY_MB&&f.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`),a.disableGpu&&f.push("--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output");let E=!1;if(a.localChromeExtensionPaths?.length){E=!0;for(let I of a.localChromeExtensionPaths){let N=Ji(I,"manifest.json");if(!el(N))throw new R("UserConfigurationError",`Chrome extension path ${N} does not exist.`)}}if(E){let I=Ji(Kd,`momentic-session-${Date.now()}`);if(!el(I))try{yP(I,{recursive:!0})}catch(P){throw new R("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Kd} folder: ${P}`)}let N=[...f];if(a.localChromeExtensionPaths){let P=a.localChromeExtensionPaths.map(D=>IP(D)).join(",");N.includes("--headless=new")||N.push("--headless=new"),N.push(`--disable-extensions-except=${P}`),w.isNewHeadless=!0}g?.deviceScaleFactor&&N.push(`--force-device-scale-factor=${g.deviceScaleFactor}`,`--device-scale-factor=${g.deviceScaleFactor}`),g.viewport&&N.push(`--window-size=${g.viewport.width},${g.viewport.height}`),x=await Py.launchPersistentContext(Ji(Kd,`momentic-session-${Date.now()}`),{...h,...g,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:N,baseURL:e}),t.debug({sharedContextOptions:g,sharedBrowserOptions:h,userBrowserSettings:a,chromeArgs:N,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),b=x.pages()[0]}else if(c){S=await Yd.connectOverCDP(c);let I=S.contexts()[0];if(!I)throw new Error("Failed to get browserbase default context");let N=I.pages()[0];if(!N)throw new Error("Failed to get browserbase default page");x=I,b=N}else{S=await Yd.launch({...h,args:f});let I={...g,baseURL:e,recordVideo:d?{dir:NP}:void 0};x=await S.newContext(I),t.debug({contextArgs:I,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:a,flags:o.getAllFlags()},"Browser initialization context args (standard)"),b=await x.newPage()}let C=new n({browser:S,context:x,page:b,baseUrl:e,logger:t,storage:r,flagStore:o,mockedServices:s||{},enricher:i,userBrowserSettings:a,viewport:g.viewport||rn,onTabsChange:p,properties:w,clientCallbacks:m,iconKnowledgeBase:u});return await C.initialize(),C}async handleAvailableTabsChangeHelper(){try{let e=await No(this.context,{getTitles:!0}),t=this.page.url();this.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let r=Ry(),o=`${e}-${r}`,i=Date.now(),s=!1,a=async()=>{try{await U(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],s=!0}};this.pageLoadPromises[o]=a().catch(()=>{}),s&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.info({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let r=this.context.pages();for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(!i||i.isClosed()||!tr(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:o});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let r=e.video();r&&this.videos.push(r)}try{this.handleNewPageEventHelper(e)}catch(r){this.logger.warn({err:r},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Ry(),r="new-page-load-handler";e.on("close",s=>this.handlePageClosedEvent(s)),e.on("framenavigated",s=>this.handleFrameNavigationEvent(s)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",s=>{MS(e,o,this.debugData,s,this.logger)}),e.on("request",s=>{jS(t,this.debugData,s,this.logger)});let i=async()=>{await zS(t,this.debugData,e),await this.loadFrameAndRecordUrl({root:e,codePath:r}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(r,async()=>i())}async handleCollectSvgs(e){if(!this.flagStore.isBooleanFlagEnabled("icon_knowledge_base")||this.page.isClosed()||this.page.mainFrame()!==e||!this.iconKnowledgeBase||!this.clientCallbacks?.onSvgsCollected||Date.now()-this.lastIconKnowledgeBaseUpdateTime<5e3)return;this.lastIconKnowledgeBaseUpdateTime=Date.now();let t=await this.stateManager.getDomGraph({devicePixelRatio:this.devicePixelRatio}),r=vS({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(r.forEach(a=>{this.iconKnowledgeBase[a.hash]=a}),!r.length)return;let o=Ge(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:EP()};for(let a of["runId","testId"])o[a]&&(i[a]=o[a]);let s={metadata:i,newSvgs:r};this.clientCallbacks.onSvgsCollected(s)}handleFrameNavigationEvent(e){let t=e.url(),r=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)}-${r}`;if(!t||t==="about:blank"||!tr(t))return;let i=async()=>{try{await this.loadFrameAndRecordUrl({root:e,codePath:o,signal:this.abortSignal}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&(await this.waitForDOMStability(),setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(a){this.logger.warn({err:a},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let r={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(r[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},r)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame()},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();await this.clearAuthState({closeNonActiveTabs:!0}),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await U(Dd(this.getBrowserCallbacks()),{milliseconds:1e3})}catch(e){this.logger.warn({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0;try{this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,r){let o=Date.now(),i=0,s=0;for(;Date.now()-o<8e3;){s++,r?.throwIfAborted();try{if(await qe({fn:()=>{let l=window;return!!(l.generateCssSelectors&&l.evaluateCssSelectors&&l.generateHtmlCacheAttributes&&l.ldist)},timeout:1e3,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensureMomenticBrowserScriptsLoaded"}))return}catch(a){if(i++,i>=3){t.warn({err:a},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ne(500),s%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),qe({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:3e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getFullHtmlTree"})}url(){return this.page.url()}async screenshot(e){let{retries:t=1}=e;try{let r=await this.screenshotHelper({...e,retries:t});if(r.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(r.length===0)throw new Error("Got empty screenshot");return r}catch(r){if(t<=0||r.message.includes("has been closed"))throw r;return this.logger.debug({pageUrl:this.page.url(),err:r},"Failed taking screenshot, retrying..."),await ne(250),this.screenshot({...e,retries:t-1})}}async screenshotHelper({locator:e,quality:t,scale:r="css",saveToDiskPath:o,hideCaret:i,timeout:s,respectActiveFrame:a,disableAnimations:l,clearHighlights:c=!1}){let p={fullPage:!1,type:"jpeg",quality:t,scale:r,caret:i?"hide":"initial",path:o,timeout:s??3e3,animations:l?"disabled":void 0};c&&await this.clearHighlights(),a&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement()),e&&(p.scale="css");let d;if(p.scale==="css"||this.properties.isNewHeadless)d=await this.page.screenshot(p);else{let S=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:2e3});d=Buffer.from(S.data,"base64"),p.path&&wP(p.path,d)}if(this.lastScreenshotForRecording=d,!e)return d;let u=await e.boundingBox({timeout:1e3});if(!u)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=u;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");if(m<0||h<0)throw new Error("Attempted to screenshot an element with negative coordinates");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{d=await(await vP.fromBuffer(d)).crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}return"dispose"in e&&await e?.dispose(),d}getViewport(){return this.viewport}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:r=this.pageLoadTimeout}){Tf(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,s;for(let l=0;l<3;l++)try{await this.page.goto(e,{timeout:r,waitUntil:"domcontentloaded"}),i=!0;break}catch(c){if(s=c,this.abortSignal?.throwIfAborted(),this.logger.warn({err:c},`Error occurred during navigation${l===0?", retrying...":" (fatal)"}`),await ne(1e3+1e3*l),s.message.includes("ERR_CONNECTION_CLOSED")&&await this.page.reload({timeout:r,waitUntil:"domcontentloaded"}),s.message.includes("Timeout")&&s.message.includes("exceeded")||s.message.includes("net::ERR_CONNECTION_REFUSED"))break}if(!i)throw new R("UserInfrastructureError",s?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step"}),this.logger.debug({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let a=this.url();if(uS.has(a))throw new R("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(l){l instanceof Error&&l.message.includes("already registered")||this.logger.error({err:l},"Failed to install Momentic libraries for action recording")}}async type(e,t={},r=!1){await this.directTypeHelper(e,t,r)}async getActiveElement(e){try{return await qe({root:e,fn:()=>{let r=document.activeElement?.textContent??void 0;return r&&r.length>100&&(r=r.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:r}:void 0},arg:void 0,timeout:1e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getActiveElement"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},r=!1){let o=await this.getActivePageOrFrame();await VS({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ne(250),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25)):this.logger.warn({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Du}),t.pressEnter?await this.press("Enter",{}):await this.waitForDOMStability({timeout:1e3})}async scrollIntoView(e){await e.scrollIntoViewIfNeeded({timeout:2e3})}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return qa({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),r=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),r=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:1e3}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),r=[...this.context.pages()];for(let o=0;o<r.length;o++){let i=r[o];if(i.isClosed())continue;let s=i.url();try{this.originsVisited.delete(new URL(s).origin)}catch{}await _S(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.debug(`Closing tab ${o} with URL ${s}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let s=await this.setCookie(i);t=t.concat(s)}this.logger.debug(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:1e3});let r=0;for(let i of e.origins??[])for(let s of i.localStorage)try{await this.cdpClient.send({timeout:1e3,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:s.name,value:s.value}}),r++}catch(a){this.logger.warn({err:a,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.debug(`Loaded ${r} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await NS(this.page,o,this.logger),this.logger.debug(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,r=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await kS(this.page,this.logger),o}catch(o){if(r=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(s=>setTimeout(s,i))}}throw this.logger.error({err:r},"Failed to save auth state after 2 retries"),new R("ActionFailureError",`Failed to save auth state: ${r?.message}`)}async getOpenPages(e){return No(this.context,e)}saveA11yDetailsToCache(e,t){t.id=e.id,t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,t.serializedForm=e.getSerializedFormWithContext(),t.nodeOnlySerializedForm=e.getNodeOnlySerializedForm()}async saveNodeDetailsToCache({node:e,target:t,dataMomenticId:r,locator:o,logger:i=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),!(t.generatedSelectors&&t.generatedSelectors.length>1)){if(r&&(t.dataMomenticId=r),o)try{let s=await this.fetchHtmlAttributes(o,i);Object.assign(t,s)}catch(s){i.warn({err:s},"Failed to fetch HTML attributes for target")}else i.debug("No locator found for target, skipping HTML attribute generation");try{await this.saveElementVisualAttributes(t,o,i)}catch(s){i.debug({err:s},"Failed to save element visual details")}}}async saveElementVisualAttributes(e,t,r){if(!t)return;await t.scrollIntoViewIfNeeded({timeout:1e3});let o=await t.boundingBox({timeout:1e3});if(!o||!o.width||!o.height){r.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}e.boundingBox=o;let{x:i=0,y:s=0,width:a=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-a)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-s)<1||!xd.includes(e?.role??""))return;let c=await this.screenshot({locator:t,retries:0});e.screenshotUrl=await this.storage.uploadScreenshot(c)}async resolveTargetUsingCssSelectors({root:e,target:t,logger:r}){if(!t.generatedSelectors||t.generatedSelectors.length<2||!t.nodeOnlySerializedHtml)throw new Ui("Insufficient data to resolve target using CSS selectors");let o;try{o=await qe({fn:c=>window.evaluateCssSelectors(c),arg:{selectors:t.generatedSelectors,ldistThreshold:.05,serializedNodeWithText:t.nodeOnlySerializedHtml},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluateCssSelectors"})}catch(c){throw new Error(`Failed to evaluate CSS selectors in browser: ${c}`)}let i=o.result;if(i)r.debug(o,"CSS selector evaluation returned an element");else throw new Error(`CSS selector evaluation returned no eligible elements:
3549
+ ${l}`,{errOptions:{cause:n}})}if(i.includes("element is not visible")){let l="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let c=await e.boundingBox({timeout:1e3});c?c.height===0?l="The element you attempted to interact with has zero height.":c.width===0&&(l="The element you attempted to interact with has zero width."):l="The element you attempted to interact with has no bounding box."}catch{}return new R("ActionFailureError",`${l} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${s}`,{errOptions:{cause:n}})}return i.includes("element is outside of the viewport")?new R("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${s}`):n}function zI(n){let e=n.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new R("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:n}});return n}async function GS(n){try{return await jI(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function jI({locator:n,logger:e}){let[t,r]=await n.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await cn(n,e),i=await n.boundingBox({timeout:1e3});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5)return;if(r==="input"&&t)try{let l=n.page().locator(`label[for=${JSON.stringify(t)}]`);return await l.waitFor({state:"visible",timeout:1e3}),{locator:l,relativePoint:void 0}}catch{}let s=await n.evaluate(l=>{let c=window;if(!c.CssSelectorGenerator)return{type:"error",error:"[MOMENTIC] Missing CSS selector libraries"};let p=l.parentElement;if(!p)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.CssSelectorGenerator.getCssSelector(p,{}),u=l.getBoundingClientRect(),m=p.getBoundingClientRect();if(m.width===0||m.height===0)return{type:"error",error:"Parent element has no width or height"};let h={x:Math.min(Math.max(1,u.left-m.left),m.width-1),y:Math.min(Math.max(1,u.top-m.top),m.height-1)};return{type:"result",selector:d,relativePoint:h,serializedForm:p.outerHTML.slice(0,500)}},{timeout:1e3});if(s.type==="error")throw new Error(s.error);let a=n.page().locator(s.selector);return await a.waitFor({state:"visible",timeout:1e3}),e.info({parentElementResult:s,originalElementDisplayString:o},`Redirected click to parent element with selector: ${s.selector}`),{locator:a,relativePoint:s.relativePoint}}var qS=["date","datetime-local","month","time","week"],VS={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function KS(n){try{await U(HI(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function HI({root:n,text:e,options:t,logger:r,callbacks:o}){let i=(await qe({root:n,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transformNativeDateTimeInputFillHelper"})).toLowerCase();if(!VS[i])return;VS[i].test(e)&&r.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,r.debug("Transforming datetime input to use sequential key presses")}async function qa({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await Ud(e,r);let o=n.evaluate(i=>{let s=window;s.momenticIsEligible=d=>{let m=window.getComputedStyle(d,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=d.getBoundingClientRect();return!(!h.height||!h.width)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let a=0;for(;!s.momenticIsEligible(i)&&a<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,a++}let l=i.style.getPropertyValue("outline"),c=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let p=`momentic${Math.floor(Math.random()*1e7)}`;s[p]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",l,c),i.getAttribute("style")||i.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[p](),s.removeHighlightFunctions?.[p]&&delete s.removeHighlightFunctions[p]},5e3)),s.removeHighlightFunctions[p]=s[p]},void 0,{timeout:r});return await U(o,{milliseconds:r}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Ud(n,e=1e3){let t=await n.state.getRoot();await qe({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let s=i.pop();clearTimeout(s)}Object.values(o.removeHighlightFunctions??{}).forEach(s=>{s()})},timeout:e,arg:void 0,waitForPageLoad:n.waitForPageLoad,codePath:"removeAllHighlights"})}async function zd(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return Hr({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>Bd({...n,targetingResult:t,useVisualClick:e})})}async function VI(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await qI(n,e)}catch(r){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:r,originalError:n},"Error handling click error, rethrowing original error"),n):r}}async function qI(n,e){let{logger:t,redirectionAttempts:r=0,browserCallbacks:o,actionSource:i}=e,s=e.targetingResult.locator,a=o.state.getDomGraph();if(n.message.includes("label")&&n.message.includes("for=")&&n.message.includes("intercepts pointer events")){let l=await s.getAttribute("id",{timeout:1e3});if(!l)throw n;let c=s.page().locator(`[for=${JSON.stringify(l)}]`);return await c.waitFor({state:"visible",timeout:1e3}),t.warn({err:n},"Attempting locator redirection due to input being covered by label"),Bd({...e,targetingResult:{locator:c},redirectionAttempts:r+1})}else if(i==="click"&&a&&n.message.includes("intercepts pointer events")){t.warn({err:n},"Attempting locator redirection due to covering error");let l=await ZI(s,a,t);if(l)return Bd({...e,targetingResult:{locator:l},redirectionAttempts:r+1});throw t.error({err:n},"No updated locator could be found to fix covering error, rethrowing"),n}else throw t.error({err:n},"Click error does not match any known recoverable patterns, rethrowing"),n}async function KI(n){let{browserCallbacks:e,logger:t,targetingResult:r,position:o,options:i}=n,s=await e.state.getRoot(),a=s&&s!==r.locator.page()&&"frameElement"in s?await s.frameElement():null,l;try{l=a?await Dr({promiseGenerator:async()=>a.boundingBox(),timeoutMs:3e3,logger:t}):null}catch(c){throw new R("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${c.message}`)}finally{await a?.dispose()}await XI({frameCoordinates:l,logger:t,targetingResult:r,position:o,options:i})}async function YI(n){let{actionSource:e,targetingResult:t,options:r,logger:o}=n,i=n.targetingResult.locator,s=r?.relativePosition??n.position;if(e==="click"&&!s){let l=await GS({locator:i,logger:o});l&&(i=l.locator,s=l.relativePoint??s)}let a=r?.force||t.hints?.force||!1;try{r?.doubleClick?await i.dblclick({button:r.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a}):await i.click({button:r?.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a})}catch(l){let c=l;if(eP(c))o.warn({err:c},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:c},"Error clicking on locator, attempting to recover..."),VI(c,{...n,targetingResult:{...i,locator:i}})}}async function Bd(n){let{options:e,logger:t,browserCallbacks:r,controllerCallbacks:o,useVisualClick:i,targetingResult:s}=n,a=(await r.state.getOpenPages()).map(d=>d.url),l=r.state.url(),c=null;try{c=await s.locator.getAttribute("target",{timeout:1e3})}catch(d){t.warn({err:d},"Failed to get attributes of element about to be clicked, continuing...")}let p;e?.waitForDownload&&(p=(async()=>{let d=e.downloadTimeoutMs??3e4;try{return await s.locator.page().waitForEvent("download",{timeout:d})}catch(u){return u instanceof GI.TimeoutError?new R("ActionFailureError",`Download did not complete in ${d}ms`):new R("ActionFailureError",`Download failed: ${u.message}`)}})());try{await qa({locator:s.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(d){t.warn({err:d},"Error highlighting locator in click, continuing...")}if(i?await KI(n):await YI(n),c==="_blank"){t.debug("Waiting for new page promise due to _blank target");let d=Date.now();for(;(await r.state.getOpenPages()).length<=a.length&&Date.now()-d<2e3;)await ne(500);await r.waitForPageLoad()}if(e?.waitForUrl&&await r.waitForUrl({beforeUrl:l,beforePages:a,matcher:{type:"GLOB",glob:e.waitForUrl}}),e?.waitForDownload)if(p){if(!o?.createIsolatedFolder)throw new R("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let d=await U(p,{milliseconds:e.downloadTimeoutMs??3e4});if(d instanceof Error)throw d;return{downloadedFile:await QI(d,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function JI(n,e){if(e.hints?.clickableXY){let i=(n?.x??0)+e.hints.clickableXY.x,s=(n?.y??0)+e.hints.clickableXY.y;return[{x:i,y:s},"targeting hint"]}let t=await e.locator.boundingBox({timeout:1e3});if(!t)throw new R("ActionFailureError","Element does not have a bounding box");let r=t.x+t.width/2,o=t.y+t.height/2;return[{x:r,y:o},"halfway point of the bounding box"]}async function XI({frameCoordinates:n,logger:e,options:t,targetingResult:r,position:o}){let i,s;if(o){let p=await r.locator.boundingBox({timeout:3e3});i=(n?.x??0)+(p?.x??0)+o.x,s=(n?.y??0)+(p?.y??0)+o.y,e.debug({clickX:i,clickY:s,frameCoordinates:n,position:o},"Clicking using XY: determined click coordinates using predefined position")}else{let[p,d]=await JI(n,r);i=p.x,s=p.y,e.debug({clickX:i,clickY:s,frameCoordinates:n,reason:d,targetingHints:r.hints},`Clicking using XY: determined click coordinates based on ${d}`)}let a=r.locator.page(),l=t?.rightClick?"right":"left",c=t?.delayMs??25;t?.doubleClick?await a.mouse.dblclick(i,s,{button:l,delay:c}):await a.mouse.click(i,s,{button:l,delay:c})}async function ZI(n,e,t){let r=await n.evaluate(a=>a.getAttribute("data-momentic-id"));if(!r)return;let o=$a(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[bt]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let s=await cn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:s},"Trying new locator based on parent-direction after covering error"),n}async function QI(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=Md(n.suggestedFilename()),i=e();await n.saveAs(WI(i,o)),JS(r,{force:!0}),setTimeout(()=>{JS(i,{recursive:!0,force:!0})},5*60*1e3);let s=NS($I(i),o);return t.debug({uri:s,downloadFolder:i},"Saved download to isolated folder"),s}function eP(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as tP}from"os";var nP={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function rP(){let n=tP();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function XS(n){return JSON.stringify(n.split("+").sort())}function ZS(n){let e=rP(),t=XS(n);for(let r of Object.values(nP))if(Object.values(r).some(o=>XS(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function jd({frame:n,page:e,deltaX:t,directionX:r,deltaY:o,directionY:i,signal:s,callbacks:a}){if(!t&&!o)return;let l=r==="left"?-1:1,c=i==="up"?-1:1;if(n)await qe({root:n,fn:([p,d,u,m])=>window.scrollTo(window.scrollX+(p??window.innerWidth)*u,window.scrollY+(d??window.innerHeight)*m),arg:[t,o,l,c],waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollFrame"});else{let p=e.viewportSize()||rn,d=await qe({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollPageGetHeight"}),[u,m,h]=await qe({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"scrollPage"});await e.mouse.wheel((t??p.width)*l,(o??p.height)*c);let g=Date.now();for(;Date.now()-g<2e3;){s?.throwIfAborted();let f=await U(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[S,x,b]=await U(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let E=w.getBoundingClientRect();return[w.scrollTop,E.x,E.y]}),{milliseconds:1e3});if(f===d&&S===u&&x===m&&b===h)break;d=f,u=S,m=x,h=b,await ne(500)}}}async function No(n,e){let t,r;for(let o=0;o<4;o++)try{return t=n.pages(),await Promise.all(t.map(async i=>{let s="";try{s=e?.getTitles?await i.title():""}catch{s="Unknown page"}return{title:s,url:i.url()}}))}catch(i){r=i,await ne(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var _o="<empty>";function oP(n){return n.includes("doubleclick.net")||n.includes("googletagmanager.com")||n.includes("googlesyndication.com")||n.includes("s.amazon-adsystem.com")||n.includes("smartadserver.com")||n.includes("omnitagjs.com")||n.includes("x.adroll.com")}function ey(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||oP(n.url)}async function iP(n,e){let t=await n.send({timeout:3e3,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await n.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],s=(await n.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return s.nodeId=o,s}async function Mo({cdpClient:n,page:e,logger:t}){let r={type:"root",childFrames:[],page:e},o=[],[i]=await Promise.all([n.send({timeout:3e3,method:"Page.getFrameTree",params:{}}),n.send({timeout:3e3,method:"DOM.getDocument",params:{}})]),l=(i.frameTree.childFrames??[]).map(async(p,d)=>{if(ey(p.frame))return null;try{return await ty({cdpClient:n,rawFrameTree:p,indices:[d],parent:r,warnings:o})}catch(u){return o.push(`Failed to get child frame: ${u}`),null}}),c=await Promise.all(l);return r.childFrames=c.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),r}async function ty({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o}){let i=e.frame.id,s=await iP(n,i),a=s.attributes??[],l=null,c=[];for(let m of["src","name","id","title","srcdoc","sandbox"]){let h=or(a,m);h&&(c.push(`${m}=${JSON.stringify(h)}`),m==="src"&&(l=h))}let p={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:i,locationData:{indices:t,attributeSelectors:c},src:l,childFrames:[],parent:r,domNode:s},u=(e.childFrames??[]).map(async(m,h)=>{if(ey(m.frame))return null;try{return await ty({cdpClient:n,rawFrameTree:m,indices:[...t,h],parent:p,warnings:o})}catch(g){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${g}`),null}});return p.childFrames=(await Promise.all(u)).filter(m=>m!==null),p}async function sP(n){try{return await n.owner().count()===1}catch{return!1}}async function aP(n){try{return await n.count()===1}catch{return!1}}async function Cn(n,e){let t=[],r=n;for(;r.parent.type==="frame";)t.push(r.parent),r=r.parent;t.reverse();let o=e,i=[];for(let c of t){let p=!1;for(let d of[...c.locationData.attributeSelectors,_o]){let u=o.frameLocator(d===_o?"iframe":`iframe[${d}]`);if(await sP(u)){p=!0,o=u,i.push(d);break}}if(!p)throw new R("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${c.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let s;for(let c of[...n.locationData.attributeSelectors,_o]){let p=o.locator(c===_o?"iframe":`iframe[${c}]`);if(await aP(p)){s=p,i.push(c);break}}if(!s)throw new R("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${n.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let a=await s.evaluateHandle(c=>c,{timeout:1e3}),l=await a.asElement().contentFrame();if(!l)throw new R("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await a.dispose(),{frame:l,mPathSelectorTokens:i}}function QS(n,e){let t=[...n],r=[];for(;t.length;){let o=t.shift();e(o)&&r.push(o),t.push(...o.childFrames)}return r}async function ny({page:n,frameTree:e,cache:t}){let r,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let a=o;for(let p=0;p<t.mPathSelectorTokens.length-1;p++){let d=t.mPathSelectorTokens[p];d===_o?a=a.length===1?a[0].childFrames:[]:a=a.filter(u=>u.locationData.attributeSelectors.includes(d)).map(u=>u.childFrames).flat()}let l=[],c=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(c===_o?l=a:l=a.filter(p=>p.locationData.attributeSelectors.includes(c)),l.length===1)return r=l[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let a=new RegExp(t.frameSrcRegex),l=QS(o,c=>!!c.src&&a.test(c.src));if(l.length===1)return r=l[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let a=new RegExp(t.frameUrlRegex),l=QS(o,c=>!!c.url&&a.test(c.url));if(l.length===1)return r=l[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let s=o;for(let a=0;a<t.indices.length-1;a++)s=s[t.indices[a]]?.childFrames??[];if(r=s[t.indices[t.indices.length-1]],r)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Cn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${s.length} frames with indices ${t.indices}`),new Yn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function Ka(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function Hd(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function ry(n){let e=Hd(n),t=n.src??"",r=n.url??"",o=[],i=[],s=[...e.childFrames];for(;s.length;){let a=s.shift();a.src&&o.push(a.src),a.url&&i.push(a.url),s.push(...a.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:r}}function oy(n){return n.type==="auto"?{type:"auto",frameId:n.handle.frameId,url:n.handle.url,src:n.handle.src??"",mPathSelectorTokens:n.mPathSelectorTokens.join(" > ")}:{type:"url",url:n.url}}async function iy({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await lP({frameElementHandle:r,logger:e,signal:t})}catch(o){e.warn({err:o},"Failed to scroll iframe into view, continuing...")}finally{await r?.dispose()}}async function lP({frameElementHandle:n,logger:e,signal:t}){let r=await n.boundingBox();if(!r){e.warn("Active frame element has null bounding box, skipping scroll");return}await Dr({promiseGenerator:async()=>n.evaluate(async(i,{x:s,y:a})=>{window.scrollTo(window.scrollX+s,window.scrollY+a);let l=Date.now(),c,p,d;for(;Date.now()-l<1500;){let u=document.activeElement,m,h,g;if(!u)m=void 0,h=void 0,g=void 0;else{let f=u.getBoundingClientRect();m=u.scrollTop,h=f.x,g=f.y}if(c!==void 0&&p!==void 0&&d!==void 0&&m===c&&h===p&&g===d)break;c=m,p=h,d=g,await new Promise(f=>setTimeout(f,250))}},r),timeoutMs:2e3,codePath:"scrollIframeIntoView",signal:t}),e.info({bb:r},"Successfully scrolled iframe into view")}async function sy({event:n,transformer:e,enricher:t,frame:r,lastScreenshotForRecording:o,logger:i}){let{warnings:s,error:a,properties:l}=n.target;if(a){i.error({error:a,warnings:s},"Error while capturing passive click");return}if(s.length&&i.warn({warnings:s},"Warnings while capturing passive click"),!l)return;let c=r.parentFrame()?r.url():void 0,d=r.page().frames().map(h=>h.url());i.debug({frameUrl:c,...n},"Passive click event captured on element");let u,m;if(c)try{let h=await r.frameElement();u=await U(h?.boundingBox(),{milliseconds:1e3})??void 0;let g=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:c});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:c}}(async()=>{try{await e.recordElementAction({...n,screenshotBase64:o,frameConfig:m,frameBoundingBox:u})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as Rn}from"crypto";import cP from"js-beautify";var dP=["Shift","CapsLock","Dead","Meta","AudioVolumeUp","AudioVolumeDown"],ay=15e3,Ya=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:r,testId:o,orgId:i,logger:s}){this.signal=e,this.logger=s,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onStepRecorded(a,l)},onActionReceived:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onActionReceived?.(a,l)}},this.generator=r}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Rn(),type:"PRESET_ACTION",command:On(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:r,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,s,a=r.properties.attributes.nodeOnlySerializedHtml.trim(),l=a,c;switch(e.frameConfig?e.frameBoundingBox?c={x:e.frameBoundingBox.x+r.properties.boundingBox.x,y:e.frameBoundingBox.y+r.properties.boundingBox.y,width:r.properties.boundingBox.width,height:r.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):c=r.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}case"SELECT":{i="SELECT_OPTION";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:l},cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=On(i);s={id:Rn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let p;e.offset===void 0?(p=this.nextStepOffset,this.nextStepOffset++):p=e.offset,this.callbacks.onActionReceived?.(s,p);let d=e.target.browserState;try{d=cP.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d.length>ay&&(d=d.slice(0,ay))}catch{}let u;try{u=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:r.properties.boundingBox},{disableCache:!1,orgId:this.orgId,loggerTags:{testId:this.testId,...Ge(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),u=a}let m=this.recordedSteps.get(p)?.step??s,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:u},this.callbacks.onStepRecorded({...m,command:h},p)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:r}=e;if(dP.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=On("TYPE");i={id:Rn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=On("PRESS");i={id:Rn(),type:"PRESET_ACTION",command:{...d,value:t}}}let s,a=this.nextStepOffset-1,l=this.recordedSteps.get(a),c=l?.step,p=c?.command;if(r){if(p?.type===i.command.type){let d=p.value,u=i.command.value;i={id:Rn(),type:"PRESET_ACTION",command:{...p,value:i.command.type==="PRESS"?`${d}+${u}`:`${d}${u}`}},s=a}else if(p?.type==="CLICK"&&i.command.type==="TYPE")c.command={...i.command,target:p.target,cache:p.cache},i=l.step,s=a;else if(p?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=p.value;i={id:Rn(),type:"PRESET_ACTION",command:{...p,value:d.slice(0,d.length-1)}},s=a}}s===void 0&&(s=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,s)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_DOWN"&&a.deltaY?(i+=a.deltaY,l=s):a?.type==="SCROLL_UP"&&a.deltaY?(i-=a.deltaY,l=s):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_DOWN":"SCROLL_UP",p=On(c);p.deltaY=Math.abs(i);let d={id:Rn(),type:"PRESET_ACTION",command:p};this.callbacks.onStepRecorded(d,l)},r=()=>{let{deltaX:i}=e;if(!i)return;let s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_RIGHT"&&a.deltaX?(i+=a.deltaX,l=s):a?.type==="SCROLL_LEFT"&&a.deltaX?(i-=a.deltaX,l=s):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",p=On(c);p.deltaX=Math.abs(i);let d={id:Rn(),type:"PRESET_ACTION",command:p};this.callbacks.onStepRecorded(d,l)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(r(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&r())}};var Xa=Pu(Ey(),1);var Za=class{defaultTimeoutMs;filterZeroOpacity;logger;cdpClient;pageGetter;abortSignalGetter;flagStore;enricher;iconKnowledgeBase;activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeTrie=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1});lastA11yTreeRoot;lastDomGraph;constructor({defaultTimeoutMs:e,filterZeroOpacity:t,logger:r,cdpClient:o,pageGetter:i,flagStore:s,abortSignalGetter:a,enricher:l,iconKnowledgeBase:c}){this.defaultTimeoutMs=e,this.filterZeroOpacity=t,this.logger=r,this.cdpClient=o,this.pageGetter=i,this.flagStore=s,this.abortSignalGetter=a,this.enricher=l,this.iconKnowledgeBase=c}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeTrie(){return this.lastSelectorToNodeTrie}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeTrie=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1}),this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),r=Hd(e),{frame:o,mPathSelectorTokens:i}=await Cn(e,t),s={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,s),{cache:s,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:r,cache:s}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),r=await Mo({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await ny({page:t,frameTree:r,cache:e});return this.logger.debug({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(Ka(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let r;return this.frameConfig.type==="url"?r=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):r={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Ka(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await iy({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await Mo({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[U(r.evaluate(e,t),{milliseconds:2e3})],s=Array.from(o.childFrames);for(;s.length>0;){let l=s.shift();s.push(...l.childFrames),i.push(Cn(l,r).then(({frame:c})=>U(c.evaluate(e,t),{milliseconds:2e3})).catch(c=>(this.logger.warn({err:c,frameUrl:l.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR")))}return(await Promise.all(i)).filter(l=>l!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await Mo({cdpClient:this.cdpClient,page:e,logger:this.logger}),r=Array.from(t.childFrames),o=[];for(;r.length>0;){let i=r.shift();r.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:r}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:r??this.logger})}async getA11yTree(e){let t={},r=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),s,a,l=null;if(this.frameConfig?.type==="url"){if(s=await Un({fn:()=>this.resolveActiveFrameConfig({logger:r,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:r})??void 0,!s)throw new R("ActionFailureError","Got null frame details despite active frame config");a=s.handle,l=a.frameId}else this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")?(a=await Un({fn:()=>Mo({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:r}),l=null):(a={type:"root",page:i,childFrames:[]},l=null);await Un({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:a.childFrames,frameFilter:s?.frame,logger:r}),codePath:"addIdsToElement",logObject:t,signal:o,logger:r});let c=await Un({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:r}),codePath:"domFetch",logObject:t,signal:o,logger:r}),p=await Un({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:a.childFrames,logger:r,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:r}),{tree:d}=await Un({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:p,domGraph:c,startingFrameId:l,frameContext:a,logger:r,iconKnowledgeBase:this.iconKnowledgeBase}),codePath:"a11yProcess",logObject:t,signal:o,logger:r});Object.values(t).some(m=>m>1e3)&&r.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=c;let u=new Xa.default("key",{splitOnRegEx:!1,splitOnGetRegEx:!1});for(let[m,h]of Object.entries(d.selectorToNodeMap))u.add({key:m,value:h});return this.lastSelectorToNodeTrie=u,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:Or,filterByViewport:!1}),Math.random()<.1){let r=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:r&&r.length>4e5?"REDACTED_DUE_TO_SIZE":r},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:r}){if(r.backendNodeId===void 0)throw new Error(`Node with a11y id ${r.id} has no backend node ID: ${r.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[r.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${r.backendNodeId}`);let i=wS({node:o,domGraph:this.domGraph});return vS(e,i)}else return this.getLocatorFromBackendId(t,r.backendNodeId)}async getLocatorFromBackendId(e,t){let r=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:2e3});if(!r||!r.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await xS(this.cdpClient,r.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(r.object)},"Failed to get ID attribute"),i}return e.locator(`[${bt}="${o}"]`)}getNodeUsingMPathSelector(e){let t=this.selectorToNodeTrie.search(e),r=t.find(o=>o.key===e);if(r)return r.value;this.logger.warn({searchResult:t},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:r=this.logger}){let o=Date.now(),i,s,a,l=0;for(;Date.now()-o<this.defaultTimeoutMs;)try{i=await Mo({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),s=await this.getMatchingFrameByUrlWithCdp(i,e),r.debug({frameId:s.handle.frameId,url:s.handle.url,src:s.handle.src,locationData:s.handle.locationData},`Found matching frame using ${s.matchType}`);break}catch(c){if(a=c,c instanceof R&&c.reason==="UserInfrastructureError")throw c;l%3===0&&this.logger.debug({attempt:l,err:c},"Failed to resolve active frame, retrying..."),await ne(500,t)}finally{l++}if(s)return{source:"url",frame:s.frame,handle:s.handle,frameIdentifierStringified:Ka(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw a}async getMatchingFrameByUrlWithCdp(e,t){let r=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),s=[];for(;i.length>0;){let a=i.shift(),l=a.domNode;i.push(...a.childFrames);let c=or(l.attributes??[],"src"),p=l.contentDocument?.documentURL;if(!c&&!p){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[c,p])if(d){if(r.startsWith("/")&&r.endsWith("/")){if(new RegExp(r.slice(1,-1)).test(d)){s.push({handle:a,matchType:"regex",...await Cn(a,o)});break}}else if(r.trim()===d.trim()){s.push({handle:a,matchType:"url",...await Cn(a,o)});break}}}if(s.length===1){let a=s[0];return this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||(a.handle.childFrames=[]),a}else throw s.length>1?new Error(`Found multiple frames with src matching '${r}'. Please use a more specific selector.`):new R("ActionFailureError",`Failed to find frame with src matching: ${r}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:r,startingFrameId:o,frameContext:i,logger:s,iconKnowledgeBase:a}){let l=await PS({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:r,logger:s,cdpClient:this.cdpClient,filterZeroOpacity:this.filterZeroOpacity,filterByViewport:e.filterByViewport,viewportDetails:void 0,iconKnowledgeBase:a,useMPaths:this.flagStore.isBooleanFlagEnabled("visual_actions")});if(!l||!l.root)throw new Error("Accessibility tree appears empty");return{tree:l}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:r,logger:o}){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return;let i=await this.addMomenticIdsHelper(r??e,1);if(!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||r)return;let s=Array.from(t),a=[];for(;s.length>0;){let l=s.shift();s.push(...l.childFrames);let c=async()=>{try{let{frame:p}=await Cn(l,e);i=await this.addMomenticIdsHelper(p,i)}catch(p){o.warn({err:p},"Error adding momentic IDs to child frame, continuing...")}};a.push(c())}await Promise.all(a)}async addMomenticIdsHelper(e,t){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return t;let r=this.logger;return await qe({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:2e3,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.defaultTimeoutMs})}catch(i){r.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"addMomenticIds"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let r=t.hostname.split("."),o=r.length>2?r.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({domNode:e,viewport:t}){let r=e.attributes??[];if(or(r,"aria-hidden")==="true")return!1;let o=or(r,"style");if(o?.includes("display: none")||o?.includes("visibility: hidden"))return!1;await this.cdpClient.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[i,s]=await Promise.all([this.cdpClient.send({timeout:3e3,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:3e3,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!i.model||!i.model.height||!i.model.width)return!1;let a=i.model.content;if(!a||a.length!==8)throw new Error(`Invalid quad data, expected 8 points but got ${a}`);let l={x:a[0],y:a[1]},c={x:a[4],y:a[5]};if(!(l.x<t.clientWidth&&l.y<t.clientHeight&&c.x>0&&c.y>0)||i.model.height<10||i.model.width<10)return!1;for(let d of s.computedStyle)if(d.name==="display"&&d.value==="none"||d.name==="visibility"&&d.value==="hidden"||d.name==="opacity"&&d.value==="0")return!1;return!0}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:r,logger:o=this.logger,signal:i=this.abortSignalGetter()}){let s={},a=[],[l,c]=await Promise.all([Un({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.defaultTimeoutMs*2}),codePath:"a11y-tree-fetch-root",logObject:s,signal:i,logger:o}),e.send({timeout:3e3,method:"Page.getLayoutMetrics",params:{}})]);if(!l)throw new Error("The accessibility tree is empty for the root page or frame. Are you sure it is working properly?");let p=c.cssVisualViewport,d={};if(d[t??"root"]=l,!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return d;let u=Array.from(r),m=[];for(;u.length>0;){let h=u.shift(),g=h.domNode;u.push(...h.childFrames);try{if(!await this.decideChildFrameUnrollEligibility({domNode:g,viewport:p}))continue}catch(S){if(S.message.includes("Could not compute box model"))continue;a.push(`Got error when determining whether to filter frame ${h.frameId} with url ${h.url}, allowing it to be fetched: ${S}`)}let f=async()=>{try{let S=await Un({fn:()=>this.getRawA11yTreeForFrame({frameId:h.frameId,timeoutMs:3e3}),codePath:`a11y-tree-fetch-child-${h.frameId}`,logObject:s,signal:i,logger:o});d[h.frameId]=S}catch(S){o.warn({err:S,url:h.url,src:h.src},`Error getting raw a11y tree for child frame ${h.frameId}, continuing...`)}};m.push(f())}return await Promise.all(m),Object.values(s).some(h=>h>500)&&this.logger.warn(s,"CDP a11y tree fetch took a long time"),a.length>0&&this.logger.warn({warnings:a},"Got warnings when fetching the raw a11y graph"),d}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t}){let r=await this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:2e3});if(!r.node.backendDOMNodeId)throw new Error("Root node has no backend DOM node ID");let o=r.node.backendDOMNodeId,i=await this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:o},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`});if(!i.nodes||i.nodes.length<=1)throw new Error("Document is entirely empty");return{root:i.nodes[0],allNodes:i.nodes}}async getDOMTree({devicePixelRatio:e,signal:t,logger:r}){let o,i=0;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:Ha},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ne(500,t),r.debug({err:s},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new R("InternalWebAgentError","Error fetching DOM tree");return bS({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=ry(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(r);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:r},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var Yd=Xi(Ly(),"momentic","chromium"),DP=Xi(Ly(),"video"),tl=process.env.TWO_CAPTCHA_KEY,Jd=_P(Oy);Jd.use(MP({provider:{id:"2captcha",token:tl},visualFeedback:!0}));var dn=class n{static USER_AGENT=NP["Desktop Chrome"].userAgent;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;lastIconKnowledgeBaseUpdateTime=0;mockedServices;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};enricher;storage;flagStore;logger;stateManager;transformer;lastScreenshotForRecording=void 0;baseUrl;originsVisited=new Set;viewport;onTabsChange=void 0;videos=[];constructor({storage:e,flagStore:t,enricher:r,browser:o,context:i,page:s,baseUrl:a,logger:l,mockedServices:c,userBrowserSettings:p,viewport:d,onTabsChange:u,properties:m,clientCallbacks:h,iconKnowledgeBase:g}){if(wg(p),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=r,this.browser=o,this.context=i,this.page=s,this.baseUrl=a,this.logger=l,this.userControlledBrowserSettings=p,this.viewport=d||rn,this.onTabsChange=u,this.properties=m,this.clientCallbacks=h,m.recordVideo){let f=this.page.video();f&&this.videos.push(f)}this.iconKnowledgeBase=g}async registerAbortSignal(e){this.abortSignal=e}async initialize(){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera"]);let e=this.flagStore.getAllFlags(),t=[this.context.addInitScript({content:wd.cssGeneratorLibJs}),this.context.addInitScript({content:wd.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(e)};`})],r=Promise.all(Object.entries(this.mockedServices).map(([s,a])=>this.context.route(s,l=>a.handle(l)))),o=s=>this.handleNewPageEvent(s);this.context.on("page",o),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",o)});let i=Promise.all(t);await Promise.all([i,r]),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&PP()==="darwin"&&vP("system_profiler SPDisplaysDataType").toString().includes("Retina")?(y.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await Ga.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),this.properties.isNewHeadless&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:this.properties.systemDevicePixelRatio,mobile:this.viewport.width>1e3}}),await this.initializeScreencast(),this.stateManager=new Za({defaultTimeoutMs:this.smartWaitingTimeout,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,flagStore:this.flagStore,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,filterZeroOpacity:this.flagStore.isBooleanFlagEnabled("filter_zero_opacity_elements"),iconKnowledgeBase:this.iconKnowledgeBase}),this.contextInitialized=!0}async initializeScreencast(){this.clientCallbacks?.onScreencastFrame&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,r=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=r,this.clientCallbacks?.onScreencastFrame?.(r,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init({baseUrl:e,logger:t,storage:r,flagStore:o,enricher:i,mockedServices:s,userBrowserSettings:a,contextArgs:l,browserbaseConnectUrl:c,onTabsChange:p,recordVideo:d,iconKnowledgeBase:u,callbacks:m}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let h={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:a.browserType==="Google Chrome"?"chrome":void 0},g={viewport:rn,userAgent:a.userAgent??n.USER_AGENT,geolocation:{latitude:37.7749,longitude:-122.4194},locale:"en-US",timezoneId:"America/Los_Angeles",httpCredentials:a.basicAuthorization?{username:a.basicAuthorization.username??"",password:a.basicAuthorization.password??""}:void 0,javaScriptEnabled:a.disableJavaScript?!1:void 0,...l??{}},f=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-features=IsolateOrigins,site-per-process","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream"],S=null,x,b,w={systemDevicePixelRatio:l?.deviceScaleFactor,recordVideo:d};h.headless&&(a.browserType==="Google Chrome"||a.browserType==="Chromium"&&o.isBooleanFlagEnabled("use_new_chrome_headless_chromium"))&&(t.info("Using new chrome headless mode through feature flag override"),f.push("--headless=new"),w.isNewHeadless=!0),process.env.BROWSER_MEMORY_MB&&f.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`),a.disableGpu&&f.push("--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output");let E=!1;if(a.localChromeExtensionPaths?.length){E=!0;for(let I of a.localChromeExtensionPaths){let N=Xi(I,"manifest.json");if(!el(N))throw new R("UserConfigurationError",`Chrome extension path ${N} does not exist.`)}}if(E){let I=Xi(Yd,`momentic-session-${Date.now()}`);if(!el(I))try{xP(I,{recursive:!0})}catch(P){throw new R("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Yd} folder: ${P}`)}let N=[...f];if(a.localChromeExtensionPaths){let P=a.localChromeExtensionPaths.map(D=>kP(D)).join(",");N.includes("--headless=new")||N.push("--headless=new"),N.push(`--disable-extensions-except=${P}`),w.isNewHeadless=!0}g?.deviceScaleFactor&&N.push(`--force-device-scale-factor=${g.deviceScaleFactor}`,`--device-scale-factor=${g.deviceScaleFactor}`),g.viewport&&N.push(`--window-size=${g.viewport.width},${g.viewport.height}`),x=await Oy.launchPersistentContext(Xi(Yd,`momentic-session-${Date.now()}`),{...h,...g,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:N,baseURL:e}),t.debug({sharedContextOptions:g,sharedBrowserOptions:h,userBrowserSettings:a,chromeArgs:N,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),b=x.pages()[0]}else if(c){S=await Jd.connectOverCDP(c);let I=S.contexts()[0];if(!I)throw new Error("Failed to get browserbase default context");let N=I.pages()[0];if(!N)throw new Error("Failed to get browserbase default page");x=I,b=N}else{S=await Jd.launch({...h,args:f});let I={...g,baseURL:e,recordVideo:d?{dir:DP}:void 0};x=await S.newContext(I),t.debug({contextArgs:I,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:a,flags:o.getAllFlags()},"Browser initialization context args (standard)"),b=await x.newPage()}let C=new n({browser:S,context:x,page:b,baseUrl:e,logger:t,storage:r,flagStore:o,mockedServices:s||{},enricher:i,userBrowserSettings:a,viewport:g.viewport||rn,onTabsChange:p,properties:w,clientCallbacks:m,iconKnowledgeBase:u});return await C.initialize(),C}async handleAvailableTabsChangeHelper(){try{let e=await No(this.context,{getTitles:!0}),t=this.page.url();this.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let r=Iy(),o=`${e}-${r}`,i=Date.now(),s=!1,a=async()=>{try{await U(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],s=!0}};this.pageLoadPromises[o]=a().catch(()=>{}),s&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.info({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let r=this.context.pages();for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(!i||i.isClosed()||!tr(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:o});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let r=e.video();r&&this.videos.push(r)}try{this.handleNewPageEventHelper(e)}catch(r){this.logger.warn({err:r},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Iy(),r="new-page-load-handler";e.on("close",s=>this.handlePageClosedEvent(s)),e.on("framenavigated",s=>this.handleFrameNavigationEvent(s)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",s=>{DS(e,o,this.debugData,s,this.logger)}),e.on("request",s=>{$S(t,this.debugData,s,this.logger)});let i=async()=>{await HS(t,this.debugData,e),await this.loadFrameAndRecordUrl({root:e,codePath:r}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(r,async()=>i())}async handleCollectSvgs(e){if(!this.flagStore.isBooleanFlagEnabled("icon_knowledge_base")||this.page.isClosed()||this.page.mainFrame()!==e||!this.iconKnowledgeBase||!this.clientCallbacks?.onSvgsCollected||Date.now()-this.lastIconKnowledgeBaseUpdateTime<5e3)return;this.lastIconKnowledgeBaseUpdateTime=Date.now();let t=await this.stateManager.getDomGraph({devicePixelRatio:this.devicePixelRatio}),r=TS({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(r.forEach(a=>{this.iconKnowledgeBase[a.hash]=a}),!r.length)return;let o=Ge(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:IP()};for(let a of["runId","testId"])o[a]&&(i[a]=o[a]);let s={metadata:i,newSvgs:r};this.clientCallbacks.onSvgsCollected(s)}handleFrameNavigationEvent(e){let t=e.url(),r=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)}-${r}`;if(!t||t==="about:blank"||!tr(t))return;let i=async()=>{try{await this.loadFrameAndRecordUrl({root:e,codePath:o,signal:this.abortSignal}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&(await this.waitForDOMStability(),setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(a){this.logger.warn({err:a},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let r={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(r[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},r)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame()},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();await this.clearAuthState({closeNonActiveTabs:!0}),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await U(Ud(this.getBrowserCallbacks()),{milliseconds:1e3})}catch(e){this.logger.warn({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0;try{this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,r){let o=Date.now(),i=0,s=0;for(;Date.now()-o<8e3;){s++,r?.throwIfAborted();try{if(await qe({fn:()=>{let l=window;return!!(l.generateCssSelectors&&l.evaluateCssSelectors&&l.generateHtmlCacheAttributes&&l.ldist)},timeout:1e3,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensureMomenticBrowserScriptsLoaded"}))return}catch(a){if(i++,i>=3){t.warn({err:a},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ne(500),s%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),qe({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:3e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getFullHtmlTree"})}url(){return this.page.url()}async screenshot(e){let{retries:t=1}=e;try{let r=await this.screenshotHelper({...e,retries:t});if(r.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(r.length===0)throw new Error("Got empty screenshot");return r}catch(r){if(t<=0||r.message.includes("has been closed"))throw r;return this.logger.debug({pageUrl:this.page.url(),err:r},"Failed taking screenshot, retrying..."),await ne(250),this.screenshot({...e,retries:t-1})}}async screenshotHelper({locator:e,quality:t,scale:r="css",saveToDiskPath:o,hideCaret:i,timeout:s,respectActiveFrame:a,disableAnimations:l,clearHighlights:c=!1}){let p={fullPage:!1,type:"jpeg",quality:t,scale:r,caret:i?"hide":"initial",path:o,timeout:s??3e3,animations:l?"disabled":void 0};c&&await this.clearHighlights(),a&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement()),e&&(p.scale="css");let d;if(p.scale==="css"||this.properties.isNewHeadless)d=await this.page.screenshot(p);else{let S=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:2e3});d=Buffer.from(S.data,"base64"),p.path&&EP(p.path,d)}if(this.lastScreenshotForRecording=d,!e)return d;let u=await e.boundingBox({timeout:1e3});if(!u)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=u;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");if(m<0||h<0)throw new Error("Attempted to screenshot an element with negative coordinates");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{d=await(await CP.fromBuffer(d)).crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}return"dispose"in e&&await e?.dispose(),d}getViewport(){return this.viewport}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:r=this.pageLoadTimeout}){Cf(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,s;for(let l=0;l<3;l++)try{await this.page.goto(e,{timeout:r,waitUntil:"domcontentloaded"}),i=!0;break}catch(c){if(s=c,this.abortSignal?.throwIfAborted(),this.logger.warn({err:c},`Error occurred during navigation${l===0?", retrying...":" (fatal)"}`),await ne(1e3+1e3*l),s.message.includes("ERR_CONNECTION_CLOSED")&&await this.page.reload({timeout:r,waitUntil:"domcontentloaded"}),s.message.includes("Timeout")&&s.message.includes("exceeded")||s.message.includes("net::ERR_CONNECTION_REFUSED"))break}if(!i)throw new R("UserInfrastructureError",s?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step"}),this.logger.debug({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let a=this.url();if(hS.has(a))throw new R("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(l){l instanceof Error&&l.message.includes("already registered")||this.logger.error({err:l},"Failed to install Momentic libraries for action recording")}}async type(e,t={},r=!1){await this.directTypeHelper(e,t,r)}async getActiveElement(e){try{return await qe({root:e,fn:()=>{let r=document.activeElement?.textContent??void 0;return r&&r.length>100&&(r=r.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:r}:void 0},arg:void 0,timeout:1e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getActiveElement"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},r=!1){let o=await this.getActivePageOrFrame();await KS({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ne(250),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25)):this.logger.warn({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Uu}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoView(e){await e.scrollIntoViewIfNeeded({timeout:2e3})}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return qa({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),r=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),r=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:1e3}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),r=[...this.context.pages()];for(let o=0;o<r.length;o++){let i=r[o];if(i.isClosed())continue;let s=i.url();try{this.originsVisited.delete(new URL(s).origin)}catch{}await FS(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.debug(`Closing tab ${o} with URL ${s}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let s=await this.setCookie(i);t=t.concat(s)}this.logger.debug(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:1e3});let r=0;for(let i of e.origins??[])for(let s of i.localStorage)try{await this.cdpClient.send({timeout:1e3,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:s.name,value:s.value}}),r++}catch(a){this.logger.warn({err:a,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.debug(`Loaded ${r} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await MS(this.page,o,this.logger),this.logger.debug(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,r=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await _S(this.page,this.logger),o}catch(o){if(r=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(s=>setTimeout(s,i))}}throw this.logger.error({err:r},"Failed to save auth state after 2 retries"),new R("ActionFailureError",`Failed to save auth state: ${r?.message}`)}async getOpenPages(e){return No(this.context,e)}saveA11yDetailsToCache(e,t){t.id=e.id,t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,t.serializedForm=e.getSerializedFormWithContext(),t.nodeOnlySerializedForm=e.getNodeOnlySerializedForm()}async saveNodeDetailsToCache({node:e,target:t,dataMomenticId:r,locator:o,logger:i=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),!(t.generatedSelectors&&t.generatedSelectors.length>1)){if(r&&(t.dataMomenticId=r),o)try{let s=await this.fetchHtmlAttributes(o,i);Object.assign(t,s)}catch(s){i.warn({err:s},"Failed to fetch HTML attributes for target")}else i.debug("No locator found for target, skipping HTML attribute generation");try{await this.saveElementVisualAttributes(t,o,i)}catch(s){i.debug({err:s},"Failed to save element visual details")}}}async saveElementVisualAttributes(e,t,r){if(!t)return;await t.scrollIntoViewIfNeeded({timeout:1e3});let o=await t.boundingBox({timeout:1e3});if(!o||!o.width||!o.height){r.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}e.boundingBox=o;let{x:i=0,y:s=0,width:a=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-a)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-s)<1||!Td.includes(e?.role??""))return;let c=await this.screenshot({locator:t,retries:0});e.screenshotUrl=await this.storage.uploadScreenshot(c)}async resolveTargetUsingCssSelectors({root:e,target:t,logger:r}){if(!t.generatedSelectors||t.generatedSelectors.length<2||!t.nodeOnlySerializedHtml)throw new Ui("Insufficient data to resolve target using CSS selectors");let o;try{o=await qe({fn:c=>window.evaluateCssSelectors(c),arg:{selectors:t.generatedSelectors,ldistThreshold:.05,serializedNodeWithText:t.nodeOnlySerializedHtml},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluateCssSelectors"})}catch(c){throw new Error(`Failed to evaluate CSS selectors in browser: ${c}`)}let i=o.result;if(i)r.debug(o,"CSS selector evaluation returned an element");else throw new Error(`CSS selector evaluation returned no eligible elements:
3532
3550
  ${o.logs.join(`
3533
- `)}`);let s,a,l;if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let c=i.mPath.join(" > ");s=e.locator(c),a=this.stateManager.getNodeUsingMPathSelector(c)}else l=parseInt(i.dataMomenticId),a=this.stateManager.dataMomenticIdToNodeMap[l],s=e.locator(i.workingSelectors[0]);return t.generatedSelectors=void 0,await this.saveNodeDetailsToCache({node:a,target:t,dataMomenticId:l,locator:s,logger:r}),t.generatedSelectors=Array.from(new Set([...i.workingSelectors??[],...t.generatedSelectors??[]].slice(0,12))),{a11yNode:a,displayString:i.serializedElement,locator:s,decisions:[{type:"CSS_SELECTOR",matched:!0,reason:`${i.workingSelectors.length} CSS selectors matched the following element: ${i.serializedElement}`,selectors:i.workingSelectors.slice(0,5)}]}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async createTargetFromA11yId({id:e,description:t,targetSource:r,skipSaveToCache:o,logger:i=this.logger}){if(e<0)throw new R("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let s=this.stateManager.a11yIdToNodeMap[e];if(!s)throw new R("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let a=this.stateManager.frameConfig,l,c,p,d;if(this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")&&!a&&s.parentFrame){let f=s.parentFrame,{cache:S,config:x}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,p=x,l=x.frame,d="auto iframe"}else s.parentFrame&&a?(p=a,l=await this.getActivePageOrFrame(),d="hardcoded url already on the state manager"):(l=await this.getActivePageOrFrame(),d="should not be possible");let u=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:l,node:s}),m={id:e,inputDescription:t??void 0,targetSource:r,targetUpdateTime:new Date().toISOString(),frameCache:c},h,g=!1;o||(p&&(i.debug({frameConfigSource:d,frameConfig:ny(p)},"A11y node was resolved to a target within an iframe"),h=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),g=!0),await this.saveNodeDetailsToCache({node:s,target:m,dataMomenticId:s.dataMomenticId,locator:u,logger:i}));try{return{resolution:{locator:u,a11yNode:s,displayString:s.getNodeOnlySerializedForm(),decisions:[]},target:m,frameConfig:p,frameConfigSource:d}}finally{g&&this.stateManager.setActiveFrameConfig(h)}}async resolveTarget(e,t,r={}){let{skipFetchTree:o=!1,targetName:i,logger:s=this.logger,signal:a=this.abortSignal}=r,l=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(l,s,a);let c=Date.now(),p=0,d;for(;Date.now()-c<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),p++;let u=Date.now()-c>this.smartWaitingTimeout-2e3;try{d=await this.resolveTargetHelper({root:l,target:t,cssSelectorOnly:!0,skipFetchTreeWait:!0,skipFetchTree:o,logger:u?s:Or,signal:a});break}catch(m){if(m instanceof Ui)break;u&&s.debug({err:m},`Could not resolve target through CSS selectors only (x${p})`),await ne(500,this.abortSignal)}}return d||(d=await this.resolveTargetHelper({root:l,target:t,cssSelectorOnly:!1,skipFetchTreeWait:!1,skipFetchTree:o,logger:s,signal:a}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),s.debug({decisions:d.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:i,elementLocationDecisions:d?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),d}async resolveTargetHelper({root:e,target:t,cssSelectorOnly:r,skipFetchTree:o,skipFetchTreeWait:i,logger:s,signal:a,skipSaveToCache:l}){let c=[],p;o||(p=(await this.getBrowserState({skipWait:i,logger:s,abortSignal:a})).serialize(),s.debug({skipFetchTreeWait:i,tree:p},"Got a11y tree before attempting target resolution"));let d=this.stateManager.a11yIdToNodeMap[t.id],u=d?.getNodeOnlySerializedForm();if(!o&&!this.flagStore.isBooleanFlagEnabled("visual_actions")&&d&&t.serializedForm&&u===t.serializedForm){let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:e,node:d});return l||await this.saveNodeDetailsToCache({node:d,target:t,dataMomenticId:d.dataMomenticId,locator:h,logger:s}),c.push({type:"A11Y_ID",matched:!0,reason:`An element with the same Chrome-internal accessibility node ID matched the saved content exactly: ${u}.`}),{locator:h,a11yNode:d,displayString:u,decisions:c,pageState:void 0}}let m;if(t.generatedSelectors){let h;try{h=await this.resolveTargetUsingCssSelectors({root:e,target:t,logger:s})}catch(g){m=g}if(h)return{...h,pageState:void 0,decisions:[...c,...h.decisions]};r||(c.push({type:"CSS_SELECTOR",matched:!1,reason:m?.message,selectors:TP(t.generatedSelectors)}),t.generatedSelectors=void 0)}if(r)throw m;if(!this.flagStore.isBooleanFlagEnabled("disable_secondary_cache_resolution")){let h=await this.resolveTargetWithSecondaryMethods({root:e,tree:p,target:t,decisions:c,logger:s,signal:a,skipSaveToCache:l});if(h)return h}throw s.debug({target:t,decisions:c},"Failed to find any relevant node"),new Yn(`Could not find any relevant node given target: ${JSON.stringify(t)}`,c)}async resolveHardcodedCssSelector(e){let{ctx:t,selector:r,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:s=this.smartWaitingTimeout}=e,a=await this.getActivePageOrFrame(),l=Date.now(),c=0,p,d=[];for(;Date.now()-l<s;){i?.throwIfAborted(),c++;let u=a.locator(r),m;try{return await u.waitFor({state:"attached",timeout:1e3}),m=await cn(u,o)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${r} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:u,displayString:m,decisions:d}}catch(h){let g=h.message;p=new R("ActionFailureError",`CSS selector '${r}' failed to resolve after ${c} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ne(500,i)}}throw p}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let t=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!t)return;let{x:r,y:o,width:i,height:s}=e.target.boundingBox,a=await t.locator.boundingBox({timeout:1e3});if(!a){this.logger.debug({proposedNode:t.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:l,y:c,width:p,height:d}=a;if(Math.abs(p-i)>50||Math.abs(d-s)>50){this.logger.debug({newW:p,oldW:i,newH:d,oldH:s,proposedNode:t.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(r&&o&&(!l||!c)){this.logger.debug({oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to new result not having x/y coords");return}else if(Math.abs((l??0)-(r??0))>200||Math.abs((c??0)-(o??0))>200){this.logger.debug({newX:l,newY:c,oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return t}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:r,logger:o,signal:i,skipSaveToCache:s}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<10){let c="Refusing to attempt HTML comparison since the saved element is too short.";r.push({type:"HTML_DISTANCE",matched:!1,reason:c})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let c=await qe({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:2e3,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"findClosestElementByLDist"}),p=Math.floor(.05*t.nodeOnlySerializedHtml.length);if(c&&c.closestDistance&&c.closestDistance>=p){let d=`Closest HTML candidate still has too far distance (${c.closestDistance}) from threshold (${p})`;r.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:c.closestDistance,closestElement:c.closestNodeSerialized})}else{if(c?.error)throw new Error(c.error);if(c?.dataMomenticId||c?.mPathSelector){let d=c.dataMomenticId?parseInt(c.dataMomenticId):void 0,u,m;if(d)u=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(`[${bt}="${d}"]`);else if(c.mPathSelector)u=this.stateManager.getNodeUsingMPathSelector(c.mPathSelector),m=e.locator(c.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=c.closestNodeSerialized??await cn(m,o)??"unknown element";return o.warn({result:c,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance"),s||await this.saveNodeDetailsToCache({node:u,target:t,dataMomenticId:d,locator:m,logger:o}),r.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${p} string comparison distance of the saved element.`,logs:c.logs,distance:c.closestDistance,closestElement:h,savedElement:t.nodeOnlySerializedHtml}),{locator:m,a11yNode:u,displayString:h,decisions:r,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(c)}`)}}catch(c){o.debug({err:c},"Failed to find closest HTML node using levenshtein distance"),r.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${c}`})}let a=t.screenshotUrl,l=t.role??"";if(a&&xd.includes(l))try{let c=await this.resolveTargetWithScreenshot({root:e,oldTarget:t,screenshotUrl:a,signal:i,skipSaveToCache:s});return{...c,decisions:[...r,...c.decisions],pageState:void 0}}catch(c){i?.throwIfAborted(),r.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${c}`,elementImageUrl:a}),o.warn({err:c},"Did not find any close element using saved screenshot")}}async resolveTargetWithScreenshot({root:e,screenshotUrl:t,oldTarget:r,signal:o,skipSaveToCache:i}){let s;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(t)).arrayBuffer(),p=kP(),d=await this.enricher.runTemplateMatching({id:p,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:o});this.logger.debug({id:p,templateMatch:d},"Template matching got successful result");let{target:u,locator:m}=await this.getTargetFromPositionPercentages({percentX:d.x,percentY:d.y}),h=u.boundingBox?.width,g=u.boundingBox?.height;if(!h||!g)throw s="Rejecting target from screenshot due to no bounding box",new Error(s);let f=u.id,S=this.stateManager.a11yIdToNodeMap[f];return i||await this.saveNodeDetailsToCache({target:r,node:S,locator:m,dataMomenticId:f}),{locator:m,a11yNode:S,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:t}]}}async resolveTargetWithXY(e,t=!1){if(this.logger.debug({target:e,skipFetchTree:t},"Resolve target through x / y positioning called"),!t){let s=(await this.getBrowserState({})).serialize();this.logger.debug({tree:s},"Got a11y tree for x / y resolution")}let r=await this.getActivePageOrFrame(),{target:o}=await this.getTargetFromPixelPosition(e);if((o.generatedSelectors??[]).length>0)return{locator:r.locator(o.generatedSelectors[0]),a11yNode:this.stateManager.a11yIdToNodeMap[o.id],displayString:o.nodeOnlySerializedHtml??o.nodeOnlySerializedForm??"Unknown element",decisions:[]};let i=this.stateManager.a11yIdToNodeMap[o.id];if(i&&i.dataMomenticId)return{locator:r.locator(`[${bt}="${i.dataMomenticId}"]`),a11yNode:i,displayString:i.getNodeOnlySerializedForm(),decisions:[]};throw new Error("Could not resolve target with x / y through either raw HTML or the accessibility tree")}async typeIntoTarget(e,t,r={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:1e3})??"",i=GS.some(s=>s===o.toLowerCase());return await Bd({targetingResult:t,options:{force:r.force},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore}),await this.page.waitForTimeout(150),this.directTypeHelper(e,r)}async click(e,t,r={}){return Bd({targetingResult:e,options:r,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore})}async waitForUrl({beforeUrl:e,matcher:t,beforePages:r},o){let i=o?.timeout??this.pageLoadTimeout,s=Date.now();r||(r=(await No(this.context)).map(p=>p.url));let a=!1,l=[],c=e;for(;Date.now()-s<i;){this.abortSignal?.throwIfAborted(),l=(await No(this.context)).map(d=>d.url);for(let d=l.length-1;d>=r.length;d--){let u=l[d];if(u!==e&&tr(u,this.logger)){pd(u,t,o)&&await this.switchToPage({type:"INDEX",index:d});break}}if(c=(await this.getActivePageOrFrame()).url(),pd(c,t,o)){a=!0;break}await ne(500,this.abortSignal)}if(!a)throw new R("ActionFailureError",`The active page URL ${o?.negated?"still does":"does not"} ${ld(t)} in ${i}ms.
3551
+ `)}`);let s,a,l;if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let c=i.mPath.join(" > ");s=e.locator(c),a=this.stateManager.getNodeUsingMPathSelector(c)}else l=parseInt(i.dataMomenticId),a=this.stateManager.dataMomenticIdToNodeMap[l],s=e.locator(i.workingSelectors[0]);return t.generatedSelectors=void 0,await this.saveNodeDetailsToCache({node:a,target:t,dataMomenticId:l,locator:s,logger:r}),t.generatedSelectors=Array.from(new Set([...i.workingSelectors??[],...t.generatedSelectors??[]].slice(0,12))),{a11yNode:a,displayString:i.serializedElement,locator:s,decisions:[{type:"CSS_SELECTOR",matched:!0,logs:o.logs,reason:`${i.workingSelectors.length} CSS selectors matched the following element: ${i.serializedElement}`,selectors:i.workingSelectors.slice(0,5)}]}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async createTargetFromA11yId({id:e,description:t,targetSource:r,skipSaveToCache:o,logger:i=this.logger}){if(e<0)throw new R("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let s=this.stateManager.a11yIdToNodeMap[e];if(!s)throw new R("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let a=this.stateManager.frameConfig,l,c,p,d;if(this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")&&!a&&s.parentFrame){let f=s.parentFrame,{cache:S,config:x}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,p=x,l=x.frame,d="auto iframe"}else s.parentFrame&&a?(p=a,l=await this.getActivePageOrFrame(),d="hardcoded url already on the state manager"):(l=await this.getActivePageOrFrame(),d="should not be possible");let u=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:l,node:s}),m={id:e,inputDescription:t??void 0,targetSource:r,targetUpdateTime:new Date().toISOString(),frameCache:c},h,g=!1;o||(p&&(i.debug({frameConfigSource:d,frameConfig:oy(p)},"A11y node was resolved to a target within an iframe"),h=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),g=!0),await this.saveNodeDetailsToCache({node:s,target:m,dataMomenticId:s.dataMomenticId,locator:u,logger:i}));try{return{resolution:{locator:u,a11yNode:s,displayString:s.getNodeOnlySerializedForm(),decisions:[]},target:m,frameConfig:p,frameConfigSource:d}}finally{g&&this.stateManager.setActiveFrameConfig(h)}}async resolveTarget(e,t,r={}){let{skipFetchTree:o=!1,targetName:i,logger:s=this.logger,signal:a=this.abortSignal}=r,l=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(l,s,a);let c=Date.now(),p=0,d;for(;Date.now()-c<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),p++;let u=Date.now()-c>this.smartWaitingTimeout-2e3;try{d=await this.resolveTargetHelper({root:l,target:t,cssSelectorOnly:!0,skipFetchTreeWait:!0,skipFetchTree:o,logger:u?s:Or,signal:a});break}catch(m){if(m instanceof Ui)break;u&&s.debug({err:m},`Could not resolve target through CSS selectors only (x${p})`),await ne(500,this.abortSignal)}}return d||(d=await this.resolveTargetHelper({root:l,target:t,cssSelectorOnly:!1,skipFetchTreeWait:!1,skipFetchTree:o,logger:s,signal:a}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),s.debug({decisions:d.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:i,elementLocationDecisions:d?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),d}async resolveTargetHelper({root:e,target:t,cssSelectorOnly:r,skipFetchTree:o,skipFetchTreeWait:i,logger:s,signal:a,skipSaveToCache:l}){let c=[],p;o||(p=(await this.getBrowserState({skipWait:i,logger:s,abortSignal:a})).serialize(),s.debug({skipFetchTreeWait:i,tree:p},"Got a11y tree before attempting target resolution"));let d=this.stateManager.a11yIdToNodeMap[t.id],u=d?.getNodeOnlySerializedForm();if(!o&&!this.flagStore.isBooleanFlagEnabled("visual_actions")&&d&&t.serializedForm&&u===t.serializedForm){let h=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:e,node:d});return l||await this.saveNodeDetailsToCache({node:d,target:t,dataMomenticId:d.dataMomenticId,locator:h,logger:s}),c.push({type:"A11Y_ID",matched:!0,reason:`An element with the same Chrome-internal accessibility node ID matched the saved content exactly: ${u}.`}),{locator:h,a11yNode:d,displayString:u,decisions:c,pageState:void 0}}let m;if(t.generatedSelectors){let h;try{h=await this.resolveTargetUsingCssSelectors({root:e,target:t,logger:s})}catch(g){m=g}if(h)return{...h,pageState:void 0,decisions:[...c,...h.decisions]};r||(c.push({type:"CSS_SELECTOR",matched:!1,reason:m?.message,selectors:AP(t.generatedSelectors)}),t.generatedSelectors=void 0)}if(r)throw m;if(!this.flagStore.isBooleanFlagEnabled("disable_secondary_cache_resolution")){let h=await this.resolveTargetWithSecondaryMethods({root:e,tree:p,target:t,decisions:c,logger:s,signal:a,skipSaveToCache:l});if(h)return h}throw s.debug({target:t,decisions:c},"Failed to find any relevant node"),new Yn(`Could not find any relevant node given target: ${JSON.stringify(t)}`,c)}async resolveHardcodedCssSelector(e){let{ctx:t,selector:r,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:s=this.smartWaitingTimeout}=e,a=await this.getActivePageOrFrame(),l=Date.now(),c=0,p,d=[];for(;Date.now()-l<s;){i?.throwIfAborted(),c++;let u=a.locator(r),m;try{return await u.waitFor({state:"attached",timeout:1e3}),m=await cn(u,o)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${r} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:u,displayString:m,decisions:d}}catch(h){let g=h.message;p=new R("ActionFailureError",`CSS selector '${r}' failed to resolve after ${c} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ne(500,i)}}throw p}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let t=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!t)return;let{x:r,y:o,width:i,height:s}=e.target.boundingBox,a=await t.locator.boundingBox({timeout:1e3});if(!a){this.logger.debug({proposedNode:t.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:l,y:c,width:p,height:d}=a;if(Math.abs(p-i)>50||Math.abs(d-s)>50){this.logger.debug({newW:p,oldW:i,newH:d,oldH:s,proposedNode:t.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(r&&o&&(!l||!c)){this.logger.debug({oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to new result not having x/y coords");return}else if(Math.abs((l??0)-(r??0))>200||Math.abs((c??0)-(o??0))>200){this.logger.debug({newX:l,newY:c,oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return t}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:r,logger:o,signal:i,skipSaveToCache:s}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<10){let c="Refusing to attempt HTML comparison since the saved element is too short.";r.push({type:"HTML_DISTANCE",matched:!1,reason:c})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let c=await qe({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:2e3,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"findClosestElementByLDist"}),p=Math.floor(.05*t.nodeOnlySerializedHtml.length);if(c&&c.closestDistance&&c.closestDistance>=p){let d=`Closest HTML candidate still has too far distance (${c.closestDistance}) from threshold (${p})`;r.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:c.closestDistance,closestElement:c.closestNodeSerialized})}else{if(c?.error)throw new Error(c.error);if(c?.dataMomenticId||c?.mPathSelector){let d=c.dataMomenticId?parseInt(c.dataMomenticId):void 0,u,m;if(d)u=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(`[${bt}="${d}"]`);else if(c.mPathSelector)u=this.stateManager.getNodeUsingMPathSelector(c.mPathSelector),m=e.locator(c.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=c.closestNodeSerialized??await cn(m,o)??"unknown element";return o.warn({result:c,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance"),s||await this.saveNodeDetailsToCache({node:u,target:t,dataMomenticId:d,locator:m,logger:o}),r.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${p} string comparison distance of the saved element.`,logs:c.logs,distance:c.closestDistance,closestElement:h,savedElement:t.nodeOnlySerializedHtml}),{locator:m,a11yNode:u,displayString:h,decisions:r,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(c)}`)}}catch(c){o.debug({err:c},"Failed to find closest HTML node using levenshtein distance"),r.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${c}`})}let a=t.screenshotUrl,l=t.role??"";if(a&&Td.includes(l))try{let c=await this.resolveTargetWithScreenshot({root:e,oldTarget:t,screenshotUrl:a,signal:i,skipSaveToCache:s});return{...c,decisions:[...r,...c.decisions],pageState:void 0}}catch(c){i?.throwIfAborted(),r.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${c}`,elementImageUrl:a}),o.warn({err:c},"Did not find any close element using saved screenshot")}}async resolveTargetWithScreenshot({root:e,screenshotUrl:t,oldTarget:r,signal:o,skipSaveToCache:i}){let s;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(t)).arrayBuffer(),p=FP(),d=await this.enricher.runTemplateMatching({id:p,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:o});this.logger.debug({id:p,templateMatch:d},"Template matching got successful result");let{target:u,locator:m}=await this.getTargetFromPositionPercentages({percentX:d.x,percentY:d.y}),h=u.boundingBox?.width,g=u.boundingBox?.height;if(!h||!g)throw s="Rejecting target from screenshot due to no bounding box",new Error(s);let f=u.id,S=this.stateManager.a11yIdToNodeMap[f];return i||await this.saveNodeDetailsToCache({target:r,node:S,locator:m,dataMomenticId:f}),{locator:m,a11yNode:S,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:t}]}}async resolveTargetWithXY(e,t=!1){if(this.logger.debug({target:e,skipFetchTree:t},"Resolve target through x / y positioning called"),!t){let s=(await this.getBrowserState({})).serialize();this.logger.debug({tree:s},"Got a11y tree for x / y resolution")}let r=await this.getActivePageOrFrame(),{target:o}=await this.getTargetFromPixelPosition(e);if((o.generatedSelectors??[]).length>0)return{locator:r.locator(o.generatedSelectors[0]),a11yNode:this.stateManager.a11yIdToNodeMap[o.id],displayString:o.nodeOnlySerializedHtml??o.nodeOnlySerializedForm??"Unknown element",decisions:[]};let i=this.stateManager.a11yIdToNodeMap[o.id];if(i&&i.dataMomenticId)return{locator:r.locator(`[${bt}="${i.dataMomenticId}"]`),a11yNode:i,displayString:i.getNodeOnlySerializedForm(),decisions:[]};throw new Error("Could not resolve target with x / y through either raw HTML or the accessibility tree")}async typeIntoTarget(e,t,r={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:1e3})??"",i=qS.some(s=>s===o.toLowerCase());return await zd({targetingResult:t,options:{force:r.force},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore}),await this.page.waitForTimeout(150),this.directTypeHelper(e,r)}async click(e,t,r={}){return zd({targetingResult:e,options:r,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore})}async waitForUrl({beforeUrl:e,matcher:t,beforePages:r},o){let i=o?.timeout??this.pageLoadTimeout,s=Date.now();r||(r=(await No(this.context)).map(p=>p.url));let a=!1,l=[],c=e;for(;Date.now()-s<i;){this.abortSignal?.throwIfAborted(),l=(await No(this.context)).map(d=>d.url);for(let d=l.length-1;d>=r.length;d--){let u=l[d];if(u!==e&&tr(u,this.logger)){ud(u,t,o)&&await this.switchToPage({type:"INDEX",index:d});break}}if(c=(await this.getActivePageOrFrame()).url(),ud(c,t,o)){a=!0;break}await ne(500,this.abortSignal)}if(!a)throw new R("ActionFailureError",`The active page URL ${o?.negated?"still does":"does not"} ${cd(t)} in ${i}ms.
3534
3552
  Current tab: ${c}
3535
3553
  All tabs: ${l.join(`
3536
- `)}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(p){this.logger.warn({err:p},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,r={}){await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:1e3});if(!o)throw new R("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,s=o.y+o.height/2,a=r.steps??5;await this.page.mouse.move(i,s,{steps:a}),await ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,r,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(Fd);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Hr({func:async t=>{await t.locator.scrollIntoViewIfNeeded({timeout:1e3});let r=await t.locator.boundingBox({timeout:1e3});if(!r)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(r.x+r.width/2,r.y+r.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Hr({func:t=>t.locator.focus({timeout:2e3}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await qe({fn:()=>{let r=document.activeElement;r&&r.nodeType===1&&r.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:1e3,codePath:"blurCommand"});return}await this.highlight(e.locator),await Hr({func:t=>t.locator.blur({timeout:2e3}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,r=!1){await this.highlight(e.locator),await Hr({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?t.index:void 0},{force:r,timeout:3e3})},targetingResult:e})}async press(e,t){let r=t.repeat??1;if(t.convertMeta){let o=JS(e);o!==e&&(this.logger.debug({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<r;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0});await this.waitForDOMStability({timeout:1e3})}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let r=0,o=2;for(;r<o;){r++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:r},`Failed to reload page${r<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"})}async getBrowserState(e){let{logger:t=this.logger,maxAttempts:r=2,skipWaitForPageLoad:o}=e,i=e.abortSignal??this.abortSignal;if(o||await this.waitForPageLoad(),!e.skipWait){let l=Date.now();await this.waitForDOMStability({logger:t,signal:i}),t.debug({duration:Date.now()-l},"Waited for DOM stability before getting browser state")}let s=0,a;for(;s<r;){s++;try{return await U(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:i,logger:t,filterByViewport:e.filterByViewport}),{milliseconds:this.pageLoadTimeout*s,signal:i,message:"Getting browser state took too long"})}catch(l){if(i?.throwIfAborted(),a=l instanceof Error?l.message:`${l}`,s>=r)throw l;t.debug({err:l,url:this.url()},"Error getting a11y tree, retrying...")}}throw new R("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${a}`)}async getViewportOffsetDetails(e){let[t,r,o,i,s]=await qe({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:3e3,waitForPageLoad:async()=>{},codePath:"getViewportOffsetDetails"});return{upperBound:t,lowerBound:t+i,leftBound:r,rightBound:r+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??s}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:r=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},s=u=>{i.value=Date.now()},a=()=>s("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",a);let l=()=>s("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>l);let c=()=>s("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",c);let p=()=>s("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",p);let d=()=>s("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,r,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",a),this.cdpClient.removeListener("Page.frameDetached",l),this.cdpClient.removeListener("Page.frameStartedLoading",c),this.cdpClient.removeListener("Page.navigatedWithinDocument",p),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,r,o){let i=!1,s=Date.now(),a,l={quality:25,retries:0,hideCaret:!0,disableAnimations:!0},c=!1,p=0;for(;Date.now()-s<r;){if(o?.throwIfAborted(),await ne(500,this.abortSignal),a)try{let u=await this.screenshot(l);if(!u.equals(a)){a=u,c=!1;continue}c=!0}catch(u){p++,p%3===0&&t.warn({err:u,screenshotErrors:p},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{a=await this.screenshot(l)}catch(u){p++,p%3===0&&t.warn({err:u,screenshotErrors:p},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<750)){i=!0;break}}let d={duration:Date.now()-s,a11yStableReceived:i,lastTreeUpdateMillisecondsAgo:Date.now()-e.value,screenshotStable:c};i||t.warn(d,"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:r,y:o}=e,i=this.url(),s=(await No(this.context)).map(a=>a.url);this.logger.debug({x:r,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(r,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1}),t.waitForUrl&&await this.waitForUrl({beforeUrl:i,beforePages:s,matcher:{type:"GLOB",glob:t.waitForUrl}})}async dragAndDropUsingVisualCoordinates(e,t,r){await this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,8e3):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,r,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(Fd);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:3e3}),r=await U(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:2e3});process.platform==="darwin"&&r===1&&(r=2);let o=t.documents[0],i=o.layout,s=o.nodes,a=s.nodeName||[],l=s.backendNodeId||[],c=i.nodeIndex,p=i.bounds,d=-1;for(let x=0;x<a.length;x++)if(l[x]===e){d=c.indexOf(x);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[u=0,m=0,h=0,g=0]=p[d];u/=r,m/=r,h/=r,g/=r;let f=u+h/2,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return zd({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks()})}async scrollHorizontal(e){return zd({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks()})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}async createRawCDPSession(e){let t=await U(this.context.newCDPSession(this.page),{milliseconds:e??this.pageLoadTimeout,fallback:()=>{throw this.logger.error(`Timed out creating new CDP session for ${this.page.url()}`),new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${this.page.url()})`)}});return this.logger.debug(`Created new CDP session for ${this.page.url()}`),t}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async changeActivePage(e,t){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let r=await this.context.newPage();await this.changeActivePage(r,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let r=!0,o,i=Date.now();for(;r||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){r=!1;try{await this.switchToPageHelper(e,t);return}catch(s){this.logger.warn({err:s},"Error switching to page, retrying..."),o=s,await ne(500)}}throw o}async switchToPageHelper(e,t){let r=this.context.pages().map((i,s)=>({page:i,url:i.url(),index:s})),o;if(e.type==="INDEX"){if(e.index<0||e.index>=r.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(r.map(i=>i.url))}`);o=r[e.index]}else{let i=r.filter(s=>e.type==="SUBSTRING"?s.url.includes(e.substring):s.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(s=>s.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
3537
- Available pages:${JSON.stringify(r.map(i=>i.url))}`);if(!tr(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.debug(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=pa(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let r=await this.getActivePageOrFrame();await U(r.evaluate(([o,i])=>{o&&localStorage.setItem(o,i||"")},[e,t]),{milliseconds:2e3})}async solveCaptcha(){await this.getBrowserState({});let e;for(let a of Object.values(this.stateManager.a11yIdToNodeMap))if(a.role==="image"&&a.name.toLowerCase().includes("captcha")){if(!a.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,a.backendNodeId);break}if(!e){let a=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!a.captchas||!a.captchas.length)throw new Error("No captchas found on the page");return}let t=await e.screenshot({type:"jpeg",animations:"allow",caret:"hide",quality:100,timeout:3e3}),r=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:tl,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!r.ok){let a=`Captcha solver API returned error response: ${r.statusText}`;throw this.logger.error({text:await r.text()},a),new Error(a)}let{taskId:o}=await r.json(),i=Date.now(),s="";for(;Date.now()-i<6e4;){await ne(2500);let a=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:tl,taskId:o})});if(!a.ok){let c=`Captcha solution API returned error response: ${a.statusText}`;throw this.logger.error({text:await a.text()},c),new Error(c)}let l=await a.json();if(l.errorId){let c=`Captcha solution API returned error ID ${l.errorId}`;throw this.logger.error(c),new Error(c)}if(l.status==="ready"){s=l.solution.text;break}}if(!s)throw new Error("Captcha solution timed out");return s}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&oy({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,r=(await this.getOpenPages()).map(a=>a.url),o=0,i=!1,s=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let a;try{a=(await this.getOpenPages()).map(c=>c.url),o=0}catch(c){this.logger.debug({err:c},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let c=a.length-1;c>=r.length;c--){let p=a[c];tr(p,this.logger)&&p!==l&&this.logger.info({lastActivePages:r,currentUrl:l,newOpenPages:a},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:c});break}r=a};t=setInterval(async()=>{if(!i){i=!0;try{await s()}catch(a){this.logger.error({err:a},"Error while checking pages during recording")}finally{i=!1}}},500),e.addEventListener("abort",async()=>{clearInterval(t)})}async startRecording(e,t,r){this.logger.debug({isClickToRecord:r},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(o=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!0,i._MOMENTIC_CLICK_RECORD_ACTIVE=o},r),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page),e.addEventListener("abort",async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let o=window;o._MOMENTIC_RECORDING_ACTIVE=!1,o._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}})}async getSelectOptions(e){return await e.evaluate(r=>Array.from(r.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:1e3})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:r}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await Dr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){let a=s;if(a.name==="AbortError")throw new Error(`The page with URL ${Me(i,50)} did not load within the configured timeout (${o}ms): ${a}`);if(!a.message.includes("detached"))throw a}try{await Dr({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){this.logger.warn({err:s,codePath:r,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return xP.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:r}=await qe({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getCondensedHtmlTree"});if(r)throw new Error(`Failed to process page HTML: ${r}`);if(!t)throw new R("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}async registerDialogHandler(e){let t=async r=>{try{e==="ACCEPT"?await r.accept():await r.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t){let r=await this.getActivePageOrFrame();return U(r.evaluate(e,t),{milliseconds:2e3})}async evaluateCodeInPage({code:e,fragment:t,context:r,timeoutMs:o=Kn}){let i=HS(),s={code:e,fragment:t,context:r},{result:a}=await U(this.page.evaluate(i,s),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new R("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return a}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let r;try{r=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:1e3})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return r}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:r}){if(t<0||t>1||r<0||r>1)throw new R("InternalWebAgentError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:s,leftBound:a}=await this.getViewportOffsetDetails(e),l=Math.round(s),c=Math.round(a),p=Math.ceil(o*t),d=Math.ceil(i*r),u=p+c,m=d+l;return this.getDomNodeFromPixelPosition(u,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),r;try{r=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return r?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:1e3,params:{highlightConfig:fS,backendNodeId:r.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:1e3,method:"Overlay.hideHighlight",params:{backendNodeId:r?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:1e3})}catch{}}async getTargetFromPixelPosition(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPixelPosition(e.x,e.y);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromPositionPercentages(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromBackendNodeId(e,t,r){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[bt],s=parseInt(i??"");if(!i||isNaN(s))throw new Error("No data-momentic-id was found on the DOM node");let a=e.locator(`[${bt}="${i}"]`);if(r){for(let d of Object.values(this.stateManager.a11yIdToNodeMap)){if(d.backendNodeId!==t)continue;let u={id:d.id,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.saveNodeDetailsToCache({node:d,target:u,dataMomenticId:parseInt(i),locator:a}),this.logger.debug({target:u},"Tied backend id to existing a11y node"),{target:u,locator:a}}let p=$a(`${i}`,this.stateManager.domGraph,this.logger);for(let d of p){let u=parseInt(d.attributes?.[bt]??"");if(isNaN(u))continue;let m=e.locator(`[${bt}="${u}"]`),h=this.stateManager.dataMomenticIdToNodeMap[u],g=h?.id;if(!g)continue;let f={id:g,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.saveNodeDetailsToCache({node:h,target:f,dataMomenticId:parseInt(i),locator:m}),this.logger.debug({target:f},"Tied backend id on non-accessible element to nearest a11y node"),{target:f,locator:m}}}let l=await this.fetchHtmlAttributes(a,this.logger),c={id:-1,dataMomenticId:s,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:c},"Tied backend id to html node"),{target:c,locator:a}}async performTargetRedirection(e,t,r){try{return await e.scrollIntoViewIfNeeded({timeout:3e3}),await U(this.performTargetRedirectionHelper(e,t,r),{milliseconds:3e3})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,r){let o=Date.now(),i=await cn(e,t);if(r===void 0&&(r=await e.boundingBox({timeout:1e3})),!r){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:s,y:a,width:l,height:c}=r,p=this.getViewport();if(s<0||a<0||s+l>p.width||a+c>p.height){t.debug("Skipping locator redirection because the element is outside the viewport");return}let d=await this.getActivePageOrFrame(),{dataMomenticId:u,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:x}=await e.evaluate(w=>{let E=window;if(!E.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return E.performTargetRedirection(w)},void 0,{timeout:1e3}),b=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:b,force:S,logs:x},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:b,force:S,logs:x},"Redirected target to new element with bounding box with data-momentic-id"),{locator:d.locator(`[data-momentic-id="${u}"]`),hints:{clickableXY:f,force:S}};if(m)return t.debug({newMPathSelector:m,serializedElement:g,duration:b,force:S,logs:x},"Redirected target to new element with bounding box with mPath"),{locator:d.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.debug({point:f,serializedElement:g,duration:b,force:S,logs:x},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:b,force:S,logs:x},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes(e,t=this.logger){let r=await e.evaluate(o=>{let i=window;return i.generateHtmlCacheAttributes?i.generateHtmlCacheAttributes(o):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},void 0,{timeout:1e3});if("error"in r)throw new Error(r.error);if(r.attributes)r.warnings.length&&t.warn(r,"Got warnings while generating HTML attributes for target");else return t.warn(r,"Got no generated HTML attributes for target"),{};return t.debug(r.attributes,"Generated HTML attributes for target"),r.attributes}async moveMouseFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:r,y:o,button:"left",clickCount:0}})}async clickMouseFromPositionPercentages(e,t,r){let o=Math.ceil(this.viewport.width*t),i=Math.ceil(this.viewport.height*r);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:o,y:i,button:"left",clickCount:e==="down"?1:0},timeout:1e3})}async scrollFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);return await this.page.mouse.wheel(r,o),{deltaX:r,deltaY:o}}canSolveCaptchas(){return!!tl}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,r,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Md(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!el(e)){let l=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(l),this.logToUserConsole(this.page,"error",l);return}let r=t?.trim()||RP(e),o=bP(e),i=AP(e),s=Jc[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!el(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await l.setFiles({name:r,buffer:o,mimeType:dS.getType(e)||"application/octet-stream"},{timeout:8e3})}catch(c){this.logger.error({err:c},"Error handling file chooser"),this.logToUserConsole(this.page,"error",c.message)}});let a=o.toString("base64");await(await this.getActivePageOrFrame()).evaluate(({fileName:l,base64Data:c,mimeType:p})=>{let d=window;d.momenticFileName=l,d.momenticFileBase64=c;let u=atob(c),m=new Array(u.length);for(let g=0;g<u.length;g++)m[g]=u.charCodeAt(g);let h=new Uint8Array(m);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([h],{type:p})}isSameEntry(g){return g.name===this.name}queryPermission(g){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(g){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let g=new Blob([h]);return new File([g],d.momenticFileName,{type:p})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:r,base64Data:a,mimeType:s})}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e={...this.debugData};return this.debugData={logsPerPage:[],harPages:{},harEntries:{}},e}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e)}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(r=>navigator.clipboard.writeText(r),e);return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(new RegExp(e))}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??5e3}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??8e3}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}};import YP from"fetch-cookie";import{cloneDeep as JP}from"lodash-es";import{CookieJar as XP}from"tough-cookie";import{z as wt}from"zod";var gQ=wt.object({doubleClick:wt.boolean().optional(),rightClick:wt.boolean().optional(),force:wt.boolean().optional(),waitForDownload:wt.boolean().optional(),waitForUrl:wt.string().optional(),delayMs:wt.number().optional(),downloadTimeoutMs:wt.number().optional(),relativePosition:wt.object({x:wt.number(),y:wt.number()}).optional()}),fQ=wt.object({repeat:wt.number().optional(),convertMeta:wt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:wt.number().optional()});var Jd=(n,e,t)=>{let[r,...o]=e.split("."),i=r;return o.length>=1?Jd(n[i],o.join("."),t):n[i]=t,n};async function sr(n,e={}){let t=await n.getBrowserState(e),r=t.serialize();return e.logger?.debug({tree:r.length>4e5?"REDACTED_DUE_TO_LENGTH":r,activeFrame:n.getActiveFrameConfig()},"Got a11y tree"),{serializedTree:r,tree:t}}var Fo=3.1783027;function _P(n){let e=0;for(let t=0;t<n.length;t++){let r=n.charCodeAt(t);!(r>=48&&r<=57)&&!(r>=65&&r<=90)&&!(r>=97&&r<=122)&&e++}return e}function Xi(n){return Math.ceil(Xd(n)/Fo)}function Xd(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
3538
- `,""),t=t.replaceAll(" ","");let r=_P(t);return t.length-r+Fo*r}if(typeof n>"u")return 0;if(typeof n=="number")return String(n).length;if(Array.isArray(n))return n.forEach(t=>{e+=Xd(t)}),e;if(typeof n=="object"){let t=n;return Object.keys(t).forEach(r=>{e+=String(r).length,r==="image_url"?(t[r]??{}).detail==="high"?e+=1105*Fo:e+=85*Fo:e+=Xd(t[r])}),e}if(typeof n=="boolean")return n?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof n}': ${n}`)}var Ly=1e6,ky={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},Ny={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},Oy=/<(\S+) id="(\d+)".*?>/g,MP=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,_y=["h1","h2","section","footer","nav","aside","form","label","dialog"],FP=[..._y,"span","div","h3"],DP=["table","select","form","ul","ol","menu","pre","code","dialog"],UP=["table","form","dialog","nav","section","ul","select"];function Zd(n){return n.serializedTree.length>Ly&&(n.logger.warn({serializedTreeLength:n.serializedTree.length},"Serialized condensed tree is too long to chunk, truncating before chunking"),n.serializedTree=n.serializedTree.slice(0,Ly)),BP(n)}function BP({serializedTree:n,options:e,logger:t}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:s}=e,a=[],l=n.split(`
3554
+ `)}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(p){this.logger.warn({err:p},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,r={}){await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:1e3});if(!o)throw new R("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,s=o.y+o.height/2,a=r.steps??5;await this.page.mouse.move(i,s,{steps:a}),await ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,r,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(Dd);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Hr({func:async t=>{await t.locator.scrollIntoViewIfNeeded({timeout:1e3});let r=await t.locator.boundingBox({timeout:1e3});if(!r)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(r.x+r.width/2,r.y+r.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Hr({func:t=>t.locator.focus({timeout:2e3}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await qe({fn:()=>{let r=document.activeElement;r&&r.nodeType===1&&r.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:1e3,codePath:"blurCommand"});return}await this.highlight(e.locator),await Hr({func:t=>t.locator.blur({timeout:2e3}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,r=!1){await this.highlight(e.locator),await Hr({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?t.index:void 0},{force:r,timeout:3e3})},targetingResult:e})}async press(e,t){let r=t.repeat??1;if(t.convertMeta){let o=ZS(e);o!==e&&(this.logger.debug({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<r;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let r=0,o=2;for(;r<o;){r++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:r},`Failed to reload page${r<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"})}async getBrowserState(e){let{logger:t=this.logger,maxAttempts:r=2,skipWaitForPageLoad:o}=e,i=e.abortSignal??this.abortSignal;if(o||await this.waitForPageLoad(),!e.skipWait){let l=Date.now();await this.waitForDOMStability({logger:t,signal:i}),t.debug({duration:Date.now()-l},"Waited for DOM stability before getting browser state")}let s=0,a;for(;s<r;){s++;try{return await U(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:i,logger:t,filterByViewport:e.filterByViewport}),{milliseconds:this.pageLoadTimeout*s,signal:i,message:"Getting browser state took too long"})}catch(l){if(i?.throwIfAborted(),a=l instanceof Error?l.message:`${l}`,s>=r)throw l;t.debug({err:l,url:this.url()},"Error getting a11y tree, retrying...")}}throw new R("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${a}`)}async getViewportOffsetDetails(e){let[t,r,o,i,s]=await qe({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:3e3,waitForPageLoad:async()=>{},codePath:"getViewportOffsetDetails"});return{upperBound:t,lowerBound:t+i,leftBound:r,rightBound:r+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??s}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:r=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},s=u=>{i.value=Date.now()},a=()=>s("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",a);let l=()=>s("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>l);let c=()=>s("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",c);let p=()=>s("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",p);let d=()=>s("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,r,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",a),this.cdpClient.removeListener("Page.frameDetached",l),this.cdpClient.removeListener("Page.frameStartedLoading",c),this.cdpClient.removeListener("Page.navigatedWithinDocument",p),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,r,o){let i=!1,s=Date.now(),a,l={quality:25,retries:0,hideCaret:!0,disableAnimations:!0},c=!1,p=0;for(;Date.now()-s<r;){if(o?.throwIfAborted(),await ne(500,this.abortSignal),a)try{let u=await this.screenshot(l);if(!u.equals(a)){a=u,c=!1;continue}c=!0}catch(u){p++,p%3===0&&t.warn({err:u,screenshotErrors:p},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{a=await this.screenshot(l)}catch(u){p++,p%3===0&&t.warn({err:u,screenshotErrors:p},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<750)){i=!0;break}}let d={duration:Date.now()-s,a11yStableReceived:i,lastTreeUpdateMillisecondsAgo:Date.now()-e.value,screenshotStable:c};i||t.warn(d,"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:r,y:o}=e,i=this.url(),s=(await No(this.context)).map(a=>a.url);this.logger.debug({x:r,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(r,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1}),t.waitForUrl&&await this.waitForUrl({beforeUrl:i,beforePages:s,matcher:{type:"GLOB",glob:t.waitForUrl}})}async dragAndDropUsingVisualCoordinates(e,t,r){await this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,8e3):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,r,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(Dd);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:3e3}),r=await U(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:2e3});process.platform==="darwin"&&r===1&&(r=2);let o=t.documents[0],i=o.layout,s=o.nodes,a=s.nodeName||[],l=s.backendNodeId||[],c=i.nodeIndex,p=i.bounds,d=-1;for(let x=0;x<a.length;x++)if(l[x]===e){d=c.indexOf(x);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[u=0,m=0,h=0,g=0]=p[d];u/=r,m/=r,h/=r,g/=r;let f=u+h/2,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return jd({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks()})}async scrollHorizontal(e){return jd({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks()})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout})}async createRawCDPSession(e){let t=await U(this.context.newCDPSession(this.page),{milliseconds:e??this.pageLoadTimeout,fallback:()=>{throw this.logger.error(`Timed out creating new CDP session for ${this.page.url()}`),new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${this.page.url()})`)}});return this.logger.debug(`Created new CDP session for ${this.page.url()}`),t}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async changeActivePage(e,t){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let r=await this.context.newPage();await this.changeActivePage(r,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let r=!0,o,i=Date.now();for(;r||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){r=!1;try{await this.switchToPageHelper(e,t);return}catch(s){this.logger.warn({err:s},"Error switching to page, retrying..."),o=s,await ne(500)}}throw o}async switchToPageHelper(e,t){let r=this.context.pages().map((i,s)=>({page:i,url:i.url(),index:s})),o;if(e.type==="INDEX"){if(e.index<0||e.index>=r.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(r.map(i=>i.url))}`);o=r[e.index]}else{let i=r.filter(s=>e.type==="SUBSTRING"?s.url.includes(e.substring):s.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(s=>s.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
3555
+ Available pages:${JSON.stringify(r.map(i=>i.url))}`);if(!tr(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.debug(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=ua(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let r=await this.getActivePageOrFrame();await U(r.evaluate(([o,i])=>{o&&localStorage.setItem(o,i||"")},[e,t]),{milliseconds:2e3})}async solveCaptcha(){await this.getBrowserState({});let e;for(let a of Object.values(this.stateManager.a11yIdToNodeMap))if(a.role==="image"&&a.name.toLowerCase().includes("captcha")){if(!a.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,a.backendNodeId);break}if(!e){let a=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!a.captchas||!a.captchas.length)throw new Error("No captchas found on the page");return}let t=await e.screenshot({type:"jpeg",animations:"allow",caret:"hide",quality:100,timeout:3e3}),r=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:tl,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!r.ok){let a=`Captcha solver API returned error response: ${r.statusText}`;throw this.logger.error({text:await r.text()},a),new Error(a)}let{taskId:o}=await r.json(),i=Date.now(),s="";for(;Date.now()-i<6e4;){await ne(2500);let a=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:tl,taskId:o})});if(!a.ok){let c=`Captcha solution API returned error response: ${a.statusText}`;throw this.logger.error({text:await a.text()},c),new Error(c)}let l=await a.json();if(l.errorId){let c=`Captcha solution API returned error ID ${l.errorId}`;throw this.logger.error(c),new Error(c)}if(l.status==="ready"){s=l.solution.text;break}}if(!s)throw new Error("Captcha solution timed out");return s}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&sy({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,r=(await this.getOpenPages()).map(a=>a.url),o=0,i=!1,s=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let a;try{a=(await this.getOpenPages()).map(c=>c.url),o=0}catch(c){this.logger.debug({err:c},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let c=a.length-1;c>=r.length;c--){let p=a[c];tr(p,this.logger)&&p!==l&&this.logger.info({lastActivePages:r,currentUrl:l,newOpenPages:a},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:c});break}r=a};t=setInterval(async()=>{if(!i){i=!0;try{await s()}catch(a){this.logger.error({err:a},"Error while checking pages during recording")}finally{i=!1}}},500),e.addEventListener("abort",async()=>{clearInterval(t)})}async startRecording(e,t,r){this.logger.debug({isClickToRecord:r},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(o=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!0,i._MOMENTIC_CLICK_RECORD_ACTIVE=o},r),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page),e.addEventListener("abort",async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let o=window;o._MOMENTIC_RECORDING_ACTIVE=!1,o._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}})}async getSelectOptions(e){return await e.evaluate(r=>Array.from(r.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:1e3})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:r}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await Dr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){let a=s;if(a.name==="AbortError")throw new Error(`The page with URL ${Me(i,50)} did not load within the configured timeout (${o}ms): ${a}`);if(!a.message.includes("detached"))throw a}try{await Dr({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){this.logger.warn({err:s,codePath:r,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return RP.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:r}=await qe({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getCondensedHtmlTree"});if(r)throw new Error(`Failed to process page HTML: ${r}`);if(!t)throw new R("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}async registerDialogHandler(e){let t=async r=>{try{e==="ACCEPT"?await r.accept():await r.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t){let r=await this.getActivePageOrFrame();return U(r.evaluate(e,t),{milliseconds:2e3})}async evaluateCodeInPage({code:e,fragment:t,context:r,timeoutMs:o=Kn}){let i=WS(),s={code:e,fragment:t,context:r},{result:a}=await U(this.page.evaluate(i,s),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new R("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return a}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let r;try{r=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:1e3})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return r}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:r}){if(t<0||t>1||r<0||r>1)throw new R("InternalWebAgentError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:s,leftBound:a}=await this.getViewportOffsetDetails(e),l=Math.round(s),c=Math.round(a),p=Math.ceil(o*t),d=Math.ceil(i*r),u=p+c,m=d+l;return this.getDomNodeFromPixelPosition(u,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),r;try{r=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return r?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:1e3,params:{highlightConfig:yS,backendNodeId:r.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:1e3,method:"Overlay.hideHighlight",params:{backendNodeId:r?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:1e3})}catch{}}async getTargetFromPixelPosition(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPixelPosition(e.x,e.y);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromPositionPercentages(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromBackendNodeId(e,t,r){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[bt],s=parseInt(i??"");if(!i||isNaN(s))throw new Error("No data-momentic-id was found on the DOM node");let a=e.locator(`[${bt}="${i}"]`);if(r){for(let d of Object.values(this.stateManager.a11yIdToNodeMap)){if(d.backendNodeId!==t)continue;let u={id:d.id,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.saveNodeDetailsToCache({node:d,target:u,dataMomenticId:parseInt(i),locator:a}),this.logger.debug({target:u},"Tied backend id to existing a11y node"),{target:u,locator:a}}let p=$a(`${i}`,this.stateManager.domGraph,this.logger);for(let d of p){let u=parseInt(d.attributes?.[bt]??"");if(isNaN(u))continue;let m=e.locator(`[${bt}="${u}"]`),h=this.stateManager.dataMomenticIdToNodeMap[u],g=h?.id;if(!g)continue;let f={id:g,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.saveNodeDetailsToCache({node:h,target:f,dataMomenticId:parseInt(i),locator:m}),this.logger.debug({target:f},"Tied backend id on non-accessible element to nearest a11y node"),{target:f,locator:m}}}let l=await this.fetchHtmlAttributes(a,this.logger),c={id:-1,dataMomenticId:s,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:c},"Tied backend id to html node"),{target:c,locator:a}}async performTargetRedirection(e,t,r){try{return await e.scrollIntoViewIfNeeded({timeout:3e3}),await U(this.performTargetRedirectionHelper(e,t,r),{milliseconds:3e3})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,r){let o=Date.now(),i=await cn(e,t);if(r===void 0&&(r=await e.boundingBox({timeout:1e3})),!r){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:s,y:a,width:l,height:c}=r,p=this.getViewport();if(s<0||a<0||s+l>p.width||a+c>p.height){t.debug("Skipping locator redirection because the element is outside the viewport");return}let d=await this.getActivePageOrFrame(),{dataMomenticId:u,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:x}=await e.evaluate(w=>{let E=window;if(!E.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return E.performTargetRedirection(w)},void 0,{timeout:1e3}),b=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:b,force:S,logs:x},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:b,force:S,logs:x},"Redirected target to new element with bounding box with data-momentic-id"),{locator:d.locator(`[data-momentic-id="${u}"]`),hints:{clickableXY:f,force:S}};if(m)return t.debug({newMPathSelector:m,serializedElement:g,duration:b,force:S,logs:x},"Redirected target to new element with bounding box with mPath"),{locator:d.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.debug({point:f,serializedElement:g,duration:b,force:S,logs:x},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:b,force:S,logs:x},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes(e,t=this.logger){let r=await e.evaluate(o=>{let i=window;return i.generateHtmlCacheAttributes?i.generateHtmlCacheAttributes(o):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},void 0,{timeout:1e3});if("error"in r)throw new Error(r.error);if(r.attributes)r.warnings.length&&t.warn(r,"Got warnings while generating HTML attributes for target");else return t.warn(r,"Got no generated HTML attributes for target"),{};return t.debug(r.attributes,"Generated HTML attributes for target"),r.attributes}async moveMouseFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:r,y:o,button:"left",clickCount:0}})}async clickMouseFromPositionPercentages(e,t,r){let o=Math.ceil(this.viewport.width*t),i=Math.ceil(this.viewport.height*r);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:o,y:i,button:"left",clickCount:e==="down"?1:0},timeout:1e3})}async scrollFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);return await this.page.mouse.wheel(r,o),{deltaX:r,deltaY:o}}canSolveCaptchas(){return!!tl}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,r,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Fd(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!el(e)){let l=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(l),this.logToUserConsole(this.page,"error",l);return}let r=t?.trim()||LP(e),o=TP(e),i=OP(e),s=Xc[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!el(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await l.setFiles({name:r,buffer:o,mimeType:uS.getType(e)||"application/octet-stream"},{timeout:8e3})}catch(c){this.logger.error({err:c},"Error handling file chooser"),this.logToUserConsole(this.page,"error",c.message)}});let a=o.toString("base64");await(await this.getActivePageOrFrame()).evaluate(({fileName:l,base64Data:c,mimeType:p})=>{let d=window;d.momenticFileName=l,d.momenticFileBase64=c;let u=atob(c),m=new Array(u.length);for(let g=0;g<u.length;g++)m[g]=u.charCodeAt(g);let h=new Uint8Array(m);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([h],{type:p})}isSameEntry(g){return g.name===this.name}queryPermission(g){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(g){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let g=new Blob([h]);return new File([g],d.momenticFileName,{type:p})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:r,base64Data:a,mimeType:s})}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e={...this.debugData};return this.debugData={logsPerPage:[],harPages:{},harEntries:{}},e}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e)}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(r=>navigator.clipboard.writeText(r),e);return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(new RegExp(e))}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??5e3}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??8e3}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}};import QP from"fetch-cookie";import{cloneDeep as eL}from"lodash-es";import{CookieJar as tL}from"tough-cookie";import{z as wt}from"zod";var yQ=wt.object({doubleClick:wt.boolean().optional(),rightClick:wt.boolean().optional(),force:wt.boolean().optional(),waitForDownload:wt.boolean().optional(),waitForUrl:wt.string().optional(),delayMs:wt.number().optional(),downloadTimeoutMs:wt.number().optional(),relativePosition:wt.object({x:wt.number(),y:wt.number()}).optional()}),bQ=wt.object({repeat:wt.number().optional(),convertMeta:wt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:wt.number().optional()});var Xd=(n,e,t)=>{let[r,...o]=e.split("."),i=r;return o.length>=1?Xd(n[i],o.join("."),t):n[i]=t,n};async function sr(n,e={}){let t=await n.getBrowserState(e),r=t.serialize();return e.logger?.debug({tree:r.length>4e5?"REDACTED_DUE_TO_LENGTH":r,activeFrame:n.getActiveFrameConfig()},"Got a11y tree"),{serializedTree:r,tree:t}}var Fo=3.1783027;function UP(n){let e=0;for(let t=0;t<n.length;t++){let r=n.charCodeAt(t);!(r>=48&&r<=57)&&!(r>=65&&r<=90)&&!(r>=97&&r<=122)&&e++}return e}function Zi(n){return Math.ceil(Zd(n)/Fo)}function Zd(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
3556
+ `,""),t=t.replaceAll(" ","");let r=UP(t);return t.length-r+Fo*r}if(typeof n>"u")return 0;if(typeof n=="number")return String(n).length;if(Array.isArray(n))return n.forEach(t=>{e+=Zd(t)}),e;if(typeof n=="object"){let t=n;return Object.keys(t).forEach(r=>{e+=String(r).length,r==="image_url"?(t[r]??{}).detail==="high"?e+=1105*Fo:e+=85*Fo:e+=Zd(t[r])}),e}if(typeof n=="boolean")return n?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof n}': ${n}`)}var Ny={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},_y={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},ky=/<(\S+) id="(\d+)".*?>/g,BP=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,My=["h1","h2","section","footer","nav","aside","form","label","dialog"],zP=[...My,"span","div","h3"],jP=["table","select","form","ul","ol","menu","pre","code","dialog"],HP=["table","form","dialog","nav","section","ul","select"];function Qd(n){return n.serializedTree.length>n.maxCharacterLength&&(n.logger.warn({serializedTreeLength:n.serializedTree.length},"Serialized condensed tree is too long to chunk, truncating before chunking"),n.serializedTree=n.serializedTree.slice(0,n.maxCharacterLength)),$P(n)}function $P({serializedTree:n,options:e,logger:t}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:s}=e,a=[],l=n.split(`
3539
3557
  `),c=0,p=[],d=0,u=[],m=[],h=!1;for(;c<l.length;){h&&(a.push({ids:u,content:p.join(`
3540
- `),tokenLength:d}),p=[],d=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=Xi(g);d+=f,g.length>s&&(g=g.slice(0,s));let b=Array.from(g.matchAll(Oy)).map(L=>L&&L.length>=3?{tagName:L[1],id:L[2]}:void 0).filter(L=>!!L),E=Array.from(g.matchAll(MP)).map(L=>L&&(L[2]||L[4])).filter(L=>!!L);E.reverse();let C=g.replace(/ id="[0-9]+"/g,"");p.push(C);for(let L of b)u.push(L.id),m.push(L);for(let L of E){let j=m[m.length-1];j&&j.tagName===L&&m.pop()}let I=m.some(L=>DP.includes(L.tagName)),N=l[c+1]??"",P=Xi(N),W=Array.from(N.matchAll(Oy)).map(L=>L&&L.length>2?L[1]:void 0).filter(L=>!!L),_=W.some(L=>_y.includes(L)),B=W.some(L=>FP.includes(L));d+P>=i&&(h=!0),d>=r&&(_&&!I||E.some(L=>UP.includes(L)))&&(h=!0),d>=o&&B&&!I&&(h=!0),c++}return p.length&&a.push({ids:u,content:p.join(`
3541
- `),tokenLength:d}),a.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${a.length})`)}),{chunks:a}}var Qd=4e4,ep=8e4;async function Wr(n){let{serializedTree:e,logger:t,flagStore:r,softTokenLimit:o=Qd}=n;if(Xi(e)<o)return e;let s=Zd({serializedTree:e,options:Ny,logger:t});try{return r.isBooleanFlagEnabled("rag_v2")?await U(zP({...n,chunks:s.chunks}),{milliseconds:15e3}):await U(HP(n),{milliseconds:1e4})}catch(a){t.warn({err:a},"Error executing page filtering, attempting AI keyword fallback");try{return await jP({...n,chunks:s.chunks})}catch(l){return t.warn({err:l},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,ep*Fo)}}}async function zP({chunks:n,generator:e,description:t,type:r,logger:o,signal:i,orgId:s,tree:a,softTokenLimit:l=Qd,hardTokenLimit:c=ep}){let p=await e.rankChunksWithAi({chunks:n,description:t,type:r,softTokenLimit:l,hardTokenLimit:c},{abortSignal:i,orgId:s,logger:o,loggerTags:Ge(o)}),d=[];n.forEach((m,h)=>{p.indices.includes(h)&&(d=d.concat(m.ids))});let u=a.pruneUsingRelevantIds(new Set(d)).serialize();return o.debug({description:t,type:r,selectedChunks:p,tree:u},"Pruned a11y tree with AI page filtering"),u}async function jP(n){let{type:e,description:t,generator:r,orgId:o,tree:i,logger:s,hardTokenLimit:a=ep}=n;if(!t.trim())throw new Error("Empty description passed to page filtering");let l=await r.getExtractedKeywords({goal:t},{orgId:o,logger:n.logger,loggerTags:Ge(n.logger)});for(let c of l.keywords){let p=n.chunks.filter(h=>h.content.includes(c));if(!p.length||p.reduce((h,g)=>h+g.tokenLength,0)>a&&p.length>1)continue;let u=p.flatMap(h=>h.ids),m=i.pruneUsingRelevantIds(new Set(u)).serialize();return s.debug({description:t,type:e,selectedChunks:p,tree:m},"Pruned a11y tree with keyword page filtering"),m}throw new Error("No keywords were unique enough for page filtering")}async function HP(n){let{description:e,generator:t,orgId:r,tree:o,logger:i,signal:s,softTokenLimit:a=Qd}=n,l=Zd({serializedTree:o.serialize(),options:ky,logger:i}),c=await t.rankChunksWithRag({description:e,chunks:l.chunks,tokenLimit:a},{abortSignal:s,orgId:r,logger:i,loggerTags:Ge(i)});if(c.ids.length===0)throw new Error("RAG returned no important ids");{let p=o.pruneUsingRelevantIds(new Set(c.ids.map(d=>`${d}`))).serialize();return i.debug({browserState:p},"Pruned a11y tree with RAG"),p}}async function np(n,e){if(!n.description)throw new R("ActionFailureError","Cannot locate element with empty description");return xn({action:async()=>$P(n,e),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:e.browser,logger:e.logger})}async function $P(n,e){let{disableCache:t,testContext:r,filterByViewport:o,skipWait:i,source:s}=n,{ctx:a,orgId:l,logger:c,browser:p,localCodeEvalTools:d,generator:u,abortSignal:m,flagStore:h}=e,g=n.description;r&&(g=await Dt({orgId:l,s:g,context:r,logger:e.logger,localTools:d,signal:e.abortSignal,flagStore:h})),s&&(g=WP(g,s));let{serializedTree:f,tree:S}=await sr(p,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),x,b=Date.now(),w;for(;!x&&Date.now()-b<3e3;){m.throwIfAborted();try{x=await p.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(L){w=L}}if(!x)throw new R("InternalWebAgentError",`Failed to take screenshot of page to locate element: ${w?.message}`);let E=f,C=!1;E=await Wr({type:"locator",description:g,serializedTree:f,flagStore:e.flagStore,tree:S,logger:c,generator:u,orgId:l}),E!==f&&(C=!0);let N=`data:image/jpeg;base64,${x.toString("base64")}`,P=await u.getElementLocation({browserState:E,goal:g,screenshot:N},{disableCache:t,orgId:l,abortSignal:m,loggerTags:Ge(c)});c.debug({usedRag:C,result:P},"Got locator result");let D=P.id>0;if(a?.details?.push({type:"AI_LOCATION",matched:D,pageState:E,ragUsed:C,thoughts:P.thoughts}),!D)throw new R("ActionFailureError",`Could not find any relevant element: ${P.thoughts}`);let{resolution:W,target:_,frameConfig:B}=await p.createTargetFromA11yId({id:P.id,description:g,targetSource:"AI",logger:c});if(W.a11yNode?.properties?.hidden&&W.a11yNode?.properties?.hidden!=="false")throw new R("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: ${W.displayString}`);return{thoughts:P.thoughts,target:_,resolution:W,frameConfig:B,screenshot:N}}var My="<select> element:",Fy="text input or contenteditable element:",Dy="Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:",tp=[My,Fy,Dy];function Uy(n,e){if(n===e)return!0;for(let t of tp){if(!n.startsWith(t))continue;let r=n.slice(t.length).trim();if(tp.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===r)||r===e.trim())return!0}return!!tp.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===n.trim())}function WP(n,e){if(!n||!e)return n;switch(e){case"SELECT_OPTION":return`${My} ${n}`;case"TYPE":return`${Fy} ${n}`;case"NEGATED_CHECK":return`${Dy}
3542
- ${n}`;default:return n}}var GP=15;async function rp({command:n,fixtures:e}){if(!n.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:r}=e,o=n.timeout?n.timeout*1e3:t.smartWaitingTimeout,i=VP(o),s=0,a=Date.now(),l,c,p;try{await xn({action:()=>t.clearHighlights(),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:t,logger:r})}catch(u){r.warn({err:u},"Failed to clear highlights before AI assertion, continuing...")}let d;for(;s<GP&&(!d||d-a<o);){e.abortSignal.throwIfAborted(),s!==0&&(r.info(`Waiting ${i}ms before retrying AI assertion`),await ne(i,e.abortSignal)),d=Date.now();try{let u=await xn({action:async()=>{let m=await By(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,zy({command:n,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:s}))},frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t});if(!u)continue;l=u;break}catch(u){e.abortSignal.throwIfAborted(),p=u instanceof Error?u:new Error(`${u}`),r.info({err:u},`AI_WAIT assert attempt ${s} failed, retrying...`)}finally{s++}}if(!l)try{l=await xn({action:async()=>zy({command:n,state:await By(t,r,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:s}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t})}catch(u){e.abortSignal.throwIfAborted(),p=u instanceof Error?u:new Error(`${u}`)}finally{s++}if(!l){let u=`AI assertion still failing after ${s} attempts.`;throw p&&(u+=` Latest result: ${p.message}`),new R("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function By(n,e,t){let[r,o]=await Promise.all([sr(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function zy({command:n,state:e,fixtures:t,useConsensus:r,highlightElementsOnFailure:o,attemptNumber:i}){let{browser:s,logger:a,generator:l,orgId:c,abortSignal:p}=t,d={type:"ASSERTION"},{serializedTree:u,tree:m}=e,h=e.screenshotBuff,g=s.url(),f=u;f=await Wr({type:"assertion",serializedTree:u,description:n.assertion,flagStore:t.flagStore,tree:m,generator:l,orgId:c,logger:a,signal:p}),f!==u&&(d.ragUsed=!0),d.pageState=f;let S={goal:n.assertion,url:g,browserState:f,screenshot:h.toString("base64"),contextChoice:n.contextChoice},b=await(n.contextChoice==="VISION_ONLY"?(w,E)=>l.getVisualAssertionResult(w,E):(w,E)=>l.getAssertionResult(w,E))(S,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:a,orgId:c,abortSignal:p,loggerTags:Ge(a)});if((b.result||o)&&b.relevantElements&&(d.relevantElementsSerialized=b.relevantElements.map(w=>s.getSerializedFormFromA11yId(w)).filter(w=>!!w),await qP(b.relevantElements,s,a)),!b.result)throw new R("AssertionFailureError",b.thoughts);return{succeedImmediately:!1,thoughts:b.thoughts,urlAfterCommand:g,afterScreenshotOverride:h}}function VP(n){let e;return n>10*60*1e3?e=2*60*1e3:n>60*1e3?e=20*1e3:n>10*1e3?e=2*1e3:e=1e3,e}async function qP(n,e,t){let r=Date.now();for(let o of n){if(Date.now()-r>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await U(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var KP=3e4;async function jy({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??KP/1e3,i=new AbortController,s=Object.fromEntries(Object.entries(n.headers||{}).filter(([d,u])=>d&&u)),a;if(Lo(n.url)&&(a=n.url),t&&Oo(n.url,t)&&(a=new URL(n.url,t).toString()),!a)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let c=await U((async()=>{try{return await r(a,{headers:s,method:"POST",body:JSON.stringify({query:n.query,variables:n.variables}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!c)throw new R("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d;try{d=await c.json()}catch{throw new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}throw d?.errors?.length&&d?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}let p={};return c.headers.forEach((d,u)=>{p[u]=d}),{status:c.status,headers:p,json:await c.json()}}var Do=class{flagStore;orgId;scratchPadId;slowMoMs;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;analytics;recordAbortController=null;registeredListeners={};constructor({browser:e,generator:t,logger:r,analytics:o,flagStore:i,storage:s,orgId:a,localCodeEvalTools:l,uploadedFileStorage:c,visualDiffScreenshotStorage:p,scratchPadId:d,slowMoMs:u}){this.orgId=a,this.scratchPadId=d,this.slowMoMs=u,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=s,this.uploadedFileStorage=c,this.visualDiffScreenshotStorage=p,this.localCodeEvalTools=l,this.generator=t,this.logger=r,this.analytics=o,this.flagStore=i}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}setLogger(e){this.logger=e}async evaluateAiAction({goal:e,startingScreenshot:t,history:r,disableCache:o,langfuseSessionId:i,lastError:s,logger:a=this.logger}){let[l,c]=await Promise.all([sr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),p=await Wr({type:"ai-action",description:e,serializedTree:l.serializedTree,tree:l.tree,logger:a,generator:this.generator,flagStore:this.flagStore,orgId:this.orgId,softTokenLimit:25e3,hardTokenLimit:5e4}),d=`data:image/jpeg;base64,${c.toString("base64")}`,u={url:this.browser.url(),browserState:p,startingScreenshot:t,history:r,goal:e,screenshot:d,lastError:s};return await this.generator.getMultiturnAiActionEvaluation(u,{disableCache:o,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:{...Ge(a)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:r,actionHint:o,disableCache:i,logger:s=this.logger,langfuseSessionId:a}){let l=this.browser.url(),[c,p]=await Promise.all([sr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${p.toString("base64")}`,u=await Wr({type:"ai-action",description:e,serializedTree:c.serializedTree,tree:c.tree,logger:s,generator:this.generator,flagStore:this.flagStore,orgId:this.orgId,softTokenLimit:25e3,hardTokenLimit:5e4}),m={url:l,browserState:u,startingScreenshot:t,history:r,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:{...Ge(s)},langfuseSessionId:a})}catch(h){throw new R("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return sr(this.browser,e)}async locateElement(e){return np(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return xn({action:async()=>{let r=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:r}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,flagStore:this.flagStore,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:s,action:a,options:l,retriesWithAI:c=1}){let p=[];for(let d=0;d<i.length;d++){let u=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:u,cache:s[d],action:async h=>h,options:{...l,skipFetchTree:d!==0,targetName:o[d]}});p.push(m)}try{return{result:await a(...p.map(u=>u.result)),elementInteractedDisplayStrings:p.map(u=>u.elementInteractedDisplayString),newTargets:p.map(u=>u.newTarget)}}catch(d){if(this.throwIfClosed(),c>0)return this.logger.debug({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:a,options:l,retriesWithAI:c-1});throw new R("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),r;for(let o=0;o<2;o++)try{return await xn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(r=i,this.flagStore.isBooleanFlagEnabled("visual_actions")&&wh(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&fa(i)){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}throw i}throw r instanceof R?r:new R("ActionFailureError",r?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:r,options:o,command:i}){let s=this.logger.child({commandId:i.id}),{targetName:a="target"}=o;if(t.type!=="description")throw new R("ActionFailureError","Cannot use selector with non-description target");let l=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:a,logger:s});return{result:await r({locator:l.locator}),elementInteractedDisplayString:l.displayString,newTarget:{cache:{id:-1,selector:t.elementDescriptor,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()}}}}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:r,target:o,action:i,options:s,command:a}=e,{disableCache:l,useSelector:c,targetName:p="target",targetHealingInProgress:d,source:u}=s,m=this.logger.child({commandId:a.id}),h=s.retriesWithAI??1,g=!1,f=e.cache;if((!f||l)&&!oc(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(c)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(m.debug("Cache explicitly disabled for this step"),g=!0,f=void 0),f?.inputDescription&&!Uy(o.elementDescriptor,f.inputDescription)&&(m.debug({old:f.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),g=!0,f=void 0);let S=!!f&&Mu(f);if(!f){let x=new Date;m.debug({targetHealingInProgress:d},"Prompting AI for an updated element location"),g&&await ne(this.browser.smartWaitingTimeout,this.executeAbortController.signal),h--;let b=await np({description:o.elementDescriptor,disableCache:l,iframeUrl:s.iframeUrl,source:u},this.getControllerFixtures(t));b.frameConfig&&this.browser.setActiveFrameConfig(b.frameConfig);let w=s.disableGlobalLocatorRedirect?{locator:b.resolution.locator}:await this.attemptLocatorRedirect(b.resolution.locator,m),E=await i(w),C;if(d){r.heal({healType:"AI"}),this.analytics.track({type:"execution:step_heal",heal_type:"AI",step_type:"PRESET_ACTION",command_type:a.type,duration_ms:Date.now()-x.getTime()}),b.target.targetSource="AI_HEALED",b.target.targetUpdateTime=new Date().toUTCString();let I=b.resolution.pageState;if(I)try{C=await this.getReverseMappedDescription({browserState:I,targetId:b.target.id,disableCache:!0,screenshot:b.screenshot})}catch(N){m.warn({err:N},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:E,elementInteractedDisplayString:b.resolution.displayString,newTarget:{cache:b.target,thoughts:b.thoughts,description:C}}}try{let x=new Date;if(this.flagStore.isBooleanFlagEnabled("visual_actions")&&await this.browser.waitForDOMStability({timeout:1e3}),f.frameCache&&this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")){let C=await this.browser.resolveAutoFrameCache(f.frameCache);this.browser.setActiveFrameConfig(C)}let b=await this.browser.resolveTarget(t,f,{targetName:p,logger:m}),w=s.disableGlobalLocatorRedirect?{locator:b.locator}:await this.attemptLocatorRedirect(b.locator,m),E=await i(w);if(S){let C=b.decisions.filter(I=>I.matched);if(C.length!==1)m.warn({decisions:b.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let I=C[0].type;r.heal({healType:I}),this.analytics.track({type:"execution:step_heal",heal_type:I,step_type:"PRESET_ACTION",command_type:a.type,duration_ms:Date.now()-x.getTime()})}m.debug({cache:f},"Successfully used cached target to perform action")}else m.debug({cache:f},"Successfully generated and used new target data");return{result:E,elementInteractedDisplayString:b.displayString,newTarget:{cache:f}}}catch(x){if(this.throwIfClosed(),x instanceof R)throw x;if(h>0&&o)return m.debug({err:x,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:r,command:a,target:o,cache:void 0,action:i,options:{...s,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",x.message,{errOptions:{cause:x}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Vi(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.slowMoMs&&await ne(this.slowMoMs);let s;try{s=await this.resolveCommandTemplateStrings(r,o)}catch(a){throw this.throwIfClosed(),new R("ActionFailureError",`Failed to substitute template strings in command: ${a.message}`,{errOptions:{cause:a}})}try{let a=(await this.browser.getOpenPages()).map(m=>m.url),l=this.browser.url(),c=await this.executePresetCommandHelper(e,t,r,o,i),p=!0;(r.type==="NAVIGATE"||r.type==="NEW_TAB"||r.type==="TAB"||r.type==="REFRESH"||r.type==="WAIT_FOR_URL")&&(p=!1);let d=(await this.browser.getOpenPages()).map(m=>m.url),u=this.browser.url();if(p&&d.length!==a.length)for(let m=d.length-1;m>=a.length;m--){let h=d[m];if(tr(h,this.logger)&&h!==l&&h!==u){this.logger.info({beforePages:a,afterPages:d,beforeUrl:l},"Auto-following new tab"),await this.browser.switchToPage({type:"INDEX",index:m});break}}return c}catch(a){throw a.name!=="AbortError"&&this.logger.error({err:a},"Error thrown in action controller"),a}finally{this.restoreCommandTemplateReplacements(r,s)}}restoreCommandTemplateReplacements(e,t={}){for(let[r,o]of Object.entries(t))Jd(e,r,o)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Nd(e)}}async resolveCommandTemplateStrings(e,t){return Po({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools,flagStore:this.flagStore})}async executePresetCommandHelper(e,t,r,o,i){switch(i=i||"disableCache"in r&&!!r.disableCache,r.type){case"SUCCESS":let s=r.condition;return s?.assertion.trim()?rp({command:s,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_WAIT":case"AI_ASSERTION":{if(!r.assertion.trim())throw new R("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new R("AssertionFailureError",`AI assertion timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return rp({command:{...r,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!r.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:r.goal,browserState:m,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)});if(g.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("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:g}}):g}}case"NAVIGATE":if(!Lo(r.url)&&!Oo(r.url,this.browser.baseUrl))throw new R("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await 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":if(!this.browser.canSolveCaptchas())break;let a=await this.browser.solveCaptcha();a&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:m=>this.browser.click(m,this.createCallbacksForBrowser(this.orgId),{}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}}),await this.browser.type(a,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,h=[];if(r.target&&Sn(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:S=>this.browser.hover(S),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});m=f,h.push(g)}switch(r.type){case"SCROLL_UP":await this.browser.scrollVertical(-(r.deltaY??0));break;case"SCROLL_DOWN":await this.browser.scrollVertical(r.deltaY);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(r.deltaX??0));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(r.deltaX);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:h}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new R("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=r.matcher;if(!m&&r.url&&(m={type:"GLOB",glob:r.url}),!m)throw new R("UserConfigurationError","No URL matcher provided for wait for URL command");await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":if(r.delay>1800)throw new R("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=r.delay*1e3;await ne(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"CLICK":{if(Sn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let x={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return Oa(m,x.urlAfterCommand)&&(x.succeedImmediately=!0,x.succeedImmediatelyReason="URL changed"),x}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(Sn(r.fromTarget)&&Sn(r.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(r.fromTarget.pixels,r.toTarget.pixels,{hoverSeconds:r.hoverSeconds});break}if(Sn(r.fromTarget)||Sn(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{newTargets:m,elementInteractedDisplayStrings:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:["from target","to target"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverSeconds:r.hoverSeconds,steps:r.steps}),options:{useSelector:!!r.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],newTargets:m}}case"MOUSE_DRAG":{let m=parseInt(r.deltaX),h=parseInt(r.deltaY),g=r.steps??5;if(isNaN(m)||isNaN(h))throw new R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&Sn(r.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,r.target.pixels,{force:r.force});break}let f,S,x=[];if(r.target?.elementDescriptor){let{newTarget:b,elementInteractedDisplayString:w,result:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:async C=>C.locator,options:{useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableCache:i}});f=E,S=w,x.push(b)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:x}}case"SELECT_OPTION":{if(!Vn(r.target))throw new Error("Select with x/y is not supported yet");let m=r.target.elementDescriptor,h=r.choice??{type:"VALUE",value:r.option},{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:m},cache:r.cache?.target,action:S=>this.browser.selectOption(S,h,r.force),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,source:Ri(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};if(r.url)await this.browser.switchToPage({type:"SUBSTRING",substring:r.url},m);else if(r.action)await this.browser.switchToPage(r.action,m);else throw new R("UserConfigurationError","No method definition was specified for the tab switch command");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 c=await this.browser.setCookie(r.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let m;try{r.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:o.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Fn({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:o,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.scratchPadId){this.logger.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.scratchPadId,orgId:this.orgId,updates:h,logger:this.logger})}}})}catch(h){throw this.throwIfClosed(),new R("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new R("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(r.target&&Sn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);break}let m=this.browser.url(),h,g=[],f=JP(r.target);if(f){let{elementInteractedDisplayString:x,newTarget:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:f,cache:r.cache?.target,action:w=>this.browser.typeIntoTarget(r.value,w,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableGlobalLocatorRedirect:!0,source:Ri(r)}});g.push(b),h=x}else await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);let S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,newTargets:g};return Oa(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"HOVER":{if(Sn(r.target)){await this.browser.hoverUsingVisualCoordinates(r.target.pixels);break}let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.hover(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"FOCUS":{if(!Vn(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,newTarget:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.focus(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:[h]}}case"BLUR":{if(r.target&&!Vn(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{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:g=>this.browser.blur(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"PRESS":let p=this.browser.url();await this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Oa(p,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"REQUEST":{let m=new XP,h=YP(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await ka({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:ma(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await jy({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Df({ctx:e,tracer:t,command:r,disableCache:i,browser:this.browser,logger:this.logger,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(r.fileSource.type==="URL"?(h=r.fileSource.url,m=await LS({uri:r.fileSource.url,logger:this.logger,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(h=r.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!m)throw new R("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!r.storageState.trim())m=void 0;else if(m=await Fn({orgId:this.orgId,code:r.storageState,fragment:!1,context:o,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=ua.optional().parse(m)}catch(g){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(r.timeout??bn)*1e3,h=await Mf({command:r,tracer:t,timeoutMs:m,targetingWrapper:g=>this.wrapElementTargetingCommand(g),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,newTargets:h.newTarget?[h.newTarget]:[],thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await xn({action:async()=>Na({assertion:r.assertion,browser:this.browser,logger:this.logger,timeout:r.timeout,signal:this.executeAbortController.signal,flagStore:this.flagStore}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:this.logger});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let h=this.browser.registerRequestListener(r.pattern).then(async g=>{let f={status:g?.status(),headers:g.headers()};return(await g.headerValue("content-type"))?.includes("json")?f.json=await g.json():(await g.headerValue("content-type"))?.includes("text")&&(f.text=await g.text()),f});return this.registeredListeners[r.key]=h,{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[r.key];if(!m)throw new R("ActionFailureError",`No listener registered with key: ${r.key}`);return{data:await U(m,{milliseconds:(r.timeout??10)*1e3,message:`Request listener timed out after ${r.timeout} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:r,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:r,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:r}){this.recordAbortController=t;let o=new Ya({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})}};var ZP=4;async function Hy({socket:n,logger:e,analytics:t,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,devicePixelRatio:a,generatorFactory:l,enricherFactory:c,browserbase:p,authorization:d,flagStoreFactory:u}){let m=n.id,h=n.handshake.query.testId;if(!h)throw new Error("Socket connection request is missing testId");let g=await r.getOrgId({type:"e2e",testId:h});e=e.child({testId:h,orgId:g,sessionId:m});let f=await l(g,e),S=await c(g,e),x=await u(g),{testMetadata:b,baseUrl:w,envName:E,localBrowserConfigFromEnv:C,environmentVariables:I,localCodeEvalTools:N}=await Gr({testId:h,orgId:g,logger:e,storage:r,authorization:d,flagStore:x}),P=X.getSession(m);if(P)return e.info("Associating connection with existing session (likely reconnect)"),await P.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let D=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:D,event:"connect",args:n.handshake.query},"Websocket event (connect)"),D&&X.getCurrentConnectionsByIp(D)>=ZP)throw e.error({clientIp:D,sessions:X.getCurrentSessionsByIp(),...n.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");X.reserveCapacityByIp(D);try{await QP({socket:n,baseUrl:w,envName:E,testMetadata:b,orgId:g,sessionId:m,logger:e,analytics:t,environmentVariables:I,clientIp:D,devicePixelRatio:a,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,localCodeEvalTools:N,generator:f,enricher:S,browserbase:p,localBrowserConfigFromEnv:C,flagStore:x})}catch(W){throw e.warn({err:W},"Error setting up socket session, possibly due to client closing the connection"),X.releaseCapacityByIp(D),W}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function QP({socket:n,baseUrl:e,envName:t,devicePixelRatio:r,testMetadata:o,orgId:i,sessionId:s,logger:a,analytics:l,storage:c,uploadedFileStorage:p,visualDiffScreenshotStorage:d,serviceMocker:u,localCodeEvalTools:m,generator:h,environmentVariables:g,localBrowserConfigFromEnv:f,clientIp:S,enricher:x,flagStore:b}){let w={};w.viewport=o.advanced?.viewport,r&&(w.deviceScaleFactor=r);let E=o.id,C=await u?.initializeServicesForTest(i,E),I=await za({advanced:{...f,...o.advanced},orgId:i,baseUrl:e,envName:t,localTools:m,envVariables:g,logger:a,customHeaders:void 0,flagStore:b});a=a.child({orgId:i,sessionId:s,testId:E});let N=!1,P=b.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,a):null,D=await dn.init({baseUrl:e,userBrowserSettings:I,enricher:x,storage:c,flagStore:b,mockedServices:C,logger:a,contextArgs:w,iconKnowledgeBase:P,onTabsChange:(j,O)=>{n.emit("tabs",{tabs:j,activeTab:O})},callbacks:{onScreencastFrame:(j,O)=>{let ee=n;N&&(ee=n.compress(!0)),ee.emit("screenshot",{buffer:j},()=>{O()})},onSvgsCollected:j=>{n.emit("newIconDetected",{numIcons:j.newSvgs.length}),c.saveNewIcons(i,j,a)}}});await D.navigate({url:e,initialNavigation:!0});let W=new Do({browser:D,generator:h,logger:a,analytics:l,flagStore:b,orgId:i,scratchPadId:void 0,storage:c,localCodeEvalTools:m,uploadedFileStorage:p,visualDiffScreenshotStorage:d,slowMoMs:I.slowMoMs}),_=mf(n,s,a),B=async()=>{_.timers.forEach(j=>clearInterval(j))},L=new It({baseUrl:e,currentUrl:W.browser.url(),variablesFromEnvironment:g,envName:t});if(!n.connected)throw await D.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");n.emit("session",{url:e,userAgent:dn.USER_AGENT,viewport:W.browser.getViewport(),sessionId:s}),X.registerSession({controller:W,context:L,sessionId:s,cleanup:B,clientIp:S})}async function Gr({testId:n,orgId:e,logger:t,storage:r,authorization:o,flagStore:i}){let s=await r.fetchTestMetadata(n,e,t);if(!s)throw new Error(`Test metadata could not found for test ${n}`);let a;o?.type==="API_KEY"&&(a=new Qn({httpClient:new _t({...o,logger:t}),fakerSeed:void 0}));let l=s.envs?.find(m=>m.default),c;l&&(c=await r.fetchEnvironment(e,l.name,t));let p=c&&"browser"in c?c.browser:void 0,d=s.baseUrl||c?.variables?.[Ae];if(!d)throw new Error("Base URL is empty in both test options and the configured environment");let u={...c?.variables};return await Promise.all((s.parameters??[]).map(async m=>{let h=await Dt({orgId:e,s:m.defaultValue,context:It.dummyContext(c?.name,u),logger:t,flagStore:i,localTools:a});u[m.name]=h})),{localCodeEvalTools:a,baseUrl:d,envName:c?.name,localBrowserConfigFromEnv:p,environmentVariables:u,testMetadata:s}}import{diff as eL}from"deep-object-diff";var op=class{parentTracer=null;socket;step;constructor({step:e,socket:t,parentTracer:r}){this.socket=t,this.parentTracer=r,this.step=e}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new nl({parentStep:this.step,socket:this.socket,parentTracer:this})}},nl=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:r}){this.parentTracer=r,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain()}),new op({step:e.step,parentTracer:this,socket:this.socket})}},rl=class{constructor(e,t,r,o,i){this.socket=e;this.storage=t;this.orgId=r;this.testId=o;this.stepsBeforeRun=i}trackStatus(){}attachConsoleLogs(){}attachNetworkLogs(){}async finish(e){this.socket.emit("finished");let{logger:t,result:r,updatedSteps:o}=e;if(r?.status==="PASSED"&&o){let i=o.steps,s=eL(this.stepsBeforeRun,i);if(Object.keys(s).length>0){t.debug({changes:s},"Updating steps post-run success");let{cachesToSave:a}=await mt({stepLists:{steps:i},cacheCreationParams:{testId:this.testId,orgId:this.orgId}});try{await this.storage.saveStepCacheEntries(a,this.testId,t)}catch(l){t.warn({err:l},"Failed to save step cache entries after execution success")}}else t.debug("No changes detected in steps post-run success")}}async startStepList(){return new nl({parentStep:null,parentTracer:null,socket:this.socket})}};var ip={currentlyExecutingRequests:{}},nL=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),s,a=await Gr({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i}),l=`${r}|${a.baseUrl}`;try{let c=ip.currentlyExecutingRequests[l]??0;ip.currentlyExecutingRequests[l]=c+1,s=await rL({...n,...e,...a,done:t})}finally{n.logger.info({result:s,sessionId:n.metadata.sessionId},"Test execution complete"),ip.currentlyExecutingRequests[l]--}},rL=async({socket:n,steps:e,baseUrl:t,testMetadata:r,reInitialize:o,toStep:i,fromStep:s,storage:a,metadata:l,logger:c,analytics:p,envName:d,environmentVariables:u,localCodeEvalTools:m,done:h})=>{let{testId:g,sessionId:f,orgId:S}=l,x=f,b=X.getSession(f);if(!b)throw new Error("No active session found");let{controller:w,context:E}=b;w.setOpen(),c=c.child({testId:g,orgId:S,baseUrl:t,sessionId:f,runId:x}),c.info({steps:e.map(O=>`${O.type}${"command"in O?` - ${O.command.type}`:""}`),toStep:i,fromStep:s,reInitialize:o,envName:d,baseUrl:t,context:E,flags:w.flagStore.getAllFlags()},"Socket execution parameters");let C=u??{},I=async()=>{o&&(await w.browser.reset({newUrl:t}),E.reset({baseUrl:t,currentUrl:w.browser.url(),variablesFromEnvironment:C,envName:d}))},N=async()=>{try{await a.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:S,testId:g,steps:e,logger:c})}catch(O){c.error({err:O},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await Wi({promiseGenerator:async()=>Promise.all([I(),N()]),signal:w.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),w.setOpen()}catch(O){if(n.emit("finished"),O.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${O}`)}let P=tL(e),D={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},W={orgId:S,runId:x,testMetadata:r,steps:e,fromStep:s,toStep:i},_={controller:w,context:E,storage:a,debugDataStorage:new Lr,codeEvalTools:m,billingReporter:new wo,logger:c,analytics:p},B={test:{},step:{onDynamicAIActionStatusUpdateEvent:O=>{n.emit("dynamicCommandStatusUpdate",O)},onDynamicAIActionEvaluatingEvent:O=>{n.emit("dynamicCommandEvaluating",O)},onDynamicCommandGenerated:O=>{n.emit("dynamicCommandGenerated",O)},onDynamicCommandExecuted:O=>{n.emit("dynamicCommandExecuted",O)}}},L=new rl(n,a,S,g,P),j=await Ba({fixtures:_,options:D,callbacks:B,inputs:W,testParams:{tracer:L}});return await L.finish({logger:c,result:j}),h?.(j),j.status};var $y={event:"execute",createHandler:nL};import{cloneDeep as oL}from"lodash-es";var iL=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,s=oL(e),a=_g(s);if(a.category!=="NO_DESCRIPTION_PROVIDED"){if(a.category!=="NONE"){t?.({result:a});return}"cache"in s&&(s.cache=void 0,s.id=void 0);try{let c=await(await o(i.orgId,r)).getLintStepResult({command:s},{logger:r,orgId:i.orgId});t?.({result:c})}catch(l){r.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},Wy={event:"lintStep",createHandler:iL};var sL=({metadata:n,logger:e,storage:t})=>{let{sessionId:r}=n;return async(o,i)=>{let{description:s,command:a,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${s}`);let p=X.getSession(r);if(!p)throw new Error("No active session found");let{controller:d,context:u}=p;d.setOpen();let m=fo.parse(l.advanced??{}),h={},g;if(s){if("useSelector"in a&&a.useSelector)try{let f=await d.locateElementWithSelector(s,"iframeUrl"in a?a.iframeUrl:void 0);g=f.resolution.locator,h={target:f.target,thoughts:f.thoughts}}catch(f){e.warn({err:f},"Failed resolving target with selector"),i({err:`Failed locating element: ${f.message}`,decisions:f instanceof Yn?f.decisions:void 0});return}else try{let f=await d.locateElement({description:s,disableCache:m.disableAICaching,iframeUrl:"iframeUrl"in a?a.iframeUrl:void 0,skipWait:!0,testContext:u,source:Ri(a)});h={target:f.target,thoughts:f.thoughts},g=f.resolution.locator}catch(f){(async()=>{try{let S=await d.browser.getCondensedHtml({skipWait:!0});e.warn({err:f,html:S.slice(0,1e5)},"Failed locating element with AI")}catch(S){e.warn({err:S},"Failed grabbing HTML after trying to locate element with AI")}})(),i({err:`Failed locating element with AI: ${f.message}`});return}if(a.type==="SELECT_OPTION"&&g)try{h.options=await d.browser.getSelectOptions(g)}catch(f){e.warn({err:f},"Failed getting select options"),i({err:`Failed getting select options: ${f.message}`});return}e.info({result:h},"Locate handler result")}if(c)try{let{buffer:f,width:S,height:x}=await d.screenshotWithDimensions({clearHighlights:!0,locator:g,hideCaret:!0}),b=await t.uploadScreenshot(f);h.screenshot={data:b,width:S,height:x},e.info({width:S,height:x},"Captured screenshot during locate")}catch(f){e.error({err:f},"Error capturing screenshot during locate"),i({err:`Error taking screenshot: ${f.message}`});return}if(i({result:h}),g)try{await Promise.all([d.browser.scrollIntoView(g),d.browser.highlight(g)])}catch(f){e.warn({err:f},"Error highlighting element, continuing...")}}},Gy={event:"locate",createHandler:sL};var aL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({event:r,percentX:o,percentY:i})=>{let s=X.getSession(t);if(!s)throw new Error("No active session found");let a=s.controller.browser;if(a.closed||a.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await a.clickMouseFromPositionPercentages(r,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},Vy={event:"cloudMouseEvent",createHandler:aL};var lL=({metadata:n,generatorFactory:e,logger:t,socket:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a,parentStepIdChain:l,attribute:c})=>{let p=X.getSession(o);if(!p)throw new Error("No active session found");let{controller:d}=p,u=await e(i,t);d.setOpen(),p.browserBehavior.showOverlay=!0;let m=new AbortController;m.signal.addEventListener("abort",async()=>{try{p.browserBehavior.showOverlay=!1,await d.stopRecordMode()}catch(f){t.warn({err:f},"Failed to stop record mode in target click socket handler")}});let h=!1,g=(f,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(r.emit("targetRecordingUpdate",{type:f,stepId:a,parentStepIdChain:l,command:S.command,attribute:c}),m.abort(),h=!0)};setTimeout(()=>{h||(m.abort(),r.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:a,parentStepIdChain:l,attribute:c}))},1e4),await d.startRecordMode({params:{generator:u,logger:t,testId:s,orgId:i,callbacks:{onActionReceived:f=>g("clickReceived",f),onStepRecorded:f=>g("descriptionGenerated",f)}},abortController:m,isClickToRecord:!0}),r.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:a,parentStepIdChain:l,attribute:c})}},qy={event:"recordTargetClick",createHandler:lL};var cL=({metadata:n,logger:e})=>{let{sessionId:t}=n,r,o=0,i=(a,l)=>{let c=async()=>{r=void 0};clearTimeout(r),r=setTimeout(c,Math.min(1e3,250*(o+1)))},s=0;return async a=>{let l=X.getSession(t);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:p}=l,d=c.browser;if(d.closed||d.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}p.showOverlay&&i(d,a);try{await d.moveMouseFromPositionPercentages(a.percentX,a.percentY),s=0}catch(u){s++,s%5===0&&e.warn({err:u,mouseErrors:s},"Error in socket mouse move handler")}}},Ky={event:"cloudMouseMove",createHandler:cL};var dL=({metadata:n})=>{let{sessionId:e}=n;return async({percentDeltaX:t,percentDeltaY:r})=>{let o=X.getSession(e);if(!o)throw new Error("No active session found");let i=o.controller.browser;if(i.closed)return;let s=await i.scrollFromPositionPercentages(t,r);if(!s)return;let a=o.browserBehavior.recordingState?.transformer;a&&a.recordScroll(s)}},Yy={event:"cloudScroll",createHandler:dL};var pL=({metadata:n,generatorFactory:e,socket:t,logger:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a})=>{let l=X.getSession(o);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:p}=l,d=await e(i,r);r.info("Starting cloud recording");let u=new AbortController,m=await c.startRecordMode({params:{generator:d,logger:r,testId:s,orgId:i,callbacks:{onActionReceived:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})},onStepRecorded:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})}}},abortController:u,isClickToRecord:!1});p.recordingState={transformer:m}}},Jy={event:"cloudStartRecording",createHandler:pL};var uL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{let r=X.getSession(t);if(!r)throw new Error("No active session found");e.info("Stopping cloud recording"),await r.controller.stopRecordMode(),r.browserBehavior.recordingState=void 0,r.browserBehavior.showOverlay=!1}},Xy={event:"cloudStopRecording",createHandler:uL};var mL=["Dead","Meta","AudioVolumeUp","AudioVolumeDown"],hL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=X.getSession(t);if(!o)throw new Error("No active session found");if(mL.includes(r))return;let{controller:i}=o;if(i.browser.closed||i.browser.getActivePage().isClosed()){e.debug({sessionId:t},"Browser is closed, ignoring typing action");return}try{i.setOpen(),r.length>1?await i.browser.press(r,{}):await i.browser.type(r,{clearContent:!1,pressKeysSequentially:!0})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:t,err:s},"Browser is closed, ignoring typing action error");return}throw s}}},Zy={event:"cloudType",createHandler:hL};var gL=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i})=>async(s,a)=>{let{testId:l,sessionId:c,orgId:p}=e;t.info({testId:l,sessionId:c},"Refresh event received");let d=await i(p),{baseUrl:u}=await Gr({testId:l,orgId:p,logger:t,storage:r,authorization:o,flagStore:d}),m=X.getSession(c);if(!m){n.emit("error",{message:"No session to refresh"});return}let{controller:h}=m;h.setOpen(),await h.browser.refresh();let g=h.browser.getViewport();t.info({baseUrl:u,viewport:g},`Session refreshed for test ${l} at ${u}`),a()},Qy={event:"refresh",createHandler:gL};var fL=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i})=>async()=>{let{testId:s,sessionId:a,orgId:l}=e;t.info({testId:s,sessionId:a},"Reset event received");let c=await i(l),{baseUrl:p,envName:d,environmentVariables:u}=await Gr({testId:s,orgId:l,logger:t,storage:r,authorization:o,flagStore:c}),m=X.getSession(a);if(!m){n.emit("error",{message:"No session to reset"});return}let{controller:h,context:g}=m;await h.browser.reset({newUrl:p});let f=h.browser.baseUrl;g.reset({baseUrl:f,currentUrl:h.browser.url(),variablesFromEnvironment:u,envName:d});let S=h.browser.getViewport(),x=dn.USER_AGENT;t.info({baseUrl:p,viewport:S},`Session reset for test ${s} at ${f}`),n.emit("session",{url:f,userAgent:x,viewport:S,sessionId:a})},eb={event:"reset",createHandler:fL};var SL=({metadata:n})=>{let{sessionId:e}=n;return async({url:t})=>{let r=X.getSession(e);if(!r)throw new Error("No active session found");await r.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},tb={event:"switchTab",createHandler:SL};async function nb(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?Rf(n):Hy(n)}var rb=[Of,$y,Gy,eb,Qy,If,tb,Wy,qy,Jy,Xy,Ky,Vy,Zy,Yy,Af,hf,Lf,Pf];var ob=n=>{let{logger:e}=n,t=new yL(n.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async r=>{let o;try{e.info({event:"connection",transport:r.conn.transport.name},"Websocket connection established"),o=await nb({...n,socket:r,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),r.emit("error",{message:i instanceof Error?i.message:`${i}`}),r.disconnect(!0);return}rb.forEach(i=>bL(i,{socket:r,metadata:o,...n,logger:e}))}),t},bL=(n,e)=>{let t=n.createHandler(e),r=(...o)=>{["cloudMouseMove","cloudScroll","cloudType","cloudMouseEvent"].includes(n.event)||e.logger.debug({...e.metadata,event:n.event,args:o},`Websocket event (${n.event})`);let i=s=>{e.logger.error({event:n.event,type:"websocket",args:o,err:s instanceof Error?s:new Error(`${s}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:s instanceof Error?s.message:`${s}`})};try{let s=t.apply(void 0,o);s&&typeof s.catch=="function"&&s.catch(i)}catch(s){i(s)}};e.socket.on(n.event,r)};import{Router as Tk}from"express";import{diff as TL}from"deep-object-diff";import Mt from"fs";import Ut from"path";import Vr from"yaml";import{exec as wL}from"child_process";function Uo(n,e){let t=e.hooks?.postSave;if(!t)return;let r;t.includes("$1")?r=t.replaceAll("$1",n):r=`${t} ${n}`,y.debug({postSaveCommand:r},"Executing post-save hook command"),wL(r,{encoding:"utf-8"},o=>{o&&y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")})}import{diff as ib}from"deep-object-diff";import ar from"fs";import{cloneDeep as vL}from"lodash-es";import sp from"path";import{v4 as xL}from"uuid";import Zi from"yaml";function ap({content:n,schemaVersion:e,momenticFiles:t,project:r}){let o=t.modules[n.moduleId]?.fullFilePath;if(!o||!ar.existsSync(o))throw new Error(`Tried to update module ${n.moduleId} that could not be found on disk`);let i=ar.readFileSync(o,"utf-8"),s=Zi.parse(i),a;if(n.name&&n.name!==s.name){let u=`${Pe(n.name)}.${Nt.MODULE}`;if(a=sp.join(sp.dirname(o),u),ar.existsSync(a))throw new Error(`Test with name '${n.name}' already exists at path '${a}'`)}let l={...n,schemaVersion:e},c=Mn({fileType:he.MODULE,...Zc.parse(l),steps:n.steps}),p=ib(c,s);if(p&&Object.keys(p).length===0){y.debug(`Skipping save for module ${n.moduleId} since there are no changes`);return}let d=Zi.stringify(c);ar.writeFileSync(o,d,"utf-8"),a&&ar.renameSync(o,a),Uo(a||o,r.config)}function sb({moduleId:n,content:e,momenticFiles:t,project:r,logger:o}){let i=t.modules[n]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${n} that could not be found on disk`);let s=Qi(i,o),a={...s,...e},l=Mn({fileType:he.MODULE,...Zc.parse(a),steps:s.steps}),c=ib(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let p=Zi.stringify(l);ar.writeFileSync(i,p,"utf-8"),Uo(i,r.config)}async function ab({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let s=Pe(n),a=sp.join(o,`${s}.module.yaml`),l=xL(),{stepsToSave:c}=await mt({stepLists:{steps:r}}),p={fileType:he.MODULE,schemaVersion:He,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},d=Zi.stringify(p);return ar.writeFileSync(a,d,"utf-8"),Uo(a,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function Qi(n,e){let t=ar.readFileSync(n,"utf-8"),r=Zi.parse(t);try{return td.parse(r)}catch(o){throw e.error({err:o,moduleFilePath:n,moduleContents:t},`${n} does not parse as a valid Momentic module`),o}}async function lp(n,e,t,r){let o=Qi(n.fullFilePath,t),{resolvedSteps:i}=await Aa({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:r,logger:t,callbacks:{onFetchModule:async({id:a})=>{let l=e.modules[a]?.fullFilePath;if(l)return Qi(l,t)}}}),s={...o,steps:i};return r&&(r[n.id]=vL(s)),s}async function ol(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await lp(r,n,e,t)})),Array.from(Object.values(t))}async function lb({test:n,name:e,folder:t}){let r=await pf(n);if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Pe(e)}.${Nt.TEST}`,s=Ut.join(t,i);return Mt.writeFileSync(s,r.test,"utf-8"),s}function cp(n,e,t){let r=Ut.join(t.rootDir,n);if(!Mt.existsSync(r))throw new Error(`Test not found at path '${n}' in project '${t.rootDir}'`);let o=Mt.readFileSync(r,"utf-8"),i=Vr.parse(o),s,a;if(e.name&&e.name!==i.name){let u=`${Pe(e.name)}.${Nt.TEST}`;if(s=Ut.join(Ut.dirname(n),u),a=Ut.join(t.rootDir,s),Mt.existsSync(a))throw new Error(`Test with name '${e.name}' already exists at path '${a}'`)}let l={...i,...e},c=Kt.parse(l),p={fileType:he.TEST,...Kt.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=Vr.stringify(p);return Mt.writeFileSync(r,d,"utf-8"),a&&Mt.renameSync(r,a),{newRelativeTestPath:s}}function qr(n,e,t,r){let o=Ut.join(r.rootDir,n);if(!Mt.existsSync(o))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let i=Mt.readFileSync(o,"utf-8"),s=Vr.parse(i),a=Kt.parse({...s,schemaVersion:t}),l=Mn({fileType:he.TEST,...a,beforeSteps:e.beforeSteps??void 0,steps:e.steps,afterSteps:e.afterSteps??void 0}),c=TL(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for test ${a.name} since there are no changes`);return}let p=Vr.stringify(l);Mt.writeFileSync(o,p,"utf-8"),Uo(o,r.config)}function dp(n,e,t=n){let r=n.split(Ut.sep).pop()??"";if(ji.includes(r))return e.warn(`Skipping directory '${n}' because it is likely an artifact folder.`),[];let o=Mt.readdirSync(n),i=[];return o.forEach(s=>{let a=Ut.join(n,s),l;try{l=Mt.statSync(a)}catch(c){e.warn({err:c},`Skipping path '${a}' because it could not be read.`);return}if(l.isDirectory())i=i.concat(dp(a,e,t));else if(s.endsWith(".yaml")){let c=Mt.readFileSync(a,"utf-8"),p=Ut.relative(Ut.resolve(t),Ut.resolve(a));try{let d=Vr.parse(c),u=kt.parse(d);i.push({id:u.id,name:u.name,fullPathSegments:a.split(Ut.sep),testPath:p,fileName:s,lastModified:l.mtime,createdAt:l.ctime})}catch{e.warn(`Skipping file '${a}' because it does not parse as a valid Momentic test.`)}}}),i}function il(n,e){let t=Ut.join(e.rootDir,n);if(!t)throw new Error(`Could not find test with path ${n} in Momentic project (${e.rootDir})`);let r;try{r=Mt.readFileSync(t,"utf8"),r=r.replace(/\r\n|\r/g,`
3543
- `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Vr.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return kt.parse(o)}function es(n,e,t){let r=t.project.rootDir,o;try{o=Mt.readFileSync(n,"utf-8")}catch(s){throw e.error({err:s,projectRoot:r},s.message),new Error(s.message)}let i=Vr.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function ts(n,e,t){let r=es(n,e,t),o;try{o=Kt.parse(r)}catch(s){throw new Error(`Test ${n} is missing metadata or has invalid metadata: ${s}`)}let{resolvedTest:i}=await lf({rawSteps:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:s,logger:a})=>{let l=t.modules[s]?.fullFilePath;if(l)return Qi(l,a)}}});return i}import EL from"@dotenvx/dotenvx";import CL from"fs";import cb from"path";function pb(n,e){return(n.config.environments??[]).map(t=>ns(t.name,n,e))}function db(n){return n.includes("${")?n.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[r,o]=t.split(/:-|-/,2),i=process.env[r];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):n}function ns(n,e,t){let r=(e.config.environments??[]).find(s=>s.name===n);if(!r)throw new Error(`Environment ${n} not found in local project configuration file`);let o={[Ae]:db(r.baseUrl)};if(r.envVariables){let s={};for(let[a,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=db(l);c&&(s[a]=c)}else{let c=l.fromFile,p;try{p=CL.readFileSync(cb.resolve(e.rootDir,c),"utf-8")}catch(d){throw new Error(`Failed to read environment variable '${a}' from file '${c}': ${d}`)}if(l.json)try{s[a]=JSON.parse(p)}catch(d){throw new Error(`Failed to parse environment variable '${a}' from file '${c}' as JSON: ${d}`)}else s[a]=p}Object.keys(s).length>0&&y.debug(s,"Set environment variables with interpolation from project configuration"),Object.assign(o,s)}if(r.envFile){let s={},a=EL.config({path:cb.resolve(e.rootDir,r.envFile),processEnv:s,logLevel:"error",quiet:!0});if(a.error)throw new Error(`Failed to load .env file: ${a.error.message}`);t.debug(s,"Set environment variables from .env file"),Object.assign(o,s)}return r.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:n,variables:o,browser:r.browser}}import{existsSync as nk,readFileSync as rk,readdirSync as ok,writeFileSync as ik}from"fs";var kb=Iu(Eb(),1);var os=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var NL={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},is=n=>n.replace(/[[\]\\-]/g,"\\$&"),_L=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Cb=n=>n.join(""),Rb=(n,e)=>{let t=e;if(n.charAt(t)!=="[")throw new Error("not in a brace expression");let r=[],o=[],i=t+1,s=!1,a=!1,l=!1,c=!1,p=t,d="";e:for(;i<n.length;){let g=n.charAt(i);if((g==="!"||g==="^")&&i===t+1){c=!0,i++;continue}if(g==="]"&&s&&!l){p=i+1;break}if(s=!0,g==="\\"&&!l){l=!0,i++;continue}if(g==="["&&!l){for(let[f,[S,x,b]]of Object.entries(NL))if(n.startsWith(f,i)){if(d)return["$.",!1,n.length-t,!0];i+=f.length,b?o.push(S):r.push(S),a=a||x;continue e}}if(l=!1,d){g>d?r.push(is(d)+"-"+is(g)):g===d&&r.push(is(g)),d="",i++;continue}if(n.startsWith("-]",i+1)){r.push(is(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){d=g,i+=2;continue}r.push(is(g)),i++}if(p<i)return["",!1,0,!1];if(!r.length&&!o.length)return["$.",!1,n.length-t,!0];if(o.length===0&&r.length===1&&/^\\?.$/.test(r[0])&&!c){let g=r[0].length===2?r[0].slice(-1):r[0];return[_L(g),!1,p-t,!1]}let u="["+(c?"^":"")+Cb(r)+"]",m="["+(c?"":"^")+Cb(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,a,p-t,!0]};var pn=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var ML=new Set(["!","?","+","*","@"]),Ab=n=>ML.has(n),FL="(?!(?:^|/)\\.\\.?(?:$|/))",sl="(?!\\.)",DL=new Set(["[","."]),UL=new Set(["..","."]),BL=new Set("().*{}+?[]^$\\!"),zL=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),mp="[^/]",Ib=mp+"*?",Pb=mp+"+?",Bo=class n{type;#e;#t;#i=!1;#r=[];#s;#w;#c;#p=!1;#a;#l;#o=!1;constructor(e,t,r={}){this.type=e,e&&(this.#t=!0),this.#s=t,this.#e=this.#s?this.#s.#e:this,this.#a=this.#e===this?r:this.#e.#a,this.#c=this.#e===this?[]:this.#e.#c,e==="!"&&!this.#e.#p&&this.#c.push(this),this.#w=this.#s?this.#s.#r.length:0}get hasMagic(){if(this.#t!==void 0)return this.#t;for(let e of this.#r)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#t=!0;return this.#t}toString(){return this.#l!==void 0?this.#l:this.type?this.#l=this.type+"("+this.#r.map(e=>String(e)).join("|")+")":this.#l=this.#r.map(e=>String(e)).join("")}#f(){if(this!==this.#e)throw new Error("should only call on root");if(this.#p)return this;this.toString(),this.#p=!0;let e;for(;e=this.#c.pop();){if(e.type!=="!")continue;let t=e,r=t.#s;for(;r;){for(let o=t.#w+1;!r.type&&o<r.#r.length;o++)for(let i of e.#r){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(r.#r[o])}t=r,r=t.#s}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof n&&t.#s===this))throw new Error("invalid part: "+t);this.#r.push(t)}}toJSON(){let e=this.type===null?this.#r.slice().map(t=>typeof t=="string"?t:t.toJSON()):[this.type,...this.#r.map(t=>t.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#p&&this.#s?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#s?.isStart())return!1;if(this.#w===0)return!0;let e=this.#s;for(let t=0;t<this.#w;t++){let r=e.#r[t];if(!(r instanceof n&&r.type==="!"))return!1}return!0}isEnd(){if(this.#e===this||this.#s?.type==="!")return!0;if(!this.#s?.isEnd())return!1;if(!this.type)return this.#s?.isEnd();let e=this.#s?this.#s.#r.length:0;return this.#w===e-1}copyIn(e){typeof e=="string"?this.push(e):this.push(e.clone(this))}clone(e){let t=new n(this.type,e);for(let r of this.#r)t.copyIn(r);return t}static#S(e,t,r,o){let i=!1,s=!1,a=-1,l=!1;if(t.type===null){let m=r,h="";for(;m<e.length;){let g=e.charAt(m++);if(i||g==="\\"){i=!i,h+=g;continue}if(s){m===a+1?(g==="^"||g==="!")&&(l=!0):g==="]"&&!(m===a+2&&l)&&(s=!1),h+=g;continue}else if(g==="["){s=!0,a=m,l=!1,h+=g;continue}if(!o.noext&&Ab(g)&&e.charAt(m)==="("){t.push(h),h="";let f=new n(g,t);m=n.#S(e,f,m,o),t.push(f);continue}h+=g}return t.push(h),m}let c=r+1,p=new n(null,t),d=[],u="";for(;c<e.length;){let m=e.charAt(c++);if(i||m==="\\"){i=!i,u+=m;continue}if(s){c===a+1?(m==="^"||m==="!")&&(l=!0):m==="]"&&!(c===a+2&&l)&&(s=!1),u+=m;continue}else if(m==="["){s=!0,a=c,l=!1,u+=m;continue}if(Ab(m)&&e.charAt(c)==="("){p.push(u),u="";let h=new n(m,p);p.push(h),c=n.#S(e,h,c,o);continue}if(m==="|"){p.push(u),u="",d.push(p),p=new n(null,t);continue}if(m===")")return u===""&&t.#r.length===0&&(t.#o=!0),p.push(u),u="",t.push(...d,p),c;u+=m}return t.type=null,t.#t=void 0,t.#r=[e.substring(r-1)],c}static fromGlob(e,t={}){let r=new n(null,void 0,t);return n.#S(e,r,0,t),r}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[t,r,o,i]=this.toRegExpSource();if(!(o||this.#t||this.#a.nocase&&!this.#a.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return r;let a=(this.#a.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${t}$`,a),{_src:t,_glob:e})}get options(){return this.#a}toRegExpSource(e){let t=e??!!this.#a.dot;if(this.#e===this&&this.#f(),!this.type){let l=this.isStart()&&this.isEnd(),c=this.#r.map(m=>{let[h,g,f,S]=typeof m=="string"?n.#u(m,this.#t,l):m.toRegExpSource(e);return this.#t=this.#t||f,this.#i=this.#i||S,h}).join(""),p="";if(this.isStart()&&typeof this.#r[0]=="string"&&!(this.#r.length===1&&UL.has(this.#r[0]))){let h=DL,g=t&&h.has(c.charAt(0))||c.startsWith("\\.")&&h.has(c.charAt(2))||c.startsWith("\\.\\.")&&h.has(c.charAt(4)),f=!t&&!e&&h.has(c.charAt(0));p=g?FL:f?sl:""}let d="";return this.isEnd()&&this.#e.#p&&this.#s?.type==="!"&&(d="(?:$|\\/)"),[p+c+d,pn(c),this.#t=!!this.#t,this.#i]}let r=this.type==="*"||this.type==="+",o=this.type==="!"?"(?:(?!(?:":"(?:",i=this.#m(t);if(this.isStart()&&this.isEnd()&&!i&&this.type!=="!"){let l=this.toString();return this.#r=[l],this.type=null,this.#t=void 0,[l,pn(this.toString()),!1,!1]}let s=!r||e||t||!sl?"":this.#m(!0);s===i&&(s=""),s&&(i=`(?:${i})(?:${s})*?`);let a="";if(this.type==="!"&&this.#o)a=(this.isStart()&&!t?sl:"")+Pb;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?sl:"")+Ib+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&s?")":this.type==="*"&&s?")?":`)${this.type}`;a=o+i+l}return[a,pn(i),this.#t=!!this.#t,this.#i]}#m(e){return this.#r.map(t=>{if(typeof t=="string")throw new Error("string type in extglob ast??");let[r,o,i,s]=t.toRegExpSource(e);return this.#i=this.#i||s,r}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,r=!1){let o=!1,i="",s=!1;for(let a=0;a<e.length;a++){let l=e.charAt(a);if(o){o=!1,i+=(BL.has(l)?"\\":"")+l;continue}if(l==="\\"){a===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,p,d,u]=Rb(e,a);if(d){i+=c,s=s||p,a+=d-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=Pb:i+=Ib,t=!0;continue}if(l==="?"){i+=mp,t=!0;continue}i+=zL(l)}return[i,pn(e),!!t,s]}};var zo=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var vt=(n,e,t={})=>(os(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Bt(e,t).match(n)),jL=/^\*+([^+@!?\*\[\(]*)$/,HL=n=>e=>!e.startsWith(".")&&e.endsWith(n),$L=n=>e=>e.endsWith(n),WL=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),GL=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),VL=/^\*+\.\*+$/,qL=n=>!n.startsWith(".")&&n.includes("."),KL=n=>n!=="."&&n!==".."&&n.includes("."),YL=/^\.\*+$/,JL=n=>n!=="."&&n!==".."&&n.startsWith("."),XL=/^\*+$/,ZL=n=>n.length!==0&&!n.startsWith("."),QL=n=>n.length!==0&&n!=="."&&n!=="..",eO=/^\?+([^+@!?\*\[\(]*)?$/,tO=([n,e=""])=>{let t=Nb([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},nO=([n,e=""])=>{let t=_b([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},rO=([n,e=""])=>{let t=_b([n]);return e?r=>t(r)&&r.endsWith(e):t},oO=([n,e=""])=>{let t=Nb([n]);return e?r=>t(r)&&r.endsWith(e):t},Nb=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},_b=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},Mb=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",Lb={win32:{sep:"\\"},posix:{sep:"/"}},iO=Mb==="win32"?Lb.win32.sep:Lb.posix.sep;vt.sep=iO;var st=Symbol("globstar **");vt.GLOBSTAR=st;var sO="[^/]",aO=sO+"*?",lO="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",cO="(?:(?!(?:\\/|^)\\.).)*?",dO=(n,e={})=>t=>vt(t,n,e);vt.filter=dO;var Xt=(n,e={})=>Object.assign({},n,e),pO=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return vt;let e=vt;return Object.assign((r,o,i={})=>e(r,o,Xt(n,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Xt(n,i))}static defaults(o){return e.defaults(Xt(n,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,s={}){super(o,i,Xt(n,s))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Xt(n,i))}},unescape:(r,o={})=>e.unescape(r,Xt(n,o)),escape:(r,o={})=>e.escape(r,Xt(n,o)),filter:(r,o={})=>e.filter(r,Xt(n,o)),defaults:r=>e.defaults(Xt(n,r)),makeRe:(r,o={})=>e.makeRe(r,Xt(n,o)),braceExpand:(r,o={})=>e.braceExpand(r,Xt(n,o)),match:(r,o,i={})=>e.match(r,o,Xt(n,i)),sep:e.sep,GLOBSTAR:st})};vt.defaults=pO;var Fb=(n,e={})=>(os(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,kb.default)(n));vt.braceExpand=Fb;var uO=(n,e={})=>new Bt(n,e).makeRe();vt.makeRe=uO;var mO=(n,e,t={})=>{let r=new Bt(e,t);return n=n.filter(o=>r.match(o)),r.options.nonull&&!n.length&&n.push(e),n};vt.match=mO;var Ob=/[?*]|[+@!]\(.*?\)|\[|\]/,hO=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Bt=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,t={}){os(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||Mb,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!t.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!t.nonegate,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=t.windowsNoMagicRoot!==void 0?t.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let t of e)if(typeof t!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,t=this.options;if(!t.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],t.debug&&(this.debug=(...i)=>console.error(...i)),this.debug(this.pattern,this.globSet);let r=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(r),this.debug(this.pattern,this.globParts);let o=this.globParts.map((i,s,a)=>{if(this.isWindows&&this.windowsNoMagicRoot){let l=i[0]===""&&i[1]===""&&(i[2]==="?"||!Ob.test(i[2]))&&!Ob.test(i[3]),c=/^[a-z]:/i.test(i[0]);if(l)return[...i.slice(0,4),...i.slice(4).map(p=>this.parse(p))];if(c)return[i[0],...i.slice(1).map(p=>this.parse(p))]}return i.map(l=>this.parse(l))});if(this.debug(this.pattern,o),this.set=o.filter(i=>i.indexOf(!1)===-1),this.isWindows)for(let i=0;i<this.set.length;i++){let s=this.set[i];s[0]===""&&s[1]===""&&this.globParts[i][2]==="?"&&typeof s[3]=="string"&&/^[a-z]:$/i.test(s[3])&&(s[2]="?")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let r=0;r<e.length;r++)for(let o=0;o<e[r].length;o++)e[r][o]==="**"&&(e[r][o]="*");let{optimizationLevel:t=1}=this.options;return t>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):t>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(t=>{let r=-1;for(;(r=t.indexOf("**",r+1))!==-1;){let o=r;for(;t[o+1]==="**";)o++;o!==r&&t.splice(r,o-r)}return t})}levelOneOptimize(e){return e.map(t=>(t=t.reduce((r,o)=>{let i=r[r.length-1];return o==="**"&&i==="**"?r:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(r.pop(),r):(r.push(o),r)},[]),t.length===0?[""]:t))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let t=!1;do{if(t=!1,!this.preserveMultipleSlashes){for(let o=1;o<e.length-1;o++){let i=e[o];o===1&&i===""&&e[0]===""||(i==="."||i==="")&&(t=!0,e.splice(o,1),o--)}e[0]==="."&&e.length===2&&(e[1]==="."||e[1]==="")&&(t=!0,e.pop())}let r=0;for(;(r=e.indexOf("..",r+1))!==-1;){let o=e[r-1];o&&o!=="."&&o!==".."&&o!=="**"&&(t=!0,e.splice(r-1,2),r-=2)}}while(t);return e.length===0?[""]:e}firstPhasePreProcess(e){let t=!1;do{t=!1;for(let r of e){let o=-1;for(;(o=r.indexOf("**",o+1))!==-1;){let s=o;for(;r[s+1]==="**";)s++;s>o&&r.splice(o+1,s-o);let a=r[o+1],l=r[o+2],c=r[o+3];if(a!==".."||!l||l==="."||l===".."||!c||c==="."||c==="..")continue;t=!0,r.splice(o,1);let p=r.slice(0);p[o]="**",e.push(p),o--}if(!this.preserveMultipleSlashes){for(let s=1;s<r.length-1;s++){let a=r[s];s===1&&a===""&&r[0]===""||(a==="."||a==="")&&(t=!0,r.splice(s,1),s--)}r[0]==="."&&r.length===2&&(r[1]==="."||r[1]==="")&&(t=!0,r.pop())}let i=0;for(;(i=r.indexOf("..",i+1))!==-1;){let s=r[i-1];if(s&&s!=="."&&s!==".."&&s!=="**"){t=!0;let l=i===1&&r[i+1]==="**"?["."]:[];r.splice(i-1,2,...l),r.length===0&&r.push(""),i-=2}}}}while(t);return e}secondPhasePreProcess(e){for(let t=0;t<e.length-1;t++)for(let r=t+1;r<e.length;r++){let o=this.partsMatch(e[t],e[r],!this.preserveMultipleSlashes);if(o){e[t]=[],e[r]=o;break}}return e.filter(t=>t.length)}partsMatch(e,t,r=!1){let o=0,i=0,s=[],a="";for(;o<e.length&&i<t.length;)if(e[o]===t[i])s.push(a==="b"?t[i]:e[o]),o++,i++;else if(r&&e[o]==="**"&&t[i]===e[o+1])s.push(e[o]),o++;else if(r&&t[i]==="**"&&e[o]===t[i+1])s.push(t[i]),i++;else if(e[o]==="*"&&t[i]&&(this.options.dot||!t[i].startsWith("."))&&t[i]!=="**"){if(a==="b")return!1;a="a",s.push(e[o]),o++,i++}else if(t[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(a==="a")return!1;a="b",s.push(t[i]),o++,i++}else return!1;return e.length===t.length&&s}parseNegate(){if(this.nonegate)return;let e=this.pattern,t=!1,r=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)t=!t,r++;r&&(this.pattern=e.slice(r)),this.negate=t}matchOne(e,t,r=!1){let o=this.options;if(this.isWindows){let g=typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0]),f=!g&&e[0]===""&&e[1]===""&&e[2]==="?"&&/^[a-z]:$/i.test(e[3]),S=typeof t[0]=="string"&&/^[a-z]:$/i.test(t[0]),x=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),b=f?3:g?0:void 0,w=x?3:S?0:void 0;if(typeof b=="number"&&typeof w=="number"){let[E,C]=[e[b],t[w]];E.toLowerCase()===C.toLowerCase()&&(t[w]=E,w>b?t=t.slice(w):b>w&&(e=e.slice(b)))}}let{optimizationLevel:i=1}=this.options;i>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:t}),this.debug("matchOne",e.length,t.length);for(var s=0,a=0,l=e.length,c=t.length;s<l&&a<c;s++,a++){this.debug("matchOne loop");var p=t[a],d=e[s];if(this.debug(t,p,d),p===!1)return!1;if(p===st){this.debug("GLOBSTAR",[t,p,d]);var u=s,m=a+1;if(m===c){for(this.debug("** at the end");s<l;s++)if(e[s]==="."||e[s]===".."||!o.dot&&e[s].charAt(0)===".")return!1;return!0}for(;u<l;){var h=e[u];if(this.debug(`
3558
+ `),tokenLength:d}),p=[],d=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=Zi(g);d+=f,g.length>s&&(g=g.slice(0,s));let b=Array.from(g.matchAll(ky)).map(L=>L&&L.length>=3?{tagName:L[1],id:L[2]}:void 0).filter(L=>!!L),E=Array.from(g.matchAll(BP)).map(L=>L&&(L[2]||L[4])).filter(L=>!!L);E.reverse();let C=g.replace(/ id="[0-9]+"/g,"");p.push(C);for(let L of b)u.push(L.id),m.push(L);for(let L of E){let j=m[m.length-1];j&&j.tagName===L&&m.pop()}let I=m.some(L=>jP.includes(L.tagName)),N=l[c+1]??"",P=Zi(N),W=Array.from(N.matchAll(ky)).map(L=>L&&L.length>2?L[1]:void 0).filter(L=>!!L),_=W.some(L=>My.includes(L)),B=W.some(L=>zP.includes(L));d+P>=i&&(h=!0),d>=r&&(_&&!I||E.some(L=>HP.includes(L)))&&(h=!0),d>=o&&B&&!I&&(h=!0),c++}return p.length&&a.push({ids:u,content:p.join(`
3559
+ `),tokenLength:d}),a.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${a.length})`)}),{chunks:a}}var ep=4e4,tp=8e4;async function Wr(n){let{serializedTree:e,logger:t,flagStore:r,softTokenLimit:o=ep}=n;if(Zi(e)<o)return e;let s=r.isBooleanFlagEnabled("rag_v2"),a;s?a=Qd({serializedTree:e,options:_y,logger:t,maxCharacterLength:1e6}):a=Qd({serializedTree:e,options:Ny,logger:t,maxCharacterLength:3e6});try{return s?await U(WP({...n,chunks:a.chunks}),{milliseconds:2e4}):await U(VP({...n,chunkResult:a}),{milliseconds:15e3})}catch(l){t.warn({err:l},"Error executing page filtering, attempting AI keyword fallback");try{return await GP({...n,chunks:a.chunks})}catch(c){return t.warn({err:c},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,tp*Fo)}}}async function WP({chunks:n,generator:e,description:t,type:r,logger:o,signal:i,orgId:s,tree:a,softTokenLimit:l=ep,hardTokenLimit:c=tp}){let p=await e.rankChunksWithAi({chunks:n,description:t,type:r,softTokenLimit:l,hardTokenLimit:c},{abortSignal:i,orgId:s,logger:o,loggerTags:Ge(o)}),d=[];n.forEach((m,h)=>{p.indices.includes(h)&&(d=d.concat(m.ids))});let u=a.pruneUsingRelevantIds(new Set(d)).serialize();return o.debug({description:t,type:r,selectedChunks:p,tree:u},"Pruned a11y tree with AI page filtering"),u}async function GP(n){let{type:e,description:t,generator:r,orgId:o,tree:i,logger:s,hardTokenLimit:a=tp}=n;if(!t.trim())throw new Error("Empty description passed to page filtering");let l=await r.getExtractedKeywords({goal:t},{orgId:o,logger:n.logger,loggerTags:Ge(n.logger)});for(let c of l.keywords){let p=n.chunks.filter(h=>h.content.toLowerCase().includes(c.toLowerCase()));if(!p.length||p.reduce((h,g)=>h+g.tokenLength,0)>a&&p.length>1)continue;let u=p.flatMap(h=>h.ids),m=i.pruneUsingRelevantIds(new Set(u)).serialize();return s.debug({description:t,type:e,selectedChunks:p,tree:m},"Pruned a11y tree with keyword page filtering"),m}throw new Error("No keywords were unique enough for page filtering")}async function VP(n){let{description:e,generator:t,orgId:r,tree:o,logger:i,signal:s,chunkResult:a,softTokenLimit:l=ep}=n,c=await t.rankChunksWithRag({description:e,chunks:a.chunks,tokenLimit:l},{abortSignal:s,orgId:r,logger:i,loggerTags:Ge(i)});if(c.ids.length===0)throw new Error("RAG returned no important ids");{let p=o.pruneUsingRelevantIds(new Set(c.ids.map(d=>`${d}`))).serialize();return i.debug({browserState:p},"Pruned a11y tree with RAG"),p}}async function rp(n,e){if(!n.description)throw new R("ActionFailureError","Cannot locate element with empty description");return xn({action:async()=>qP(n,e),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:e.browser,logger:e.logger})}async function qP(n,e){let{disableCache:t,testContext:r,filterByViewport:o,skipWait:i,source:s}=n,{ctx:a,orgId:l,logger:c,browser:p,localCodeEvalTools:d,generator:u,abortSignal:m,flagStore:h}=e,g=n.description;r&&(g=await Dt({orgId:l,s:g,context:r,logger:e.logger,localTools:d,signal:e.abortSignal,flagStore:h})),s&&(g=KP(g,s));let{serializedTree:f,tree:S}=await sr(p,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),x,b=Date.now(),w;for(;!x&&Date.now()-b<3e3;){m.throwIfAborted();try{x=await p.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(L){w=L}}if(!x)throw new R("InternalWebAgentError",`Failed to take screenshot of page to locate element: ${w?.message}`);let E=f,C=!1;E=await Wr({type:"locator",description:g,serializedTree:f,flagStore:e.flagStore,tree:S,logger:c,generator:u,orgId:l}),E!==f&&(C=!0);let N=`data:image/jpeg;base64,${x.toString("base64")}`,P=await u.getElementLocation({browserState:E,goal:g,screenshot:N},{disableCache:t,orgId:l,abortSignal:m,loggerTags:Ge(c)});c.debug({usedRag:C,result:P},"Got locator result");let D=P.id>0;if(a?.details?.push({type:"AI_LOCATION",matched:D,pageState:E,ragUsed:C,thoughts:P.thoughts}),!D)throw new R("ActionFailureError",`Could not find any relevant element: ${P.thoughts}`);let{resolution:W,target:_,frameConfig:B}=await p.createTargetFromA11yId({id:P.id,description:g,targetSource:"AI",logger:c});if(W.a11yNode?.properties?.hidden&&W.a11yNode?.properties?.hidden!=="false")throw new R("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: ${W.displayString}`);return{thoughts:P.thoughts,target:_,resolution:W,frameConfig:B,screenshot:N}}var Fy="<select> element:",Dy="text input or contenteditable element:",Uy="Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:",np=[Fy,Dy,Uy];function By(n,e){if(n===e)return!0;for(let t of np){if(!n.startsWith(t))continue;let r=n.slice(t.length).trim();if(np.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===r)||r===e.trim())return!0}return!!np.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===n.trim())}function KP(n,e){if(!n||!e)return n;switch(e){case"SELECT_OPTION":return`${Fy} ${n}`;case"TYPE":return`${Dy} ${n}`;case"NEGATED_CHECK":return`${Uy}
3560
+ ${n}`;default:return n}}var YP=15;async function op({command:n,fixtures:e}){if(!n.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:r}=e,o=n.timeout?n.timeout*1e3:t.smartWaitingTimeout,i=JP(o),s=0,a=Date.now(),l,c,p;try{await xn({action:()=>t.clearHighlights(),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:t,logger:r})}catch(u){r.warn({err:u},"Failed to clear highlights before AI assertion, continuing...")}let d;for(;s<YP&&(!d||d-a<o);){e.abortSignal.throwIfAborted(),s!==0&&(r.info(`Waiting ${i}ms before retrying AI assertion`),await ne(i,e.abortSignal)),d=Date.now();try{let u=await xn({action:async()=>{let m=await zy(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,jy({command:n,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:s}))},frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t});if(!u)continue;l=u;break}catch(u){e.abortSignal.throwIfAborted(),p=u instanceof Error?u:new Error(`${u}`),r.info({err:u},`AI_WAIT assert attempt ${s} failed, retrying...`)}finally{s++}}if(!l)try{l=await xn({action:async()=>jy({command:n,state:await zy(t,r,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:s}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t})}catch(u){e.abortSignal.throwIfAborted(),p=u instanceof Error?u:new Error(`${u}`)}finally{s++}if(!l){let u=`AI assertion still failing after ${s} attempts.`;throw p&&(u+=` Latest result: ${p.message}`),new R("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function zy(n,e,t){let[r,o]=await Promise.all([sr(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function jy({command:n,state:e,fixtures:t,useConsensus:r,highlightElementsOnFailure:o,attemptNumber:i}){let{browser:s,logger:a,generator:l,orgId:c,abortSignal:p}=t,d={type:"ASSERTION"},{serializedTree:u,tree:m}=e,h=e.screenshotBuff,g=s.url(),f=u;f=await Wr({type:"assertion",serializedTree:u,description:n.assertion,flagStore:t.flagStore,tree:m,generator:l,orgId:c,logger:a,signal:p}),f!==u&&(d.ragUsed=!0),d.pageState=f;let S={goal:n.assertion,url:g,browserState:f,screenshot:h.toString("base64"),contextChoice:n.contextChoice},b=await(n.contextChoice==="VISION_ONLY"?(w,E)=>l.getVisualAssertionResult(w,E):(w,E)=>l.getAssertionResult(w,E))(S,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:a,orgId:c,abortSignal:p,loggerTags:Ge(a)});if((b.result||o)&&b.relevantElements&&(d.relevantElementsSerialized=b.relevantElements.map(w=>s.getSerializedFormFromA11yId(w)).filter(w=>!!w),await XP(b.relevantElements,s,a)),!b.result)throw new R("AssertionFailureError",b.thoughts);return{succeedImmediately:!1,thoughts:b.thoughts,urlAfterCommand:g,afterScreenshotOverride:h}}function JP(n){let e;return n>10*60*1e3?e=2*60*1e3:n>60*1e3?e=20*1e3:n>10*1e3?e=2*1e3:e=1e3,e}async function XP(n,e,t){let r=Date.now();for(let o of n){if(Date.now()-r>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await U(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var ZP=3e4;async function Hy({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??ZP/1e3,i=new AbortController,s=Object.fromEntries(Object.entries(n.headers||{}).filter(([d,u])=>d&&u)),a;if(Lo(n.url)&&(a=n.url),t&&Oo(n.url,t)&&(a=new URL(n.url,t).toString()),!a)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let c=await U((async()=>{try{return await r(a,{headers:s,method:"POST",body:JSON.stringify({query:n.query,variables:n.variables}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!c)throw new R("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d;try{d=await c.json()}catch{throw new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}throw d?.errors?.length&&d?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}let p={};return c.headers.forEach((d,u)=>{p[u]=d}),{status:c.status,headers:p,json:await c.json()}}var Do=class{flagStore;orgId;scratchPadId;slowMoMs;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;analytics;recordAbortController=null;registeredListeners={};constructor({browser:e,generator:t,logger:r,analytics:o,flagStore:i,storage:s,orgId:a,localCodeEvalTools:l,uploadedFileStorage:c,visualDiffScreenshotStorage:p,scratchPadId:d,slowMoMs:u}){this.orgId=a,this.scratchPadId=d,this.slowMoMs=u,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=s,this.uploadedFileStorage=c,this.visualDiffScreenshotStorage=p,this.localCodeEvalTools=l,this.generator=t,this.logger=r,this.analytics=o,this.flagStore=i}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}setLogger(e){this.logger=e}async evaluateAiAction({goal:e,startingScreenshot:t,history:r,disableCache:o,langfuseSessionId:i,lastError:s,logger:a=this.logger}){let[l,c]=await Promise.all([sr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),p=await Wr({type:"ai-action",description:e,serializedTree:l.serializedTree,tree:l.tree,logger:a,generator:this.generator,flagStore:this.flagStore,orgId:this.orgId,softTokenLimit:25e3,hardTokenLimit:5e4}),d=`data:image/jpeg;base64,${c.toString("base64")}`,u={url:this.browser.url(),browserState:p,startingScreenshot:t,history:r,goal:e,screenshot:d,lastError:s};return await this.generator.getMultiturnAiActionEvaluation(u,{disableCache:o,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:{...Ge(a)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:r,actionHint:o,disableCache:i,logger:s=this.logger,langfuseSessionId:a}){let l=this.browser.url(),[c,p]=await Promise.all([sr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${p.toString("base64")}`,u=await Wr({type:"ai-action",description:e,serializedTree:c.serializedTree,tree:c.tree,logger:s,generator:this.generator,flagStore:this.flagStore,orgId:this.orgId,softTokenLimit:25e3,hardTokenLimit:5e4}),m={url:l,browserState:u,startingScreenshot:t,history:r,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:{...Ge(s)},langfuseSessionId:a})}catch(h){throw new R("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return sr(this.browser,e)}async locateElement(e){return rp(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return xn({action:async()=>{let r=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:r}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,flagStore:this.flagStore,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:s,action:a,options:l,retriesWithAI:c=1}){let p=[];for(let d=0;d<i.length;d++){let u=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:u,cache:s[d],action:async h=>h,options:{...l,skipFetchTree:d!==0,targetName:o[d]}});p.push(m)}try{return{result:await a(...p.map(u=>u.result)),elementInteractedDisplayStrings:p.map(u=>u.elementInteractedDisplayString),newTargets:p.map(u=>u.newTarget)}}catch(d){if(this.throwIfClosed(),c>0)return this.logger.debug({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:a,options:l,retriesWithAI:c-1});throw new R("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),r;for(let o=0;o<2;o++)try{return await xn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(r=i,this.flagStore.isBooleanFlagEnabled("visual_actions")&&Jc(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&Bi(i)){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}throw i}throw r instanceof R?r:new R("ActionFailureError",r?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:r,options:o,command:i}){let s=this.logger.child({commandId:i.id}),{targetName:a="target"}=o;if(t.type!=="description")throw new R("ActionFailureError","Cannot use selector with non-description target");let l=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:a,logger:s});return{result:await r({locator:l.locator}),elementInteractedDisplayString:l.displayString,newTarget:{cache:{id:-1,selector:t.elementDescriptor,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()}}}}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:r,target:o,action:i,options:s,command:a}=e,{disableCache:l,useSelector:c,targetName:p="target",targetHealingInProgress:d,source:u}=s,m=this.logger.child({commandId:a.id}),h=s.retriesWithAI??1,g=!1,f=e.cache;if((!f||l)&&!oc(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(c)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(m.debug("Cache explicitly disabled for this step"),g=!0,f=void 0),f?.inputDescription&&!By(o.elementDescriptor,f.inputDescription)&&(m.warn({old:f.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),g=!0,f=void 0);let S=!!f&&Fu(f);if(!f){let x=new Date;m.debug({targetHealingInProgress:d},"Prompting AI for an updated element location"),g&&await ne(this.browser.smartWaitingTimeout,this.executeAbortController.signal),h--;let b=await rp({description:o.elementDescriptor,disableCache:l,iframeUrl:s.iframeUrl,source:u},this.getControllerFixtures(t));b.frameConfig&&this.browser.setActiveFrameConfig(b.frameConfig);let w=s.disableGlobalLocatorRedirect?{locator:b.resolution.locator}:await this.attemptLocatorRedirect(b.resolution.locator,m),E=await i(w),C;if(d){r.heal({healType:"AI"}),this.analytics.track({type:"execution:step_heal",heal_type:"AI",step_type:"PRESET_ACTION",command_type:a.type,duration_ms:Date.now()-x.getTime()}),b.target.targetSource="AI_HEALED",b.target.targetUpdateTime=new Date().toUTCString();let I=b.resolution.pageState;if(I)try{C=await this.getReverseMappedDescription({browserState:I,targetId:b.target.id,disableCache:!0,screenshot:b.screenshot})}catch(N){m.warn({err:N},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:E,elementInteractedDisplayString:b.resolution.displayString,newTarget:{cache:b.target,thoughts:b.thoughts,description:C}}}try{let x=new Date;if(this.flagStore.isBooleanFlagEnabled("visual_actions")&&await this.browser.waitForDOMStability({timeout:1e3}),f.frameCache&&this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")){let C=await this.browser.resolveAutoFrameCache(f.frameCache);this.browser.setActiveFrameConfig(C)}let b=await this.browser.resolveTarget(t,f,{targetName:p,logger:m}),w=s.disableGlobalLocatorRedirect?{locator:b.locator}:await this.attemptLocatorRedirect(b.locator,m),E=await i(w);if(S){let C=b.decisions.filter(I=>I.matched);if(C.length!==1)m.warn({decisions:b.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let I=C[0].type;r.heal({healType:I}),this.analytics.track({type:"execution:step_heal",heal_type:I,step_type:"PRESET_ACTION",command_type:a.type,duration_ms:Date.now()-x.getTime()})}m.debug({cache:f,method:C[0]},"Successfully used cached target to perform action")}else m.debug({cache:f},"Successfully generated and used new target data");return{result:E,elementInteractedDisplayString:b.displayString,newTarget:{cache:f}}}catch(x){this.throwIfClosed();let b=xh(x)&&!Jc(x)&&!Bi(x);if(x instanceof R&&!b)throw x;if(h>0&&o)return m.debug({err:x,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:r,command:a,target:o,cache:void 0,action:i,options:{...s,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",x.message,{errOptions:{cause:x}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return qi(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.slowMoMs&&await ne(this.slowMoMs);let s;try{s=await this.resolveCommandTemplateStrings(r,o)}catch(a){throw this.throwIfClosed(),new R("ActionFailureError",`Failed to substitute template strings in command: ${a.message}`,{errOptions:{cause:a}})}try{let a=(await this.browser.getOpenPages()).map(m=>m.url),l=this.browser.url(),c=await this.executePresetCommandHelper(e,t,r,o,i);this.flagStore.isBooleanFlagEnabled("visual_actions")&&zu(r)?await this.browser.waitForDOMStability():this.flagStore.isBooleanFlagEnabled("visual_actions")&&["PRESS","TYPE"].includes(r.type)&&await this.browser.waitForDOMStability({timeout:1e3});let p=!0;(r.type==="NAVIGATE"||r.type==="NEW_TAB"||r.type==="TAB"||r.type==="REFRESH"||r.type==="WAIT_FOR_URL")&&(p=!1);let d=(await this.browser.getOpenPages()).map(m=>m.url),u=this.browser.url();if(p&&d.length!==a.length)for(let m=d.length-1;m>=a.length;m--){let h=d[m];if(tr(h,this.logger)&&h!==l&&h!==u){this.logger.info({beforePages:a,afterPages:d,beforeUrl:l},"Auto-following new tab"),await this.browser.switchToPage({type:"INDEX",index:m});break}}return c}catch(a){throw a.name!=="AbortError"&&this.logger.error({err:a},"Error thrown in action controller"),a}finally{this.restoreCommandTemplateReplacements(r,s)}}restoreCommandTemplateReplacements(e,t={}){for(let[r,o]of Object.entries(t))Xd(e,r,o)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>_d(e)}}async resolveCommandTemplateStrings(e,t){return Po({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools,flagStore:this.flagStore})}async executePresetCommandHelper(e,t,r,o,i){switch(i=i||"disableCache"in r&&!!r.disableCache,r.type){case"SUCCESS":let s=r.condition;return s?.assertion.trim()?op({command:s,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_WAIT":case"AI_ASSERTION":{if(!r.assertion.trim())throw new R("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new R("AssertionFailureError",`AI assertion timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return op({command:{...r,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!r.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:r.goal,browserState:m,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)});if(g.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("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:g}}):g}}case"NAVIGATE":if(!Lo(r.url)&&!Oo(r.url,this.browser.baseUrl))throw new R("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await 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":if(!this.browser.canSolveCaptchas())break;let a=await this.browser.solveCaptcha();a&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:m=>this.browser.click(m,this.createCallbacksForBrowser(this.orgId),{}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}}),await this.browser.type(a,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,h=[];if(r.target&&Sn(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:S=>this.browser.hover(S),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});m=f,h.push(g)}switch(r.type){case"SCROLL_UP":await this.browser.scrollVertical(-(r.deltaY??0));break;case"SCROLL_DOWN":await this.browser.scrollVertical(r.deltaY);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(r.deltaX??0));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(r.deltaX);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:h}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new R("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=r.matcher;if(!m&&r.url&&(m={type:"GLOB",glob:r.url}),!m)throw new R("UserConfigurationError","No URL matcher provided for wait for URL command");await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":if(r.delay>1800)throw new R("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=r.delay*1e3;await ne(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"CLICK":{if(Sn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let x={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return Oa(m,x.urlAfterCommand)&&(x.succeedImmediately=!0,x.succeedImmediatelyReason="URL changed"),x}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(Sn(r.fromTarget)&&Sn(r.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(r.fromTarget.pixels,r.toTarget.pixels,{hoverSeconds:r.hoverSeconds});break}if(Sn(r.fromTarget)||Sn(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{newTargets:m,elementInteractedDisplayStrings:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:["from target","to target"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverSeconds:r.hoverSeconds,steps:r.steps}),options:{useSelector:!!r.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],newTargets:m}}case"MOUSE_DRAG":{let m=parseInt(r.deltaX),h=parseInt(r.deltaY),g=r.steps??5;if(isNaN(m)||isNaN(h))throw new R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&Sn(r.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,r.target.pixels,{force:r.force});break}let f,S,x=[];if(r.target?.elementDescriptor){let{newTarget:b,elementInteractedDisplayString:w,result:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:async C=>C.locator,options:{useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableCache:i}});f=E,S=w,x.push(b)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:x}}case"SELECT_OPTION":{if(!Vn(r.target))throw new Error("Select with x/y is not supported yet");let m=r.target.elementDescriptor,h=r.choice??{type:"VALUE",value:r.option},{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:m},cache:r.cache?.target,action:S=>this.browser.selectOption(S,h,r.force),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,source:Ri(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};if(r.url)await this.browser.switchToPage({type:"SUBSTRING",substring:r.url},m);else if(r.action)await this.browser.switchToPage(r.action,m);else throw new R("UserConfigurationError","No method definition was specified for the tab switch command");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 c=await this.browser.setCookie(r.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let m;try{r.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:o.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Fn({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:o,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.scratchPadId){this.logger.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.scratchPadId,orgId:this.orgId,updates:h,logger:this.logger})}}})}catch(h){throw this.throwIfClosed(),new R("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new R("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(r.target&&Sn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);break}let m=this.browser.url(),h,g=[],f=eL(r.target);if(f){let{elementInteractedDisplayString:x,newTarget:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:f,cache:r.cache?.target,action:w=>this.browser.typeIntoTarget(r.value,w,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableGlobalLocatorRedirect:!0,source:Ri(r)}});g.push(b),h=x}else await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);let S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,newTargets:g};return Oa(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"HOVER":{if(Sn(r.target)){await this.browser.hoverUsingVisualCoordinates(r.target.pixels);break}let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.hover(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"FOCUS":{if(!Vn(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,newTarget:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.focus(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:[h]}}case"BLUR":{if(r.target&&!Vn(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{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:g=>this.browser.blur(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"PRESS":let p=this.browser.url();await this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Oa(p,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"REQUEST":{let m=new tL,h=QP(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await ka({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:ha(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await Hy({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Bf({ctx:e,tracer:t,command:r,disableCache:i,browser:this.browser,logger:this.logger,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(r.fileSource.type==="URL"?(h=r.fileSource.url,m=await kS({uri:r.fileSource.url,logger:this.logger,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(h=r.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!m)throw new R("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!r.storageState.trim())m=void 0;else if(m=await Fn({orgId:this.orgId,code:r.storageState,fragment:!1,context:o,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=ma.optional().parse(m)}catch(g){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(r.timeout??bn)*1e3,h=await Df({command:r,tracer:t,timeoutMs:m,targetingWrapper:g=>this.wrapElementTargetingCommand(g),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,newTargets:h.newTarget?[h.newTarget]:[],thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await xn({action:async()=>Na({assertion:r.assertion,browser:this.browser,logger:this.logger,timeout:r.timeout,signal:this.executeAbortController.signal,flagStore:this.flagStore}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:this.logger});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let h=this.browser.registerRequestListener(r.pattern).then(async g=>{let f={status:g?.status(),headers:g.headers()};return(await g.headerValue("content-type"))?.includes("json")?f.json=await g.json():(await g.headerValue("content-type"))?.includes("text")&&(f.text=await g.text()),f});return this.registeredListeners[r.key]=h,{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[r.key];if(!m)throw new R("ActionFailureError",`No listener registered with key: ${r.key}`);return{data:await U(m,{milliseconds:(r.timeout??10)*1e3,message:`Request listener timed out after ${r.timeout} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:r,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:r,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:r}){this.recordAbortController=t;let o=new Ya({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,orgId:this.orgId,abortSignal:this.executeAbortController.signal,loggerTags:Ge(this.logger)})}};var nL=4;async function $y({socket:n,logger:e,analytics:t,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,devicePixelRatio:a,generatorFactory:l,enricherFactory:c,browserbase:p,authorization:d,flagStoreFactory:u}){let m=n.id,h=n.handshake.query.testId;if(!h)throw new Error("Socket connection request is missing testId");let g=await r.getOrgId({type:"e2e",testId:h});e=e.child({testId:h,orgId:g,sessionId:m});let f=await l(g,e),S=await c(g,e),x=await u(g),{testMetadata:b,baseUrl:w,envName:E,localBrowserConfigFromEnv:C,environmentVariables:I,localCodeEvalTools:N}=await Gr({testId:h,orgId:g,logger:e,storage:r,authorization:d,flagStore:x}),P=X.getSession(m);if(P)return e.info("Associating connection with existing session (likely reconnect)"),await P.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let D=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:D,event:"connect",args:n.handshake.query},"Websocket event (connect)"),D&&X.getCurrentConnectionsByIp(D)>=nL)throw e.error({clientIp:D,sessions:X.getCurrentSessionsByIp(),...n.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");X.reserveCapacityByIp(D);try{await rL({socket:n,baseUrl:w,envName:E,testMetadata:b,orgId:g,sessionId:m,logger:e,analytics:t,environmentVariables:I,clientIp:D,devicePixelRatio:a,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,localCodeEvalTools:N,generator:f,enricher:S,browserbase:p,localBrowserConfigFromEnv:C,flagStore:x})}catch(W){throw e.warn({err:W},"Error setting up socket session, possibly due to client closing the connection"),X.releaseCapacityByIp(D),W}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function rL({socket:n,baseUrl:e,envName:t,devicePixelRatio:r,testMetadata:o,orgId:i,sessionId:s,logger:a,analytics:l,storage:c,uploadedFileStorage:p,visualDiffScreenshotStorage:d,serviceMocker:u,localCodeEvalTools:m,generator:h,environmentVariables:g,localBrowserConfigFromEnv:f,clientIp:S,enricher:x,flagStore:b}){let w={};w.viewport=o.advanced?.viewport,r&&(w.deviceScaleFactor=r);let E=o.id,C=await u?.initializeServicesForTest(i,E),I=await za({advanced:{...f,...o.advanced},orgId:i,baseUrl:e,envName:t,localTools:m,envVariables:g,logger:a,customHeaders:void 0,flagStore:b});a=a.child({orgId:i,sessionId:s,testId:E});let N=!1,P=b.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,a):null,D=await dn.init({baseUrl:e,userBrowserSettings:I,enricher:x,storage:c,flagStore:b,mockedServices:C,logger:a,contextArgs:w,iconKnowledgeBase:P,onTabsChange:(j,O)=>{n.emit("tabs",{tabs:j,activeTab:O})},callbacks:{onScreencastFrame:(j,O)=>{let ee=n;N&&(ee=n.compress(!0)),ee.emit("screenshot",{buffer:j},()=>{O()})},onSvgsCollected:j=>{n.emit("newIconDetected",{numIcons:j.newSvgs.length}),c.saveNewIcons(i,j,a)}}});await D.navigate({url:e,initialNavigation:!0});let W=new Do({browser:D,generator:h,logger:a,analytics:l,flagStore:b,orgId:i,scratchPadId:void 0,storage:c,localCodeEvalTools:m,uploadedFileStorage:p,visualDiffScreenshotStorage:d,slowMoMs:I.slowMoMs}),_=gf(n,s,a),B=async()=>{_.timers.forEach(j=>clearInterval(j))},L=new It({baseUrl:e,currentUrl:W.browser.url(),variablesFromEnvironment:g,envName:t});if(!n.connected)throw await D.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");n.emit("session",{url:e,userAgent:dn.USER_AGENT,viewport:W.browser.getViewport(),sessionId:s}),X.registerSession({controller:W,context:L,sessionId:s,cleanup:B,clientIp:S})}async function Gr({testId:n,orgId:e,logger:t,storage:r,authorization:o,flagStore:i}){let s=await r.fetchTestMetadata(n,e,t);if(!s)throw new Error(`Test metadata could not found for test ${n}`);let a;o?.type==="API_KEY"&&(a=new Qn({httpClient:new _t({...o,logger:t}),fakerSeed:void 0}));let l=s.envs?.find(m=>m.default),c;l&&(c=await r.fetchEnvironment(e,l.name,t));let p=c&&"browser"in c?c.browser:void 0,d=s.baseUrl||c?.variables?.[Ae];if(!d)throw new Error("Base URL is empty in both test options and the configured environment");let u={...c?.variables};return await Promise.all((s.parameters??[]).map(async m=>{let h=await Dt({orgId:e,s:m.defaultValue,context:It.dummyContext(c?.name,u),logger:t,flagStore:i,localTools:a});u[m.name]=h})),{localCodeEvalTools:a,baseUrl:d,envName:c?.name,localBrowserConfigFromEnv:p,environmentVariables:u,testMetadata:s}}import{diff as oL}from"deep-object-diff";var ip=class{parentTracer=null;socket;step;constructor({step:e,socket:t,parentTracer:r}){this.socket=t,this.parentTracer=r,this.step=e}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new nl({parentStep:this.step,socket:this.socket,parentTracer:this})}},nl=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:r}){this.parentTracer=r,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain()}),new ip({step:e.step,parentTracer:this,socket:this.socket})}},rl=class{constructor(e,t,r,o,i){this.socket=e;this.storage=t;this.orgId=r;this.testId=o;this.stepsBeforeRun=i}trackStatus(){}attachConsoleLogs(){}attachNetworkLogs(){}async finish(e){this.socket.emit("finished");let{logger:t,result:r,updatedSteps:o}=e;if(r?.status==="PASSED"&&o){let i=o.steps,s=oL(this.stepsBeforeRun,i);if(Object.keys(s).length>0){t.debug({changes:s},"Updating steps post-run success");let{cachesToSave:a}=await mt({stepLists:{steps:i},cacheCreationParams:{testId:this.testId,orgId:this.orgId}});try{await this.storage.saveStepCacheEntries(a,this.testId,t)}catch(l){t.warn({err:l},"Failed to save step cache entries after execution success")}}else t.debug("No changes detected in steps post-run success")}}async startStepList(){return new nl({parentStep:null,parentTracer:null,socket:this.socket})}};var sp={currentlyExecutingRequests:{}},sL=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),s,a=await Gr({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i}),l=`${r}|${a.baseUrl}`;try{let c=sp.currentlyExecutingRequests[l]??0;sp.currentlyExecutingRequests[l]=c+1,s=await aL({...n,...e,...a,done:t})}finally{n.logger.info({result:s,sessionId:n.metadata.sessionId},"Test execution complete"),sp.currentlyExecutingRequests[l]--}},aL=async({socket:n,steps:e,baseUrl:t,testMetadata:r,reInitialize:o,toStep:i,fromStep:s,storage:a,metadata:l,logger:c,analytics:p,envName:d,environmentVariables:u,localCodeEvalTools:m,done:h})=>{let{testId:g,sessionId:f,orgId:S}=l,x=f,b=X.getSession(f);if(!b)throw new Error("No active session found");let{controller:w,context:E}=b;w.setOpen(),c=c.child({testId:g,orgId:S,baseUrl:t,sessionId:f,runId:x}),c.info({steps:e.map(O=>`${O.type}${"command"in O?` - ${O.command.type}`:""}`),toStep:i,fromStep:s,reInitialize:o,envName:d,baseUrl:t,context:E,flags:w.flagStore.getAllFlags()},"Socket execution parameters");let C=u??{},I=async()=>{o&&(await w.browser.reset({newUrl:t}),E.reset({baseUrl:t,currentUrl:w.browser.url(),variablesFromEnvironment:C,envName:d}))},N=async()=>{try{await a.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:S,testId:g,steps:e,logger:c})}catch(O){c.error({err:O},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await Gi({promiseGenerator:async()=>Promise.all([I(),N()]),signal:w.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),w.setOpen()}catch(O){if(n.emit("finished"),O.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${O}`)}let P=iL(e),D={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},W={orgId:S,runId:x,testMetadata:r,steps:e,fromStep:s,toStep:i},_={controller:w,context:E,storage:a,debugDataStorage:new Lr,codeEvalTools:m,billingReporter:new wo,logger:c,analytics:p},B={test:{},step:{onDynamicAIActionStatusUpdateEvent:O=>{n.emit("dynamicCommandStatusUpdate",O)},onDynamicAIActionEvaluatingEvent:O=>{n.emit("dynamicCommandEvaluating",O)},onDynamicCommandGenerated:O=>{n.emit("dynamicCommandGenerated",O)},onDynamicCommandExecuted:O=>{n.emit("dynamicCommandExecuted",O)}}},L=new rl(n,a,S,g,P),j=await Ba({fixtures:_,options:D,callbacks:B,inputs:W,testParams:{tracer:L}});return await L.finish({logger:c,result:j}),h?.(j),j.status};var Wy={event:"execute",createHandler:sL};import{cloneDeep as lL}from"lodash-es";var cL=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,s=lL(e),a=Fg(s);if(a.category!=="NO_DESCRIPTION_PROVIDED"){if(a.category!=="NONE"){t?.({result:a});return}"cache"in s&&(s.cache=void 0,s.id=void 0);try{let c=await(await o(i.orgId,r)).getLintStepResult({command:s},{logger:r,orgId:i.orgId});t?.({result:c})}catch(l){r.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},Gy={event:"lintStep",createHandler:cL};var dL=({metadata:n,logger:e,storage:t})=>{let{sessionId:r}=n;return async(o,i)=>{let{description:s,command:a,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${s}`);let p=X.getSession(r);if(!p)throw new Error("No active session found");let{controller:d,context:u}=p;d.setOpen();let m=fo.parse(l.advanced??{}),h={},g;if(s){if("useSelector"in a&&a.useSelector)try{let f=await d.locateElementWithSelector(s,"iframeUrl"in a?a.iframeUrl:void 0);g=f.resolution.locator,h={target:f.target,thoughts:f.thoughts}}catch(f){e.warn({err:f},"Failed resolving target with selector"),i({err:`Failed locating element: ${f.message}`,decisions:f instanceof Yn?f.decisions:void 0});return}else try{let f=await d.locateElement({description:s,disableCache:m.disableAICaching,iframeUrl:"iframeUrl"in a?a.iframeUrl:void 0,skipWait:!0,testContext:u,source:Ri(a)});h={target:f.target,thoughts:f.thoughts},g=f.resolution.locator}catch(f){(async()=>{try{let S=await d.browser.getCondensedHtml({skipWait:!0});e.warn({err:f,html:S.slice(0,1e5)},"Failed locating element with AI")}catch(S){e.warn({err:S},"Failed grabbing HTML after trying to locate element with AI")}})(),i({err:`Failed locating element with AI: ${f.message}`});return}if(a.type==="SELECT_OPTION"&&g)try{h.options=await d.browser.getSelectOptions(g)}catch(f){e.warn({err:f},"Failed getting select options"),i({err:`Failed getting select options: ${f.message}`});return}e.info({result:h},"Locate handler result")}if(c)try{let{buffer:f,width:S,height:x}=await d.screenshotWithDimensions({clearHighlights:!0,locator:g,hideCaret:!0}),b=await t.uploadScreenshot(f);h.screenshot={data:b,width:S,height:x},e.info({width:S,height:x},"Captured screenshot during locate")}catch(f){e.error({err:f},"Error capturing screenshot during locate"),i({err:`Error taking screenshot: ${f.message}`});return}if(i({result:h}),g)try{await Promise.all([d.browser.scrollIntoView(g),d.browser.highlight(g)])}catch(f){e.warn({err:f},"Error highlighting element, continuing...")}}},Vy={event:"locate",createHandler:dL};var pL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({event:r,percentX:o,percentY:i})=>{let s=X.getSession(t);if(!s)throw new Error("No active session found");let a=s.controller.browser;if(a.closed||a.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await a.clickMouseFromPositionPercentages(r,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},qy={event:"cloudMouseEvent",createHandler:pL};var uL=({metadata:n,generatorFactory:e,logger:t,socket:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a,parentStepIdChain:l,attribute:c})=>{let p=X.getSession(o);if(!p)throw new Error("No active session found");let{controller:d}=p,u=await e(i,t);d.setOpen(),p.browserBehavior.showOverlay=!0;let m=new AbortController;m.signal.addEventListener("abort",async()=>{try{p.browserBehavior.showOverlay=!1,await d.stopRecordMode()}catch(f){t.warn({err:f},"Failed to stop record mode in target click socket handler")}});let h=!1,g=(f,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(r.emit("targetRecordingUpdate",{type:f,stepId:a,parentStepIdChain:l,command:S.command,attribute:c}),m.abort(),h=!0)};setTimeout(()=>{h||(m.abort(),r.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:a,parentStepIdChain:l,attribute:c}))},1e4),await d.startRecordMode({params:{generator:u,logger:t,testId:s,orgId:i,callbacks:{onActionReceived:f=>g("clickReceived",f),onStepRecorded:f=>g("descriptionGenerated",f)}},abortController:m,isClickToRecord:!0}),r.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:a,parentStepIdChain:l,attribute:c})}},Ky={event:"recordTargetClick",createHandler:uL};var mL=({metadata:n,logger:e})=>{let{sessionId:t}=n,r,o=0,i=(a,l)=>{let c=async()=>{r=void 0};clearTimeout(r),r=setTimeout(c,Math.min(1e3,250*(o+1)))},s=0;return async a=>{let l=X.getSession(t);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:p}=l,d=c.browser;if(d.closed||d.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}p.showOverlay&&i(d,a);try{await d.moveMouseFromPositionPercentages(a.percentX,a.percentY),s=0}catch(u){s++,s%5===0&&e.warn({err:u,mouseErrors:s},"Error in socket mouse move handler")}}},Yy={event:"cloudMouseMove",createHandler:mL};var hL=({metadata:n})=>{let{sessionId:e}=n;return async({percentDeltaX:t,percentDeltaY:r})=>{let o=X.getSession(e);if(!o)throw new Error("No active session found");let i=o.controller.browser;if(i.closed)return;let s=await i.scrollFromPositionPercentages(t,r);if(!s)return;let a=o.browserBehavior.recordingState?.transformer;a&&a.recordScroll(s)}},Jy={event:"cloudScroll",createHandler:hL};var gL=({metadata:n,generatorFactory:e,socket:t,logger:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a})=>{let l=X.getSession(o);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:p}=l,d=await e(i,r);r.info("Starting cloud recording");let u=new AbortController,m=await c.startRecordMode({params:{generator:d,logger:r,testId:s,orgId:i,callbacks:{onActionReceived:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})},onStepRecorded:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})}}},abortController:u,isClickToRecord:!1});p.recordingState={transformer:m}}},Xy={event:"cloudStartRecording",createHandler:gL};var fL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{let r=X.getSession(t);if(!r)throw new Error("No active session found");e.info("Stopping cloud recording"),await r.controller.stopRecordMode(),r.browserBehavior.recordingState=void 0,r.browserBehavior.showOverlay=!1}},Zy={event:"cloudStopRecording",createHandler:fL};var SL=["Dead","Meta","AudioVolumeUp","AudioVolumeDown"],yL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=X.getSession(t);if(!o)throw new Error("No active session found");if(SL.includes(r))return;let{controller:i}=o;if(i.browser.closed||i.browser.getActivePage().isClosed()){e.debug({sessionId:t},"Browser is closed, ignoring typing action");return}try{i.setOpen(),r.length>1?await i.browser.press(r,{}):await i.browser.type(r,{clearContent:!1,pressKeysSequentially:!0})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:t,err:s},"Browser is closed, ignoring typing action error");return}throw s}}},Qy={event:"cloudType",createHandler:yL};var bL=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i})=>async(s,a)=>{let{testId:l,sessionId:c,orgId:p}=e;t.info({testId:l,sessionId:c},"Refresh event received");let d=await i(p),{baseUrl:u}=await Gr({testId:l,orgId:p,logger:t,storage:r,authorization:o,flagStore:d}),m=X.getSession(c);if(!m){n.emit("error",{message:"No session to refresh"});return}let{controller:h}=m;h.setOpen(),await h.browser.refresh();let g=h.browser.getViewport();t.info({baseUrl:u,viewport:g},`Session refreshed for test ${l} at ${u}`),a()},eb={event:"refresh",createHandler:bL};var wL=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i})=>async()=>{let{testId:s,sessionId:a,orgId:l}=e;t.info({testId:s,sessionId:a},"Reset event received");let c=await i(l),{baseUrl:p,envName:d,environmentVariables:u}=await Gr({testId:s,orgId:l,logger:t,storage:r,authorization:o,flagStore:c}),m=X.getSession(a);if(!m){n.emit("error",{message:"No session to reset"});return}let{controller:h,context:g}=m;await h.browser.reset({newUrl:p});let f=h.browser.baseUrl;g.reset({baseUrl:f,currentUrl:h.browser.url(),variablesFromEnvironment:u,envName:d});let S=h.browser.getViewport(),x=dn.USER_AGENT;t.info({baseUrl:p,viewport:S},`Session reset for test ${s} at ${f}`),n.emit("session",{url:f,userAgent:x,viewport:S,sessionId:a})},tb={event:"reset",createHandler:wL};var vL=({metadata:n})=>{let{sessionId:e}=n;return async({url:t})=>{let r=X.getSession(e);if(!r)throw new Error("No active session found");await r.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},nb={event:"switchTab",createHandler:vL};async function rb(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?If(n):$y(n)}var ob=[Nf,Wy,Vy,tb,eb,Lf,nb,Gy,Ky,Xy,Zy,Yy,qy,Qy,Jy,Pf,ff,kf,Of];var ib=n=>{let{logger:e}=n,t=new xL(n.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async r=>{let o;try{e.info({event:"connection",transport:r.conn.transport.name},"Websocket connection established"),o=await rb({...n,socket:r,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),r.emit("error",{message:i instanceof Error?i.message:`${i}`}),r.disconnect(!0);return}ob.forEach(i=>TL(i,{socket:r,metadata:o,...n,logger:e}))}),t},TL=(n,e)=>{let t=n.createHandler(e),r=(...o)=>{["cloudMouseMove","cloudScroll","cloudType","cloudMouseEvent"].includes(n.event)||e.logger.debug({...e.metadata,event:n.event,args:o},`Websocket event (${n.event})`);let i=s=>{e.logger.error({event:n.event,type:"websocket",args:o,err:s instanceof Error?s:new Error(`${s}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:s instanceof Error?s.message:`${s}`})};try{let s=t.apply(void 0,o);s&&typeof s.catch=="function"&&s.catch(i)}catch(s){i(s)}};e.socket.on(n.event,r)};import{Router as Ak}from"express";import{diff as AL}from"deep-object-diff";import Mt from"fs";import Ut from"path";import Vr from"yaml";import{execSync as EL}from"child_process";function Uo(n,e){let t=e.hooks?.postSave;if(!t)return;let r;t.includes("$1")?r=t.replaceAll("$1",n):r=`${t} ${n}`,y.debug({postSaveCommand:r},"Executing post-save hook command");try{EL(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as sb}from"deep-object-diff";import ar from"fs";import{cloneDeep as CL}from"lodash-es";import ap from"path";import{v4 as RL}from"uuid";import Qi from"yaml";function lp({content:n,schemaVersion:e,momenticFiles:t,project:r}){let o=t.modules[n.moduleId]?.fullFilePath;if(!o||!ar.existsSync(o))throw new Error(`Tried to update module ${n.moduleId} that could not be found on disk`);let i=ar.readFileSync(o,"utf-8"),s=Qi.parse(i),a;if(n.name&&n.name!==s.name){let u=`${Pe(n.name)}.${Nt.MODULE}`;if(a=ap.join(ap.dirname(o),u),ar.existsSync(a))throw new Error(`Test with name '${n.name}' already exists at path '${a}'`)}let l={...n,schemaVersion:e},c=Mn({fileType:he.MODULE,...Qc.parse(l),steps:n.steps}),p=sb(c,s);if(p&&Object.keys(p).length===0){y.debug(`Skipping save for module ${n.moduleId} since there are no changes`);return}let d=Qi.stringify(c);ar.writeFileSync(o,d,"utf-8"),a&&ar.renameSync(o,a),Uo(a||o,r.config)}function ab({moduleId:n,content:e,momenticFiles:t,project:r,logger:o}){let i=t.modules[n]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${n} that could not be found on disk`);let s=es(i,o),a={...s,...e},l=Mn({fileType:he.MODULE,...Qc.parse(a),steps:s.steps}),c=sb(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let p=Qi.stringify(l);ar.writeFileSync(i,p,"utf-8"),Uo(i,r.config)}async function lb({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let s=Pe(n),a=ap.join(o,`${s}.module.yaml`),l=RL(),{stepsToSave:c}=await mt({stepLists:{steps:r}}),p={fileType:he.MODULE,schemaVersion:He,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},d=Qi.stringify(p);return ar.writeFileSync(a,d,"utf-8"),Uo(a,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function es(n,e){let t=ar.readFileSync(n,"utf-8"),r=Qi.parse(t);try{return nd.parse(r)}catch(o){throw e.error({err:o,moduleFilePath:n,moduleContents:t},`${n} does not parse as a valid Momentic module`),o}}async function cp(n,e,t,r){let o=es(n.fullFilePath,t),{resolvedSteps:i}=await Aa({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:r,logger:t,callbacks:{onFetchModule:async({id:a})=>{let l=e.modules[a]?.fullFilePath;if(l)return es(l,t)}}}),s={...o,steps:i};return r&&(r[n.id]=CL(s)),s}async function ol(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await cp(r,n,e,t)})),Array.from(Object.values(t))}async function cb({test:n,name:e,folder:t}){let r=await mf(n);if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Pe(e)}.${Nt.TEST}`,s=Ut.join(t,i);return Mt.writeFileSync(s,r.test,"utf-8"),s}function dp(n,e,t){let r=Ut.join(t.rootDir,n);if(!Mt.existsSync(r))throw new Error(`Test not found at path '${n}' in project '${t.rootDir}'`);let o=Mt.readFileSync(r,"utf-8"),i=Vr.parse(o),s,a;if(e.name&&e.name!==i.name){let u=`${Pe(e.name)}.${Nt.TEST}`;if(s=Ut.join(Ut.dirname(n),u),a=Ut.join(t.rootDir,s),Mt.existsSync(a))throw new Error(`Test with name '${e.name}' already exists at path '${a}'`)}let l={...i,...e},c=Kt.parse(l),p={fileType:he.TEST,...Kt.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=Vr.stringify(p);return Mt.writeFileSync(r,d,"utf-8"),a&&Mt.renameSync(r,a),{newRelativeTestPath:s}}function qr(n,e,t,r){let o=Ut.join(r.rootDir,n);if(!Mt.existsSync(o))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let i=Mt.readFileSync(o,"utf-8"),s=Vr.parse(i),a=Kt.parse({...s,schemaVersion:t}),l=Mn({fileType:he.TEST,...a,beforeSteps:e.beforeSteps??void 0,steps:e.steps,afterSteps:e.afterSteps??void 0}),c=AL(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for test ${a.name} since there are no changes`);return}let p=Vr.stringify(l);Mt.writeFileSync(o,p,"utf-8"),Uo(o,r.config)}function pp(n,e,t=n){let r=n.split(Ut.sep).pop()??"";if(Hi.includes(r))return e.warn(`Skipping directory '${n}' because it is likely an artifact folder.`),[];let o=Mt.readdirSync(n),i=[];return o.forEach(s=>{let a=Ut.join(n,s),l;try{l=Mt.statSync(a)}catch(c){e.warn({err:c},`Skipping path '${a}' because it could not be read.`);return}if(l.isDirectory())i=i.concat(pp(a,e,t));else if(s.endsWith(".yaml")){let c=Mt.readFileSync(a,"utf-8"),p=Ut.relative(Ut.resolve(t),Ut.resolve(a));try{let d=Vr.parse(c),u=kt.parse(d);i.push({id:u.id,name:u.name,fullPathSegments:a.split(Ut.sep),testPath:p,fileName:s,lastModified:l.mtime,createdAt:l.ctime})}catch{e.warn(`Skipping file '${a}' because it does not parse as a valid Momentic test.`)}}}),i}function il(n,e){let t=Ut.join(e.rootDir,n);if(!t)throw new Error(`Could not find test with path ${n} in Momentic project (${e.rootDir})`);let r;try{r=Mt.readFileSync(t,"utf8"),r=r.replace(/\r\n|\r/g,`
3561
+ `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Vr.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return kt.parse(o)}function ts(n,e,t){let r=t.project.rootDir,o;try{o=Mt.readFileSync(n,"utf-8")}catch(s){throw e.error({err:s,projectRoot:r},s.message),new Error(s.message)}let i=Vr.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function ns(n,e,t){let r=ts(n,e,t),o;try{o=Kt.parse(r)}catch(s){throw new Error(`Test ${n} is missing metadata or has invalid metadata: ${s}`)}let{resolvedTest:i}=await df({rawSteps:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:s,logger:a})=>{let l=t.modules[s]?.fullFilePath;if(l)return es(l,a)}}});return i}import IL from"@dotenvx/dotenvx";import PL from"fs";import db from"path";function ub(n,e){return(n.config.environments??[]).map(t=>rs(t.name,n,e))}function pb(n){return n.includes("${")?n.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[r,o]=t.split(/:-|-/,2),i=process.env[r];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):n}function rs(n,e,t){let r=(e.config.environments??[]).find(s=>s.name===n);if(!r)throw new Error(`Environment ${n} not found in local project configuration file`);let o={[Ae]:pb(r.baseUrl)};if(r.envVariables){let s={};for(let[a,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=pb(l);c&&(s[a]=c)}else{let c=l.fromFile,p;try{p=PL.readFileSync(db.resolve(e.rootDir,c),"utf-8")}catch(d){throw new Error(`Failed to read environment variable '${a}' from file '${c}': ${d}`)}if(l.json)try{s[a]=JSON.parse(p)}catch(d){throw new Error(`Failed to parse environment variable '${a}' from file '${c}' as JSON: ${d}`)}else s[a]=p}Object.keys(s).length>0&&y.debug(s,"Set environment variables with interpolation from project configuration"),Object.assign(o,s)}if(r.envFile){let s={},a=IL.config({path:db.resolve(e.rootDir,r.envFile),processEnv:s,logLevel:"error",quiet:!0});if(a.error)throw new Error(`Failed to load .env file: ${a.error.message}`);t.debug(s,"Set environment variables from .env file"),Object.assign(o,s)}return r.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:n,variables:o,browser:r.browser}}import{existsSync as sk,readFileSync as ak,readdirSync as lk,writeFileSync as ck}from"fs";var Nb=Pu(Cb(),1);var is=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var DL={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},ss=n=>n.replace(/[[\]\\-]/g,"\\$&"),UL=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Rb=n=>n.join(""),Ab=(n,e)=>{let t=e;if(n.charAt(t)!=="[")throw new Error("not in a brace expression");let r=[],o=[],i=t+1,s=!1,a=!1,l=!1,c=!1,p=t,d="";e:for(;i<n.length;){let g=n.charAt(i);if((g==="!"||g==="^")&&i===t+1){c=!0,i++;continue}if(g==="]"&&s&&!l){p=i+1;break}if(s=!0,g==="\\"&&!l){l=!0,i++;continue}if(g==="["&&!l){for(let[f,[S,x,b]]of Object.entries(DL))if(n.startsWith(f,i)){if(d)return["$.",!1,n.length-t,!0];i+=f.length,b?o.push(S):r.push(S),a=a||x;continue e}}if(l=!1,d){g>d?r.push(ss(d)+"-"+ss(g)):g===d&&r.push(ss(g)),d="",i++;continue}if(n.startsWith("-]",i+1)){r.push(ss(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){d=g,i+=2;continue}r.push(ss(g)),i++}if(p<i)return["",!1,0,!1];if(!r.length&&!o.length)return["$.",!1,n.length-t,!0];if(o.length===0&&r.length===1&&/^\\?.$/.test(r[0])&&!c){let g=r[0].length===2?r[0].slice(-1):r[0];return[UL(g),!1,p-t,!1]}let u="["+(c?"^":"")+Rb(r)+"]",m="["+(c?"":"^")+Rb(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,a,p-t,!0]};var pn=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var BL=new Set(["!","?","+","*","@"]),Ib=n=>BL.has(n),zL="(?!(?:^|/)\\.\\.?(?:$|/))",sl="(?!\\.)",jL=new Set(["[","."]),HL=new Set(["..","."]),$L=new Set("().*{}+?[]^$\\!"),WL=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),hp="[^/]",Pb=hp+"*?",Lb=hp+"+?",Bo=class n{type;#e;#t;#i=!1;#r=[];#s;#w;#c;#p=!1;#a;#l;#o=!1;constructor(e,t,r={}){this.type=e,e&&(this.#t=!0),this.#s=t,this.#e=this.#s?this.#s.#e:this,this.#a=this.#e===this?r:this.#e.#a,this.#c=this.#e===this?[]:this.#e.#c,e==="!"&&!this.#e.#p&&this.#c.push(this),this.#w=this.#s?this.#s.#r.length:0}get hasMagic(){if(this.#t!==void 0)return this.#t;for(let e of this.#r)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#t=!0;return this.#t}toString(){return this.#l!==void 0?this.#l:this.type?this.#l=this.type+"("+this.#r.map(e=>String(e)).join("|")+")":this.#l=this.#r.map(e=>String(e)).join("")}#f(){if(this!==this.#e)throw new Error("should only call on root");if(this.#p)return this;this.toString(),this.#p=!0;let e;for(;e=this.#c.pop();){if(e.type!=="!")continue;let t=e,r=t.#s;for(;r;){for(let o=t.#w+1;!r.type&&o<r.#r.length;o++)for(let i of e.#r){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(r.#r[o])}t=r,r=t.#s}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof n&&t.#s===this))throw new Error("invalid part: "+t);this.#r.push(t)}}toJSON(){let e=this.type===null?this.#r.slice().map(t=>typeof t=="string"?t:t.toJSON()):[this.type,...this.#r.map(t=>t.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#p&&this.#s?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#s?.isStart())return!1;if(this.#w===0)return!0;let e=this.#s;for(let t=0;t<this.#w;t++){let r=e.#r[t];if(!(r instanceof n&&r.type==="!"))return!1}return!0}isEnd(){if(this.#e===this||this.#s?.type==="!")return!0;if(!this.#s?.isEnd())return!1;if(!this.type)return this.#s?.isEnd();let e=this.#s?this.#s.#r.length:0;return this.#w===e-1}copyIn(e){typeof e=="string"?this.push(e):this.push(e.clone(this))}clone(e){let t=new n(this.type,e);for(let r of this.#r)t.copyIn(r);return t}static#S(e,t,r,o){let i=!1,s=!1,a=-1,l=!1;if(t.type===null){let m=r,h="";for(;m<e.length;){let g=e.charAt(m++);if(i||g==="\\"){i=!i,h+=g;continue}if(s){m===a+1?(g==="^"||g==="!")&&(l=!0):g==="]"&&!(m===a+2&&l)&&(s=!1),h+=g;continue}else if(g==="["){s=!0,a=m,l=!1,h+=g;continue}if(!o.noext&&Ib(g)&&e.charAt(m)==="("){t.push(h),h="";let f=new n(g,t);m=n.#S(e,f,m,o),t.push(f);continue}h+=g}return t.push(h),m}let c=r+1,p=new n(null,t),d=[],u="";for(;c<e.length;){let m=e.charAt(c++);if(i||m==="\\"){i=!i,u+=m;continue}if(s){c===a+1?(m==="^"||m==="!")&&(l=!0):m==="]"&&!(c===a+2&&l)&&(s=!1),u+=m;continue}else if(m==="["){s=!0,a=c,l=!1,u+=m;continue}if(Ib(m)&&e.charAt(c)==="("){p.push(u),u="";let h=new n(m,p);p.push(h),c=n.#S(e,h,c,o);continue}if(m==="|"){p.push(u),u="",d.push(p),p=new n(null,t);continue}if(m===")")return u===""&&t.#r.length===0&&(t.#o=!0),p.push(u),u="",t.push(...d,p),c;u+=m}return t.type=null,t.#t=void 0,t.#r=[e.substring(r-1)],c}static fromGlob(e,t={}){let r=new n(null,void 0,t);return n.#S(e,r,0,t),r}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[t,r,o,i]=this.toRegExpSource();if(!(o||this.#t||this.#a.nocase&&!this.#a.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return r;let a=(this.#a.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${t}$`,a),{_src:t,_glob:e})}get options(){return this.#a}toRegExpSource(e){let t=e??!!this.#a.dot;if(this.#e===this&&this.#f(),!this.type){let l=this.isStart()&&this.isEnd(),c=this.#r.map(m=>{let[h,g,f,S]=typeof m=="string"?n.#u(m,this.#t,l):m.toRegExpSource(e);return this.#t=this.#t||f,this.#i=this.#i||S,h}).join(""),p="";if(this.isStart()&&typeof this.#r[0]=="string"&&!(this.#r.length===1&&HL.has(this.#r[0]))){let h=jL,g=t&&h.has(c.charAt(0))||c.startsWith("\\.")&&h.has(c.charAt(2))||c.startsWith("\\.\\.")&&h.has(c.charAt(4)),f=!t&&!e&&h.has(c.charAt(0));p=g?zL:f?sl:""}let d="";return this.isEnd()&&this.#e.#p&&this.#s?.type==="!"&&(d="(?:$|\\/)"),[p+c+d,pn(c),this.#t=!!this.#t,this.#i]}let r=this.type==="*"||this.type==="+",o=this.type==="!"?"(?:(?!(?:":"(?:",i=this.#m(t);if(this.isStart()&&this.isEnd()&&!i&&this.type!=="!"){let l=this.toString();return this.#r=[l],this.type=null,this.#t=void 0,[l,pn(this.toString()),!1,!1]}let s=!r||e||t||!sl?"":this.#m(!0);s===i&&(s=""),s&&(i=`(?:${i})(?:${s})*?`);let a="";if(this.type==="!"&&this.#o)a=(this.isStart()&&!t?sl:"")+Lb;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?sl:"")+Pb+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&s?")":this.type==="*"&&s?")?":`)${this.type}`;a=o+i+l}return[a,pn(i),this.#t=!!this.#t,this.#i]}#m(e){return this.#r.map(t=>{if(typeof t=="string")throw new Error("string type in extglob ast??");let[r,o,i,s]=t.toRegExpSource(e);return this.#i=this.#i||s,r}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,r=!1){let o=!1,i="",s=!1;for(let a=0;a<e.length;a++){let l=e.charAt(a);if(o){o=!1,i+=($L.has(l)?"\\":"")+l;continue}if(l==="\\"){a===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,p,d,u]=Ab(e,a);if(d){i+=c,s=s||p,a+=d-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=Lb:i+=Pb,t=!0;continue}if(l==="?"){i+=hp,t=!0;continue}i+=WL(l)}return[i,pn(e),!!t,s]}};var zo=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var vt=(n,e,t={})=>(is(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Bt(e,t).match(n)),GL=/^\*+([^+@!?\*\[\(]*)$/,VL=n=>e=>!e.startsWith(".")&&e.endsWith(n),qL=n=>e=>e.endsWith(n),KL=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),YL=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),JL=/^\*+\.\*+$/,XL=n=>!n.startsWith(".")&&n.includes("."),ZL=n=>n!=="."&&n!==".."&&n.includes("."),QL=/^\.\*+$/,eO=n=>n!=="."&&n!==".."&&n.startsWith("."),tO=/^\*+$/,nO=n=>n.length!==0&&!n.startsWith("."),rO=n=>n.length!==0&&n!=="."&&n!=="..",oO=/^\?+([^+@!?\*\[\(]*)?$/,iO=([n,e=""])=>{let t=_b([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},sO=([n,e=""])=>{let t=Mb([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},aO=([n,e=""])=>{let t=Mb([n]);return e?r=>t(r)&&r.endsWith(e):t},lO=([n,e=""])=>{let t=_b([n]);return e?r=>t(r)&&r.endsWith(e):t},_b=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},Mb=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},Fb=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",Ob={win32:{sep:"\\"},posix:{sep:"/"}},cO=Fb==="win32"?Ob.win32.sep:Ob.posix.sep;vt.sep=cO;var st=Symbol("globstar **");vt.GLOBSTAR=st;var dO="[^/]",pO=dO+"*?",uO="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",mO="(?:(?!(?:\\/|^)\\.).)*?",hO=(n,e={})=>t=>vt(t,n,e);vt.filter=hO;var Xt=(n,e={})=>Object.assign({},n,e),gO=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return vt;let e=vt;return Object.assign((r,o,i={})=>e(r,o,Xt(n,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Xt(n,i))}static defaults(o){return e.defaults(Xt(n,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,s={}){super(o,i,Xt(n,s))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Xt(n,i))}},unescape:(r,o={})=>e.unescape(r,Xt(n,o)),escape:(r,o={})=>e.escape(r,Xt(n,o)),filter:(r,o={})=>e.filter(r,Xt(n,o)),defaults:r=>e.defaults(Xt(n,r)),makeRe:(r,o={})=>e.makeRe(r,Xt(n,o)),braceExpand:(r,o={})=>e.braceExpand(r,Xt(n,o)),match:(r,o,i={})=>e.match(r,o,Xt(n,i)),sep:e.sep,GLOBSTAR:st})};vt.defaults=gO;var Db=(n,e={})=>(is(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,Nb.default)(n));vt.braceExpand=Db;var fO=(n,e={})=>new Bt(n,e).makeRe();vt.makeRe=fO;var SO=(n,e,t={})=>{let r=new Bt(e,t);return n=n.filter(o=>r.match(o)),r.options.nonull&&!n.length&&n.push(e),n};vt.match=SO;var kb=/[?*]|[+@!]\(.*?\)|\[|\]/,yO=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Bt=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,t={}){is(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||Fb,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!t.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!t.nonegate,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=t.windowsNoMagicRoot!==void 0?t.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let t of e)if(typeof t!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,t=this.options;if(!t.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],t.debug&&(this.debug=(...i)=>console.error(...i)),this.debug(this.pattern,this.globSet);let r=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(r),this.debug(this.pattern,this.globParts);let o=this.globParts.map((i,s,a)=>{if(this.isWindows&&this.windowsNoMagicRoot){let l=i[0]===""&&i[1]===""&&(i[2]==="?"||!kb.test(i[2]))&&!kb.test(i[3]),c=/^[a-z]:/i.test(i[0]);if(l)return[...i.slice(0,4),...i.slice(4).map(p=>this.parse(p))];if(c)return[i[0],...i.slice(1).map(p=>this.parse(p))]}return i.map(l=>this.parse(l))});if(this.debug(this.pattern,o),this.set=o.filter(i=>i.indexOf(!1)===-1),this.isWindows)for(let i=0;i<this.set.length;i++){let s=this.set[i];s[0]===""&&s[1]===""&&this.globParts[i][2]==="?"&&typeof s[3]=="string"&&/^[a-z]:$/i.test(s[3])&&(s[2]="?")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let r=0;r<e.length;r++)for(let o=0;o<e[r].length;o++)e[r][o]==="**"&&(e[r][o]="*");let{optimizationLevel:t=1}=this.options;return t>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):t>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(t=>{let r=-1;for(;(r=t.indexOf("**",r+1))!==-1;){let o=r;for(;t[o+1]==="**";)o++;o!==r&&t.splice(r,o-r)}return t})}levelOneOptimize(e){return e.map(t=>(t=t.reduce((r,o)=>{let i=r[r.length-1];return o==="**"&&i==="**"?r:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(r.pop(),r):(r.push(o),r)},[]),t.length===0?[""]:t))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let t=!1;do{if(t=!1,!this.preserveMultipleSlashes){for(let o=1;o<e.length-1;o++){let i=e[o];o===1&&i===""&&e[0]===""||(i==="."||i==="")&&(t=!0,e.splice(o,1),o--)}e[0]==="."&&e.length===2&&(e[1]==="."||e[1]==="")&&(t=!0,e.pop())}let r=0;for(;(r=e.indexOf("..",r+1))!==-1;){let o=e[r-1];o&&o!=="."&&o!==".."&&o!=="**"&&(t=!0,e.splice(r-1,2),r-=2)}}while(t);return e.length===0?[""]:e}firstPhasePreProcess(e){let t=!1;do{t=!1;for(let r of e){let o=-1;for(;(o=r.indexOf("**",o+1))!==-1;){let s=o;for(;r[s+1]==="**";)s++;s>o&&r.splice(o+1,s-o);let a=r[o+1],l=r[o+2],c=r[o+3];if(a!==".."||!l||l==="."||l===".."||!c||c==="."||c==="..")continue;t=!0,r.splice(o,1);let p=r.slice(0);p[o]="**",e.push(p),o--}if(!this.preserveMultipleSlashes){for(let s=1;s<r.length-1;s++){let a=r[s];s===1&&a===""&&r[0]===""||(a==="."||a==="")&&(t=!0,r.splice(s,1),s--)}r[0]==="."&&r.length===2&&(r[1]==="."||r[1]==="")&&(t=!0,r.pop())}let i=0;for(;(i=r.indexOf("..",i+1))!==-1;){let s=r[i-1];if(s&&s!=="."&&s!==".."&&s!=="**"){t=!0;let l=i===1&&r[i+1]==="**"?["."]:[];r.splice(i-1,2,...l),r.length===0&&r.push(""),i-=2}}}}while(t);return e}secondPhasePreProcess(e){for(let t=0;t<e.length-1;t++)for(let r=t+1;r<e.length;r++){let o=this.partsMatch(e[t],e[r],!this.preserveMultipleSlashes);if(o){e[t]=[],e[r]=o;break}}return e.filter(t=>t.length)}partsMatch(e,t,r=!1){let o=0,i=0,s=[],a="";for(;o<e.length&&i<t.length;)if(e[o]===t[i])s.push(a==="b"?t[i]:e[o]),o++,i++;else if(r&&e[o]==="**"&&t[i]===e[o+1])s.push(e[o]),o++;else if(r&&t[i]==="**"&&e[o]===t[i+1])s.push(t[i]),i++;else if(e[o]==="*"&&t[i]&&(this.options.dot||!t[i].startsWith("."))&&t[i]!=="**"){if(a==="b")return!1;a="a",s.push(e[o]),o++,i++}else if(t[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(a==="a")return!1;a="b",s.push(t[i]),o++,i++}else return!1;return e.length===t.length&&s}parseNegate(){if(this.nonegate)return;let e=this.pattern,t=!1,r=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)t=!t,r++;r&&(this.pattern=e.slice(r)),this.negate=t}matchOne(e,t,r=!1){let o=this.options;if(this.isWindows){let g=typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0]),f=!g&&e[0]===""&&e[1]===""&&e[2]==="?"&&/^[a-z]:$/i.test(e[3]),S=typeof t[0]=="string"&&/^[a-z]:$/i.test(t[0]),x=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),b=f?3:g?0:void 0,w=x?3:S?0:void 0;if(typeof b=="number"&&typeof w=="number"){let[E,C]=[e[b],t[w]];E.toLowerCase()===C.toLowerCase()&&(t[w]=E,w>b?t=t.slice(w):b>w&&(e=e.slice(b)))}}let{optimizationLevel:i=1}=this.options;i>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:t}),this.debug("matchOne",e.length,t.length);for(var s=0,a=0,l=e.length,c=t.length;s<l&&a<c;s++,a++){this.debug("matchOne loop");var p=t[a],d=e[s];if(this.debug(t,p,d),p===!1)return!1;if(p===st){this.debug("GLOBSTAR",[t,p,d]);var u=s,m=a+1;if(m===c){for(this.debug("** at the end");s<l;s++)if(e[s]==="."||e[s]===".."||!o.dot&&e[s].charAt(0)===".")return!1;return!0}for(;u<l;){var h=e[u];if(this.debug(`
3544
3562
  globstar while`,e,u,t,m,h),this.matchOne(e.slice(u),t.slice(m),r))return this.debug("globstar found match!",u,l,h),!0;if(h==="."||h===".."||!o.dot&&h.charAt(0)==="."){this.debug("dot detected!",e,u,t,m);break}this.debug("globstar swallow a segment, and continue"),u++}return!!(r&&(this.debug(`
3545
- >>> no match, partial?`,e,u,t,m),u===l))}let g;if(typeof p=="string"?(g=d===p,this.debug("string match",p,d,g)):(g=p.test(d),this.debug("pattern match",p,d,g)),!g)return!1}if(s===l&&a===c)return!0;if(s===l)return r;if(a===c)return s===l-1&&e[s]==="";throw new Error("wtf?")}braceExpand(){return Fb(this.pattern,this.options)}parse(e){os(e);let t=this.options;if(e==="**")return st;if(e==="")return"";let r,o=null;(r=e.match(XL))?o=t.dot?QL:ZL:(r=e.match(jL))?o=(t.nocase?t.dot?GL:WL:t.dot?$L:HL)(r[1]):(r=e.match(eO))?o=(t.nocase?t.dot?nO:tO:t.dot?rO:oO)(r):(r=e.match(VL))?o=t.dot?KL:qL:(r=e.match(YL))&&(o=JL);let i=Bo.fromGlob(e,this.options).toMMPattern();return o&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:o}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let t=this.options,r=t.noglobstar?aO:t.dot?lO:cO,o=new Set(t.nocase?["i"]:[]),i=e.map(l=>{let c=l.map(p=>{if(p instanceof RegExp)for(let d of p.flags.split(""))o.add(d);return typeof p=="string"?hO(p):p===st?st:p._src});return c.forEach((p,d)=>{let u=c[d+1],m=c[d-1];p!==st||m===st||(m===void 0?u!==void 0&&u!==st?c[d+1]="(?:\\/|"+r+"\\/)?"+u:c[d]=r:u===void 0?c[d-1]=m+"(?:\\/|"+r+")?":u!==st&&(c[d-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[d+1]=st))}),c.filter(p=>p!==st).join("/")}).join("|"),[s,a]=e.length>1?["(?:",")"]:["",""];i="^"+s+i+a+"$",this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...o].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&t)return!0;let r=this.options;this.isWindows&&(e=e.split("\\").join("/"));let o=this.slashSplit(e);this.debug(this.pattern,"split",o);let i=this.set;this.debug(this.pattern,"set",i);let s=o[o.length-1];if(!s)for(let a=o.length-2;!s&&a>=0;a--)s=o[a];for(let a=0;a<i.length;a++){let l=i[a],c=o;if(r.matchBase&&l.length===1&&(c=[s]),this.matchOne(c,l,t))return r.flipNegate?!0:!this.negate}return r.flipNegate?!1:this.negate}static defaults(e){return vt.defaults(e).Minimatch}};vt.AST=Bo;vt.Minimatch=Bt;vt.escape=zo;vt.unescape=pn;import{fileURLToPath as VO}from"node:url";var jo=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,Ub=new Set,hp=typeof process=="object"&&process?process:{},Bb=(n,e,t,r)=>{typeof hp.emitWarning=="function"?hp.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},al=globalThis.AbortController,Db=globalThis.AbortSignal;if(typeof al>"u"){Db=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},al=class{constructor(){e()}signal=new Db;abort(r){if(!this.signal.aborted){this.signal.reason=r,this.signal.aborted=!0;for(let o of this.signal._onabort)o(r);this.signal.onabort?.(r)}}};let n=hp.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,Bb("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}var gO=n=>!Ub.has(n),Nie=Symbol("type"),lr=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),zb=n=>lr(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?Ho:null:null,Ho=class extends Array{constructor(e){super(e),this.fill(0)}},gp=class n{heap;length;static#e=!1;static create(e){let t=zb(e);if(!t)return[];n.#e=!0;let r=new n(e,t);return n.#e=!1,r}constructor(e,t){if(!n.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},ss=class n{#e;#t;#i;#r;#s;#w;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#p;#a;#l;#o;#f;#S;#m;#u;#T;#g;#E;#C;#b;#v;#x;#h;static unsafeExposeInternals(e){return{starts:e.#C,ttls:e.#b,sizes:e.#E,keyMap:e.#a,keyList:e.#l,valList:e.#o,next:e.#f,prev:e.#S,get head(){return e.#m},get tail(){return e.#u},free:e.#T,isBackgroundFetch:t=>e.#d(t),backgroundFetch:(t,r,o,i)=>e.#U(t,r,o,i),moveToTail:t=>e.#z(t),indexes:t=>e.#A(t),rindexes:t=>e.#I(t),isStale:t=>e.#y(t)}}get max(){return this.#e}get maxSize(){return this.#t}get calculatedSize(){return this.#p}get size(){return this.#c}get fetchMethod(){return this.#s}get memoMethod(){return this.#w}get dispose(){return this.#i}get disposeAfter(){return this.#r}constructor(e){let{max:t=0,ttl:r,ttlResolution:o=1,ttlAutopurge:i,updateAgeOnGet:s,updateAgeOnHas:a,allowStale:l,dispose:c,disposeAfter:p,noDisposeOnSet:d,noUpdateTTL:u,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:g,fetchMethod:f,memoMethod:S,noDeleteOnFetchRejection:x,noDeleteOnStaleGet:b,allowStaleOnFetchRejection:w,allowStaleOnFetchAbort:E,ignoreFetchAbort:C}=e;if(t!==0&&!lr(t))throw new TypeError("max option must be a nonnegative integer");let I=t?zb(t):Array;if(!I)throw new Error("invalid max value: "+t);if(this.#e=t,this.#t=m,this.maxEntrySize=h||this.#t,this.sizeCalculation=g,this.sizeCalculation){if(!this.#t&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#w=S,f!==void 0&&typeof f!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#s=f,this.#x=!!f,this.#a=new Map,this.#l=new Array(t).fill(void 0),this.#o=new Array(t).fill(void 0),this.#f=new I(t),this.#S=new I(t),this.#m=0,this.#u=0,this.#T=gp.create(t),this.#c=0,this.#p=0,typeof c=="function"&&(this.#i=c),typeof p=="function"?(this.#r=p,this.#g=[]):(this.#r=void 0,this.#g=void 0),this.#v=!!this.#i,this.#h=!!this.#r,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!x,this.allowStaleOnFetchRejection=!!w,this.allowStaleOnFetchAbort=!!E,this.ignoreFetchAbort=!!C,this.maxEntrySize!==0){if(this.#t!==0&&!lr(this.#t))throw new TypeError("maxSize must be a positive integer if specified");if(!lr(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#L()}if(this.allowStale=!!l,this.noDeleteOnStaleGet=!!b,this.updateAgeOnGet=!!s,this.updateAgeOnHas=!!a,this.ttlResolution=lr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=r||0,this.ttl){if(!lr(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#P()}if(this.#e===0&&this.ttl===0&&this.#t===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#e&&!this.#t){let N="LRU_CACHE_UNBOUNDED";gO(N)&&(Ub.add(N),Bb("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",N,n))}}getRemainingTTL(e){return this.#a.has(e)?1/0:0}#P(){let e=new Ho(this.#e),t=new Ho(this.#e);this.#b=e,this.#C=t,this.#k=(i,s,a=jo.now())=>{if(t[i]=s!==0?a:0,e[i]=s,s!==0&&this.ttlAutopurge){let l=setTimeout(()=>{this.#y(i)&&this.#O(this.#l[i],"expire")},s+1);l.unref&&l.unref()}},this.#R=i=>{t[i]=e[i]!==0?jo.now():0},this.#n=(i,s)=>{if(e[s]){let a=e[s],l=t[s];if(!a||!l)return;i.ttl=a,i.start=l,i.now=r||o();let c=i.now-l;i.remainingTTL=a-c}};let r=0,o=()=>{let i=jo.now();if(this.ttlResolution>0){r=i;let s=setTimeout(()=>r=0,this.ttlResolution);s.unref&&s.unref()}return i};this.getRemainingTTL=i=>{let s=this.#a.get(i);if(s===void 0)return 0;let a=e[s],l=t[s];if(!a||!l)return 1/0;let c=(r||o())-l;return a-c},this.#y=i=>{let s=t[i],a=e[i];return!!a&&!!s&&(r||o())-s>a}}#R=()=>{};#n=()=>{};#k=()=>{};#y=()=>!1;#L(){let e=new Ho(this.#e);this.#p=0,this.#E=e,this.#N=t=>{this.#p-=e[t],e[t]=0},this.#M=(t,r,o,i)=>{if(this.#d(r))return 0;if(!lr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(r,t),!lr(o))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return o},this.#_=(t,r,o)=>{if(e[t]=r,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#D(!0)}this.#p+=e[t],o&&(o.entrySize=r,o.totalCalculatedSize=this.#p)}}#N=e=>{};#_=(e,t,r)=>{};#M=(e,t,r,o)=>{if(r||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#u;!(!this.#F(t)||((e||!this.#y(t))&&(yield t),t===this.#m));)t=this.#S[t]}*#I({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#m;!(!this.#F(t)||((e||!this.#y(t))&&(yield t),t===this.#u));)t=this.#f[t]}#F(e){return e!==void 0&&this.#a.get(this.#l[e])===e}*entries(){for(let e of this.#A())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*rentries(){for(let e of this.#I())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*keys(){for(let e of this.#A()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*rkeys(){for(let e of this.#I()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*values(){for(let e of this.#A())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}*rvalues(){for(let e of this.#I())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#l[r],this))return this.get(this.#l[r],t)}}forEach(e,t=this){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}rforEach(e,t=this){for(let r of this.#I()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}purgeStale(){let e=!1;for(let t of this.#I({allowStale:!0}))this.#y(t)&&(this.#O(this.#l[t],"expire"),e=!0);return e}info(e){let t=this.#a.get(e);if(t===void 0)return;let r=this.#o[t],o=this.#d(r)?r.__staleWhileFetching:r;if(o===void 0)return;let i={value:o};if(this.#b&&this.#C){let s=this.#b[t],a=this.#C[t];if(s&&a){let l=s-(jo.now()-a);i.ttl=l,i.start=Date.now()}}return this.#E&&(i.size=this.#E[t]),i}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let r=this.#l[t],o=this.#o[t],i=this.#d(o)?o.__staleWhileFetching:o;if(i===void 0||r===void 0)continue;let s={value:i};if(this.#b&&this.#C){s.ttl=this.#b[t];let a=jo.now()-this.#C[t];s.start=Math.floor(Date.now()-a)}this.#E&&(s.size=this.#E[t]),e.unshift([r,s])}return e}load(e){this.clear();for(let[t,r]of e){if(r.start){let o=Date.now()-r.start;r.start=jo.now()-o}this.set(t,r.value,r)}}set(e,t,r={}){if(t===void 0)return this.delete(e),this;let{ttl:o=this.ttl,start:i,noDisposeOnSet:s=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:l}=r,{noUpdateTTL:c=this.noUpdateTTL}=r,p=this.#M(e,t,r.size||0,a);if(this.maxEntrySize&&p>this.maxEntrySize)return l&&(l.set="miss",l.maxEntrySizeExceeded=!0),this.#O(e,"set"),this;let d=this.#c===0?void 0:this.#a.get(e);if(d===void 0)d=this.#c===0?this.#u:this.#T.length!==0?this.#T.pop():this.#c===this.#e?this.#D(!1):this.#c,this.#l[d]=e,this.#o[d]=t,this.#a.set(e,d),this.#f[this.#u]=d,this.#S[d]=this.#u,this.#u=d,this.#c++,this.#_(d,p,l),l&&(l.set="add"),c=!1;else{this.#z(d);let u=this.#o[d];if(t!==u){if(this.#x&&this.#d(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:m}=u;m!==void 0&&!s&&(this.#v&&this.#i?.(m,e,"set"),this.#h&&this.#g?.push([m,e,"set"]))}else s||(this.#v&&this.#i?.(u,e,"set"),this.#h&&this.#g?.push([u,e,"set"]));if(this.#N(d),this.#_(d,p,l),this.#o[d]=t,l){l.set="replace";let m=u&&this.#d(u)?u.__staleWhileFetching:u;m!==void 0&&(l.oldValue=m)}}else l&&(l.set="update")}if(o!==0&&!this.#b&&this.#P(),this.#b&&(c||this.#k(d,o,i),l&&this.#n(l,d)),!s&&this.#h&&this.#g){let u=this.#g,m;for(;m=u?.shift();)this.#r?.(...m)}return this}pop(){try{for(;this.#c;){let e=this.#o[this.#m];if(this.#D(!0),this.#d(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#h&&this.#g){let e=this.#g,t;for(;t=e?.shift();)this.#r?.(...t)}}}#D(e){let t=this.#m,r=this.#l[t],o=this.#o[t];return this.#x&&this.#d(o)?o.__abortController.abort(new Error("evicted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(o,r,"evict"),this.#h&&this.#g?.push([o,r,"evict"])),this.#N(t),e&&(this.#l[t]=void 0,this.#o[t]=void 0,this.#T.push(t)),this.#c===1?(this.#m=this.#u=0,this.#T.length=0):this.#m=this.#f[t],this.#a.delete(r),this.#c--,t}has(e,t={}){let{updateAgeOnHas:r=this.updateAgeOnHas,status:o}=t,i=this.#a.get(e);if(i!==void 0){let s=this.#o[i];if(this.#d(s)&&s.__staleWhileFetching===void 0)return!1;if(this.#y(i))o&&(o.has="stale",this.#n(o,i));else return r&&this.#R(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,t={}){let{allowStale:r=this.allowStale}=t,o=this.#a.get(e);if(o===void 0||!r&&this.#y(o))return;let i=this.#o[o];return this.#d(i)?i.__staleWhileFetching:i}#U(e,t,r,o){let i=t===void 0?void 0:this.#o[t];if(this.#d(i))return i;let s=new al,{signal:a}=r;a?.addEventListener("abort",()=>s.abort(a.reason),{signal:s.signal});let l={signal:s.signal,options:r,context:o},c=(g,f=!1)=>{let{aborted:S}=s.signal,x=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=s.signal.reason,x&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!x&&!f)return d(s.signal.reason);let b=m;return this.#o[t]===m&&(g===void 0?b.__staleWhileFetching?this.#o[t]=b.__staleWhileFetching:this.#O(e,"fetch"):(r.status&&(r.status.fetchUpdated=!0),this.set(e,g,l.options))),g},p=g=>(r.status&&(r.status.fetchRejected=!0,r.status.fetchError=g),d(g)),d=g=>{let{aborted:f}=s.signal,S=f&&r.allowStaleOnFetchAbort,x=S||r.allowStaleOnFetchRejection,b=x||r.noDeleteOnFetchRejection,w=m;if(this.#o[t]===m&&(!b||w.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=w.__staleWhileFetching)),x)return r.status&&w.__staleWhileFetching!==void 0&&(r.status.returnedStale=!0),w.__staleWhileFetching;if(w.__returned===w)throw g},u=(g,f)=>{let S=this.#s?.(e,i,l);S&&S instanceof Promise&&S.then(x=>g(x===void 0?void 0:x),f),s.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=x=>c(x,!0)))})};r.status&&(r.status.fetchDispatched=!0);let m=new Promise(u).then(c,p),h=Object.assign(m,{__abortController:s,__staleWhileFetching:i,__returned:void 0});return t===void 0?(this.set(e,h,{...l.options,status:void 0}),t=this.#a.get(e)):this.#o[t]=h,h}#d(e){if(!this.#x)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof al}async fetch(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:s=this.ttl,noDisposeOnSet:a=this.noDisposeOnSet,size:l=0,sizeCalculation:c=this.sizeCalculation,noUpdateTTL:p=this.noUpdateTTL,noDeleteOnFetchRejection:d=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:g,forceRefresh:f=!1,status:S,signal:x}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let b={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:s,noDisposeOnSet:a,size:l,sizeCalculation:c,noUpdateTTL:p,noDeleteOnFetchRejection:d,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:x},w=this.#a.get(e);if(w===void 0){S&&(S.fetch="miss");let E=this.#U(e,w,b,g);return E.__returned=E}else{let E=this.#o[w];if(this.#d(E)){let D=r&&E.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",D&&(S.returnedStale=!0)),D?E.__staleWhileFetching:E.__returned=E}let C=this.#y(w);if(!f&&!C)return S&&(S.fetch="hit"),this.#z(w),o&&this.#R(w),S&&this.#n(S,w),E;let I=this.#U(e,w,b,g),P=I.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",P&&C&&(S.returnedStale=!0)),P?I.__staleWhileFetching:I.__returned=I}}async forceFetch(e,t={}){let r=await this.fetch(e,t);if(r===void 0)throw new Error("fetch() returned undefined");return r}memo(e,t={}){let r=this.#w;if(!r)throw new Error("no memoMethod provided to constructor");let{context:o,forceRefresh:i,...s}=t,a=this.get(e,s);if(!i&&a!==void 0)return a;let l=r(e,a,{options:s,context:o});return this.set(e,l,s),l}get(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:s}=t,a=this.#a.get(e);if(a!==void 0){let l=this.#o[a],c=this.#d(l);return s&&this.#n(s,a),this.#y(a)?(s&&(s.get="stale"),c?(s&&r&&l.__staleWhileFetching!==void 0&&(s.returnedStale=!0),r?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),s&&r&&(s.returnedStale=!0),r?l:void 0)):(s&&(s.get="hit"),c?l.__staleWhileFetching:(this.#z(a),o&&this.#R(a),l))}else s&&(s.get="miss")}#B(e,t){this.#S[t]=e,this.#f[e]=t}#z(e){e!==this.#u&&(e===this.#m?this.#m=this.#f[e]:this.#B(this.#S[e],this.#f[e]),this.#B(this.#u,e),this.#u=e)}delete(e){return this.#O(e,"delete")}#O(e,t){let r=!1;if(this.#c!==0){let o=this.#a.get(e);if(o!==void 0)if(r=!0,this.#c===1)this.#j(t);else{this.#N(o);let i=this.#o[o];if(this.#d(i)?i.__abortController.abort(new Error("deleted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(i,e,t),this.#h&&this.#g?.push([i,e,t])),this.#a.delete(e),this.#l[o]=void 0,this.#o[o]=void 0,o===this.#u)this.#u=this.#S[o];else if(o===this.#m)this.#m=this.#f[o];else{let s=this.#S[o];this.#f[s]=this.#f[o];let a=this.#f[o];this.#S[a]=this.#S[o]}this.#c--,this.#T.push(o)}}if(this.#h&&this.#g?.length){let o=this.#g,i;for(;i=o?.shift();)this.#r?.(...i)}return r}clear(){return this.#j("delete")}#j(e){for(let t of this.#I({allowStale:!0})){let r=this.#o[t];if(this.#d(r))r.__abortController.abort(new Error("deleted"));else{let o=this.#l[t];this.#v&&this.#i?.(r,o,e),this.#h&&this.#g?.push([r,o,e])}}if(this.#a.clear(),this.#o.fill(void 0),this.#l.fill(void 0),this.#b&&this.#C&&(this.#b.fill(0),this.#C.fill(0)),this.#E&&this.#E.fill(0),this.#m=0,this.#u=0,this.#T.length=0,this.#p=0,this.#c=0,this.#h&&this.#g){let t=this.#g,r;for(;r=t?.shift();)this.#r?.(...r)}}};import{posix as RO,win32 as Cp}from"node:path";import{fileURLToPath as AO}from"node:url";import{lstatSync as IO,readdir as PO,readdirSync as LO,readlinkSync as OO,realpathSync as kO}from"fs";import*as NO from"node:fs";import{lstat as MO,readdir as FO,readlink as DO,realpath as UO}from"node:fs/promises";import{EventEmitter as xp}from"node:events";import Gb from"node:stream";import{StringDecoder as fO}from"node:string_decoder";var jb=typeof process=="object"&&process?process:{stdout:null,stderr:null},SO=n=>!!n&&typeof n=="object"&&(n instanceof dr||n instanceof Gb||yO(n)||bO(n)),yO=n=>!!n&&typeof n=="object"&&n instanceof xp&&typeof n.pipe=="function"&&n.pipe!==Gb.Writable.prototype.pipe,bO=n=>!!n&&typeof n=="object"&&n instanceof xp&&typeof n.write=="function"&&typeof n.end=="function",Bn=Symbol("EOF"),zn=Symbol("maybeEmitEnd"),cr=Symbol("emittedEnd"),ll=Symbol("emittingEnd"),as=Symbol("emittedError"),cl=Symbol("closed"),Hb=Symbol("read"),dl=Symbol("flush"),$b=Symbol("flushChunk"),un=Symbol("encoding"),$o=Symbol("decoder"),Ze=Symbol("flowing"),ls=Symbol("paused"),Wo=Symbol("resume"),Qe=Symbol("buffer"),xt=Symbol("pipes"),et=Symbol("bufferLength"),fp=Symbol("bufferPush"),pl=Symbol("bufferShift"),ht=Symbol("objectMode"),Fe=Symbol("destroyed"),Sp=Symbol("error"),yp=Symbol("emitData"),Wb=Symbol("emitEnd"),bp=Symbol("emitEnd2"),An=Symbol("async"),wp=Symbol("abort"),ul=Symbol("aborted"),cs=Symbol("signal"),Kr=Symbol("dataListeners"),zt=Symbol("discarded"),ds=n=>Promise.resolve().then(n),wO=n=>n(),vO=n=>n==="end"||n==="finish"||n==="prefinish",xO=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,TO=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),ml=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[Wo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},vp=class extends ml{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,r){super(e,t,r),this.proxyErrors=o=>t.emit("error",o),e.on("error",this.proxyErrors)}},EO=n=>!!n.objectMode,CO=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",dr=class extends xp{[Ze]=!1;[ls]=!1;[xt]=[];[Qe]=[];[ht];[un];[An];[$o];[Bn]=!1;[cr]=!1;[ll]=!1;[cl]=!1;[as]=null;[et]=0;[Fe]=!1;[cs];[ul]=!1;[Kr]=0;[zt]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");EO(t)?(this[ht]=!0,this[un]=null):CO(t)?(this[un]=t.encoding,this[ht]=!1):(this[ht]=!1,this[un]=null),this[An]=!!t.async,this[$o]=this[un]?new fO(this[un]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[Qe]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[xt]});let{signal:r}=t;r&&(this[cs]=r,r.aborted?this[wp]():r.addEventListener("abort",()=>this[wp]()))}get bufferLength(){return this[et]}get encoding(){return this[un]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[ht]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[An]}set async(e){this[An]=this[An]||!!e}[wp](){this[ul]=!0,this.emit("abort",this[cs]?.reason),this.destroy(this[cs]?.reason)}get aborted(){return this[ul]}set aborted(e){}write(e,t,r){if(this[ul])return!1;if(this[Bn])throw new Error("write after end");if(this[Fe])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(r=t,t="utf8"),t||(t="utf8");let o=this[An]?ds:wO;if(!this[ht]&&!Buffer.isBuffer(e)){if(TO(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(xO(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[ht]?(this[Ze]&&this[et]!==0&&this[dl](!0),this[Ze]?this.emit("data",e):this[fp](e),this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze]):e.length?(typeof e=="string"&&!(t===this[un]&&!this[$o]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[un]&&(e=this[$o].write(e)),this[Ze]&&this[et]!==0&&this[dl](!0),this[Ze]?this.emit("data",e):this[fp](e),this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze]):(this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze])}read(e){if(this[Fe])return null;if(this[zt]=!1,this[et]===0||e===0||e&&e>this[et])return this[zn](),null;this[ht]&&(e=null),this[Qe].length>1&&!this[ht]&&(this[Qe]=[this[un]?this[Qe].join(""):Buffer.concat(this[Qe],this[et])]);let t=this[Hb](e||null,this[Qe][0]);return this[zn](),t}[Hb](e,t){if(this[ht])this[pl]();else{let r=t;e===r.length||e===null?this[pl]():typeof r=="string"?(this[Qe][0]=r.slice(e),t=r.slice(0,e),this[et]-=e):(this[Qe][0]=r.subarray(e),t=r.subarray(0,e),this[et]-=e)}return this.emit("data",t),!this[Qe].length&&!this[Bn]&&this.emit("drain"),t}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t="utf8"),e!==void 0&&this.write(e,t),r&&this.once("end",r),this[Bn]=!0,this.writable=!1,(this[Ze]||!this[ls])&&this[zn](),this}[Wo](){this[Fe]||(!this[Kr]&&!this[xt].length&&(this[zt]=!0),this[ls]=!1,this[Ze]=!0,this.emit("resume"),this[Qe].length?this[dl]():this[Bn]?this[zn]():this.emit("drain"))}resume(){return this[Wo]()}pause(){this[Ze]=!1,this[ls]=!0,this[zt]=!1}get destroyed(){return this[Fe]}get flowing(){return this[Ze]}get paused(){return this[ls]}[fp](e){this[ht]?this[et]+=1:this[et]+=e.length,this[Qe].push(e)}[pl](){return this[ht]?this[et]-=1:this[et]-=this[Qe][0].length,this[Qe].shift()}[dl](e=!1){do;while(this[$b](this[pl]())&&this[Qe].length);!e&&!this[Qe].length&&!this[Bn]&&this.emit("drain")}[$b](e){return this.emit("data",e),this[Ze]}pipe(e,t){if(this[Fe])return e;this[zt]=!1;let r=this[cr];return t=t||{},e===jb.stdout||e===jb.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[xt].push(t.proxyErrors?new vp(this,e,t):new ml(this,e,t)),this[An]?ds(()=>this[Wo]()):this[Wo]()),e}unpipe(e){let t=this[xt].find(r=>r.dest===e);t&&(this[xt].length===1?(this[Ze]&&this[Kr]===0&&(this[Ze]=!1),this[xt]=[]):this[xt].splice(this[xt].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let r=super.on(e,t);if(e==="data")this[zt]=!1,this[Kr]++,!this[xt].length&&!this[Ze]&&this[Wo]();else if(e==="readable"&&this[et]!==0)super.emit("readable");else if(vO(e)&&this[cr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[as]){let o=t;this[An]?ds(()=>o.call(this,this[as])):o.call(this,this[as])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Kr]=this.listeners("data").length,this[Kr]===0&&!this[zt]&&!this[xt].length&&(this[Ze]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Kr]=0,!this[zt]&&!this[xt].length&&(this[Ze]=!1)),t}get emittedEnd(){return this[cr]}[zn](){!this[ll]&&!this[cr]&&!this[Fe]&&this[Qe].length===0&&this[Bn]&&(this[ll]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[cl]&&this.emit("close"),this[ll]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==Fe&&this[Fe])return!1;if(e==="data")return!this[ht]&&!r?!1:this[An]?(ds(()=>this[yp](r)),!0):this[yp](r);if(e==="end")return this[Wb]();if(e==="close"){if(this[cl]=!0,!this[cr]&&!this[Fe])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[as]=r,super.emit(Sp,r);let i=!this[cs]||this.listeners("error").length?super.emit("error",r):!1;return this[zn](),i}else if(e==="resume"){let i=super.emit("resume");return this[zn](),i}else if(e==="finish"||e==="prefinish"){let i=super.emit(e);return this.removeAllListeners(e),i}let o=super.emit(e,...t);return this[zn](),o}[yp](e){for(let r of this[xt])r.dest.write(e)===!1&&this.pause();let t=this[zt]?!1:super.emit("data",e);return this[zn](),t}[Wb](){return this[cr]?!1:(this[cr]=!0,this.readable=!1,this[An]?(ds(()=>this[bp]()),!0):this[bp]())}[bp](){if(this[$o]){let t=this[$o].end();if(t){for(let r of this[xt])r.dest.write(t);this[zt]||super.emit("data",t)}}for(let t of this[xt])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[ht]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[ht]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[ht])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[un]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(Fe,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[zt]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let o=this.read();if(o!==null)return Promise.resolve({done:!1,value:o});if(this[Bn])return t();let i,s,a=d=>{this.off("data",l),this.off("end",c),this.off(Fe,p),t(),s(d)},l=d=>{this.off("error",a),this.off("end",c),this.off(Fe,p),this.pause(),i({value:d,done:!!this[Bn]})},c=()=>{this.off("error",a),this.off("data",l),this.off(Fe,p),t(),i({done:!0,value:void 0})},p=()=>a(new Error("stream destroyed"));return new Promise((d,u)=>{s=u,i=d,this.once(Fe,p),this.once("error",a),this.once("end",c),this.once("data",l)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[zt]=!1;let e=!1,t=()=>(this.pause(),this.off(Sp,t),this.off(Fe,t),this.off("end",t),e=!0,{done:!0,value:void 0}),r=()=>{if(e)return t();let o=this.read();return o===null?t():{done:!1,value:o}};return this.once("end",t),this.once(Sp,t),this.once(Fe,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[Fe])return e?this.emit("error",e):this.emit(Fe),this;this[Fe]=!0,this[zt]=!0,this[Qe].length=0,this[et]=0;let t=this;return typeof t.close=="function"&&!this[cl]&&t.close(),e?this.emit("error",e):this.emit(Fe),this}static get isStream(){return SO}};var _O=kO.native,us={lstatSync:IO,readdir:PO,readdirSync:LO,readlinkSync:OO,realpathSync:_O,promises:{lstat:MO,readdir:FO,readlink:DO,realpath:UO}},Jb=n=>!n||n===us||n===NO?us:{...us,...n,promises:{...us.promises,...n.promises||{}}},Xb=/^\\\\\?\\([a-z]:)\\?$/i,BO=n=>n.replace(/\//g,"\\").replace(Xb,"$1\\"),zO=/[\\\/]/,Qt=0,Zb=1,Qb=2,In=4,ew=6,tw=8,Yr=10,nw=12,Zt=15,ps=~Zt,Tp=16,Vb=32,ms=64,mn=128,hl=256,fl=512,qb=ms|mn|fl,jO=1023,Ep=n=>n.isFile()?tw:n.isDirectory()?In:n.isSymbolicLink()?Yr:n.isCharacterDevice()?Qb:n.isBlockDevice()?ew:n.isSocket()?nw:n.isFIFO()?Zb:Qt,Kb=new Map,hs=n=>{let e=Kb.get(n);if(e)return e;let t=n.normalize("NFKD");return Kb.set(n,t),t},Yb=new Map,gl=n=>{let e=Yb.get(n);if(e)return e;let t=hs(n.toLowerCase());return Yb.set(n,t),t},Sl=class extends ss{constructor(){super({max:256})}},Rp=class extends ss{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},rw=Symbol("PathScurry setAsCwd"),gt=class{name;root;roots;parent;nocase;isCWD=!1;#e;#t;get dev(){return this.#t}#i;get mode(){return this.#i}#r;get nlink(){return this.#r}#s;get uid(){return this.#s}#w;get gid(){return this.#w}#c;get rdev(){return this.#c}#p;get blksize(){return this.#p}#a;get ino(){return this.#a}#l;get size(){return this.#l}#o;get blocks(){return this.#o}#f;get atimeMs(){return this.#f}#S;get mtimeMs(){return this.#S}#m;get ctimeMs(){return this.#m}#u;get birthtimeMs(){return this.#u}#T;get atime(){return this.#T}#g;get mtime(){return this.#g}#E;get ctime(){return this.#E}#C;get birthtime(){return this.#C}#b;#v;#x;#h;#P;#R;#n;#k;#y;#L;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(e,t=Qt,r,o,i,s,a){this.name=e,this.#b=i?gl(e):hs(e),this.#n=t&jO,this.nocase=i,this.roots=o,this.root=r||this,this.#k=s,this.#x=a.fullpath,this.#P=a.relative,this.#R=a.relativePosix,this.parent=a.parent,this.parent?this.#e=this.parent.#e:this.#e=Jb(a.fs)}depth(){return this.#v!==void 0?this.#v:this.parent?this.#v=this.parent.depth()+1:this.#v=0}childrenCache(){return this.#k}resolve(e){if(!e)return this;let t=this.getRootString(e),o=e.substring(t.length).split(this.splitSep);return t?this.getRoot(t).#N(o):this.#N(o)}#N(e){let t=this;for(let r of e)t=t.child(r);return t}children(){let e=this.#k.get(this);if(e)return e;let t=Object.assign([],{provisional:0});return this.#k.set(this,t),this.#n&=~Tp,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?gl(e):hs(e);for(let l of r)if(l.#b===o)return l;let i=this.parent?this.sep:"",s=this.#x?this.#x+i+e:void 0,a=this.newChild(e,Qt,{...t,parent:this,fullpath:s});return this.canReaddir()||(a.#n|=mn),r.push(a),a}relative(){if(this.isCWD)return"";if(this.#P!==void 0)return this.#P;let e=this.name,t=this.parent;if(!t)return this.#P=this.name;let r=t.relative();return r+(!r||!t.parent?"":this.sep)+e}relativePosix(){if(this.sep==="/")return this.relative();if(this.isCWD)return"";if(this.#R!==void 0)return this.#R;let e=this.name,t=this.parent;if(!t)return this.#R=this.fullpathPosix();let r=t.relativePosix();return r+(!r||!t.parent?"":"/")+e}fullpath(){if(this.#x!==void 0)return this.#x;let e=this.name,t=this.parent;if(!t)return this.#x=this.name;let o=t.fullpath()+(t.parent?this.sep:"")+e;return this.#x=o}fullpathPosix(){if(this.#h!==void 0)return this.#h;if(this.sep==="/")return this.#h=this.fullpath();if(!this.parent){let o=this.fullpath().replace(/\\/g,"/");return/^[a-z]:\//i.test(o)?this.#h=`//?/${o}`:this.#h=o}let e=this.parent,t=e.fullpathPosix(),r=t+(!t||!e.parent?"":"/")+this.name;return this.#h=r}isUnknown(){return(this.#n&Zt)===Qt}isType(e){return this[`is${e}`]()}getType(){return this.isUnknown()?"Unknown":this.isDirectory()?"Directory":this.isFile()?"File":this.isSymbolicLink()?"SymbolicLink":this.isFIFO()?"FIFO":this.isCharacterDevice()?"CharacterDevice":this.isBlockDevice()?"BlockDevice":this.isSocket()?"Socket":"Unknown"}isFile(){return(this.#n&Zt)===tw}isDirectory(){return(this.#n&Zt)===In}isCharacterDevice(){return(this.#n&Zt)===Qb}isBlockDevice(){return(this.#n&Zt)===ew}isFIFO(){return(this.#n&Zt)===Zb}isSocket(){return(this.#n&Zt)===nw}isSymbolicLink(){return(this.#n&Yr)===Yr}lstatCached(){return this.#n&Vb?this:void 0}readlinkCached(){return this.#y}realpathCached(){return this.#L}readdirCached(){let e=this.children();return e.slice(0,e.provisional)}canReadlink(){if(this.#y)return!0;if(!this.parent)return!1;let e=this.#n&Zt;return!(e!==Qt&&e!==Yr||this.#n&hl||this.#n&mn)}calledReaddir(){return!!(this.#n&Tp)}isENOENT(){return!!(this.#n&mn)}isNamed(e){return this.nocase?this.#b===gl(e):this.#b===hs(e)}async readlink(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=await this.#e.promises.readlink(this.fullpath()),r=(await this.parent.realpath())?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}readlinkSync(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=this.#e.readlinkSync(this.fullpath()),r=this.parent.realpathSync()?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}#_(e){this.#n|=Tp;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#M()}}#M(){this.#n&mn||(this.#n=(this.#n|mn)&ps,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#M()}#I(){this.#n|=fl,this.#F()}#F(){if(this.#n&ms)return;let e=this.#n;(e&Zt)===In&&(e&=ps),this.#n=e|ms,this.#A()}#D(e=""){e==="ENOTDIR"||e==="EPERM"?this.#F():e==="ENOENT"?this.#M():this.children().provisional=0}#U(e=""){e==="ENOTDIR"?this.parent.#F():e==="ENOENT"&&this.#M()}#d(e=""){let t=this.#n;t|=hl,e==="ENOENT"&&(t|=mn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=ps),this.#n=t,e==="ENOTDIR"&&this.parent&&this.parent.#F()}#B(e,t){return this.#O(e,t)||this.#z(e,t)}#z(e,t){let r=Ep(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&Zt;return i!==In&&i!==Yr&&i!==Qt&&(o.#n|=ms),t.unshift(o),t.provisional++,o}#O(e,t){for(let r=t.provisional;r<t.length;r++){let o=t[r];if((this.nocase?gl(e.name):hs(e.name))===o.#b)return this.#j(e,o,r,t)}}#j(e,t,r,o){let i=t.name;return t.#n=t.#n&ps|Ep(e),i!==e.name&&(t.name=e.name),r!==o.provisional&&(r===o.length-1?o.pop():o.splice(r,1),o.unshift(t)),o.provisional++,t}async lstat(){if(!(this.#n&mn))try{return this.#G(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#U(e.code)}}lstatSync(){if(!(this.#n&mn))try{return this.#G(this.#e.lstatSync(this.fullpath())),this}catch(e){this.#U(e.code)}}#G(e){let{atime:t,atimeMs:r,birthtime:o,birthtimeMs:i,blksize:s,blocks:a,ctime:l,ctimeMs:c,dev:p,gid:d,ino:u,mode:m,mtime:h,mtimeMs:g,nlink:f,rdev:S,size:x,uid:b}=e;this.#T=t,this.#f=r,this.#C=o,this.#u=i,this.#p=s,this.#o=a,this.#E=l,this.#m=c,this.#t=p,this.#w=d,this.#a=u,this.#i=m,this.#g=h,this.#S=g,this.#r=f,this.#c=S,this.#l=x,this.#s=b;let w=Ep(e);this.#n=this.#n&ps|w|Vb,w!==Qt&&w!==In&&w!==Yr&&(this.#n|=ms)}#$=[];#W=!1;#V(e){this.#W=!1;let t=this.#$.slice();this.#$.length=0,t.forEach(r=>r(null,e))}readdirCB(e,t=!1){if(!this.canReaddir()){t?e(null,[]):queueMicrotask(()=>e(null,[]));return}let r=this.children();if(this.calledReaddir()){let i=r.slice(0,r.provisional);t?e(null,i):queueMicrotask(()=>e(null,i));return}if(this.#$.push(e),this.#W)return;this.#W=!0;let o=this.fullpath();this.#e.readdir(o,{withFileTypes:!0},(i,s)=>{if(i)this.#D(i.code),r.provisional=0;else{for(let a of s)this.#B(a,r);this.#_(r)}this.#V(r.slice(0,r.provisional))})}#H;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();if(this.#H)await this.#H;else{let r=()=>{};this.#H=new Promise(o=>r=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#_(e)}catch(o){this.#D(o.code),e.provisional=0}this.#H=void 0,r()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();try{for(let r of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(r,e);this.#_(e)}catch(r){this.#D(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&qb)return!1;let e=Zt&this.#n;return e===Qt||e===In||e===Yr}shouldWalk(e,t){return(this.#n&In)===In&&!(this.#n&qb)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((fl|hl|mn)&this.#n))try{let e=await this.#e.promises.realpath(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}realpathSync(){if(this.#L)return this.#L;if(!((fl|hl|mn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[rw](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),r=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=r.join(this.sep),o.#R=r.join("/"),o=o.parent,r.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},yl=class n extends gt{sep="\\";splitSep=zO;constructor(e,t=Qt,r,o,i,s,a){super(e,t,r,o,i,s,a)}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}getRootString(e){return Cp.parse(e).root}getRoot(e){if(e=BO(e.toUpperCase()),e===this.root.name)return this.root;for(let[t,r]of Object.entries(this.roots))if(this.sameRoot(e,t))return this.roots[e]=r;return this.roots[e]=new Go(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(Xb,"$1\\"),e===t}},bl=class n extends gt{splitSep="/";sep="/";constructor(e,t=Qt,r,o,i,s,a){super(e,t,r,o,i,s,a)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}},wl=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:s=us}={}){this.#r=Jb(s),(e instanceof URL||e.startsWith("file://"))&&(e=AO(e));let a=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(a),this.#e=new Sl,this.#t=new Sl,this.#i=new Rp(i);let l=a.substring(this.rootPath.length).split(r);if(l.length===1&&!l[0]&&l.pop(),o===void 0)throw new TypeError("must provide nocase setting to PathScurryBase ctor");this.nocase=o,this.root=this.newRoot(this.#r),this.roots[this.rootPath]=this.root;let c=this.root,p=l.length-1,d=t.sep,u=this.rootPath,m=!1;for(let h of l){let g=p--;c=c.child(h,{relative:new Array(g).fill("..").join(d),relativePosix:new Array(g).fill("..").join("/"),fullpath:u+=(m?"":d)+h}),m=!0}this.cwd=c}depth(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.depth()}childrenCache(){return this.#i}resolve(...e){let t="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))break}let r=this.#e.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpath();return this.#e.set(t,o),o}resolvePosix(...e){let t="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))break}let r=this.#t.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpathPosix();return this.#t.set(t,o),o}relative(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relative()}relativePosix(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relativePosix()}basename(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.name}dirname(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),(e.parent||e).fullpath()}async readdir(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r}=t;if(e.canReaddir()){let o=await e.readdir();return r?o:o.map(i=>i.name)}else return[]}readdirSync(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0}=t;return e.canReaddir()?r?e.readdirSync():e.readdirSync().map(o=>o.name):[]}async lstat(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstat()}lstatSync(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstatSync()}async readlink(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=await e.readlink();return t?r:r?.fullpath()}readlinkSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=e.readlinkSync();return t?r:r?.fullpath()}async realpath(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=await e.realpath();return t?r:r?.fullpath()}realpathSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=e.realpathSync();return t?r:r?.fullpath()}async walk(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=[];(!i||i(e))&&a.push(r?e:e.fullpath());let l=new Set,c=(d,u)=>{l.add(d),d.readdirCB((m,h)=>{if(m)return u(m);let g=h.length;if(!g)return u();let f=()=>{--g===0&&u()};for(let S of h)(!i||i(S))&&a.push(r?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(x=>x?.isUnknown()?x.lstat():x).then(x=>x?.shouldWalk(l,s)?c(x,f):f()):S.shouldWalk(l,s)?c(S,f):f()},!0)},p=e;return new Promise((d,u)=>{c(p,m=>{if(m)return u(m);d(a)})})}walkSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=[];(!i||i(e))&&a.push(r?e:e.fullpath());let l=new Set([e]);for(let c of l){let p=c.readdirSync();for(let d of p){(!i||i(d))&&a.push(r?d:d.fullpath());let u=d;if(d.isSymbolicLink()){if(!(o&&(u=d.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(l,s)&&l.add(u)}}return a}[Symbol.asyncIterator](){return this.iterate()}iterate(e=this.cwd,t={}){return typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd),this.stream(e,t)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t;(!i||i(e))&&(yield r?e:e.fullpath());let a=new Set([e]);for(let l of a){let c=l.readdirSync();for(let p of c){(!i||i(p))&&(yield r?p:p.fullpath());let d=p;if(p.isSymbolicLink()){if(!(o&&(d=p.realpathSync())))continue;d.isUnknown()&&d.lstatSync()}d.shouldWalk(a,s)&&a.add(d)}}}stream(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=new dr({objectMode:!0});(!i||i(e))&&a.write(r?e:e.fullpath());let l=new Set,c=[e],p=0,d=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){p===0&&a.end();return}p++,l.add(m);let h=(f,S,x=!1)=>{if(f)return a.emit("error",f);if(o&&!x){let b=[];for(let w of S)w.isSymbolicLink()&&b.push(w.realpath().then(E=>E?.isUnknown()?E.lstat():E));if(b.length){Promise.all(b).then(()=>h(null,S,!0));return}}for(let b of S)b&&(!i||i(b))&&(a.write(r?b:b.fullpath())||(u=!0));p--;for(let b of S){let w=b.realpathCached()||b;w.shouldWalk(l,s)&&c.push(w)}u&&!a.flowing?a.once("drain",d):g||d()},g=!0;m.readdirCB(h,!0),g=!1}};return d(),a}streamSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=new dr({objectMode:!0}),l=new Set;(!i||i(e))&&a.write(r?e:e.fullpath());let c=[e],p=0,d=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){p===0&&a.end();return}p++,l.add(m);let h=m.readdirSync();for(let g of h)(!i||i(g))&&(a.write(r?g:g.fullpath())||(u=!0));p--;for(let g of h){let f=g;if(g.isSymbolicLink()){if(!(o&&(f=g.realpathSync())))continue;f.isUnknown()&&f.lstatSync()}f.shouldWalk(l,s)&&c.push(f)}}u&&!a.flowing&&a.once("drain",d)};return d(),a}chdir(e=this.cwd){let t=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[rw](t)}},Go=class extends wl{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,Cp,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return Cp.parse(e).root.toUpperCase()}newRoot(e){return new yl(this.rootPath,In,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},Vo=class extends wl{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,RO,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new bl(this.rootPath,In,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},gs=class extends Vo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},Gie=process.platform==="win32"?yl:bl,ow=process.platform==="win32"?Go:process.platform==="darwin"?gs:Vo;var HO=n=>n.length>=1,$O=n=>n.length>=1,qo=class n{#e;#t;#i;length;#r;#s;#w;#c;#p;#a;#l=!0;constructor(e,t,r,o){if(!HO(e))throw new TypeError("empty pattern list");if(!$O(t))throw new TypeError("empty glob list");if(t.length!==e.length)throw new TypeError("mismatched pattern list and glob list lengths");if(this.length=e.length,r<0||r>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#t=t,this.#i=r,this.#r=o,this.#i===0){if(this.isUNC()){let[i,s,a,l,...c]=this.#e,[p,d,u,m,...h]=this.#t;c[0]===""&&(c.shift(),h.shift());let g=[i,s,a,l,""].join("/"),f=[p,d,u,m,""].join("/");this.#e=[g,...c],this.#t=[f,...h],this.length=this.#e.length}else if(this.isDrive()||this.isAbsolute()){let[i,...s]=this.#e,[a,...l]=this.#t;s[0]===""&&(s.shift(),l.shift());let c=i+"/",p=a+"/";this.#e=[c,...s],this.#t=[p,...l],this.length=this.#e.length}}}pattern(){return this.#e[this.#i]}isString(){return typeof this.#e[this.#i]=="string"}isGlobstar(){return this.#e[this.#i]===st}isRegExp(){return this.#e[this.#i]instanceof RegExp}globString(){return this.#w=this.#w||(this.#i===0?this.isAbsolute()?this.#t[0]+this.#t.slice(1).join("/"):this.#t.join("/"):this.#t.slice(this.#i).join("/"))}hasMore(){return this.length>this.#i+1}rest(){return this.#s!==void 0?this.#s:this.hasMore()?(this.#s=new n(this.#e,this.#t,this.#i+1,this.#r),this.#s.#a=this.#a,this.#s.#p=this.#p,this.#s.#c=this.#c,this.#s):this.#s=null}isUNC(){let e=this.#e;return this.#p!==void 0?this.#p:this.#p=this.#r==="win32"&&this.#i===0&&e[0]===""&&e[1]===""&&typeof e[2]=="string"&&!!e[2]&&typeof e[3]=="string"&&!!e[3]}isDrive(){let e=this.#e;return this.#c!==void 0?this.#c:this.#c=this.#r==="win32"&&this.#i===0&&this.length>1&&typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0])}isAbsolute(){let e=this.#e;return this.#a!==void 0?this.#a:this.#a=e[0]===""&&e.length>1||this.isDrive()||this.isUNC()}root(){let e=this.#e[0];return typeof e=="string"&&this.isAbsolute()&&this.#i===0?e:""}checkFollowGlobstar(){return!(this.#i===0||!this.isGlobstar()||!this.#l)}markFollowGlobstar(){return this.#i===0||!this.isGlobstar()||!this.#l?!1:(this.#l=!1,!0)}};var WO=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Ko=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:s=WO}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=s,this.mmopts={dot:!0,nobrace:t,nocase:r,noext:o,noglobstar:i,optimizationLevel:2,platform:s,nocomment:!0,nonegate:!0};for(let a of e)this.add(a)}add(e){let t=new Bt(e,this.mmopts);for(let r=0;r<t.set.length;r++){let o=t.set[r],i=t.globParts[r];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let s=new qo(o,i,0,this.platform),a=new Bt(s.globString(),this.mmopts),l=i[i.length-1]==="**",c=s.isAbsolute();c?this.absolute.push(a):this.relative.push(a),l&&(c?this.absoluteChildren.push(a):this.relativeChildren.push(a))}}ignored(e){let t=e.fullpath(),r=`${t}/`,o=e.relative()||".",i=`${o}/`;for(let s of this.relative)if(s.match(o)||s.match(i))return!0;for(let s of this.absolute)if(s.match(t)||s.match(r))return!0;return!1}childrenIgnored(e){let t=e.fullpath()+"/",r=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(r))return!0;for(let o of this.absoluteChildren)if(o.match(t))return!0;return!1}};var Ap=class n{store;constructor(e=new Map){this.store=e}copy(){return new n(new Map(this.store))}hasWalked(e,t){return this.store.get(e.fullpath())?.has(t.globString())}storeWalked(e,t){let r=e.fullpath(),o=this.store.get(r);o?o.add(t.globString()):this.store.set(r,new Set([t.globString()]))}},Ip=class{store=new Map;add(e,t,r){let o=(t?2:0)|(r?1:0),i=this.store.get(e);this.store.set(e,i===void 0?o:o&i)}entries(){return[...this.store.entries()].map(([e,t])=>[e,!!(t&2),!!(t&1)])}},Pp=class{store=new Map;add(e,t){if(!e.canReaddir())return;let r=this.store.get(e);r?r.find(o=>o.globString()===t.globString())||r.push(t):this.store.set(e,[t])}get(e){let t=this.store.get(e);if(!t)throw new Error("attempting to walk unknown path");return t}entries(){return this.keys().map(e=>[e,this.store.get(e)])}keys(){return[...this.store.keys()].filter(e=>e.canReaddir())}},fs=class n{hasWalkedCache;matches=new Ip;subwalks=new Pp;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Ap}processPatterns(e,t){this.patterns=t;let r=t.map(o=>[e,o]);for(let[o,i]of r){this.hasWalkedCache.storeWalked(o,i);let s=i.root(),a=i.isAbsolute()&&this.opts.absolute!==!1;if(s){o=o.resolve(s==="/"&&this.opts.root!==void 0?this.opts.root:s);let d=i.rest();if(d)i=d;else{this.matches.add(o,!0,!1);continue}}if(o.isENOENT())continue;let l,c,p=!1;for(;typeof(l=i.pattern())=="string"&&(c=i.rest());)o=o.resolve(l),i=c,p=!0;if(l=i.pattern(),c=i.rest(),p){if(this.hasWalkedCache.hasWalked(o,i))continue;this.hasWalkedCache.storeWalked(o,i)}if(typeof l=="string"){let d=l===".."||l===""||l===".";this.matches.add(o.resolve(l),a,d);continue}else if(l===st){(!o.isSymbolicLink()||this.follow||i.checkFollowGlobstar())&&this.subwalks.add(o,i);let d=c?.pattern(),u=c?.rest();if(!c||(d===""||d===".")&&!u)this.matches.add(o,a,d===""||d===".");else if(d===".."){let m=o.parent||o;u?this.hasWalkedCache.hasWalked(m,u)||this.subwalks.add(m,u):this.matches.add(m,a,!0)}}else l instanceof RegExp&&this.subwalks.add(o,i)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new n(this.opts,this.hasWalkedCache)}filterEntries(e,t){let r=this.subwalks.get(e),o=this.child();for(let i of t)for(let s of r){let a=s.isAbsolute(),l=s.pattern(),c=s.rest();l===st?o.testGlobstar(i,s,c,a):l instanceof RegExp?o.testRegExp(i,l,c,a):o.testString(i,l,c,a)}return o}testGlobstar(e,t,r,o){if((this.dot||!e.name.startsWith("."))&&(t.hasMore()||this.matches.add(e,o,!1),e.canReaddir()&&(this.follow||!e.isSymbolicLink()?this.subwalks.add(e,t):e.isSymbolicLink()&&(r&&t.checkFollowGlobstar()?this.subwalks.add(e,r):t.markFollowGlobstar()&&this.subwalks.add(e,t)))),r){let i=r.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,r.rest(),o);else if(i===".."){let s=e.parent||e;this.subwalks.add(s,r)}else i instanceof RegExp&&this.testRegExp(e,i,r.rest(),o)}}testRegExp(e,t,r,o){t.test(e.name)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}testString(e,t,r,o){e.isNamed(t)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}};var GO=(n,e)=>typeof n=="string"?new Ko([n],e):Array.isArray(n)?new Ko(n,e):n,vl=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#t;#i;signal;maxDepth;includeChildMatches;constructor(e,t,r){if(this.patterns=e,this.path=t,this.opts=r,this.#i=!r.posix&&r.platform==="win32"?"\\":"/",this.includeChildMatches=r.includeChildMatches!==!1,(r.ignore||!this.includeChildMatches)&&(this.#t=GO(r.ignore??[],r),!this.includeChildMatches&&typeof this.#t.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=r.maxDepth||1/0,r.signal&&(this.signal=r.signal,this.signal.addEventListener("abort",()=>{this.#e.length=0}))}#r(e){return this.seen.has(e)||!!this.#t?.ignored?.(e)}#s(e){return!!this.#t?.childrenIgnored?.(e)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let e;for(;!this.paused&&(e=this.#e.shift());)e()}onResume(e){this.signal?.aborted||(this.paused?this.#e.push(e):e())}async matchCheck(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||await e.realpath(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?await e.lstat():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=await i.realpath();s&&(s.isUnknown()||this.opts.stat)&&await s.lstat()}return this.matchCheckTest(i,t)}matchCheckTest(e,t){return e&&(this.maxDepth===1/0||e.depth()<=this.maxDepth)&&(!t||e.canReaddir())&&(!this.opts.nodir||!e.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!e.isSymbolicLink()||!e.realpathCached()?.isDirectory())&&!this.#r(e)?e:void 0}matchCheckSync(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||e.realpathSync(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?e.lstatSync():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=i.realpathSync();s&&(s?.isUnknown()||this.opts.stat)&&s.lstatSync()}return this.matchCheckTest(i,t)}matchFinish(e,t){if(this.#r(e))return;if(!this.includeChildMatches&&this.#t?.add){let i=`${e.relativePosix()}/**`;this.#t.add(i)}let r=this.opts.absolute===void 0?t:this.opts.absolute;this.seen.add(e);let o=this.opts.mark&&e.isDirectory()?this.#i:"";if(this.opts.withFileTypes)this.matchEmit(e);else if(r){let i=this.opts.posix?e.fullpathPosix():e.fullpath();this.matchEmit(i+o)}else{let i=this.opts.posix?e.relativePosix():e.relative(),s=this.opts.dotRelative&&!i.startsWith(".."+this.#i)?"."+this.#i:"";this.matchEmit(i?s+i+o:"."+o)}}async match(e,t,r){let o=await this.matchCheck(e,r);o&&this.matchFinish(o,t)}matchSync(e,t,r){let o=this.matchCheckSync(e,r);o&&this.matchFinish(o,t)}walkCB(e,t,r){this.signal?.aborted&&r(),this.walkCB2(e,t,new fs(this.opts),r)}walkCB2(e,t,r,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,t,r,o));return}r.processPatterns(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirCached();a.calledReaddir()?this.walkCB3(a,l,r,s):a.readdirCB((c,p)=>this.walkCB3(a,p,r,s),!0)}s()}walkCB3(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let[a,l]of r.subwalks.entries())i++,this.walkCB2(a,l,r.child(),s);s()}walkCBSync(e,t,r){this.signal?.aborted&&r(),this.walkCB2Sync(e,t,new fs(this.opts),r)}walkCB2Sync(e,t,r,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,t,r,o));return}r.processPatterns(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirSync();this.walkCB3Sync(a,l,r,s)}s()}walkCB3Sync(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let[a,l]of r.subwalks.entries())i++,this.walkCB2Sync(a,l,r.child(),s);s()}},Ss=class extends vl{matches=new Set;constructor(e,t,r){super(e,t,r)}matchEmit(e){this.matches.add(e)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((e,t)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?t(this.signal.reason):e(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},ys=class extends vl{results;constructor(e,t,r){super(e,t,r),this.results=new dr({signal:this.signal,objectMode:!0}),this.results.on("drain",()=>this.resume()),this.results.on("resume",()=>this.resume())}matchEmit(e){this.results.write(e),this.results.flowing||this.pause()}stream(){let e=this.path;return e.isUnknown()?e.lstat().then(()=>{this.walkCB(e,this.patterns,()=>this.results.end())}):this.walkCB(e,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}};var qO=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",hn=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(e,t){if(!t)throw new TypeError("glob options required");if(this.withFileTypes=!!t.withFileTypes,this.signal=t.signal,this.follow=!!t.follow,this.dot=!!t.dot,this.dotRelative=!!t.dotRelative,this.nodir=!!t.nodir,this.mark=!!t.mark,t.cwd?(t.cwd instanceof URL||t.cwd.startsWith("file://"))&&(t.cwd=VO(t.cwd)):this.cwd="",this.cwd=t.cwd||"",this.root=t.root,this.magicalBraces=!!t.magicalBraces,this.nobrace=!!t.nobrace,this.noext=!!t.noext,this.realpath=!!t.realpath,this.absolute=t.absolute,this.includeChildMatches=t.includeChildMatches!==!1,this.noglobstar=!!t.noglobstar,this.matchBase=!!t.matchBase,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:1/0,this.stat=!!t.stat,this.ignore=t.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error("cannot set absolute and withFileTypes:true");if(typeof e=="string"&&(e=[e]),this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(e=e.map(l=>l.replace(/\\/g,"/"))),this.matchBase){if(t.noglobstar)throw new TypeError("base matching requires globstar");e=e.map(l=>l.includes("/")?l:`./**/${l}`)}if(this.pattern=e,this.platform=t.platform||qO,this.opts={...t,platform:this.platform},t.scurry){if(this.scurry=t.scurry,t.nocase!==void 0&&t.nocase!==t.scurry.nocase)throw new Error("nocase option contradicts provided scurry option")}else{let l=t.platform==="win32"?Go:t.platform==="darwin"?gs:t.platform?Vo:ow;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let r=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:r,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(l=>new Bt(l,o)),[s,a]=i.reduce((l,c)=>(l[0].push(...c.set),l[1].push(...c.globParts),l),[[],[]]);this.patterns=s.map((l,c)=>{let p=a[c];if(!p)throw new Error("invalid pattern object");return new qo(l,p,0,this.platform)})}async walk(){return[...await new Ss(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new Ss(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new ys(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new ys(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}};var Lp=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Bt(t,e).hasMagic())return!0;return!1};function xl(n,e={}){return new hn(n,e).streamSync()}function aw(n,e={}){return new hn(n,e).stream()}function Yo(n,e={}){return new hn(n,e).walkSync()}async function iw(n,e={}){return new hn(n,e).walk()}function Tl(n,e={}){return new hn(n,e).iterateSync()}function lw(n,e={}){return new hn(n,e).iterate()}var KO=xl,YO=Object.assign(aw,{sync:xl}),JO=Tl,XO=Object.assign(lw,{sync:Tl}),ZO=Object.assign(Yo,{stream:xl,iterate:Tl}),sw=Object.assign(iw,{glob:iw,globSync:Yo,sync:ZO,globStream:aw,stream:YO,globStreamSync:xl,streamSync:KO,globIterate:lw,iterate:XO,globIterateSync:Tl,iterateSync:JO,Glob:hn,hasMagic:Lp,escape:zo,unescape:pn});sw.glob=sw;import sk from"os";import pr,{dirname as uw}from"path";import{cwd as _p}from"process";import mw from"yaml";import{z as Te}from"zod";import cw from"fs";import El from"path";import QO from"yaml";import{z as Op}from"zod";var dw=!1,bs=[`**/*.${Nt.TEST}`,`**/*.${Nt.MODULE}`],kp=Op.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),Np=50,ek=Op.object({fileType:Op.nativeEnum(he)});function ke(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??bs,o=Array.from(n.config.exclude??[]).concat(kh),i=Yo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:Np,nodir:!0});for(let s of i)tk(n.rootDir,s,t,e);return dw=!0,t}function tk(n,e,t,r){let o=El.join(n,e),i;try{i=cw.readFileSync(o,"utf-8")}catch(d){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${d}`);return}let s;try{if(s=QO.parse(i),typeof s!="object"||s===null)throw new Error("The YAML document should parse as a map with key-value pairs")}catch(d){r.warn(`Could not parse possible Momentic file at ${o}, skipping: ${d}`);return}let a=ek.safeParse(s);if(a.error){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${a.error}`);return}let l=a.data.fileType,c;try{c=cw.statSync(o)}catch(d){r.warn(`Skipping path '${o}' because it could not be stat, skipping: ${d}`);return}let p={relativePath:e,fullFilePath:o,platformSep:El.sep,fullPathSegments:o.split(El.sep),fileName:El.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case he.TEST:try{let d=Kt.parse(s);if(t.tests[d.id]){let u=t.tests[d.id].fullFilePath;y.error(`Two tests with the same ID (${d.id}) were found in the same project. Please ensure that all test IDs are unique and avoid copying tests manually. Momentic will ignore the first test when resolving tests.
3563
+ >>> no match, partial?`,e,u,t,m),u===l))}let g;if(typeof p=="string"?(g=d===p,this.debug("string match",p,d,g)):(g=p.test(d),this.debug("pattern match",p,d,g)),!g)return!1}if(s===l&&a===c)return!0;if(s===l)return r;if(a===c)return s===l-1&&e[s]==="";throw new Error("wtf?")}braceExpand(){return Db(this.pattern,this.options)}parse(e){is(e);let t=this.options;if(e==="**")return st;if(e==="")return"";let r,o=null;(r=e.match(tO))?o=t.dot?rO:nO:(r=e.match(GL))?o=(t.nocase?t.dot?YL:KL:t.dot?qL:VL)(r[1]):(r=e.match(oO))?o=(t.nocase?t.dot?sO:iO:t.dot?aO:lO)(r):(r=e.match(JL))?o=t.dot?ZL:XL:(r=e.match(QL))&&(o=eO);let i=Bo.fromGlob(e,this.options).toMMPattern();return o&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:o}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let t=this.options,r=t.noglobstar?pO:t.dot?uO:mO,o=new Set(t.nocase?["i"]:[]),i=e.map(l=>{let c=l.map(p=>{if(p instanceof RegExp)for(let d of p.flags.split(""))o.add(d);return typeof p=="string"?yO(p):p===st?st:p._src});return c.forEach((p,d)=>{let u=c[d+1],m=c[d-1];p!==st||m===st||(m===void 0?u!==void 0&&u!==st?c[d+1]="(?:\\/|"+r+"\\/)?"+u:c[d]=r:u===void 0?c[d-1]=m+"(?:\\/|"+r+")?":u!==st&&(c[d-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[d+1]=st))}),c.filter(p=>p!==st).join("/")}).join("|"),[s,a]=e.length>1?["(?:",")"]:["",""];i="^"+s+i+a+"$",this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...o].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&t)return!0;let r=this.options;this.isWindows&&(e=e.split("\\").join("/"));let o=this.slashSplit(e);this.debug(this.pattern,"split",o);let i=this.set;this.debug(this.pattern,"set",i);let s=o[o.length-1];if(!s)for(let a=o.length-2;!s&&a>=0;a--)s=o[a];for(let a=0;a<i.length;a++){let l=i[a],c=o;if(r.matchBase&&l.length===1&&(c=[s]),this.matchOne(c,l,t))return r.flipNegate?!0:!this.negate}return r.flipNegate?!1:this.negate}static defaults(e){return vt.defaults(e).Minimatch}};vt.AST=Bo;vt.Minimatch=Bt;vt.escape=zo;vt.unescape=pn;import{fileURLToPath as JO}from"node:url";var jo=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,Bb=new Set,gp=typeof process=="object"&&process?process:{},zb=(n,e,t,r)=>{typeof gp.emitWarning=="function"?gp.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},al=globalThis.AbortController,Ub=globalThis.AbortSignal;if(typeof al>"u"){Ub=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},al=class{constructor(){e()}signal=new Ub;abort(r){if(!this.signal.aborted){this.signal.reason=r,this.signal.aborted=!0;for(let o of this.signal._onabort)o(r);this.signal.onabort?.(r)}}};let n=gp.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,zb("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}var bO=n=>!Bb.has(n),Die=Symbol("type"),lr=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),jb=n=>lr(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?Ho:null:null,Ho=class extends Array{constructor(e){super(e),this.fill(0)}},fp=class n{heap;length;static#e=!1;static create(e){let t=jb(e);if(!t)return[];n.#e=!0;let r=new n(e,t);return n.#e=!1,r}constructor(e,t){if(!n.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},as=class n{#e;#t;#i;#r;#s;#w;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#p;#a;#l;#o;#f;#S;#m;#u;#T;#g;#E;#C;#b;#v;#x;#h;static unsafeExposeInternals(e){return{starts:e.#C,ttls:e.#b,sizes:e.#E,keyMap:e.#a,keyList:e.#l,valList:e.#o,next:e.#f,prev:e.#S,get head(){return e.#m},get tail(){return e.#u},free:e.#T,isBackgroundFetch:t=>e.#d(t),backgroundFetch:(t,r,o,i)=>e.#U(t,r,o,i),moveToTail:t=>e.#z(t),indexes:t=>e.#A(t),rindexes:t=>e.#I(t),isStale:t=>e.#y(t)}}get max(){return this.#e}get maxSize(){return this.#t}get calculatedSize(){return this.#p}get size(){return this.#c}get fetchMethod(){return this.#s}get memoMethod(){return this.#w}get dispose(){return this.#i}get disposeAfter(){return this.#r}constructor(e){let{max:t=0,ttl:r,ttlResolution:o=1,ttlAutopurge:i,updateAgeOnGet:s,updateAgeOnHas:a,allowStale:l,dispose:c,disposeAfter:p,noDisposeOnSet:d,noUpdateTTL:u,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:g,fetchMethod:f,memoMethod:S,noDeleteOnFetchRejection:x,noDeleteOnStaleGet:b,allowStaleOnFetchRejection:w,allowStaleOnFetchAbort:E,ignoreFetchAbort:C}=e;if(t!==0&&!lr(t))throw new TypeError("max option must be a nonnegative integer");let I=t?jb(t):Array;if(!I)throw new Error("invalid max value: "+t);if(this.#e=t,this.#t=m,this.maxEntrySize=h||this.#t,this.sizeCalculation=g,this.sizeCalculation){if(!this.#t&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#w=S,f!==void 0&&typeof f!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#s=f,this.#x=!!f,this.#a=new Map,this.#l=new Array(t).fill(void 0),this.#o=new Array(t).fill(void 0),this.#f=new I(t),this.#S=new I(t),this.#m=0,this.#u=0,this.#T=fp.create(t),this.#c=0,this.#p=0,typeof c=="function"&&(this.#i=c),typeof p=="function"?(this.#r=p,this.#g=[]):(this.#r=void 0,this.#g=void 0),this.#v=!!this.#i,this.#h=!!this.#r,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!x,this.allowStaleOnFetchRejection=!!w,this.allowStaleOnFetchAbort=!!E,this.ignoreFetchAbort=!!C,this.maxEntrySize!==0){if(this.#t!==0&&!lr(this.#t))throw new TypeError("maxSize must be a positive integer if specified");if(!lr(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#L()}if(this.allowStale=!!l,this.noDeleteOnStaleGet=!!b,this.updateAgeOnGet=!!s,this.updateAgeOnHas=!!a,this.ttlResolution=lr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=r||0,this.ttl){if(!lr(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#P()}if(this.#e===0&&this.ttl===0&&this.#t===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#e&&!this.#t){let N="LRU_CACHE_UNBOUNDED";bO(N)&&(Bb.add(N),zb("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",N,n))}}getRemainingTTL(e){return this.#a.has(e)?1/0:0}#P(){let e=new Ho(this.#e),t=new Ho(this.#e);this.#b=e,this.#C=t,this.#k=(i,s,a=jo.now())=>{if(t[i]=s!==0?a:0,e[i]=s,s!==0&&this.ttlAutopurge){let l=setTimeout(()=>{this.#y(i)&&this.#O(this.#l[i],"expire")},s+1);l.unref&&l.unref()}},this.#R=i=>{t[i]=e[i]!==0?jo.now():0},this.#n=(i,s)=>{if(e[s]){let a=e[s],l=t[s];if(!a||!l)return;i.ttl=a,i.start=l,i.now=r||o();let c=i.now-l;i.remainingTTL=a-c}};let r=0,o=()=>{let i=jo.now();if(this.ttlResolution>0){r=i;let s=setTimeout(()=>r=0,this.ttlResolution);s.unref&&s.unref()}return i};this.getRemainingTTL=i=>{let s=this.#a.get(i);if(s===void 0)return 0;let a=e[s],l=t[s];if(!a||!l)return 1/0;let c=(r||o())-l;return a-c},this.#y=i=>{let s=t[i],a=e[i];return!!a&&!!s&&(r||o())-s>a}}#R=()=>{};#n=()=>{};#k=()=>{};#y=()=>!1;#L(){let e=new Ho(this.#e);this.#p=0,this.#E=e,this.#N=t=>{this.#p-=e[t],e[t]=0},this.#M=(t,r,o,i)=>{if(this.#d(r))return 0;if(!lr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(r,t),!lr(o))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return o},this.#_=(t,r,o)=>{if(e[t]=r,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#D(!0)}this.#p+=e[t],o&&(o.entrySize=r,o.totalCalculatedSize=this.#p)}}#N=e=>{};#_=(e,t,r)=>{};#M=(e,t,r,o)=>{if(r||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#u;!(!this.#F(t)||((e||!this.#y(t))&&(yield t),t===this.#m));)t=this.#S[t]}*#I({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#m;!(!this.#F(t)||((e||!this.#y(t))&&(yield t),t===this.#u));)t=this.#f[t]}#F(e){return e!==void 0&&this.#a.get(this.#l[e])===e}*entries(){for(let e of this.#A())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*rentries(){for(let e of this.#I())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*keys(){for(let e of this.#A()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*rkeys(){for(let e of this.#I()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*values(){for(let e of this.#A())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}*rvalues(){for(let e of this.#I())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#l[r],this))return this.get(this.#l[r],t)}}forEach(e,t=this){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}rforEach(e,t=this){for(let r of this.#I()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}purgeStale(){let e=!1;for(let t of this.#I({allowStale:!0}))this.#y(t)&&(this.#O(this.#l[t],"expire"),e=!0);return e}info(e){let t=this.#a.get(e);if(t===void 0)return;let r=this.#o[t],o=this.#d(r)?r.__staleWhileFetching:r;if(o===void 0)return;let i={value:o};if(this.#b&&this.#C){let s=this.#b[t],a=this.#C[t];if(s&&a){let l=s-(jo.now()-a);i.ttl=l,i.start=Date.now()}}return this.#E&&(i.size=this.#E[t]),i}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let r=this.#l[t],o=this.#o[t],i=this.#d(o)?o.__staleWhileFetching:o;if(i===void 0||r===void 0)continue;let s={value:i};if(this.#b&&this.#C){s.ttl=this.#b[t];let a=jo.now()-this.#C[t];s.start=Math.floor(Date.now()-a)}this.#E&&(s.size=this.#E[t]),e.unshift([r,s])}return e}load(e){this.clear();for(let[t,r]of e){if(r.start){let o=Date.now()-r.start;r.start=jo.now()-o}this.set(t,r.value,r)}}set(e,t,r={}){if(t===void 0)return this.delete(e),this;let{ttl:o=this.ttl,start:i,noDisposeOnSet:s=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:l}=r,{noUpdateTTL:c=this.noUpdateTTL}=r,p=this.#M(e,t,r.size||0,a);if(this.maxEntrySize&&p>this.maxEntrySize)return l&&(l.set="miss",l.maxEntrySizeExceeded=!0),this.#O(e,"set"),this;let d=this.#c===0?void 0:this.#a.get(e);if(d===void 0)d=this.#c===0?this.#u:this.#T.length!==0?this.#T.pop():this.#c===this.#e?this.#D(!1):this.#c,this.#l[d]=e,this.#o[d]=t,this.#a.set(e,d),this.#f[this.#u]=d,this.#S[d]=this.#u,this.#u=d,this.#c++,this.#_(d,p,l),l&&(l.set="add"),c=!1;else{this.#z(d);let u=this.#o[d];if(t!==u){if(this.#x&&this.#d(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:m}=u;m!==void 0&&!s&&(this.#v&&this.#i?.(m,e,"set"),this.#h&&this.#g?.push([m,e,"set"]))}else s||(this.#v&&this.#i?.(u,e,"set"),this.#h&&this.#g?.push([u,e,"set"]));if(this.#N(d),this.#_(d,p,l),this.#o[d]=t,l){l.set="replace";let m=u&&this.#d(u)?u.__staleWhileFetching:u;m!==void 0&&(l.oldValue=m)}}else l&&(l.set="update")}if(o!==0&&!this.#b&&this.#P(),this.#b&&(c||this.#k(d,o,i),l&&this.#n(l,d)),!s&&this.#h&&this.#g){let u=this.#g,m;for(;m=u?.shift();)this.#r?.(...m)}return this}pop(){try{for(;this.#c;){let e=this.#o[this.#m];if(this.#D(!0),this.#d(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#h&&this.#g){let e=this.#g,t;for(;t=e?.shift();)this.#r?.(...t)}}}#D(e){let t=this.#m,r=this.#l[t],o=this.#o[t];return this.#x&&this.#d(o)?o.__abortController.abort(new Error("evicted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(o,r,"evict"),this.#h&&this.#g?.push([o,r,"evict"])),this.#N(t),e&&(this.#l[t]=void 0,this.#o[t]=void 0,this.#T.push(t)),this.#c===1?(this.#m=this.#u=0,this.#T.length=0):this.#m=this.#f[t],this.#a.delete(r),this.#c--,t}has(e,t={}){let{updateAgeOnHas:r=this.updateAgeOnHas,status:o}=t,i=this.#a.get(e);if(i!==void 0){let s=this.#o[i];if(this.#d(s)&&s.__staleWhileFetching===void 0)return!1;if(this.#y(i))o&&(o.has="stale",this.#n(o,i));else return r&&this.#R(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,t={}){let{allowStale:r=this.allowStale}=t,o=this.#a.get(e);if(o===void 0||!r&&this.#y(o))return;let i=this.#o[o];return this.#d(i)?i.__staleWhileFetching:i}#U(e,t,r,o){let i=t===void 0?void 0:this.#o[t];if(this.#d(i))return i;let s=new al,{signal:a}=r;a?.addEventListener("abort",()=>s.abort(a.reason),{signal:s.signal});let l={signal:s.signal,options:r,context:o},c=(g,f=!1)=>{let{aborted:S}=s.signal,x=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=s.signal.reason,x&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!x&&!f)return d(s.signal.reason);let b=m;return this.#o[t]===m&&(g===void 0?b.__staleWhileFetching?this.#o[t]=b.__staleWhileFetching:this.#O(e,"fetch"):(r.status&&(r.status.fetchUpdated=!0),this.set(e,g,l.options))),g},p=g=>(r.status&&(r.status.fetchRejected=!0,r.status.fetchError=g),d(g)),d=g=>{let{aborted:f}=s.signal,S=f&&r.allowStaleOnFetchAbort,x=S||r.allowStaleOnFetchRejection,b=x||r.noDeleteOnFetchRejection,w=m;if(this.#o[t]===m&&(!b||w.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=w.__staleWhileFetching)),x)return r.status&&w.__staleWhileFetching!==void 0&&(r.status.returnedStale=!0),w.__staleWhileFetching;if(w.__returned===w)throw g},u=(g,f)=>{let S=this.#s?.(e,i,l);S&&S instanceof Promise&&S.then(x=>g(x===void 0?void 0:x),f),s.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=x=>c(x,!0)))})};r.status&&(r.status.fetchDispatched=!0);let m=new Promise(u).then(c,p),h=Object.assign(m,{__abortController:s,__staleWhileFetching:i,__returned:void 0});return t===void 0?(this.set(e,h,{...l.options,status:void 0}),t=this.#a.get(e)):this.#o[t]=h,h}#d(e){if(!this.#x)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof al}async fetch(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:s=this.ttl,noDisposeOnSet:a=this.noDisposeOnSet,size:l=0,sizeCalculation:c=this.sizeCalculation,noUpdateTTL:p=this.noUpdateTTL,noDeleteOnFetchRejection:d=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:g,forceRefresh:f=!1,status:S,signal:x}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let b={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:s,noDisposeOnSet:a,size:l,sizeCalculation:c,noUpdateTTL:p,noDeleteOnFetchRejection:d,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:x},w=this.#a.get(e);if(w===void 0){S&&(S.fetch="miss");let E=this.#U(e,w,b,g);return E.__returned=E}else{let E=this.#o[w];if(this.#d(E)){let D=r&&E.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",D&&(S.returnedStale=!0)),D?E.__staleWhileFetching:E.__returned=E}let C=this.#y(w);if(!f&&!C)return S&&(S.fetch="hit"),this.#z(w),o&&this.#R(w),S&&this.#n(S,w),E;let I=this.#U(e,w,b,g),P=I.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",P&&C&&(S.returnedStale=!0)),P?I.__staleWhileFetching:I.__returned=I}}async forceFetch(e,t={}){let r=await this.fetch(e,t);if(r===void 0)throw new Error("fetch() returned undefined");return r}memo(e,t={}){let r=this.#w;if(!r)throw new Error("no memoMethod provided to constructor");let{context:o,forceRefresh:i,...s}=t,a=this.get(e,s);if(!i&&a!==void 0)return a;let l=r(e,a,{options:s,context:o});return this.set(e,l,s),l}get(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:s}=t,a=this.#a.get(e);if(a!==void 0){let l=this.#o[a],c=this.#d(l);return s&&this.#n(s,a),this.#y(a)?(s&&(s.get="stale"),c?(s&&r&&l.__staleWhileFetching!==void 0&&(s.returnedStale=!0),r?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),s&&r&&(s.returnedStale=!0),r?l:void 0)):(s&&(s.get="hit"),c?l.__staleWhileFetching:(this.#z(a),o&&this.#R(a),l))}else s&&(s.get="miss")}#B(e,t){this.#S[t]=e,this.#f[e]=t}#z(e){e!==this.#u&&(e===this.#m?this.#m=this.#f[e]:this.#B(this.#S[e],this.#f[e]),this.#B(this.#u,e),this.#u=e)}delete(e){return this.#O(e,"delete")}#O(e,t){let r=!1;if(this.#c!==0){let o=this.#a.get(e);if(o!==void 0)if(r=!0,this.#c===1)this.#j(t);else{this.#N(o);let i=this.#o[o];if(this.#d(i)?i.__abortController.abort(new Error("deleted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(i,e,t),this.#h&&this.#g?.push([i,e,t])),this.#a.delete(e),this.#l[o]=void 0,this.#o[o]=void 0,o===this.#u)this.#u=this.#S[o];else if(o===this.#m)this.#m=this.#f[o];else{let s=this.#S[o];this.#f[s]=this.#f[o];let a=this.#f[o];this.#S[a]=this.#S[o]}this.#c--,this.#T.push(o)}}if(this.#h&&this.#g?.length){let o=this.#g,i;for(;i=o?.shift();)this.#r?.(...i)}return r}clear(){return this.#j("delete")}#j(e){for(let t of this.#I({allowStale:!0})){let r=this.#o[t];if(this.#d(r))r.__abortController.abort(new Error("deleted"));else{let o=this.#l[t];this.#v&&this.#i?.(r,o,e),this.#h&&this.#g?.push([r,o,e])}}if(this.#a.clear(),this.#o.fill(void 0),this.#l.fill(void 0),this.#b&&this.#C&&(this.#b.fill(0),this.#C.fill(0)),this.#E&&this.#E.fill(0),this.#m=0,this.#u=0,this.#T.length=0,this.#p=0,this.#c=0,this.#h&&this.#g){let t=this.#g,r;for(;r=t?.shift();)this.#r?.(...r)}}};import{posix as LO,win32 as Rp}from"node:path";import{fileURLToPath as OO}from"node:url";import{lstatSync as kO,readdir as NO,readdirSync as _O,readlinkSync as MO,realpathSync as FO}from"fs";import*as DO from"node:fs";import{lstat as BO,readdir as zO,readlink as jO,realpath as HO}from"node:fs/promises";import{EventEmitter as Tp}from"node:events";import Vb from"node:stream";import{StringDecoder as wO}from"node:string_decoder";var Hb=typeof process=="object"&&process?process:{stdout:null,stderr:null},vO=n=>!!n&&typeof n=="object"&&(n instanceof dr||n instanceof Vb||xO(n)||TO(n)),xO=n=>!!n&&typeof n=="object"&&n instanceof Tp&&typeof n.pipe=="function"&&n.pipe!==Vb.Writable.prototype.pipe,TO=n=>!!n&&typeof n=="object"&&n instanceof Tp&&typeof n.write=="function"&&typeof n.end=="function",Bn=Symbol("EOF"),zn=Symbol("maybeEmitEnd"),cr=Symbol("emittedEnd"),ll=Symbol("emittingEnd"),ls=Symbol("emittedError"),cl=Symbol("closed"),$b=Symbol("read"),dl=Symbol("flush"),Wb=Symbol("flushChunk"),un=Symbol("encoding"),$o=Symbol("decoder"),Ze=Symbol("flowing"),cs=Symbol("paused"),Wo=Symbol("resume"),Qe=Symbol("buffer"),xt=Symbol("pipes"),et=Symbol("bufferLength"),Sp=Symbol("bufferPush"),pl=Symbol("bufferShift"),ht=Symbol("objectMode"),Fe=Symbol("destroyed"),yp=Symbol("error"),bp=Symbol("emitData"),Gb=Symbol("emitEnd"),wp=Symbol("emitEnd2"),An=Symbol("async"),vp=Symbol("abort"),ul=Symbol("aborted"),ds=Symbol("signal"),Kr=Symbol("dataListeners"),zt=Symbol("discarded"),ps=n=>Promise.resolve().then(n),EO=n=>n(),CO=n=>n==="end"||n==="finish"||n==="prefinish",RO=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,AO=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),ml=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[Wo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},xp=class extends ml{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,r){super(e,t,r),this.proxyErrors=o=>t.emit("error",o),e.on("error",this.proxyErrors)}},IO=n=>!!n.objectMode,PO=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",dr=class extends Tp{[Ze]=!1;[cs]=!1;[xt]=[];[Qe]=[];[ht];[un];[An];[$o];[Bn]=!1;[cr]=!1;[ll]=!1;[cl]=!1;[ls]=null;[et]=0;[Fe]=!1;[ds];[ul]=!1;[Kr]=0;[zt]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");IO(t)?(this[ht]=!0,this[un]=null):PO(t)?(this[un]=t.encoding,this[ht]=!1):(this[ht]=!1,this[un]=null),this[An]=!!t.async,this[$o]=this[un]?new wO(this[un]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[Qe]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[xt]});let{signal:r}=t;r&&(this[ds]=r,r.aborted?this[vp]():r.addEventListener("abort",()=>this[vp]()))}get bufferLength(){return this[et]}get encoding(){return this[un]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[ht]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[An]}set async(e){this[An]=this[An]||!!e}[vp](){this[ul]=!0,this.emit("abort",this[ds]?.reason),this.destroy(this[ds]?.reason)}get aborted(){return this[ul]}set aborted(e){}write(e,t,r){if(this[ul])return!1;if(this[Bn])throw new Error("write after end");if(this[Fe])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(r=t,t="utf8"),t||(t="utf8");let o=this[An]?ps:EO;if(!this[ht]&&!Buffer.isBuffer(e)){if(AO(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(RO(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[ht]?(this[Ze]&&this[et]!==0&&this[dl](!0),this[Ze]?this.emit("data",e):this[Sp](e),this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze]):e.length?(typeof e=="string"&&!(t===this[un]&&!this[$o]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[un]&&(e=this[$o].write(e)),this[Ze]&&this[et]!==0&&this[dl](!0),this[Ze]?this.emit("data",e):this[Sp](e),this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze]):(this[et]!==0&&this.emit("readable"),r&&o(r),this[Ze])}read(e){if(this[Fe])return null;if(this[zt]=!1,this[et]===0||e===0||e&&e>this[et])return this[zn](),null;this[ht]&&(e=null),this[Qe].length>1&&!this[ht]&&(this[Qe]=[this[un]?this[Qe].join(""):Buffer.concat(this[Qe],this[et])]);let t=this[$b](e||null,this[Qe][0]);return this[zn](),t}[$b](e,t){if(this[ht])this[pl]();else{let r=t;e===r.length||e===null?this[pl]():typeof r=="string"?(this[Qe][0]=r.slice(e),t=r.slice(0,e),this[et]-=e):(this[Qe][0]=r.subarray(e),t=r.subarray(0,e),this[et]-=e)}return this.emit("data",t),!this[Qe].length&&!this[Bn]&&this.emit("drain"),t}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t="utf8"),e!==void 0&&this.write(e,t),r&&this.once("end",r),this[Bn]=!0,this.writable=!1,(this[Ze]||!this[cs])&&this[zn](),this}[Wo](){this[Fe]||(!this[Kr]&&!this[xt].length&&(this[zt]=!0),this[cs]=!1,this[Ze]=!0,this.emit("resume"),this[Qe].length?this[dl]():this[Bn]?this[zn]():this.emit("drain"))}resume(){return this[Wo]()}pause(){this[Ze]=!1,this[cs]=!0,this[zt]=!1}get destroyed(){return this[Fe]}get flowing(){return this[Ze]}get paused(){return this[cs]}[Sp](e){this[ht]?this[et]+=1:this[et]+=e.length,this[Qe].push(e)}[pl](){return this[ht]?this[et]-=1:this[et]-=this[Qe][0].length,this[Qe].shift()}[dl](e=!1){do;while(this[Wb](this[pl]())&&this[Qe].length);!e&&!this[Qe].length&&!this[Bn]&&this.emit("drain")}[Wb](e){return this.emit("data",e),this[Ze]}pipe(e,t){if(this[Fe])return e;this[zt]=!1;let r=this[cr];return t=t||{},e===Hb.stdout||e===Hb.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[xt].push(t.proxyErrors?new xp(this,e,t):new ml(this,e,t)),this[An]?ps(()=>this[Wo]()):this[Wo]()),e}unpipe(e){let t=this[xt].find(r=>r.dest===e);t&&(this[xt].length===1?(this[Ze]&&this[Kr]===0&&(this[Ze]=!1),this[xt]=[]):this[xt].splice(this[xt].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let r=super.on(e,t);if(e==="data")this[zt]=!1,this[Kr]++,!this[xt].length&&!this[Ze]&&this[Wo]();else if(e==="readable"&&this[et]!==0)super.emit("readable");else if(CO(e)&&this[cr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ls]){let o=t;this[An]?ps(()=>o.call(this,this[ls])):o.call(this,this[ls])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Kr]=this.listeners("data").length,this[Kr]===0&&!this[zt]&&!this[xt].length&&(this[Ze]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Kr]=0,!this[zt]&&!this[xt].length&&(this[Ze]=!1)),t}get emittedEnd(){return this[cr]}[zn](){!this[ll]&&!this[cr]&&!this[Fe]&&this[Qe].length===0&&this[Bn]&&(this[ll]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[cl]&&this.emit("close"),this[ll]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==Fe&&this[Fe])return!1;if(e==="data")return!this[ht]&&!r?!1:this[An]?(ps(()=>this[bp](r)),!0):this[bp](r);if(e==="end")return this[Gb]();if(e==="close"){if(this[cl]=!0,!this[cr]&&!this[Fe])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[ls]=r,super.emit(yp,r);let i=!this[ds]||this.listeners("error").length?super.emit("error",r):!1;return this[zn](),i}else if(e==="resume"){let i=super.emit("resume");return this[zn](),i}else if(e==="finish"||e==="prefinish"){let i=super.emit(e);return this.removeAllListeners(e),i}let o=super.emit(e,...t);return this[zn](),o}[bp](e){for(let r of this[xt])r.dest.write(e)===!1&&this.pause();let t=this[zt]?!1:super.emit("data",e);return this[zn](),t}[Gb](){return this[cr]?!1:(this[cr]=!0,this.readable=!1,this[An]?(ps(()=>this[wp]()),!0):this[wp]())}[wp](){if(this[$o]){let t=this[$o].end();if(t){for(let r of this[xt])r.dest.write(t);this[zt]||super.emit("data",t)}}for(let t of this[xt])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[ht]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[ht]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[ht])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[un]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(Fe,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[zt]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let o=this.read();if(o!==null)return Promise.resolve({done:!1,value:o});if(this[Bn])return t();let i,s,a=d=>{this.off("data",l),this.off("end",c),this.off(Fe,p),t(),s(d)},l=d=>{this.off("error",a),this.off("end",c),this.off(Fe,p),this.pause(),i({value:d,done:!!this[Bn]})},c=()=>{this.off("error",a),this.off("data",l),this.off(Fe,p),t(),i({done:!0,value:void 0})},p=()=>a(new Error("stream destroyed"));return new Promise((d,u)=>{s=u,i=d,this.once(Fe,p),this.once("error",a),this.once("end",c),this.once("data",l)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[zt]=!1;let e=!1,t=()=>(this.pause(),this.off(yp,t),this.off(Fe,t),this.off("end",t),e=!0,{done:!0,value:void 0}),r=()=>{if(e)return t();let o=this.read();return o===null?t():{done:!1,value:o}};return this.once("end",t),this.once(yp,t),this.once(Fe,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[Fe])return e?this.emit("error",e):this.emit(Fe),this;this[Fe]=!0,this[zt]=!0,this[Qe].length=0,this[et]=0;let t=this;return typeof t.close=="function"&&!this[cl]&&t.close(),e?this.emit("error",e):this.emit(Fe),this}static get isStream(){return vO}};var UO=FO.native,ms={lstatSync:kO,readdir:NO,readdirSync:_O,readlinkSync:MO,realpathSync:UO,promises:{lstat:BO,readdir:zO,readlink:jO,realpath:HO}},Xb=n=>!n||n===ms||n===DO?ms:{...ms,...n,promises:{...ms.promises,...n.promises||{}}},Zb=/^\\\\\?\\([a-z]:)\\?$/i,$O=n=>n.replace(/\//g,"\\").replace(Zb,"$1\\"),WO=/[\\\/]/,Qt=0,Qb=1,ew=2,In=4,tw=6,nw=8,Yr=10,rw=12,Zt=15,us=~Zt,Ep=16,qb=32,hs=64,mn=128,hl=256,fl=512,Kb=hs|mn|fl,GO=1023,Cp=n=>n.isFile()?nw:n.isDirectory()?In:n.isSymbolicLink()?Yr:n.isCharacterDevice()?ew:n.isBlockDevice()?tw:n.isSocket()?rw:n.isFIFO()?Qb:Qt,Yb=new Map,gs=n=>{let e=Yb.get(n);if(e)return e;let t=n.normalize("NFKD");return Yb.set(n,t),t},Jb=new Map,gl=n=>{let e=Jb.get(n);if(e)return e;let t=gs(n.toLowerCase());return Jb.set(n,t),t},Sl=class extends as{constructor(){super({max:256})}},Ap=class extends as{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},ow=Symbol("PathScurry setAsCwd"),gt=class{name;root;roots;parent;nocase;isCWD=!1;#e;#t;get dev(){return this.#t}#i;get mode(){return this.#i}#r;get nlink(){return this.#r}#s;get uid(){return this.#s}#w;get gid(){return this.#w}#c;get rdev(){return this.#c}#p;get blksize(){return this.#p}#a;get ino(){return this.#a}#l;get size(){return this.#l}#o;get blocks(){return this.#o}#f;get atimeMs(){return this.#f}#S;get mtimeMs(){return this.#S}#m;get ctimeMs(){return this.#m}#u;get birthtimeMs(){return this.#u}#T;get atime(){return this.#T}#g;get mtime(){return this.#g}#E;get ctime(){return this.#E}#C;get birthtime(){return this.#C}#b;#v;#x;#h;#P;#R;#n;#k;#y;#L;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(e,t=Qt,r,o,i,s,a){this.name=e,this.#b=i?gl(e):gs(e),this.#n=t&GO,this.nocase=i,this.roots=o,this.root=r||this,this.#k=s,this.#x=a.fullpath,this.#P=a.relative,this.#R=a.relativePosix,this.parent=a.parent,this.parent?this.#e=this.parent.#e:this.#e=Xb(a.fs)}depth(){return this.#v!==void 0?this.#v:this.parent?this.#v=this.parent.depth()+1:this.#v=0}childrenCache(){return this.#k}resolve(e){if(!e)return this;let t=this.getRootString(e),o=e.substring(t.length).split(this.splitSep);return t?this.getRoot(t).#N(o):this.#N(o)}#N(e){let t=this;for(let r of e)t=t.child(r);return t}children(){let e=this.#k.get(this);if(e)return e;let t=Object.assign([],{provisional:0});return this.#k.set(this,t),this.#n&=~Ep,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?gl(e):gs(e);for(let l of r)if(l.#b===o)return l;let i=this.parent?this.sep:"",s=this.#x?this.#x+i+e:void 0,a=this.newChild(e,Qt,{...t,parent:this,fullpath:s});return this.canReaddir()||(a.#n|=mn),r.push(a),a}relative(){if(this.isCWD)return"";if(this.#P!==void 0)return this.#P;let e=this.name,t=this.parent;if(!t)return this.#P=this.name;let r=t.relative();return r+(!r||!t.parent?"":this.sep)+e}relativePosix(){if(this.sep==="/")return this.relative();if(this.isCWD)return"";if(this.#R!==void 0)return this.#R;let e=this.name,t=this.parent;if(!t)return this.#R=this.fullpathPosix();let r=t.relativePosix();return r+(!r||!t.parent?"":"/")+e}fullpath(){if(this.#x!==void 0)return this.#x;let e=this.name,t=this.parent;if(!t)return this.#x=this.name;let o=t.fullpath()+(t.parent?this.sep:"")+e;return this.#x=o}fullpathPosix(){if(this.#h!==void 0)return this.#h;if(this.sep==="/")return this.#h=this.fullpath();if(!this.parent){let o=this.fullpath().replace(/\\/g,"/");return/^[a-z]:\//i.test(o)?this.#h=`//?/${o}`:this.#h=o}let e=this.parent,t=e.fullpathPosix(),r=t+(!t||!e.parent?"":"/")+this.name;return this.#h=r}isUnknown(){return(this.#n&Zt)===Qt}isType(e){return this[`is${e}`]()}getType(){return this.isUnknown()?"Unknown":this.isDirectory()?"Directory":this.isFile()?"File":this.isSymbolicLink()?"SymbolicLink":this.isFIFO()?"FIFO":this.isCharacterDevice()?"CharacterDevice":this.isBlockDevice()?"BlockDevice":this.isSocket()?"Socket":"Unknown"}isFile(){return(this.#n&Zt)===nw}isDirectory(){return(this.#n&Zt)===In}isCharacterDevice(){return(this.#n&Zt)===ew}isBlockDevice(){return(this.#n&Zt)===tw}isFIFO(){return(this.#n&Zt)===Qb}isSocket(){return(this.#n&Zt)===rw}isSymbolicLink(){return(this.#n&Yr)===Yr}lstatCached(){return this.#n&qb?this:void 0}readlinkCached(){return this.#y}realpathCached(){return this.#L}readdirCached(){let e=this.children();return e.slice(0,e.provisional)}canReadlink(){if(this.#y)return!0;if(!this.parent)return!1;let e=this.#n&Zt;return!(e!==Qt&&e!==Yr||this.#n&hl||this.#n&mn)}calledReaddir(){return!!(this.#n&Ep)}isENOENT(){return!!(this.#n&mn)}isNamed(e){return this.nocase?this.#b===gl(e):this.#b===gs(e)}async readlink(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=await this.#e.promises.readlink(this.fullpath()),r=(await this.parent.realpath())?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}readlinkSync(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=this.#e.readlinkSync(this.fullpath()),r=this.parent.realpathSync()?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}#_(e){this.#n|=Ep;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#M()}}#M(){this.#n&mn||(this.#n=(this.#n|mn)&us,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#M()}#I(){this.#n|=fl,this.#F()}#F(){if(this.#n&hs)return;let e=this.#n;(e&Zt)===In&&(e&=us),this.#n=e|hs,this.#A()}#D(e=""){e==="ENOTDIR"||e==="EPERM"?this.#F():e==="ENOENT"?this.#M():this.children().provisional=0}#U(e=""){e==="ENOTDIR"?this.parent.#F():e==="ENOENT"&&this.#M()}#d(e=""){let t=this.#n;t|=hl,e==="ENOENT"&&(t|=mn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=us),this.#n=t,e==="ENOTDIR"&&this.parent&&this.parent.#F()}#B(e,t){return this.#O(e,t)||this.#z(e,t)}#z(e,t){let r=Cp(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&Zt;return i!==In&&i!==Yr&&i!==Qt&&(o.#n|=hs),t.unshift(o),t.provisional++,o}#O(e,t){for(let r=t.provisional;r<t.length;r++){let o=t[r];if((this.nocase?gl(e.name):gs(e.name))===o.#b)return this.#j(e,o,r,t)}}#j(e,t,r,o){let i=t.name;return t.#n=t.#n&us|Cp(e),i!==e.name&&(t.name=e.name),r!==o.provisional&&(r===o.length-1?o.pop():o.splice(r,1),o.unshift(t)),o.provisional++,t}async lstat(){if(!(this.#n&mn))try{return this.#G(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#U(e.code)}}lstatSync(){if(!(this.#n&mn))try{return this.#G(this.#e.lstatSync(this.fullpath())),this}catch(e){this.#U(e.code)}}#G(e){let{atime:t,atimeMs:r,birthtime:o,birthtimeMs:i,blksize:s,blocks:a,ctime:l,ctimeMs:c,dev:p,gid:d,ino:u,mode:m,mtime:h,mtimeMs:g,nlink:f,rdev:S,size:x,uid:b}=e;this.#T=t,this.#f=r,this.#C=o,this.#u=i,this.#p=s,this.#o=a,this.#E=l,this.#m=c,this.#t=p,this.#w=d,this.#a=u,this.#i=m,this.#g=h,this.#S=g,this.#r=f,this.#c=S,this.#l=x,this.#s=b;let w=Cp(e);this.#n=this.#n&us|w|qb,w!==Qt&&w!==In&&w!==Yr&&(this.#n|=hs)}#$=[];#W=!1;#V(e){this.#W=!1;let t=this.#$.slice();this.#$.length=0,t.forEach(r=>r(null,e))}readdirCB(e,t=!1){if(!this.canReaddir()){t?e(null,[]):queueMicrotask(()=>e(null,[]));return}let r=this.children();if(this.calledReaddir()){let i=r.slice(0,r.provisional);t?e(null,i):queueMicrotask(()=>e(null,i));return}if(this.#$.push(e),this.#W)return;this.#W=!0;let o=this.fullpath();this.#e.readdir(o,{withFileTypes:!0},(i,s)=>{if(i)this.#D(i.code),r.provisional=0;else{for(let a of s)this.#B(a,r);this.#_(r)}this.#V(r.slice(0,r.provisional))})}#H;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();if(this.#H)await this.#H;else{let r=()=>{};this.#H=new Promise(o=>r=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#_(e)}catch(o){this.#D(o.code),e.provisional=0}this.#H=void 0,r()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();try{for(let r of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(r,e);this.#_(e)}catch(r){this.#D(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&Kb)return!1;let e=Zt&this.#n;return e===Qt||e===In||e===Yr}shouldWalk(e,t){return(this.#n&In)===In&&!(this.#n&Kb)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((fl|hl|mn)&this.#n))try{let e=await this.#e.promises.realpath(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}realpathSync(){if(this.#L)return this.#L;if(!((fl|hl|mn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[ow](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),r=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=r.join(this.sep),o.#R=r.join("/"),o=o.parent,r.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},yl=class n extends gt{sep="\\";splitSep=WO;constructor(e,t=Qt,r,o,i,s,a){super(e,t,r,o,i,s,a)}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}getRootString(e){return Rp.parse(e).root}getRoot(e){if(e=$O(e.toUpperCase()),e===this.root.name)return this.root;for(let[t,r]of Object.entries(this.roots))if(this.sameRoot(e,t))return this.roots[e]=r;return this.roots[e]=new Go(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(Zb,"$1\\"),e===t}},bl=class n extends gt{splitSep="/";sep="/";constructor(e,t=Qt,r,o,i,s,a){super(e,t,r,o,i,s,a)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}},wl=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:s=ms}={}){this.#r=Xb(s),(e instanceof URL||e.startsWith("file://"))&&(e=OO(e));let a=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(a),this.#e=new Sl,this.#t=new Sl,this.#i=new Ap(i);let l=a.substring(this.rootPath.length).split(r);if(l.length===1&&!l[0]&&l.pop(),o===void 0)throw new TypeError("must provide nocase setting to PathScurryBase ctor");this.nocase=o,this.root=this.newRoot(this.#r),this.roots[this.rootPath]=this.root;let c=this.root,p=l.length-1,d=t.sep,u=this.rootPath,m=!1;for(let h of l){let g=p--;c=c.child(h,{relative:new Array(g).fill("..").join(d),relativePosix:new Array(g).fill("..").join("/"),fullpath:u+=(m?"":d)+h}),m=!0}this.cwd=c}depth(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.depth()}childrenCache(){return this.#i}resolve(...e){let t="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))break}let r=this.#e.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpath();return this.#e.set(t,o),o}resolvePosix(...e){let t="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))break}let r=this.#t.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpathPosix();return this.#t.set(t,o),o}relative(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relative()}relativePosix(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relativePosix()}basename(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.name}dirname(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),(e.parent||e).fullpath()}async readdir(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r}=t;if(e.canReaddir()){let o=await e.readdir();return r?o:o.map(i=>i.name)}else return[]}readdirSync(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0}=t;return e.canReaddir()?r?e.readdirSync():e.readdirSync().map(o=>o.name):[]}async lstat(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstat()}lstatSync(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstatSync()}async readlink(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=await e.readlink();return t?r:r?.fullpath()}readlinkSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=e.readlinkSync();return t?r:r?.fullpath()}async realpath(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=await e.realpath();return t?r:r?.fullpath()}realpathSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e.withFileTypes,e=this.cwd);let r=e.realpathSync();return t?r:r?.fullpath()}async walk(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=[];(!i||i(e))&&a.push(r?e:e.fullpath());let l=new Set,c=(d,u)=>{l.add(d),d.readdirCB((m,h)=>{if(m)return u(m);let g=h.length;if(!g)return u();let f=()=>{--g===0&&u()};for(let S of h)(!i||i(S))&&a.push(r?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(x=>x?.isUnknown()?x.lstat():x).then(x=>x?.shouldWalk(l,s)?c(x,f):f()):S.shouldWalk(l,s)?c(S,f):f()},!0)},p=e;return new Promise((d,u)=>{c(p,m=>{if(m)return u(m);d(a)})})}walkSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=[];(!i||i(e))&&a.push(r?e:e.fullpath());let l=new Set([e]);for(let c of l){let p=c.readdirSync();for(let d of p){(!i||i(d))&&a.push(r?d:d.fullpath());let u=d;if(d.isSymbolicLink()){if(!(o&&(u=d.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(l,s)&&l.add(u)}}return a}[Symbol.asyncIterator](){return this.iterate()}iterate(e=this.cwd,t={}){return typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd),this.stream(e,t)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t;(!i||i(e))&&(yield r?e:e.fullpath());let a=new Set([e]);for(let l of a){let c=l.readdirSync();for(let p of c){(!i||i(p))&&(yield r?p:p.fullpath());let d=p;if(p.isSymbolicLink()){if(!(o&&(d=p.realpathSync())))continue;d.isUnknown()&&d.lstatSync()}d.shouldWalk(a,s)&&a.add(d)}}}stream(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=new dr({objectMode:!0});(!i||i(e))&&a.write(r?e:e.fullpath());let l=new Set,c=[e],p=0,d=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){p===0&&a.end();return}p++,l.add(m);let h=(f,S,x=!1)=>{if(f)return a.emit("error",f);if(o&&!x){let b=[];for(let w of S)w.isSymbolicLink()&&b.push(w.realpath().then(E=>E?.isUnknown()?E.lstat():E));if(b.length){Promise.all(b).then(()=>h(null,S,!0));return}}for(let b of S)b&&(!i||i(b))&&(a.write(r?b:b.fullpath())||(u=!0));p--;for(let b of S){let w=b.realpathCached()||b;w.shouldWalk(l,s)&&c.push(w)}u&&!a.flowing?a.once("drain",d):g||d()},g=!0;m.readdirCB(h,!0),g=!1}};return d(),a}streamSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof gt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:s}=t,a=new dr({objectMode:!0}),l=new Set;(!i||i(e))&&a.write(r?e:e.fullpath());let c=[e],p=0,d=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){p===0&&a.end();return}p++,l.add(m);let h=m.readdirSync();for(let g of h)(!i||i(g))&&(a.write(r?g:g.fullpath())||(u=!0));p--;for(let g of h){let f=g;if(g.isSymbolicLink()){if(!(o&&(f=g.realpathSync())))continue;f.isUnknown()&&f.lstatSync()}f.shouldWalk(l,s)&&c.push(f)}}u&&!a.flowing&&a.once("drain",d)};return d(),a}chdir(e=this.cwd){let t=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[ow](t)}},Go=class extends wl{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,Rp,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return Rp.parse(e).root.toUpperCase()}newRoot(e){return new yl(this.rootPath,In,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},Vo=class extends wl{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,LO,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new bl(this.rootPath,In,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},fs=class extends Vo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},Yie=process.platform==="win32"?yl:bl,iw=process.platform==="win32"?Go:process.platform==="darwin"?fs:Vo;var VO=n=>n.length>=1,qO=n=>n.length>=1,qo=class n{#e;#t;#i;length;#r;#s;#w;#c;#p;#a;#l=!0;constructor(e,t,r,o){if(!VO(e))throw new TypeError("empty pattern list");if(!qO(t))throw new TypeError("empty glob list");if(t.length!==e.length)throw new TypeError("mismatched pattern list and glob list lengths");if(this.length=e.length,r<0||r>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#t=t,this.#i=r,this.#r=o,this.#i===0){if(this.isUNC()){let[i,s,a,l,...c]=this.#e,[p,d,u,m,...h]=this.#t;c[0]===""&&(c.shift(),h.shift());let g=[i,s,a,l,""].join("/"),f=[p,d,u,m,""].join("/");this.#e=[g,...c],this.#t=[f,...h],this.length=this.#e.length}else if(this.isDrive()||this.isAbsolute()){let[i,...s]=this.#e,[a,...l]=this.#t;s[0]===""&&(s.shift(),l.shift());let c=i+"/",p=a+"/";this.#e=[c,...s],this.#t=[p,...l],this.length=this.#e.length}}}pattern(){return this.#e[this.#i]}isString(){return typeof this.#e[this.#i]=="string"}isGlobstar(){return this.#e[this.#i]===st}isRegExp(){return this.#e[this.#i]instanceof RegExp}globString(){return this.#w=this.#w||(this.#i===0?this.isAbsolute()?this.#t[0]+this.#t.slice(1).join("/"):this.#t.join("/"):this.#t.slice(this.#i).join("/"))}hasMore(){return this.length>this.#i+1}rest(){return this.#s!==void 0?this.#s:this.hasMore()?(this.#s=new n(this.#e,this.#t,this.#i+1,this.#r),this.#s.#a=this.#a,this.#s.#p=this.#p,this.#s.#c=this.#c,this.#s):this.#s=null}isUNC(){let e=this.#e;return this.#p!==void 0?this.#p:this.#p=this.#r==="win32"&&this.#i===0&&e[0]===""&&e[1]===""&&typeof e[2]=="string"&&!!e[2]&&typeof e[3]=="string"&&!!e[3]}isDrive(){let e=this.#e;return this.#c!==void 0?this.#c:this.#c=this.#r==="win32"&&this.#i===0&&this.length>1&&typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0])}isAbsolute(){let e=this.#e;return this.#a!==void 0?this.#a:this.#a=e[0]===""&&e.length>1||this.isDrive()||this.isUNC()}root(){let e=this.#e[0];return typeof e=="string"&&this.isAbsolute()&&this.#i===0?e:""}checkFollowGlobstar(){return!(this.#i===0||!this.isGlobstar()||!this.#l)}markFollowGlobstar(){return this.#i===0||!this.isGlobstar()||!this.#l?!1:(this.#l=!1,!0)}};var KO=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Ko=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:s=KO}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=s,this.mmopts={dot:!0,nobrace:t,nocase:r,noext:o,noglobstar:i,optimizationLevel:2,platform:s,nocomment:!0,nonegate:!0};for(let a of e)this.add(a)}add(e){let t=new Bt(e,this.mmopts);for(let r=0;r<t.set.length;r++){let o=t.set[r],i=t.globParts[r];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let s=new qo(o,i,0,this.platform),a=new Bt(s.globString(),this.mmopts),l=i[i.length-1]==="**",c=s.isAbsolute();c?this.absolute.push(a):this.relative.push(a),l&&(c?this.absoluteChildren.push(a):this.relativeChildren.push(a))}}ignored(e){let t=e.fullpath(),r=`${t}/`,o=e.relative()||".",i=`${o}/`;for(let s of this.relative)if(s.match(o)||s.match(i))return!0;for(let s of this.absolute)if(s.match(t)||s.match(r))return!0;return!1}childrenIgnored(e){let t=e.fullpath()+"/",r=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(r))return!0;for(let o of this.absoluteChildren)if(o.match(t))return!0;return!1}};var Ip=class n{store;constructor(e=new Map){this.store=e}copy(){return new n(new Map(this.store))}hasWalked(e,t){return this.store.get(e.fullpath())?.has(t.globString())}storeWalked(e,t){let r=e.fullpath(),o=this.store.get(r);o?o.add(t.globString()):this.store.set(r,new Set([t.globString()]))}},Pp=class{store=new Map;add(e,t,r){let o=(t?2:0)|(r?1:0),i=this.store.get(e);this.store.set(e,i===void 0?o:o&i)}entries(){return[...this.store.entries()].map(([e,t])=>[e,!!(t&2),!!(t&1)])}},Lp=class{store=new Map;add(e,t){if(!e.canReaddir())return;let r=this.store.get(e);r?r.find(o=>o.globString()===t.globString())||r.push(t):this.store.set(e,[t])}get(e){let t=this.store.get(e);if(!t)throw new Error("attempting to walk unknown path");return t}entries(){return this.keys().map(e=>[e,this.store.get(e)])}keys(){return[...this.store.keys()].filter(e=>e.canReaddir())}},Ss=class n{hasWalkedCache;matches=new Pp;subwalks=new Lp;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Ip}processPatterns(e,t){this.patterns=t;let r=t.map(o=>[e,o]);for(let[o,i]of r){this.hasWalkedCache.storeWalked(o,i);let s=i.root(),a=i.isAbsolute()&&this.opts.absolute!==!1;if(s){o=o.resolve(s==="/"&&this.opts.root!==void 0?this.opts.root:s);let d=i.rest();if(d)i=d;else{this.matches.add(o,!0,!1);continue}}if(o.isENOENT())continue;let l,c,p=!1;for(;typeof(l=i.pattern())=="string"&&(c=i.rest());)o=o.resolve(l),i=c,p=!0;if(l=i.pattern(),c=i.rest(),p){if(this.hasWalkedCache.hasWalked(o,i))continue;this.hasWalkedCache.storeWalked(o,i)}if(typeof l=="string"){let d=l===".."||l===""||l===".";this.matches.add(o.resolve(l),a,d);continue}else if(l===st){(!o.isSymbolicLink()||this.follow||i.checkFollowGlobstar())&&this.subwalks.add(o,i);let d=c?.pattern(),u=c?.rest();if(!c||(d===""||d===".")&&!u)this.matches.add(o,a,d===""||d===".");else if(d===".."){let m=o.parent||o;u?this.hasWalkedCache.hasWalked(m,u)||this.subwalks.add(m,u):this.matches.add(m,a,!0)}}else l instanceof RegExp&&this.subwalks.add(o,i)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new n(this.opts,this.hasWalkedCache)}filterEntries(e,t){let r=this.subwalks.get(e),o=this.child();for(let i of t)for(let s of r){let a=s.isAbsolute(),l=s.pattern(),c=s.rest();l===st?o.testGlobstar(i,s,c,a):l instanceof RegExp?o.testRegExp(i,l,c,a):o.testString(i,l,c,a)}return o}testGlobstar(e,t,r,o){if((this.dot||!e.name.startsWith("."))&&(t.hasMore()||this.matches.add(e,o,!1),e.canReaddir()&&(this.follow||!e.isSymbolicLink()?this.subwalks.add(e,t):e.isSymbolicLink()&&(r&&t.checkFollowGlobstar()?this.subwalks.add(e,r):t.markFollowGlobstar()&&this.subwalks.add(e,t)))),r){let i=r.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,r.rest(),o);else if(i===".."){let s=e.parent||e;this.subwalks.add(s,r)}else i instanceof RegExp&&this.testRegExp(e,i,r.rest(),o)}}testRegExp(e,t,r,o){t.test(e.name)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}testString(e,t,r,o){e.isNamed(t)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}};var YO=(n,e)=>typeof n=="string"?new Ko([n],e):Array.isArray(n)?new Ko(n,e):n,vl=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#t;#i;signal;maxDepth;includeChildMatches;constructor(e,t,r){if(this.patterns=e,this.path=t,this.opts=r,this.#i=!r.posix&&r.platform==="win32"?"\\":"/",this.includeChildMatches=r.includeChildMatches!==!1,(r.ignore||!this.includeChildMatches)&&(this.#t=YO(r.ignore??[],r),!this.includeChildMatches&&typeof this.#t.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=r.maxDepth||1/0,r.signal&&(this.signal=r.signal,this.signal.addEventListener("abort",()=>{this.#e.length=0}))}#r(e){return this.seen.has(e)||!!this.#t?.ignored?.(e)}#s(e){return!!this.#t?.childrenIgnored?.(e)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let e;for(;!this.paused&&(e=this.#e.shift());)e()}onResume(e){this.signal?.aborted||(this.paused?this.#e.push(e):e())}async matchCheck(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||await e.realpath(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?await e.lstat():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=await i.realpath();s&&(s.isUnknown()||this.opts.stat)&&await s.lstat()}return this.matchCheckTest(i,t)}matchCheckTest(e,t){return e&&(this.maxDepth===1/0||e.depth()<=this.maxDepth)&&(!t||e.canReaddir())&&(!this.opts.nodir||!e.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!e.isSymbolicLink()||!e.realpathCached()?.isDirectory())&&!this.#r(e)?e:void 0}matchCheckSync(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||e.realpathSync(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?e.lstatSync():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=i.realpathSync();s&&(s?.isUnknown()||this.opts.stat)&&s.lstatSync()}return this.matchCheckTest(i,t)}matchFinish(e,t){if(this.#r(e))return;if(!this.includeChildMatches&&this.#t?.add){let i=`${e.relativePosix()}/**`;this.#t.add(i)}let r=this.opts.absolute===void 0?t:this.opts.absolute;this.seen.add(e);let o=this.opts.mark&&e.isDirectory()?this.#i:"";if(this.opts.withFileTypes)this.matchEmit(e);else if(r){let i=this.opts.posix?e.fullpathPosix():e.fullpath();this.matchEmit(i+o)}else{let i=this.opts.posix?e.relativePosix():e.relative(),s=this.opts.dotRelative&&!i.startsWith(".."+this.#i)?"."+this.#i:"";this.matchEmit(i?s+i+o:"."+o)}}async match(e,t,r){let o=await this.matchCheck(e,r);o&&this.matchFinish(o,t)}matchSync(e,t,r){let o=this.matchCheckSync(e,r);o&&this.matchFinish(o,t)}walkCB(e,t,r){this.signal?.aborted&&r(),this.walkCB2(e,t,new Ss(this.opts),r)}walkCB2(e,t,r,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,t,r,o));return}r.processPatterns(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirCached();a.calledReaddir()?this.walkCB3(a,l,r,s):a.readdirCB((c,p)=>this.walkCB3(a,p,r,s),!0)}s()}walkCB3(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let[a,l]of r.subwalks.entries())i++,this.walkCB2(a,l,r.child(),s);s()}walkCBSync(e,t,r){this.signal?.aborted&&r(),this.walkCB2Sync(e,t,new Ss(this.opts),r)}walkCB2Sync(e,t,r,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,t,r,o));return}r.processPatterns(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirSync();this.walkCB3Sync(a,l,r,s)}s()}walkCB3Sync(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let[a,l]of r.subwalks.entries())i++,this.walkCB2Sync(a,l,r.child(),s);s()}},ys=class extends vl{matches=new Set;constructor(e,t,r){super(e,t,r)}matchEmit(e){this.matches.add(e)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((e,t)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?t(this.signal.reason):e(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},bs=class extends vl{results;constructor(e,t,r){super(e,t,r),this.results=new dr({signal:this.signal,objectMode:!0}),this.results.on("drain",()=>this.resume()),this.results.on("resume",()=>this.resume())}matchEmit(e){this.results.write(e),this.results.flowing||this.pause()}stream(){let e=this.path;return e.isUnknown()?e.lstat().then(()=>{this.walkCB(e,this.patterns,()=>this.results.end())}):this.walkCB(e,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}};var XO=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",hn=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(e,t){if(!t)throw new TypeError("glob options required");if(this.withFileTypes=!!t.withFileTypes,this.signal=t.signal,this.follow=!!t.follow,this.dot=!!t.dot,this.dotRelative=!!t.dotRelative,this.nodir=!!t.nodir,this.mark=!!t.mark,t.cwd?(t.cwd instanceof URL||t.cwd.startsWith("file://"))&&(t.cwd=JO(t.cwd)):this.cwd="",this.cwd=t.cwd||"",this.root=t.root,this.magicalBraces=!!t.magicalBraces,this.nobrace=!!t.nobrace,this.noext=!!t.noext,this.realpath=!!t.realpath,this.absolute=t.absolute,this.includeChildMatches=t.includeChildMatches!==!1,this.noglobstar=!!t.noglobstar,this.matchBase=!!t.matchBase,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:1/0,this.stat=!!t.stat,this.ignore=t.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error("cannot set absolute and withFileTypes:true");if(typeof e=="string"&&(e=[e]),this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(e=e.map(l=>l.replace(/\\/g,"/"))),this.matchBase){if(t.noglobstar)throw new TypeError("base matching requires globstar");e=e.map(l=>l.includes("/")?l:`./**/${l}`)}if(this.pattern=e,this.platform=t.platform||XO,this.opts={...t,platform:this.platform},t.scurry){if(this.scurry=t.scurry,t.nocase!==void 0&&t.nocase!==t.scurry.nocase)throw new Error("nocase option contradicts provided scurry option")}else{let l=t.platform==="win32"?Go:t.platform==="darwin"?fs:t.platform?Vo:iw;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let r=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:r,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(l=>new Bt(l,o)),[s,a]=i.reduce((l,c)=>(l[0].push(...c.set),l[1].push(...c.globParts),l),[[],[]]);this.patterns=s.map((l,c)=>{let p=a[c];if(!p)throw new Error("invalid pattern object");return new qo(l,p,0,this.platform)})}async walk(){return[...await new ys(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new ys(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new bs(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new bs(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}};var Op=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Bt(t,e).hasMagic())return!0;return!1};function xl(n,e={}){return new hn(n,e).streamSync()}function lw(n,e={}){return new hn(n,e).stream()}function Yo(n,e={}){return new hn(n,e).walkSync()}async function sw(n,e={}){return new hn(n,e).walk()}function Tl(n,e={}){return new hn(n,e).iterateSync()}function cw(n,e={}){return new hn(n,e).iterate()}var ZO=xl,QO=Object.assign(lw,{sync:xl}),ek=Tl,tk=Object.assign(cw,{sync:Tl}),nk=Object.assign(Yo,{stream:xl,iterate:Tl}),aw=Object.assign(sw,{glob:sw,globSync:Yo,sync:nk,globStream:lw,stream:QO,globStreamSync:xl,streamSync:ZO,globIterate:cw,iterate:tk,globIterateSync:Tl,iterateSync:ek,Glob:hn,hasMagic:Op,escape:zo,unescape:pn});aw.glob=aw;import dk from"os";import pr,{dirname as mw}from"path";import{cwd as Mp}from"process";import hw from"yaml";import{z as Te}from"zod";import dw from"fs";import El from"path";import rk from"yaml";import{z as kp}from"zod";var pw=!1,ws=[`**/*.${Nt.TEST}`,`**/*.${Nt.MODULE}`],Np=kp.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),_p=50,ok=kp.object({fileType:kp.nativeEnum(he)});function ke(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??ws,o=Array.from(n.config.exclude??[]).concat(_h),i=Yo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:_p,nodir:!0});for(let s of i)ik(n.rootDir,s,t,e);return pw=!0,t}function ik(n,e,t,r){let o=El.join(n,e),i;try{i=dw.readFileSync(o,"utf-8")}catch(d){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${d}`);return}let s;try{if(s=rk.parse(i),typeof s!="object"||s===null)throw new Error("The YAML document should parse as a map with key-value pairs")}catch(d){r.warn(`Could not parse possible Momentic file at ${o}, skipping: ${d}`);return}let a=ok.safeParse(s);if(a.error){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${a.error}`);return}let l=a.data.fileType,c;try{c=dw.statSync(o)}catch(d){r.warn(`Skipping path '${o}' because it could not be stat, skipping: ${d}`);return}let p={relativePath:e,fullFilePath:o,platformSep:El.sep,fullPathSegments:o.split(El.sep),fileName:El.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case he.TEST:try{let d=Kt.parse(s);if(t.tests[d.id]){let u=t.tests[d.id].fullFilePath;y.error(`Two tests with the same ID (${d.id}) were found in the same project. Please ensure that all test IDs are unique and avoid copying tests manually. Momentic will ignore the first test when resolving tests.
3546
3564
 
3547
3565
  First test path: ${u}
3548
3566
 
3549
- Second test path: ${o}`)}t.tests[d.id]={type:he.TEST,name:d.name,id:d.id,description:d.description??void 0,labels:d.labels,...p};return}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case he.MODULE:try{let d=At.parse(s);t.modules[d.moduleId]={type:he.MODULE,name:d.name,id:d.moduleId,...p};let u=p.fileName.replace(".module.yaml","");!dw&&Pe(d.name)!==u&&r.warn(`The module with ID ${d.moduleId} has a name (${d.name}) that does not match its file name (${u}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`);return}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}default:r.warn(`Unsupported file type ${l}, skipping...`);return}}var Jo="momentic.config.yaml",pw="momentic.workspace.yaml",ak=Te.object({projects:Te.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),lk=Te.union([Te.string(),Te.object({fromFile:Te.string(),json:Te.boolean().optional()})]),ck=Te.object({name:kp,baseUrl:Te.string(),envFile:Te.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Te.record(Te.string(),lk).optional(),inheritFromShell:Te.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Vs.optional().transform(n=>n&&(n.localChromeExtensionPaths&&(n.localChromeExtensionPaths=n.localChromeExtensionPaths.map(e=>e.startsWith("~")?pr.join(sk.homedir(),e.slice(1)):e)),n))}),dk=Te.object({postSave:Te.string().optional()}),pk=Te.object({name:kp,include:Te.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Te.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Te.string().optional(),reporterDir:Te.string().optional(),outputDir:Te.string().optional(),retries:Te.number().optional().describe("number of retries per test"),parallel:Te.number().optional().describe("degree of parallelism"),browser:Vs.optional(),environments:Te.array(ck).optional(),ai:Qc.optional(),hooks:dk.optional()});function hw(n,e){let t;try{t=rk(n,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=mw.parse(t),typeof r!="object"||r===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof r} instead`)}catch(o){y.warn(`Possible Momentic ${e} file at ${n} does not parse as valid YAML: ${o}`);return}return r}function Mp(n){let e=hw(n,"project configuration");if(e!==void 0)try{return pk.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function uk(n){let e=hw(n,"workspace configuration");if(e!==void 0)try{return ak.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function mk(){let n=[],e=_p(),t=pr.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=pr.basename(e);if(ji.includes(i))return y.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),n;for(let s of ok(e))if(s.endsWith(Jo)){let a=pr.join(e,s),l=Mp(a);l&&n.push({configFilePath:a,config:l,rootDir:uw(a)})}if(n.length)return n;if(e=pr.dirname(e),e===t)break}return n}function gn(n={}){let{configFilePath:e,nameFilter:t}=n,r=Fp(e);if(t&&(r=r.filter(o=>o.config.name===t)),r.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
3550
- ${r.map(o=>o.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return y.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function hk(n){let e=uk(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${Jo}`)),r=Yo(t,{absolute:!1,cwd:_p(),dotRelative:!1,maxDepth:Np,nodir:!0}),o=[];for(let i of r){let s=pr.join(_p(),i),a=Mp(s);a&&o.push({configFilePath:s,config:a,rootDir:uw(s)})}return o}function Fp(n){if(n){n=pr.resolve(n);let t=Mp(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:pr.dirname(n)}]}if(nk(pw)){let t=hk(pw);if(t)return t}return mk()}function Xo(n,e){let t=mw.stringify(n);ik(e,t)}import Zo from"fs";import Dp from"path";import{z as Up}from"zod";var gk=Up.object({width:Up.number(),height:Up.number()}),Qo=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=Dp.join(e.rootDir,e.config.goldenFileDir??"golden/visual-diff");this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){if(t.screenshot?.data?.startsWith("https://")){let s=await fetch(t.screenshot.data);return{buffer:Buffer.from(await s.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Dp.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Zo.mkdirSync(Dp.dirname(o),{recursive:!0}),Zo.writeFileSync(o,r.buffer),Zo.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(Zo.existsSync(o)){let s=Zo.readFileSync(o),a=gk.parse(JSON.parse(Zo.readFileSync(i,"utf-8")));return{buffer:s,width:a.width,height:a.height}}else throw new R("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import Hp from"fs";import wk from"path";import fw,{multistream as fk}from"pino";import Sk from"pino-pretty";var gw=["lastScreenshotBuffer"];var Bp=new Map,yk=!0,zp=class n{consoleLogger;ddClientToken;hostname;bindingAttributes;disableConsoleLogs;site="https://http-intake.logs.us5.datadoghq.com/api/v2/logs";constructor({bindings:e,clientToken:t,hostname:r,disableConsoleLogs:o}){this.ddClientToken=t,this.hostname=r,this.disableConsoleLogs=o,this.bindingAttributes={...e,env:"production"};let i={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=yk?fw(i):fw(i,fk([{stream:Sk({colorize:!0})}]))}child(e){return new n({clientToken:this.ddClientToken,bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs})}flush(e){this.disableConsoleLogs||this.consoleLogger.flush(e)}log(e,t,r,...o){if(t&&r===void 0&&(r=`${t}`,t={}),this.disableConsoleLogs||this.consoleLogger[e](e==="error"?t:{testId:t.testId,runId:t.runId},r,...o),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error){let s={};for(let a of Object.getOwnPropertyNames(t.err))gw.includes(a)||(s[a]=t.err[a]);s.name=t.err.name,t.err=s}let i=Object.assign({},this.bindingAttributes,t&&typeof t=="object"?t:{});o.length>0&&(i.args=o),(async()=>{try{let s=await fetch(this.site,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","DD-API-KEY":this.ddClientToken},body:JSON.stringify([{ddsource:this.bindingAttributes.app,ddtags:["env:production"],hostname:this.hostname??"vercel",service:"momentic",message:{message:r||"",...i,level:e}}])});if(!s.ok)throw new Error(`Failed to log to Datadog: ${s.statusText})}`)}catch(s){this.disableConsoleLogs||this.consoleLogger.warn({obj:t,msg:r,args:o,err:s},"Failed to log to Datadog")}})()}debug(e,t,...r){this.log("debug",e,t,...r)}info(e,t,...r){this.log("info",e,t,...r)}warn(e,t,...r){this.log("warn",e,t,...r)}error(e,t,...r){this.log("error",e,t,...r)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){this.consoleLogger.level=e}enableConsoleLogs(){this.disableConsoleLogs=!1}},Cl=({app:n,clientToken:e,hostname:t,disableConsoleLogs:r})=>{if(!process.env.DD_CLIENT_TOKEN&&!process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN&&!e)throw new Error("Missing DD_CLIENT_TOKEN");return Bp.has(n)||Bp.set(n,new zp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),Bp.get(n)};import{hostname as bk}from"os";var ge=Cl({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:bk(),disableConsoleLogs:!0}),Sw=n=>{ge.addBinding("version",n)};var vk=new Va(10,60*1e3),Gp="https://api.momentic.ai",Vp,jp,yw=n=>{Gp=n},Rl=()=>Gp,bw=(n,e)=>{Vp=n,jp?.abort(),jp=new AbortController;let t=jp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=wk.resolve(n.rootDir,o.envFile);try{if(Hp.lstatSync(i).isSymbolicLink())return;Hp.existsSync(i)&&r.push(i)}catch(s){ge.warn({err:s},`Failed to check if env file ${i} exists`)}});try{xk({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){ge.error({err:o},"Failed to start config file watchers")}},fe=()=>Vp,ei,$p,Wp,ww=async n=>{if(ei)return ei;let e=new it({baseUrl:Gp,apiKey:n,logger:ge});try{let t=await e.getAuthInfo();return ei=t.orgId,$p=t.userId,Wp=n,ei}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},ur=()=>{if(!ei)throw new Error("Your organization ID is invalid.");return ei},Al=()=>{if(!$p)throw new Error("Your user ID is invalid.");return $p},vw=()=>{if(!Wp)throw new Error("Your API key is invalid.");return Wp};function xk({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{Hp.watch(o,{signal:t,persistent:!1,recursive:!1},(i,s)=>{s&&(vk.increment("setLocalProject")&&y.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 10 times in the last minute. Please avoid making rapid changes to files in this directory as this may cause performance issues.`),Vp=e(r.configFilePath))})})}function we(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}var xw=Tk();xw.get("/",we((n,e)=>{let t=pb(fe(),ge);e.status(200).json(t)}));var Tw=xw;import{Router as Ek}from"express";var Il=class extends Eo{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async getOrgId(t){return this.orgId}async fetchTestMetadata(t,r,o){let i=fe(),a=ke(i,o).tests[t];if(a)return il(a.relativePath,i)}async fetchApiTestMetadata(t,r,o){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,r,o){let i=fe();return ns(r,i,Or)}async fetchIconKnowledgeBase(t,r){try{return await this.client.fetchIconKnowledgeBase(t,r)}catch(o){return r.error({err:o},"Failed to fetch icon knowledge base"),null}}};var Ew=Ek();Ew.get("/",we((n,e)=>{e.status(200).json({userId:Al(),orgId:ur()})}));var Cw=Ew;import{Router as Ck}from"express";var Rw=Ck();Rw.get("/",we((n,e)=>{let t=fe(),r=ke(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(s=>{s.labels?.forEach(a=>o.add(a))});let i=Array.from(o).sort();e.status(200).json(i)}));var Aw=Rw;import{Router as Rk}from"express";import Iw from"fs";import Ak from"path";var ws=Rk();ws.get("/",we(async(n,e)=>{let t=fe(),r=ke(t,y),i=(await ol(r,ge)).filter(s=>s.enabled!==!1).map(s=>{let a=r.modules[s.moduleId];if(!a){y.warn(`Found a dangling module with ID ${s.moduleId} that could not be found on disk.`);return}return{...a,content:s}}).filter(s=>s!==void 0);e.status(200).json(i)}));ws.post("/",we(async(n,e)=>{let t;try{t=Ih.parse(n.body)}catch(a){e.status(400).json({error:`Invalid request body: ${a}`});return}try{bo(t.name)}catch(a){e.status(400).json({error:`Invalid module name: ${a}`});return}let r=fe(),o=ke(r,y).modules;if(Object.values(o).find(a=>a.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=Ak.join(r.rootDir,t.folderPath??"");if(!Iw.existsSync(i)||!Iw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let s=await ab({...t,folder:i,project:r});e.status(201).json(s)}));ws.get("/:moduleId",we(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=ke(fe(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await lp(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));ws.patch("/:moduleId/metadata",we(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Ph.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=fe(),o=ke(r,y);sb({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var Pw=ws;import{Router as Ik}from"express";var Pl=Ik();Pl.get("/",we((n,e)=>{let t=Fp().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));Pl.get("/current",we((n,e)=>{let t=fe(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));Pl.post("/set",we((n,e)=>{let t;try{t=Oh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=gn({configFilePath:t.configFilePath});bw(r,o=>gn({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var Lw=Pl;import{Router as Pk}from"express";var Ow=Pk();Ow.get("/",we((n,e)=>{let r={ai:fe().config.ai};e.status(200).json(r)}));var kw=Ow;import{Router as Ok}from"express";import Nw from"fs";import Jr from"path";import{v4 as _w}from"uuid";import kk from"yaml";import{PostHog as Lk}from"posthog-node";var ti=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},ni=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new Lk("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new n({...this.bindings,...e},this.options)}track(e,t){if(!rh(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:r,...o}=e;return this.client.capture({distinctId:this.bindings.user_id,event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var ri=new ni({platform:"local_app"},{flushAt:1,flushInterval:0});var mr=Ok();function Mw(n){let e=ke(n,y);return Object.values(e.tests)}mr.get("/",we((n,e)=>{let t=Mw(fe());e.status(200).json(t)}));mr.post("/",we(async(n,e)=>{let t;try{t=Rh.parse(n.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{bo(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:_w(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:He,advanced:{disableAICaching:!1,browserType:t.browserType??"Chromium",viewport:t.viewport??rn},retries:0,steps:[]};t.environment&&(o.envs=[{name:t.environment,default:!0}]);let i=fe();if(Mw(i).find(p=>p.name===t.name)){e.status(400).send(`A test with the name "${t.name}" already exists. Please use a different name.`);return}let a=Jr.join(i.rootDir,t.folderPath??""),l=await lb({test:o,name:t.name,folder:a}),c={...o,relativeFilePath:Jr.relative(i.rootDir,l)};ri.track({type:"test_editor:test_create"}),e.status(201).json(c)}));mr.get("/:testPath",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=fe(),o=ke(r,y),i;try{i=await ts(Jr.join(r.rootDir,t),ge,o),e.status(200).json(i)}catch(s){e.status(400).send({error:s.message});return}(async()=>{try{let{stepsToSave:s,moduleUpdates:a}=await mt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});a.forEach(l=>{ap({content:l,schemaVersion:He,momenticFiles:o,project:r})}),qr(t,s,He,r)}catch(s){ge.error({err:s},"Failed to save migrated test to disk after initial fetch")}})()}));mr.patch("/:testPath/metadata",we(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Ch.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:cp(n.params.testPath,t,fe()).newRelativeTestPath};e.status(200).json(o)}));mr.patch("/:testPath",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Eh.parse(n.body)}catch(d){e.status(400).json({error:`Invalid request body: ${d}`});return}let o=fe(),i=ke(o,y),s;try{s=il(t,o)}catch(d){e.status(400).json({error:`Existing test file on disk is invalid: ${d}`});return}let{stepsToSave:a,moduleUpdates:l,cachesToSave:c}=await mt({stepLists:r.stepLists,cacheCreationParams:{testId:s.id,orgId:ur()}});await new it({apiKey:vw(),baseUrl:Rl(),logger:ge}).updateStepCaches({entries:c,testId:s.id}),l.forEach(d=>{ap({content:d,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),qr(t,a,r.schemaVersion,o),e.status(201).json({message:"ok"})}));mr.patch("/:testPath/environments",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Lh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}cp(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},fe()),e.status(201).json({message:"ok"})}));mr.post("/:testPath/duplicate",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Ah.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{bo(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=fe(),i=Jr.join(o.rootDir,t);if(!Nw.existsSync(i)){e.status(404).json({error:"Test not found."});return}let s=ke(o,y),a;try{a=await ts(i,ge,s)}catch(f){e.status(400).send({error:f.message});return}let l=_w(),c=Kt.parse({...a,name:r.name,id:l}),{stepsToSave:p}=await mt({stepLists:{steps:a.steps,beforeSteps:a.beforeSteps,afterSteps:a.afterSteps},createNewStepIds:!0,cacheCreationParams:{createNewCacheIds:!0,testId:l,orgId:ur()}}),d=Mn({fileType:he.TEST,...c,beforeSteps:p.beforeSteps??void 0,steps:p.steps,afterSteps:p.afterSteps??void 0}),u=Jr.dirname(i),m=Jr.join(u,`${r.name}.${Nt.TEST}`),h=kk.stringify(d);Nw.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Jr.relative(o.rootDir,m)};ri.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var Fw=mr;var vs=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new Qo(fe(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function zw(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:s}=n;Sw(s),e&&yw(e),ge.debug(n,"Initializing desktop server"),await ww(t);let a=ur(),l=Al();ri.identify({user_id:l,org_id:a}),ge.debug({orgId:a,userId:l},"Checking API key successful");let c=Uk(o,r),p=`http://localhost:${r}`;y.info(`Desktop server is running at ${p}`),await new Promise(x=>{try{c.listen(r,()=>{ge.info(`Desktop server is running at ${p}`),x()})}catch(b){b.message.includes("EADDRINUSE")?jw(r):y.error(`An unexpected error occurred while starting the server: ${b.message}`),process.exit(1)}});let u={type:"API_KEY",baseUrl:Rl(),apiKey:t,logger:ge},m=new Ro(u),h=new Ur(u),g=new it(u),f=new Il(g,ur()),S=new vs;ob({baseServer:c,generatorFactory:async()=>m,enricherFactory:async()=>h,flagStoreFactory:async x=>Ao.init(x,g),storage:f,logger:ge,devicePixelRatio:i,authorization:u,visualDiffScreenshotStorage:S,analytics:ri})}var Bw="25mb";function Uk(n,e){let t=Uw();t.use(Nk()),t.use(Dw.json({limit:Bw})),t.use(Dw.urlencoded({extended:!1,limit:Bw}));let r=Fk();if(r.use("/tests",Fw),r.use("/modules",Pw),r.use("/environments",Tw),r.use("/projects",Lw),r.use("/labels",Aw),r.use("/settings",kw),r.use("/identify",Cw),t.use("/api",r),t.use((i,s,a)=>{i.path!=="/healthcheck"&&!i.path.startsWith("/assets")&&ge.debug({url:i.url,path:i.path,query:i.query,method:i.method,body:i.body,headers:i.rawHeaders,client:i.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&ge.error({url:i.url,method:i.method,statusCode:s.statusCode},"Request completed in error")}),a()}),t.use((i,s,a,l)=>{if(i instanceof Error&&i.message.includes("BadRequestError: request aborted")){a.status(400).send("Client disconnected");return}ge.error({stack:i.stack,msg:i.message,err:i,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),y.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${i.message}
3551
- ${i.stack}`),a.status(500).send("Internal Server Error")}),n){let i=Uw.static(n,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")}});t.use("/",i),t.use("*",i)}let o=Dk.createServer(t);return o.once("error",i=>{"code"in i&&i.code==="EADDRINUSE"?(jw(e),process.exit(1)):console.error("An unexpected server error occurred:",i.message)}),o}Mk.setMaxListeners(50);process.on("warning",n=>{ge.warn({err:n},`Node warning received on desktop-server: ${n.message}`)});process.on("uncaughtException",n=>{ge.error({err:n},"Uncaught exception leading to exit on desktop-server"),y.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${n.message}`)});process.on("unhandledRejection",(n,e)=>{ge.error({reason:`${n}`,promise:`${e}`,stack:n?.stack},"Uncaught exception leading to exit on desktop-server (promise rejection)"),y.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${n}`)});function jw(n){y.error(_k`Port ${n} is already in use by another process. Please close the other process and try again.
3567
+ Second test path: ${o}`)}t.tests[d.id]={type:he.TEST,name:d.name,id:d.id,description:d.description??void 0,labels:d.labels,...p};return}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case he.MODULE:try{let d=At.parse(s);t.modules[d.moduleId]={type:he.MODULE,name:d.name,id:d.moduleId,...p};let u=p.fileName.replace(".module.yaml","");!pw&&Pe(d.name)!==u&&r.warn(`The module with ID ${d.moduleId} has a name (${d.name}) that does not match its file name (${u}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`);return}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}default:r.warn(`Unsupported file type ${l}, skipping...`);return}}var Jo="momentic.config.yaml",uw="momentic.workspace.yaml",pk=Te.object({projects:Te.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),uk=Te.union([Te.string(),Te.object({fromFile:Te.string(),json:Te.boolean().optional()})]),mk=Te.object({name:Np,baseUrl:Te.string(),envFile:Te.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Te.record(Te.string(),uk).optional(),inheritFromShell:Te.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:qs.optional().transform(n=>n&&(n.localChromeExtensionPaths&&(n.localChromeExtensionPaths=n.localChromeExtensionPaths.map(e=>e.startsWith("~")?pr.join(dk.homedir(),e.slice(1)):e)),n))}),hk=Te.object({postSave:Te.string().optional()}),gk=Te.object({name:Np,include:Te.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Te.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Te.string().optional(),reporterDir:Te.string().optional(),outputDir:Te.string().optional(),retries:Te.number().optional().describe("number of retries per test"),parallel:Te.number().optional().describe("degree of parallelism"),browser:qs.optional(),environments:Te.array(mk).optional(),ai:ed.optional(),hooks:hk.optional()});function gw(n,e){let t;try{t=ak(n,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=hw.parse(t),typeof r!="object"||r===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof r} instead`)}catch(o){y.warn(`Possible Momentic ${e} file at ${n} does not parse as valid YAML: ${o}`);return}return r}function Fp(n){let e=gw(n,"project configuration");if(e!==void 0)try{return gk.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function fk(n){let e=gw(n,"workspace configuration");if(e!==void 0)try{return pk.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function Sk(){let n=[],e=Mp(),t=pr.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=pr.basename(e);if(Hi.includes(i))return y.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),n;for(let s of lk(e))if(s.endsWith(Jo)){let a=pr.join(e,s),l=Fp(a);l&&n.push({configFilePath:a,config:l,rootDir:mw(a)})}if(n.length)return n;if(e=pr.dirname(e),e===t)break}return n}function gn(n={}){let{configFilePath:e,nameFilter:t}=n,r=Dp(e);if(t&&(r=r.filter(o=>o.config.name===t)),r.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
3568
+ ${r.map(o=>o.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return y.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function yk(n){let e=fk(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${Jo}`)),r=Yo(t,{absolute:!1,cwd:Mp(),dotRelative:!1,maxDepth:_p,nodir:!0}),o=[];for(let i of r){let s=pr.join(Mp(),i),a=Fp(s);a&&o.push({configFilePath:s,config:a,rootDir:mw(s)})}return o}function Dp(n){if(n){n=pr.resolve(n);let t=Fp(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:pr.dirname(n)}]}if(sk(uw)){let t=yk(uw);if(t)return t}return Sk()}function Xo(n,e){let t=hw.stringify(n);ck(e,t)}import Zo from"fs";import Up from"path";import{z as Bp}from"zod";var bk=Bp.object({width:Bp.number(),height:Bp.number()}),Qo=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=Up.join(e.rootDir,e.config.goldenFileDir??"golden/visual-diff");this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){if(t.screenshot?.data?.startsWith("https://")){let s=await fetch(t.screenshot.data);return{buffer:Buffer.from(await s.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Up.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Zo.mkdirSync(Up.dirname(o),{recursive:!0}),Zo.writeFileSync(o,r.buffer),Zo.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(Zo.existsSync(o)){let s=Zo.readFileSync(o),a=bk.parse(JSON.parse(Zo.readFileSync(i,"utf-8")));return{buffer:s,width:a.width,height:a.height}}else throw new R("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import $p from"fs";import Ek from"path";import Sw,{multistream as wk}from"pino";import vk from"pino-pretty";var fw=["lastScreenshotBuffer"];var zp=new Map,xk=!0,jp=class n{consoleLogger;ddClientToken;hostname;bindingAttributes;disableConsoleLogs;site="https://http-intake.logs.us5.datadoghq.com/api/v2/logs";constructor({bindings:e,clientToken:t,hostname:r,disableConsoleLogs:o}){this.ddClientToken=t,this.hostname=r,this.disableConsoleLogs=o,this.bindingAttributes={...e,env:"production"};let i={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=xk?Sw(i):Sw(i,wk([{stream:vk({colorize:!0})}]))}child(e){return new n({clientToken:this.ddClientToken,bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs})}flush(e){this.disableConsoleLogs||this.consoleLogger.flush(e)}log(e,t,r,...o){if(t&&r===void 0&&(r=`${t}`,t={}),this.disableConsoleLogs||this.consoleLogger[e](e==="error"?t:{testId:t.testId,runId:t.runId},r,...o),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error){let s={};for(let a of Object.getOwnPropertyNames(t.err))fw.includes(a)||(s[a]=t.err[a]);s.name=t.err.name,t.err=s}let i=Object.assign({},this.bindingAttributes,t&&typeof t=="object"?t:{});o.length>0&&(i.args=o),(async()=>{try{let s=await fetch(this.site,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","DD-API-KEY":this.ddClientToken},body:JSON.stringify([{ddsource:this.bindingAttributes.app,ddtags:["env:production"],hostname:this.hostname??"vercel",service:"momentic",message:{message:r||"",...i,level:e}}])});if(!s.ok)throw new Error(`Failed to log to Datadog: ${s.statusText})}`)}catch(s){this.disableConsoleLogs||this.consoleLogger.warn({obj:t,msg:r,args:o,err:s},"Failed to log to Datadog")}})()}debug(e,t,...r){this.log("debug",e,t,...r)}info(e,t,...r){this.log("info",e,t,...r)}warn(e,t,...r){this.log("warn",e,t,...r)}error(e,t,...r){this.log("error",e,t,...r)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){this.consoleLogger.level=e}enableConsoleLogs(){this.disableConsoleLogs=!1}},Cl=({app:n,clientToken:e,hostname:t,disableConsoleLogs:r})=>{if(!process.env.DD_CLIENT_TOKEN&&!process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN&&!e)throw new Error("Missing DD_CLIENT_TOKEN");return zp.has(n)||zp.set(n,new jp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),zp.get(n)};import{hostname as Tk}from"os";var ge=Cl({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:Tk(),disableConsoleLogs:!0}),yw=n=>{ge.addBinding("version",n)};var Ck=new Va(10,60*1e3),Vp="https://api.momentic.ai",qp,Hp,bw=n=>{Vp=n},Rl=()=>Vp,ww=(n,e)=>{qp=n,Hp?.abort(),Hp=new AbortController;let t=Hp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=Ek.resolve(n.rootDir,o.envFile);try{if($p.lstatSync(i).isSymbolicLink())return;$p.existsSync(i)&&r.push(i)}catch(s){ge.warn({err:s},`Failed to check if env file ${i} exists`)}});try{Rk({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){ge.error({err:o},"Failed to start config file watchers")}},fe=()=>qp,ei,Wp,Gp,vw=async n=>{if(ei)return ei;let e=new it({baseUrl:Vp,apiKey:n,logger:ge});try{let t=await e.getAuthInfo();return ei=t.orgId,Wp=t.userId,Gp=n,ei}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},ur=()=>{if(!ei)throw new Error("Your organization ID is invalid.");return ei},Al=()=>{if(!Wp)throw new Error("Your user ID is invalid.");return Wp},xw=()=>{if(!Gp)throw new Error("Your API key is invalid.");return Gp};function Rk({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{$p.watch(o,{signal:t,persistent:!1,recursive:!1},(i,s)=>{s&&(Ck.increment("setLocalProject")&&y.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 10 times in the last minute. Please avoid making rapid changes to files in this directory as this may cause performance issues.`),qp=e(r.configFilePath))})})}function we(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}var Tw=Ak();Tw.get("/",we((n,e)=>{let t=ub(fe(),ge);e.status(200).json(t)}));var Ew=Tw;import{Router as Ik}from"express";var Il=class extends Eo{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async getOrgId(t){return this.orgId}async fetchTestMetadata(t,r,o){let i=fe(),a=ke(i,o).tests[t];if(a)return il(a.relativePath,i)}async fetchApiTestMetadata(t,r,o){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,r,o){let i=fe();return rs(r,i,Or)}async fetchIconKnowledgeBase(t,r){try{return await this.client.fetchIconKnowledgeBase(t,r)}catch(o){return r.error({err:o},"Failed to fetch icon knowledge base"),null}}};var Cw=Ik();Cw.get("/",we((n,e)=>{e.status(200).json({userId:Al(),orgId:ur()})}));var Rw=Cw;import{Router as Pk}from"express";var Aw=Pk();Aw.get("/",we((n,e)=>{let t=fe(),r=ke(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(s=>{s.labels?.forEach(a=>o.add(a))});let i=Array.from(o).sort();e.status(200).json(i)}));var Iw=Aw;import{Router as Lk}from"express";import Pw from"fs";import Ok from"path";var vs=Lk();vs.get("/",we(async(n,e)=>{let t=fe(),r=ke(t,y),i=(await ol(r,ge)).filter(s=>s.enabled!==!1).map(s=>{let a=r.modules[s.moduleId];if(!a){y.warn(`Found a dangling module with ID ${s.moduleId} that could not be found on disk.`);return}return{...a,content:s}}).filter(s=>s!==void 0);e.status(200).json(i)}));vs.post("/",we(async(n,e)=>{let t;try{t=Lh.parse(n.body)}catch(a){e.status(400).json({error:`Invalid request body: ${a}`});return}try{bo(t.name)}catch(a){e.status(400).json({error:`Invalid module name: ${a}`});return}let r=fe(),o=ke(r,y).modules;if(Object.values(o).find(a=>a.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=Ok.join(r.rootDir,t.folderPath??"");if(!Pw.existsSync(i)||!Pw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let s=await lb({...t,folder:i,project:r});e.status(201).json(s)}));vs.get("/:moduleId",we(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=ke(fe(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await cp(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));vs.patch("/:moduleId/metadata",we(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Oh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=fe(),o=ke(r,y);ab({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var Lw=vs;import{Router as kk}from"express";var Pl=kk();Pl.get("/",we((n,e)=>{let t=Dp().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));Pl.get("/current",we((n,e)=>{let t=fe(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));Pl.post("/set",we((n,e)=>{let t;try{t=Nh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=gn({configFilePath:t.configFilePath});ww(r,o=>gn({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var Ow=Pl;import{Router as Nk}from"express";var kw=Nk();kw.get("/",we((n,e)=>{let r={ai:fe().config.ai};e.status(200).json(r)}));var Nw=kw;import{Router as Mk}from"express";import _w from"fs";import Jr from"path";import{v4 as Mw}from"uuid";import Fk from"yaml";import{PostHog as _k}from"posthog-node";var ti=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},ni=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new _k("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new n({...this.bindings,...e},this.options)}track(e,t){if(!ih(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:r,...o}=e;return this.client.capture({distinctId:this.bindings.user_id,event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var ri=new ni({platform:"local_app"},{flushAt:1,flushInterval:0});var mr=Mk();function Fw(n){let e=ke(n,y);return Object.values(e.tests)}mr.get("/",we((n,e)=>{let t=Fw(fe());e.status(200).json(t)}));mr.post("/",we(async(n,e)=>{let t;try{t=Ih.parse(n.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{bo(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:Mw(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:He,advanced:{disableAICaching:!1,browserType:t.browserType??"Chromium",viewport:t.viewport??rn},retries:0,steps:[]};t.environment&&(o.envs=[{name:t.environment,default:!0}]);let i=fe();if(Fw(i).find(p=>p.name===t.name)){e.status(400).send(`A test with the name "${t.name}" already exists. Please use a different name.`);return}let a=Jr.join(i.rootDir,t.folderPath??""),l=await cb({test:o,name:t.name,folder:a}),c={...o,relativeFilePath:Jr.relative(i.rootDir,l)};ri.track({type:"test_editor:test_create"}),e.status(201).json(c)}));mr.get("/:testPath",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=fe(),o=ke(r,y),i;try{i=await ns(Jr.join(r.rootDir,t),ge,o),e.status(200).json(i)}catch(s){e.status(400).send({error:s.message});return}(async()=>{try{let{stepsToSave:s,moduleUpdates:a}=await mt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});a.forEach(l=>{lp({content:l,schemaVersion:He,momenticFiles:o,project:r})}),qr(t,s,He,r)}catch(s){ge.error({err:s},"Failed to save migrated test to disk after initial fetch")}})()}));mr.patch("/:testPath/metadata",we(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Ah.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:dp(n.params.testPath,t,fe()).newRelativeTestPath};e.status(200).json(o)}));mr.patch("/:testPath",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Rh.parse(n.body)}catch(d){e.status(400).json({error:`Invalid request body: ${d}`});return}let o=fe(),i=ke(o,y),s;try{s=il(t,o)}catch(d){e.status(400).json({error:`Existing test file on disk is invalid: ${d}`});return}let{stepsToSave:a,moduleUpdates:l,cachesToSave:c}=await mt({stepLists:r.stepLists,cacheCreationParams:{testId:s.id,orgId:ur()}});await new it({apiKey:xw(),baseUrl:Rl(),logger:ge}).updateStepCaches({entries:c,testId:s.id}),l.forEach(d=>{lp({content:d,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),qr(t,a,r.schemaVersion,o),e.status(201).json({message:"ok"})}));mr.patch("/:testPath/environments",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=kh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}dp(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},fe()),e.status(201).json({message:"ok"})}));mr.post("/:testPath/duplicate",we(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Ph.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{bo(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=fe(),i=Jr.join(o.rootDir,t);if(!_w.existsSync(i)){e.status(404).json({error:"Test not found."});return}let s=ke(o,y),a;try{a=await ns(i,ge,s)}catch(f){e.status(400).send({error:f.message});return}let l=Mw(),c=Kt.parse({...a,name:r.name,id:l}),{stepsToSave:p}=await mt({stepLists:{steps:a.steps,beforeSteps:a.beforeSteps,afterSteps:a.afterSteps},createNewStepIds:!0,cacheCreationParams:{createNewCacheIds:!0,testId:l,orgId:ur()}}),d=Mn({fileType:he.TEST,...c,beforeSteps:p.beforeSteps??void 0,steps:p.steps,afterSteps:p.afterSteps??void 0}),u=Jr.dirname(i),m=Jr.join(u,`${r.name}.${Nt.TEST}`),h=Fk.stringify(d);_w.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Jr.relative(o.rootDir,m)};ri.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var Dw=mr;var xs=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new Qo(fe(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function jw(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:s}=n;yw(s),e&&bw(e),ge.debug(n,"Initializing desktop server"),await vw(t);let a=ur(),l=Al();ri.identify({user_id:l,org_id:a}),ge.debug({orgId:a,userId:l},"Checking API key successful");let c=Hk(o,r),p=`http://localhost:${r}`;y.info(`Desktop server is running at ${p}`),await new Promise(x=>{try{c.listen(r,()=>{ge.info(`Desktop server is running at ${p}`),x()})}catch(b){b.message.includes("EADDRINUSE")?Hw(r):y.error(`An unexpected error occurred while starting the server: ${b.message}`),process.exit(1)}});let u={type:"API_KEY",baseUrl:Rl(),apiKey:t,logger:ge},m=new Ro(u),h=new Ur(u),g=new it(u),f=new Il(g,ur()),S=new xs;ib({baseServer:c,generatorFactory:async()=>m,enricherFactory:async()=>h,flagStoreFactory:async x=>Ao.init(x,g),storage:f,logger:ge,devicePixelRatio:i,authorization:u,visualDiffScreenshotStorage:S,analytics:ri})}var zw="25mb";function Hk(n,e){let t=Bw();t.use(Dk()),t.use(Uw.json({limit:zw})),t.use(Uw.urlencoded({extended:!1,limit:zw}));let r=zk();if(r.use("/tests",Dw),r.use("/modules",Lw),r.use("/environments",Ew),r.use("/projects",Ow),r.use("/labels",Iw),r.use("/settings",Nw),r.use("/identify",Rw),t.use("/api",r),t.use((i,s,a)=>{i.path!=="/healthcheck"&&!i.path.startsWith("/assets")&&ge.debug({url:i.url,path:i.path,query:i.query,method:i.method,body:i.body,headers:i.rawHeaders,client:i.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&ge.error({url:i.url,method:i.method,statusCode:s.statusCode},"Request completed in error")}),a()}),t.use((i,s,a,l)=>{if(i instanceof Error&&i.message.includes("BadRequestError: request aborted")){a.status(400).send("Client disconnected");return}ge.error({stack:i.stack,msg:i.message,err:i,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),y.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${i.message}
3569
+ ${i.stack}`),a.status(500).send("Internal Server Error")}),n){let i=Bw.static(n,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")}});t.use("/",i),t.use("*",i)}let o=jk.createServer(t);return o.once("error",i=>{"code"in i&&i.code==="EADDRINUSE"?(Hw(e),process.exit(1)):console.error("An unexpected server error occurred:",i.message)}),o}Bk.setMaxListeners(50);process.on("warning",n=>{ge.warn({err:n},`Node warning received on desktop-server: ${n.message}`)});process.on("uncaughtException",n=>{ge.error({err:n},"Uncaught exception leading to exit on desktop-server"),y.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${n.message}`)});process.on("unhandledRejection",(n,e)=>{ge.error({reason:`${n}`,promise:`${e}`,stack:n?.stack},"Uncaught exception leading to exit on desktop-server (promise rejection)"),y.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${n}`)});function Hw(n){y.error(Uk`Port ${n} is already in use by another process. Please close the other process and try again.
3552
3570
  Using Bash on MacOS or Linux:
3553
3571
  lsof -t -i :58888 | xargs kill -9
3554
3572
 
3555
3573
  Using Command Prompt on Windows:
3556
3574
  for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
3557
- `)}import o_ from"events";import Eu from"fs";import i_ from"open";import ec from"path";import{fileURLToPath as s_}from"url";import rN from"diff-lines";import{gt as oN}from"semver";import{execSync as Bk}from"child_process";import{platform as zk}from"os";function qp(){return Hw()?(y.info("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),y.info("If you are using a low pixel-density monitor, you should manually set --pixel-ratio to 1 to avoid incorrect viewport calculations."),y.info("Confirm your device's pixel-ratio at https://www.mydevice.io."),2):(y.info("Setting device pixel ratio to 1."),y.info("If you are using Momentic on a high-pixel density (HiDPI) monitor, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations"),y.info("Confirm your device's pixel-ratio at https://www.mydevice.io."),1)}function Hw(){return zk()==="darwin"&&Bk("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Kp(n){Hw()&&n===1&&(y.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),y.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import jk from"@actions/exec";import Hk from"@actions/io";import $k from"quote";import Wk from"string-argv";async function $w(n,e=!0){let t=Wk(n),r=await Hk.which(t[0],!0),o=t.slice(1),i=jk.exec($k(r),o,{delay:100});if(e)return i}import{existsSync as Gk,statSync as Vk}from"fs";var Ll=!!process.env.CI||!process.stdout.isTTY||!!process.env.TF_BUILD;function xs(n){try{return Gk(n)&&Vk(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import qk from"csv-parser";import{createReadStream as Kk}from"fs";function Yp(n){return new Promise((e,t)=>{let r=[];Kk(n).pipe(qk()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Ol from"semver";import{z as kl}from"zod";var jt="1.1.2",Yk="https://registry.npmjs.org/momentic",Jk=kl.object({versions:kl.record(kl.string(),kl.unknown()).optional()});async function Ww(n){try{await Xk(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Xk(n){if(!jt){n.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let r=0;r<2;r++)try{let o=await U(fetch(Yk),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=Jk.parse(i).versions;break}catch(o){n.warn({err:o},"Failed to fetch npm registry data")}if(!e){n.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let r of Object.keys(e))Ol.valid(r)&&(!t||Ol.gt(r,t))&&Ol.gt(r,jt)&&Ol.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(y.warn(`Update available: v${jt} -> v${t}`),y.warn("This version may be missing critical fixes, features, and security updates."),y.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as Qk,mkdirSync as eN,statSync as tN}from"fs";import{dirname as nN}from"path";import Vw from"readline/promises";import{hostname as Zk}from"os";var Q=Cl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:Zk(),disableConsoleLogs:!0}).child({version:"1.1.2"});var Jp=!1,qw=(()=>{try{return tN("/.dockerenv"),!0}catch{return!1}})();async function at(n,e){if(Ll||Jp||qw)return!0;Q.flush(),await new Promise(s=>setTimeout(s,500));let t=Vw.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let s=`${r.slice(0,r.length-1).join(".").trim()}.`;e?y.warn(s):y.log(s),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(Jp=!0,setTimeout(()=>{Jp=!1},3e3),!0):i.toLowerCase()==="y"}async function Xp(n){let e=nN(n);return xs(e)?Qk(n)?at(`File '${Gw(n)}' already exists. Overwrite existing content?`,!0):!0:await at(`Directory '${Gw(e)}' doesn't exist. Create it now?`,!0)?(eN(e,{recursive:!0}),!0):!1}function Gw(n){return n.replace(/(\s+)/g,"\\$1")}async function Kw(n,e){if(Ll||qw)return e;let t=Vw.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function Yw({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){oN(e.schemaVersion,He)&&(y.error(`This version of the CLI does not support the schema version of the fragment (${e.schemaVersion}). Please update to the latest version of the CLI and retry this command.`),process.exit(1)),Pg(e.steps).forEach(g=>{t.modules[g]||(y.error(`The test patch contains a module with id ${g} that could not be found in the current project. This suggests that either this test patch or your local file system may be out of date.`),process.exit(1))}),e.createdAt.getTime()<Date.now()-7*24*60*60*1e3&&!i&&!await at("The test patch you are applying is more than 7 days old. Are you sure you want to continue?",!0)&&process.exit(1);let a=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<a&&!i&&!await at("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?",!0)&&process.exit(1);let l=es(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let p,d;if(e.schemaVersion!==He){let{steps:g,newVersion:f}=await Hi({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:y});p=f,d=ve.array().parse(g)}else d=ve.array().parse(e.steps);let{stepsToSave:u,moduleUpdates:m}=await mt({stepLists:{steps:d}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=rN(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});y.dimmed("=".repeat(30)),y.dimmed(h),y.dimmed("=".repeat(30)),y.dimmed(""),p&&y.warn(`If this patch is applied, your test will also be automatically upgraded to the latest schema version (${p}). Schema upgrades have no impact on functionality, although you may notice minor differences in the test YAML.`),!i&&!await at("Do you want to apply this patch?")&&(y.dimmed("Cancelled."),process.exit(1)),qr(n.relativePath,u,p??e.schemaVersion,t.project),y.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as iN}from"crypto";async function Jw({fix:n,project:e}){let t=ke(e,y),r=Object.values(t.tests),o={},i=new Set,s=0;for(let a of r)try{let l=es(a.fullFilePath,Q,t),c=l.steps;if(!c||c.length===0||!Array.isArray(c)){y.debug(`Test ${a.name} (${a.relativePath}) has no steps, skipping...`);continue}let p=kt.parse(l),d=await cd(p,c,y),u=!1,m=!1;d.steps.forEach((h,g)=>{if(!h.id){y.error(`Step ${g} in test '${a.name}' (${a.relativePath}) does not have an ID`),m=!0;return}let f=o[h.id]?.testId,S=o[h.id]?.testRelativePath;f?(s++,m=!0,f===a.id?y.error(`Multiple steps in the test '${a.name}' (${a.relativePath}) have the same ID '${h.id}'`):y.error(`Step ${g} in test '${a.name}' (${a.relativePath}) has the ID ${h.id} which is duplicated in test ${S}`),n&&(u=!0,h.id=iN())):o[h.id]={testId:a.id,testRelativePath:a.relativePath}}),m&&y.dimmed("=".repeat(80)),u&&n&&(qr(a.relativePath,{beforeSteps:l.beforeSteps,steps:d.steps,afterSteps:l.afterSteps},He,e),i.add(a.fullFilePath))}catch(l){y.error({err:l},`Failed to parse test ${a.name} (${a.relativePath})`);continue}s>0?(y.error(`Found errors in ${s} steps`),n?y.warn(`Modified the following files:
3558
- ${[...i].map(a=>`- ${a}`).join(`
3559
- `)}`):y.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(y.success("No step ID errors found!"),process.exit(0))}async function Xw({project:n}){let e=ke(n,y),t=Object.values(e.tests),r=await ol(e,Q),o={},i={},s={},a={},l=new Set,c=new Set,p=new Set,d=new Set;for(let m of t)o[m.id]?s[m.id]?s[m.id].push(m.fullFilePath):s[m.id]=[o[m.id],m.fullFilePath]:o[m.id]=m.fullFilePath,i[m.name]?a[m.name]?a[m.name].push(m.fullFilePath):a[m.name]=[i[m.name],m.fullFilePath]:i[m.name]=m.fullFilePath;for(let m of r)d.has(m.moduleId)&&l.add(m.moduleId),p.has(m.name)&&c.add(m.name),d.add(m.moduleId),p.add(m.name);if(Object.entries(s).length>0||Object.entries(a).length>0||l.size>0||c.size>0){for(let[m,h]of Object.entries(s))for(let g of h)y.error(`Test ID ${m} is duplicated in ${g}`);for(let[m,h]of Object.entries(a))for(let g of h)y.error(`Test Name ${m} is duplicated in ${g}`);for(let m of l)y.error(`Module id ${m} is duplicated in your project`);for(let m of c)y.error(`Module name ${m} is duplicated in your project`);process.exit(1)}y.success("No duplicates detected. All test and module names and ids are unique."),process.exit(0)}import{cloneDeep as sN}from"lodash-es";async function Nl({client:n,skipPrompts:e,project:t}){let r=await n.getAllEnvironments(),o=sN(t.config);o.environments||(o.environments=[]);for(let i of r){let s=o.environments?.find(a=>a.name===i.name);if(s)!e&&!await at(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),s.baseUrl=i.variables[Ae],delete i.variables[Ae],s.envVariables=i.variables;else{let a=i.variables[Ae];delete i.variables[Ae],o.environments.push({name:i.name,baseUrl:a,envVariables:i.variables})}}Xo(o,t.configFilePath),y.success(`Pulled ${r.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as Zw}from"crypto";import Qw from"fs";async function tv({testsToFetch:n,client:e,all:t,yes:r}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:n,all:t}),s=0;for(let[l,c]of Object.entries(o)){let p=ev(l,he.TEST);!r&&!await Xp(p)||(s+=1,Qw.writeFileSync(p,c,"utf-8"),Q.info({checksum:Zw("md5").update(c).digest("hex")},`Wrote '${p}'`))}let a=0;for(let[l,c]of Object.entries(i)){let p=ev(l,he.MODULE);!r&&!await Xp(p)||(a+=1,Qw.writeFileSync(p,c,"utf-8"),Q.info({checksum:Zw("md5").update(c).digest("hex")},`Wrote '${p}'`))}s===0?y.success("Pulled 0 tests."):y.success(`Pulled ${s} test${s>1?"s":""}${a?` and ${a} module${a>1?"s":""}`:""}!`)}function ev(n,e){switch(e){case he.TEST:return`${Pe(n)}.${Nt.TEST}`;case he.MODULE:return`${Pe(n)}.${Nt.MODULE}`;default:throw new Error(`Unknown entity type ${e}`)}}async function nv(n){let{project:e,client:t,skipPrompts:r}=n;y.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),y.info("Importing environments from Momentic Cloud."),y.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await at("Are you sure you want to proceed?",!0)||(y.info("Aborting..."),process.exit(1)),await Nl({client:t,project:e,skipPrompts:r}),y.success(`Successfully imported environments from Momentic Cloud. We recommend pulling secrets out of ${e.configFilePath} into .env files or dynamically set environment variables for security.`),y.info("Importing tests and modules from Momentic Cloud."),await tv({testsToFetch:[],client:t,all:!0,yes:r}),y.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}import Ht from"fs";import Xr from"path";import aN from"yaml";function rv(){xs("momentic")||(y.error(`The migration command should be ran from the v0 root Momentic directory, which should contain a folder called 'momentic'. No folder named 'momentic' was found in the current working directory (${process.cwd()}).`),process.exit(1));let n={name:"default",include:bs,environments:[]};y.info("Migrating environments");let e=ov(["momentic/environments"],lN);for(let r of e){let o=aN.parse(Ht.readFileSync(r,"utf-8"));try{let i=qs.parse(o),s=i.variables[Ae]??"";delete i.variables[Ae],n.environments?.push({name:i.name,baseUrl:s,envVariables:i.variables})}catch(i){y.error(`${r} failed to parse as a valid environment file.`),y.error(i),process.exit(1)}}y.info("Migrating tests");let t=dp("./momentic",y);for(let r of t){let o=Xr.join(...r.fullPathSegments),i=Xr.join(Xr.dirname(o),`${r.fileName.slice(0,-5)}.test.yaml`);y.info(`Moving test ${o} to ${i}`),Ht.renameSync(o,i)}if(xs("momentic/modules")){y.info("Migrating modules");for(let r of Ht.readdirSync("./momentic/modules")){if(!r.endsWith(".yaml"))continue;let o=Xr.resolve(Xr.join("./momentic/modules",r));if(!Ht.readFileSync(o,"utf-8").includes("schemaVersion")){y.warn(`Skipping file ${o} since it does not have valid Momentic module contents`);continue}let s=`${o.slice(0,-5)}.module.yaml`;y.info(`Moving module ${o} to ${s}`),Ht.renameSync(o,s)}}return y.info("Writing new project configuration file"),Xo(n,"momentic.config.yaml"),Ht.rmSync("./momentic/environments",{recursive:!0,force:!0}),Ht.rmSync("./momentic/fixtures",{recursive:!0,force:!0}),y.success("Migration succeeded!"),y.info("Going forward:"),y.info(` - You can store test and module files anywhere under the project root (${process.cwd()})`),y.info(" - Environment details and other common options are tracked in the root momentic.config.yaml file"),n}function ov(n,e,t=new Set){for(let r of n){let o=Xr.resolve(r),i=!1;try{i=Ht.existsSync(o)&&Ht.statSync(o).isDirectory()}catch(s){y.error({err:s},`Error reading path ${o} during collect paths`)}if(o&&i){let s=Ht.readdirSync(o).map(a=>Xr.join(o,a));ov(s,e,t);continue}if(o.endsWith(".yaml")){try{if(!Ht.existsSync(o)||!Ht.statSync(o).isFile()){y.warn(`File not found or unreadable: ${o}`);continue}}catch(s){y.error({err:s},`Error reading file ${o} during collect paths`);continue}if(!e(o))continue;t.add(o)}}return t}function lN(n){return n.endsWith(".yaml")?Ht.readFileSync(n,"utf8").includes("momentic/environment")?!0:(y.warn(`Skipping YAML that is not a Momentic environment: ${n}`),!1):!1}import{Argument as oi,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as cN}from"http";import{cpus as iv}from"os";import{parse as Ipe}from"yaml";import{z as q}from"zod";var _l=58888,Zp=30*60*1e3,jn=new Ne("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),hr=new Ne("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),gr=new Ne("-y, --yes","Skip all confirmation prompts."),Qp=new Ne("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),eu=new Ne("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${Zp/1e3} seconds.`),Ml=new Ne("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),tu=new Ne("--no-report","Skip reporting test results to Momentic Cloud when running with the --local flag.").implies({local:!0}),av=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(_i)),lv=new Ne("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),nu=new Ne("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),cv=new Ne("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),dv=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),ru=new Ne("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),pv=new Ne("--port <port>",`Port to run the app on. Defaults to ${_l}.`),ou=new Ne("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),Fl=new Ne("--env <env>","Name of the environment to use when running tests."),Dl=new Ne("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),uv=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),fr=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),iu=new Ne("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),mv=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),hv=new Ne("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),gv=new oi("<tests...>",`One or more test paths to queue on Momentic Cloud.
3575
+ `)}import a_ from"events";import Cu from"fs";import l_ from"open";import ec from"path";import{fileURLToPath as c_}from"url";import aN from"diff-lines";import{gt as lN}from"semver";import{execSync as $k}from"child_process";import{platform as Wk}from"os";function Kp(){return $w()?(y.info("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),y.info("If you are using a low pixel-density monitor, you should manually set --pixel-ratio to 1 to avoid incorrect viewport calculations."),y.info("Confirm your device's pixel-ratio at https://www.mydevice.io."),2):(y.info("Setting device pixel ratio to 1."),y.info("If you are using Momentic on a high-pixel density (HiDPI) monitor, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations"),y.info("Confirm your device's pixel-ratio at https://www.mydevice.io."),1)}function $w(){return Wk()==="darwin"&&$k("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Yp(n){$w()&&n===1&&(y.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),y.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import Gk from"@actions/exec";import Vk from"@actions/io";import qk from"quote";import Kk from"string-argv";async function Ww(n,e=!0){let t=Kk(n),r=await Vk.which(t[0],!0),o=t.slice(1),i=Gk.exec(qk(r),o,{delay:100});if(e)return i}import{existsSync as Yk,statSync as Jk}from"fs";var Ll=!!process.env.CI||!process.stdout.isTTY||!!process.env.TF_BUILD;function Ts(n){try{return Yk(n)&&Jk(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import Xk from"csv-parser";import{createReadStream as Zk}from"fs";function Jp(n){return new Promise((e,t)=>{let r=[];Zk(n).pipe(Xk()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Ol from"semver";import{z as kl}from"zod";var jt="1.1.3",Qk="https://registry.npmjs.org/momentic",eN=kl.object({versions:kl.record(kl.string(),kl.unknown()).optional()});async function Gw(n){try{await tN(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function tN(n){if(!jt){n.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let r=0;r<2;r++)try{let o=await U(fetch(Qk),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=eN.parse(i).versions;break}catch(o){n.warn({err:o},"Failed to fetch npm registry data")}if(!e){n.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let r of Object.keys(e))Ol.valid(r)&&(!t||Ol.gt(r,t))&&Ol.gt(r,jt)&&Ol.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(y.warn(`Update available: v${jt} -> v${t}`),y.warn("This version may be missing critical fixes, features, and security updates."),y.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as rN,mkdirSync as oN,statSync as iN}from"fs";import{dirname as sN}from"path";import qw from"readline/promises";import{hostname as nN}from"os";var Q=Cl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:nN(),disableConsoleLogs:!0}).child({version:"1.1.3"});var Xp=!1,Kw=(()=>{try{return iN("/.dockerenv"),!0}catch{return!1}})();async function at(n,e){if(Ll||Xp||Kw)return!0;Q.flush(),await new Promise(s=>setTimeout(s,500));let t=qw.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let s=`${r.slice(0,r.length-1).join(".").trim()}.`;e?y.warn(s):y.log(s),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(Xp=!0,setTimeout(()=>{Xp=!1},3e3),!0):i.toLowerCase()==="y"}async function Zp(n){let e=sN(n);return Ts(e)?rN(n)?at(`File '${Vw(n)}' already exists. Overwrite existing content?`,!0):!0:await at(`Directory '${Vw(e)}' doesn't exist. Create it now?`,!0)?(oN(e,{recursive:!0}),!0):!1}function Vw(n){return n.replace(/(\s+)/g,"\\$1")}async function Yw(n,e){if(Ll||Kw)return e;let t=qw.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function Jw({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){lN(e.schemaVersion,He)&&(y.error(`This version of the CLI does not support the schema version of the fragment (${e.schemaVersion}). Please update to the latest version of the CLI and retry this command.`),process.exit(1)),Og(e.steps).forEach(g=>{t.modules[g]||(y.error(`The test patch contains a module with id ${g} that could not be found in the current project. This suggests that either this test patch or your local file system may be out of date.`),process.exit(1))}),e.createdAt.getTime()<Date.now()-7*24*60*60*1e3&&!i&&!await at("The test patch you are applying is more than 7 days old. Are you sure you want to continue?",!0)&&process.exit(1);let a=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<a&&!i&&!await at("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?",!0)&&process.exit(1);let l=ts(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let p,d;if(e.schemaVersion!==He){let{steps:g,newVersion:f}=await $i({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:y});p=f,d=ve.array().parse(g)}else d=ve.array().parse(e.steps);let{stepsToSave:u,moduleUpdates:m}=await mt({stepLists:{steps:d}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=aN(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});y.dimmed("=".repeat(30)),y.dimmed(h),y.dimmed("=".repeat(30)),y.dimmed(""),p&&y.warn(`If this patch is applied, your test will also be automatically upgraded to the latest schema version (${p}). Schema upgrades have no impact on functionality, although you may notice minor differences in the test YAML.`),!i&&!await at("Do you want to apply this patch?")&&(y.dimmed("Cancelled."),process.exit(1)),qr(n.relativePath,u,p??e.schemaVersion,t.project),y.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as Xw}from"crypto";async function Zw({fix:n,project:e}){let t=ke(e,y),r=Object.values(t.tests),o={},i={},s=new Set,a=0;for(let l of r)try{let c=ts(l.fullFilePath,Q,t),p=c.steps;if(!p||p.length===0||!Array.isArray(p)){y.debug(`Test ${l.name} (${l.relativePath}) has no steps, skipping...`);continue}let d=kt.parse(c),u=await dd(d,p,y),m=!1,h=!1;u.steps.forEach((g,f)=>{if(!g.id){y.error(`Step ${f} in test '${l.name}' (${l.relativePath}) does not have an ID`),h=!0;return}let S=o[g.id]?.testId,x=o[g.id]?.testRelativePath;if(S?(a++,h=!0,S===l.id?y.error(`Multiple steps in the test '${l.name}' (${l.relativePath}) have the same ID '${g.id}'`):y.error(`Step ${f} in test '${l.name}' (${l.relativePath}) has the ID ${g.id} which is duplicated in test ${x}`),n&&(m=!0,g.id=Xw())):o[g.id]={testId:l.id,testRelativePath:l.relativePath},g.type!=="PRESET_ACTION")return;let b=g.command.id,w=i[b]?.testId,E=i[b]?.testRelativePath;w?(a++,h=!0,w===l.id?y.error(`Multiple commands in the test '${l.name}' (${l.relativePath}) have the same ID '${b}'`):y.error(`Command ${f} in test '${l.name}' (${l.relativePath}) has the ID ${b} which is duplicated in test ${E}`),n&&(m=!0,g.command.id=Xw())):i[b]={testId:l.id,testRelativePath:l.relativePath}}),h&&y.dimmed("=".repeat(80)),m&&n&&(qr(l.relativePath,{beforeSteps:c.beforeSteps,steps:u.steps,afterSteps:c.afterSteps},He,e),s.add(l.fullFilePath))}catch(c){y.error({err:c},`Failed to parse test ${l.name} (${l.relativePath})`);continue}a>0?(y.error(`Found errors in ${a} steps`),n?y.warn(`Modified the following files:
3576
+ ${[...s].map(l=>`- ${l}`).join(`
3577
+ `)}`):y.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(y.success("No step ID errors found!"),process.exit(0))}async function Qw({project:n}){let e=ke(n,y),t=Object.values(e.tests),r=await ol(e,Q),o={},i={},s={},a={},l=new Set,c=new Set,p=new Set,d=new Set;for(let m of t)o[m.id]?s[m.id]?s[m.id].push(m.fullFilePath):s[m.id]=[o[m.id],m.fullFilePath]:o[m.id]=m.fullFilePath,i[m.name]?a[m.name]?a[m.name].push(m.fullFilePath):a[m.name]=[i[m.name],m.fullFilePath]:i[m.name]=m.fullFilePath;for(let m of r)d.has(m.moduleId)&&l.add(m.moduleId),p.has(m.name)&&c.add(m.name),d.add(m.moduleId),p.add(m.name);if(Object.entries(s).length>0||Object.entries(a).length>0||l.size>0||c.size>0){for(let[m,h]of Object.entries(s))for(let g of h)y.error(`Test ID ${m} is duplicated in ${g}`);for(let[m,h]of Object.entries(a))for(let g of h)y.error(`Test Name ${m} is duplicated in ${g}`);for(let m of l)y.error(`Module id ${m} is duplicated in your project`);for(let m of c)y.error(`Module name ${m} is duplicated in your project`);process.exit(1)}y.success("No duplicates detected. All test and module names and ids are unique."),process.exit(0)}import{cloneDeep as cN}from"lodash-es";async function Nl({client:n,skipPrompts:e,project:t}){let r=await n.getAllEnvironments(),o=cN(t.config);o.environments||(o.environments=[]);for(let i of r){let s=o.environments?.find(a=>a.name===i.name);if(s)!e&&!await at(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),s.baseUrl=i.variables[Ae],delete i.variables[Ae],s.envVariables=i.variables;else{let a=i.variables[Ae];delete i.variables[Ae],o.environments.push({name:i.name,baseUrl:a,envVariables:i.variables})}}Xo(o,t.configFilePath),y.success(`Pulled ${r.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as ev}from"crypto";import tv from"fs";async function rv({testsToFetch:n,client:e,all:t,yes:r}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:n,all:t}),s=0;for(let[l,c]of Object.entries(o)){let p=nv(l,he.TEST);!r&&!await Zp(p)||(s+=1,tv.writeFileSync(p,c,"utf-8"),Q.info({checksum:ev("md5").update(c).digest("hex")},`Wrote '${p}'`))}let a=0;for(let[l,c]of Object.entries(i)){let p=nv(l,he.MODULE);!r&&!await Zp(p)||(a+=1,tv.writeFileSync(p,c,"utf-8"),Q.info({checksum:ev("md5").update(c).digest("hex")},`Wrote '${p}'`))}s===0?y.success("Pulled 0 tests."):y.success(`Pulled ${s} test${s>1?"s":""}${a?` and ${a} module${a>1?"s":""}`:""}!`)}function nv(n,e){switch(e){case he.TEST:return`${Pe(n)}.${Nt.TEST}`;case he.MODULE:return`${Pe(n)}.${Nt.MODULE}`;default:throw new Error(`Unknown entity type ${e}`)}}async function ov(n){let{project:e,client:t,skipPrompts:r}=n;y.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),y.info("Importing environments from Momentic Cloud."),y.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await at("Are you sure you want to proceed?",!0)||(y.info("Aborting..."),process.exit(1)),await Nl({client:t,project:e,skipPrompts:r}),y.success(`Successfully imported environments from Momentic Cloud. We recommend pulling secrets out of ${e.configFilePath} into .env files or dynamically set environment variables for security.`),y.info("Importing tests and modules from Momentic Cloud."),await rv({testsToFetch:[],client:t,all:!0,yes:r}),y.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}import Ht from"fs";import Xr from"path";import dN from"yaml";function iv(){Ts("momentic")||(y.error(`The migration command should be ran from the v0 root Momentic directory, which should contain a folder called 'momentic'. No folder named 'momentic' was found in the current working directory (${process.cwd()}).`),process.exit(1));let n={name:"default",include:ws,environments:[]};y.info("Migrating environments");let e=sv(["momentic/environments"],pN);for(let r of e){let o=dN.parse(Ht.readFileSync(r,"utf-8"));try{let i=Ks.parse(o),s=i.variables[Ae]??"";delete i.variables[Ae],n.environments?.push({name:i.name,baseUrl:s,envVariables:i.variables})}catch(i){y.error(`${r} failed to parse as a valid environment file.`),y.error(i),process.exit(1)}}y.info("Migrating tests");let t=pp("./momentic",y);for(let r of t){let o=Xr.join(...r.fullPathSegments),i=Xr.join(Xr.dirname(o),`${r.fileName.slice(0,-5)}.test.yaml`);y.info(`Moving test ${o} to ${i}`),Ht.renameSync(o,i)}if(Ts("momentic/modules")){y.info("Migrating modules");for(let r of Ht.readdirSync("./momentic/modules")){if(!r.endsWith(".yaml"))continue;let o=Xr.resolve(Xr.join("./momentic/modules",r));if(!Ht.readFileSync(o,"utf-8").includes("schemaVersion")){y.warn(`Skipping file ${o} since it does not have valid Momentic module contents`);continue}let s=`${o.slice(0,-5)}.module.yaml`;y.info(`Moving module ${o} to ${s}`),Ht.renameSync(o,s)}}return y.info("Writing new project configuration file"),Xo(n,"momentic.config.yaml"),Ht.rmSync("./momentic/environments",{recursive:!0,force:!0}),Ht.rmSync("./momentic/fixtures",{recursive:!0,force:!0}),y.success("Migration succeeded!"),y.info("Going forward:"),y.info(` - You can store test and module files anywhere under the project root (${process.cwd()})`),y.info(" - Environment details and other common options are tracked in the root momentic.config.yaml file"),n}function sv(n,e,t=new Set){for(let r of n){let o=Xr.resolve(r),i=!1;try{i=Ht.existsSync(o)&&Ht.statSync(o).isDirectory()}catch(s){y.error({err:s},`Error reading path ${o} during collect paths`)}if(o&&i){let s=Ht.readdirSync(o).map(a=>Xr.join(o,a));sv(s,e,t);continue}if(o.endsWith(".yaml")){try{if(!Ht.existsSync(o)||!Ht.statSync(o).isFile()){y.warn(`File not found or unreadable: ${o}`);continue}}catch(s){y.error({err:s},`Error reading file ${o} during collect paths`);continue}if(!e(o))continue;t.add(o)}}return t}function pN(n){return n.endsWith(".yaml")?Ht.readFileSync(n,"utf8").includes("momentic/environment")?!0:(y.warn(`Skipping YAML that is not a Momentic environment: ${n}`),!1):!1}import{Argument as oi,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as uN}from"http";import{cpus as av}from"os";import{parse as kpe}from"yaml";import{z as q}from"zod";var _l=58888,Qp=30*60*1e3,jn=new Ne("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),hr=new Ne("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),gr=new Ne("-y, --yes","Skip all confirmation prompts."),eu=new Ne("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),tu=new Ne("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${Qp/1e3} seconds.`),Ml=new Ne("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),nu=new Ne("--no-report","Skip reporting test results to Momentic Cloud when running with the --local flag.").implies({local:!0}),cv=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(_i)),dv=new Ne("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),ru=new Ne("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),pv=new Ne("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),uv=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),ou=new Ne("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),mv=new Ne("--port <port>",`Port to run the app on. Defaults to ${_l}.`),iu=new Ne("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),Fl=new Ne("--env <env>","Name of the environment to use when running tests."),Dl=new Ne("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),hv=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),fr=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),su=new Ne("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),gv=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),fv=new Ne("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),Sv=new oi("<tests...>",`One or more test paths to queue on Momentic Cloud.
3560
3578
 
3561
- A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic@latest pull hello-world'.`),fv=new oi("<tests...>","One or more test file path or folders that exist on the local machine: 'npx momentic@latest run hello-world.test.yaml'.").argOptional(),Sv=new oi("<suites...>",`One or more suite paths that exist on Momentic Cloud.
3579
+ A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic@latest pull hello-world'.`),yv=new oi("<tests...>","One or more test file path or folders that exist on the local machine: 'npx momentic@latest run hello-world.test.yaml'.").argOptional(),bv=new oi("<suites...>",`One or more suite paths that exist on Momentic Cloud.
3562
3580
 
3563
- The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),Ope=new oi("<envs...>","One or more environment names to push").argOptional(),yv=new oi("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),bv=new oi("<results>","Path to the results archive.").argRequired(),sv=q.object({apiKey:q.preprocess(n=>n!==void 0?n:process.env.MOMENTIC_API_KEY,q.string()),server:q.string().default("https://api.momentic.ai"),config:q.string().optional(),filter:q.string().optional(),yes:q.preprocess(n=>process.env.CI?!0:n,q.boolean().optional()),fix:q.boolean().optional(),pixelRatio:q.coerce.number().optional(),port:q.coerce.number().default(_l).optional(),wait:q.preprocess(n=>!!n,q.boolean()).optional(),waitTimeout:q.coerce.number().optional(),start:q.string().optional(),waitOn:q.string().optional(),waitOnTimeout:q.coerce.number().default(60).optional(),customHeaders:q.string().array().optional(),env:q.string().optional(),urlOverride:q.string().url().optional(),all:q.boolean().optional(),parallel:q.coerce.number().optional(),retries:q.coerce.number().optional(),shardIndex:q.coerce.number().optional(),shardCount:q.coerce.number().optional(),inputCsv:q.string().optional(),updateGoldenFiles:q.boolean().optional().default(!1),tests:q.array(q.string()).optional(),suites:q.array(q.string()).optional(),paths:q.array(q.string()).optional(),envs:q.array(q.string()).optional(),include:q.array(q.string()).optional(),exclude:q.array(q.string()).optional(),labels:q.array(q.string()).optional(),report:q.preprocess(()=>!!process.env.CI,q.boolean().optional()),reporter:q.nativeEnum(_i).optional(),reporterDir:q.string().optional(),outputDir:q.string().optional()}),fn=async n=>{let e={},t;try{let r=Object.assign(e,sv.partial().parse(n));t=sv.parse(r)}catch(r){y.error(`Error parsing command line arguments: ${r.message}`),process.exit(1)}try{dN(t)}catch(r){y.error(`Invalid command line arguments: ${r.message}`),process.exit(1)}return t};var dN=n=>{for(let[e,t]of Object.entries(n))switch(e){case"shardIndex":if(!n.shardCount)throw new Error("The --shard-count flag must be provided alongside --shard-index");if(n.shardCount&&n.shardIndex&&n.shardIndex>n.shardCount)throw new Error("Shard index cannot be greater than shard count");if(n.shardIndex!==void 0&&n.shardIndex<1)throw new Error("Shard index must be greater than 0");break;case"waitTimeout":case"pixelRatio":try{n[e]=q.number().int().optional().parse(t)}catch{throw new Error(`Invalid ${e} provided does not parse a number: ${t}`)}break;case"urlOverride":if(t===void 0)break;try{q.string().url().parse(t)}catch(r){throw new Error(`Invalid URL provided for ${e}`,{cause:r})}break;case"server":if(typeof t!="string")throw new Error(`Expected a string for ${e}`);if(!t.startsWith("http"))throw new Error("--server option must be a fully qualified URL beginning with http");break;case"parallel":if(t===void 0)break;if(typeof t!="number"||isNaN(t))throw new Error(`Expected a number for ${e}`);iv().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${iv().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function Ul(n){if(n===void 0)return;let e={};for(let t of n){let r=t.indexOf("=");if(r===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,r),i=t.slice(r+1);cN(o,i),e[o]=i}return e}import uN from"fs";import{tmpdir as mN}from"os";import hN from"path";import{registry as Bl}from"playwright-core/lib/server";import wv from"proper-lockfile";var vv=hN.join(mN(),"momenticBrowserInstallation"),su=["chrome","chromium"];function xv(n){let e=n.executablePath();return uN.existsSync(e)}function gN(n,e){let t=[],r=[];for(let o of n){let i=Bl.findExecutable(o);if(!i||i.installType==="none")t.push(o);else{if(!e&&xv(i))return[];r.push(i)}}return r}async function fN(n,e){let t=gN([n],e);if(!t.length){y.debug(`Browser '${n}' is already installed, skipping...`);return}y.info(`Installing browser '${n}'...`);try{await Bl.installDeps(t,!1),await Bl.install(t,!1)}catch(r){if(r.message.includes("Lock file is already being held")){y.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=Bl.findExecutable(n),i=5*60*1e3,s=Date.now();for(;Date.now()-s<i&&!xv(o);)y.info("Waiting for browser to finish installing..."),await new Promise(a=>setTimeout(a,5e3))}else throw r}}function Tv(n){for(let e of n)su.includes(e)||(y.error(`Got invalid browser ${e} to install`),process.exit(1));return Array.from(new Set(n))}async function Zr(n,e=!1){try{await wv.lock(vv,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(t){y.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${t}. Continuing without installation...`);return}try{for(let t of n)try{await fN(t,e)}catch(r){y.error(`Failed to install the ${t} browser: ${r}`)}}finally{await wv.unlock(vv,{realpath:!1})}}async function au(n){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(y.error(`Node.js version 18 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),y.debug(`Identified node version ${e}`);let r=await n.client.getAuthInfo();return y.debug("Got auth info from API"),n.installBrowsers&&(await Zr(["chromium"]),y.debug("Installed Chromium browser")),r}import Rv from"chalk";import{Console as Ev}from"console";import{format as Ts}from"util";var lu=class extends Error{constructor(e,t,r){let o=Error.stackTraceLimit;r&&(Error.stackTraceLimit=Math.max(r,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},zl=class n extends Ev{_buffer=[];_groupDepth=0;Console=Ev;constructor(){super({write:e=>(n.write(this._buffer,"log",e),!0)})}static write(e,t,r,o=2){let i=new lu(void 0,n.write).stack;if(!i)return e;let s=i.split(`
3581
+ The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),Mpe=new oi("<envs...>","One or more environment names to push").argOptional(),wv=new oi("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),vv=new oi("<results>","Path to the results archive.").argRequired(),lv=q.object({apiKey:q.preprocess(n=>n!==void 0?n:process.env.MOMENTIC_API_KEY,q.string()),server:q.string().default("https://api.momentic.ai"),config:q.string().optional(),filter:q.string().optional(),yes:q.preprocess(n=>process.env.CI?!0:n,q.boolean().optional()),fix:q.boolean().optional(),pixelRatio:q.coerce.number().optional(),port:q.coerce.number().default(_l).optional(),wait:q.preprocess(n=>!!n,q.boolean()).optional(),waitTimeout:q.coerce.number().optional(),start:q.string().optional(),waitOn:q.string().optional(),waitOnTimeout:q.coerce.number().default(60).optional(),customHeaders:q.string().array().optional(),env:q.string().optional(),urlOverride:q.string().url().optional(),all:q.boolean().optional(),parallel:q.coerce.number().optional(),retries:q.coerce.number().optional(),shardIndex:q.coerce.number().optional(),shardCount:q.coerce.number().optional(),inputCsv:q.string().optional(),updateGoldenFiles:q.boolean().optional().default(!1),tests:q.array(q.string()).optional(),suites:q.array(q.string()).optional(),paths:q.array(q.string()).optional(),envs:q.array(q.string()).optional(),include:q.array(q.string()).optional(),exclude:q.array(q.string()).optional(),labels:q.array(q.string()).optional(),report:q.preprocess(()=>!!process.env.CI,q.boolean().optional()),reporter:q.nativeEnum(_i).optional(),reporterDir:q.string().optional(),outputDir:q.string().optional()}),fn=async n=>{let e={},t;try{let r=Object.assign(e,lv.partial().parse(n));t=lv.parse(r)}catch(r){y.error(`Error parsing command line arguments: ${r.message}`),process.exit(1)}try{mN(t)}catch(r){y.error(`Invalid command line arguments: ${r.message}`),process.exit(1)}return t};var mN=n=>{for(let[e,t]of Object.entries(n))switch(e){case"shardIndex":if(!n.shardCount)throw new Error("The --shard-count flag must be provided alongside --shard-index");if(n.shardCount&&n.shardIndex&&n.shardIndex>n.shardCount)throw new Error("Shard index cannot be greater than shard count");if(n.shardIndex!==void 0&&n.shardIndex<1)throw new Error("Shard index must be greater than 0");break;case"waitTimeout":case"pixelRatio":try{n[e]=q.number().int().optional().parse(t)}catch{throw new Error(`Invalid ${e} provided does not parse a number: ${t}`)}break;case"urlOverride":if(t===void 0)break;try{q.string().url().parse(t)}catch(r){throw new Error(`Invalid URL provided for ${e}`,{cause:r})}break;case"server":if(typeof t!="string")throw new Error(`Expected a string for ${e}`);if(!t.startsWith("http"))throw new Error("--server option must be a fully qualified URL beginning with http");break;case"parallel":if(t===void 0)break;if(typeof t!="number"||isNaN(t))throw new Error(`Expected a number for ${e}`);av().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${av().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function Ul(n){if(n===void 0)return;let e={};for(let t of n){let r=t.indexOf("=");if(r===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,r),i=t.slice(r+1);uN(o,i),e[o]=i}return e}import gN from"fs";import{tmpdir as fN}from"os";import SN from"path";import{registry as Bl}from"playwright-core/lib/server";import xv from"proper-lockfile";var Tv=SN.join(fN(),"momenticBrowserInstallation"),au=["chrome","chromium"];function Ev(n){let e=n.executablePath();return gN.existsSync(e)}function yN(n,e){let t=[],r=[];for(let o of n){let i=Bl.findExecutable(o);if(!i||i.installType==="none")t.push(o);else{if(!e&&Ev(i))return[];r.push(i)}}return r}async function bN(n,e){let t=yN([n],e);if(!t.length){y.debug(`Browser '${n}' is already installed, skipping...`);return}y.info(`Installing browser '${n}'...`);try{await Bl.installDeps(t,!1),await Bl.install(t,!1)}catch(r){if(r.message.includes("Lock file is already being held")){y.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=Bl.findExecutable(n),i=5*60*1e3,s=Date.now();for(;Date.now()-s<i&&!Ev(o);)y.info("Waiting for browser to finish installing..."),await new Promise(a=>setTimeout(a,5e3))}else throw r}}function Cv(n){for(let e of n)au.includes(e)||(y.error(`Got invalid browser ${e} to install`),process.exit(1));return Array.from(new Set(n))}async function Zr(n,e=!1){try{await xv.lock(Tv,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(t){y.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${t}. Continuing without installation...`);return}try{for(let t of n)try{await bN(t,e)}catch(r){y.error(`Failed to install the ${t} browser: ${r}`)}}finally{await xv.unlock(Tv,{realpath:!1})}}async function lu(n){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(y.error(`Node.js version 18 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),y.debug(`Identified node version ${e}`);let r=await n.client.getAuthInfo();return y.debug("Got auth info from API"),n.installBrowsers&&(await Zr(["chromium"]),y.debug("Installed Chromium browser")),r}import Iv from"chalk";import{Console as Rv}from"console";import{format as Es}from"util";var cu=class extends Error{constructor(e,t,r){let o=Error.stackTraceLimit;r&&(Error.stackTraceLimit=Math.max(r,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},zl=class n extends Rv{_buffer=[];_groupDepth=0;Console=Rv;constructor(){super({write:e=>(n.write(this._buffer,"log",e),!0)})}static write(e,t,r,o=2){let i=new cu(void 0,n.write).stack;if(!i)return e;let s=i.split(`
3564
3582
  `).slice(o).filter(Boolean).join(`
3565
- `);return e.push({message:r,origin:s,type:t}),e}_log(e,t){n.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Ts(e,...t))}error(e,...t){this._log("error",Ts(e,...t))}info(e,...t){this._log("info",Ts(e,...t))}log(e,...t){this._log("log",Ts(e,...t))}warn(e,...t){this._log("warn",Ts(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function Cv(n){let e=globalThis.console,t=new zl;globalThis.console=t;try{n()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
3583
+ `);return e.push({message:r,origin:s,type:t}),e}_log(e,t){n.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Es(e,...t))}error(e,...t){this._log("error",Es(e,...t))}info(e,...t){this._log("info",Es(e,...t))}log(e,...t){this._log("log",Es(e,...t))}warn(e,...t){this._log("warn",Es(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function Av(n){let e=globalThis.console,t=new zl;globalThis.console=t;try{n()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
3566
3584
  `);process.stderr.write(`${o}
3567
- `),globalThis.console=e}}var SN=5;async function jl({getResults:n,checkDone:e,name:t,timeoutMs:r=Zp}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let s;i>SN&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{s=await n(),i=0}catch(c){i++,Q.warn({err:c},"Failed to fetch run status, retrying..."),y.warn({err:c},"Failed to fetch run status, retrying..."),await new Promise(p=>setTimeout(p,1500*i));continue}if(e(s))return s;let l=Math.max(1e4,Math.floor(r/100));await new Promise(c=>setTimeout(c,l))}y.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(r/1e3)}s).`),process.exit(1)}function ii({results:n,startTime:e,entity:t,getDisplayLine:r,onFailed:o}){let i=n.filter(l=>l.status==="PASSED"),s=n.filter(l=>l.status==="FAILED"),a=n.filter(l=>l.status==="CANCELLED");return Cv(()=>{s.forEach(l=>{y.log(""),o(l)}),s.length&&(y.log(""),y.error(`${s.length} ${t}s failed:`),s.forEach(l=>{y.dimmed(r(l))})),a.length&&(y.log(""),y.warn(`${a.length} ${t}s cancelled:`),a.forEach(l=>{y.dimmed(r(l))})),i.length&&(y.log(""),y.success(`${i.length} ${t}s passed:`),i.forEach(l=>{y.dimmed(r(l))})),y.log(""),y.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{passed:i.length,failed:s.length,cancelled:a.length}}var Hl=(n,e)=>{if(!n.failureDetails||!n.failureReason)return;let t=Ks[n.failureDetails?.classification?.reason||n.failureReason],r=n.failureDetails?.classification?.summary||go[n.failureReason];y.error(e),y.log(` Reason: ${Rv.red(t)}`),y.log(` Description: ${Rv.red(r)}`)};function Av(n){return n?Pe(n):"Unknown suite"}async function Iv({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:s,runGroupIds:a}=await n.queueSuiteRuns({paths:t,...i});Q.info({orgId:e,suiteRunIds:s,runGroupIds:a,suitePaths:t},"Queued suites remotely"),y.dimmed(`Queued ${t.length} suites.`),r||process.exit(0);let l=Date.now();y.dimmed(`Waiting for ${t.length} suites to complete.`);let c=new Set,p=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(x=>x.status==="FAILED"&&(x.failureReason||x.finishedAt&&Date.now()-x.finishedAt.getTime()>30*1e3)||x.status==="PASSED"||x.status==="CANCELLED"),u=await jl({name:"suites",getResults:async()=>{let f=a.filter(b=>!p.some(w=>w.id===b)),S=await n.bulkGetRunGroupStatus(f),x=[];for(let b of S)d(b)?p.push(b):x.push(b);return[...p,...x]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),y.log(`${c.size}/${a.length} ${Av(S.suite?.name)}`)))}),f.every(d))}),m=n.getAppUrl(),g=ii({results:u,startTime:l,onFailed:f=>{let S=Av(f.suite?.name),x=f.runs.filter(w=>w.status==="FAILED").length,b=f.runs.length;y.error(`${S} (${x}/${b} tests failed):`);for(let w of f.runs)if(w.status==="FAILED"){let E=w.testName||w.test?.name;y.error(` ${E?Pe(E):"Unknown test"} (${m}/runs/${w.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Pe(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function Pv({tests:n,client:e,orgId:t,...r}){!r.yes&&!await at(`This command will queue ${n.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:n,...r});if(Q.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),y.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.`),r.wait||process.exit(0),!i.length)return;y.dimmed(`Waiting for ${o.length} tests to complete.`);let s=new Set,a=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),p=Date.now(),d=await jl({name:"runs",getResults:async()=>{let m=i.filter(f=>!a.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)l(f)?a.push(f):g.push(f);return[...a,...g]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!s.has(h.id)){s.add(h.id);let g=h.testName||h.test?.name;g&&y.log(`${s.size}/${o.length} ${Pe(g)}`)}}),m.every(l))}),u=ii({results:d,startTime:p,onFailed:m=>{let h=m.testName||m.test?.name;Hl(m,h?Pe(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Pe(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import li,{supportsColor as XN}from"chalk";import{existsSync as LN,mkdirSync as ON,statSync as kN}from"fs";import{randomUUID as cu}from"crypto";import $l from"fs";import{hostname as yN}from"os";import Es from"path";async function Wl(n,e,t,r,o){if(r){let i=Es.extname(r),s=`${cu()}-screenshot${i}`,a=Es.join(t,s),c=await(await fetch(r)).arrayBuffer();return $l.writeFileSync(a,Buffer.from(c)),s}if(o){let i=await e.getScreenshot(n,o);if(i){let s=`${o}-screenshot.jpeg`,a=Es.join(t,s);return $l.writeFileSync(a,i),s}}}async function bN(n,e,t,r){let o=r.runId??cu(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:Pe(r.test.name),status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"skipped":"failed",start:r.lastAttemptStartedAt.getTime(),stop:r.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:yN()},{name:"platform",value:"momentic"},{name:"attempts",value:r.attempts.toString()}],steps:[]};r.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${r.runId}`});for(let[a,l]of Object.entries(r.parameters))l!=null&&i.parameters.push({name:a,value:JSON.stringify(l)});r.results&&await wN(n,e,t.folder,i.steps,r.results);let s=`${o}-result.json`;$l.writeFileSync(Es.join(t.folder,s),JSON.stringify(i,void 0,2))}async function si(n,e,t,r){let o={name:ln(r),start:r.startedAt.getTime(),stop:r.finishedAt.getTime(),status:r.status==="SUCCESS"?"passed":r.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};r.beforeUrl&&o.labels?.push({name:"URL before step",value:r.beforeUrl}),r.afterUrl&&o.labels?.push({name:"URL after step",value:r.afterUrl});let i=await Wl(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let s=await Wl(n,e,t,r.afterScreenshot,r.afterSnapshot);if(s&&o.attachments.push({name:"Screenshot after step",source:s,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data){let a=`${cu()}-attachment.json`,l=Es.join(t,a);$l.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:a,type:"text/plain"})}return o}async function wN(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await si(n,e,t,i));break}case"CONDITIONAL":{let s=await si(n,e,t,i);s.steps=[],i.assertion&&s.steps.push(await si(n,e,t,i.assertion)),s.steps.push(...await Promise.all(i.results.map(a=>si(n,e,t,a)))),r.push(s);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let s=await si(n,e,t,i);if(s.steps=await Promise.all(i.results.map(a=>si(n,e,t,a))),i.type==="MODULE"&&i.inputs){s.parameters=[];for(let[a,l]of Object.entries(i.inputs))s.parameters.push({name:a,value:l})}r.push(s)}}}async function Lv(n,e,t,r){for(let o of r.runs)await bN(n,e,{folder:t,suiteName:r.suiteName},o)}import Ov from"junit-report-builder";import kv from"path";function vN(n,e){let t=e??Ov.testCase();if(t.name(n.test.name).className(n.test.name).file(kv.relative(".",n.filePath)).property("id",n.test.id),n.baseUrl&&t.property("baseUrl",n.baseUrl),n.runId&&t.property("runUrl",`https://app.momentic.ai/runs/${n.runId}`),n.status==="FAILED"){if(n.failureReason){let r=Ks[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||go[n.failureReason];n.runId&&(o+=` See details: https://app.momentic.ai/runs/${n.runId}`),t.failure(o,r)}n.failureDetails?.errorStack&&t.stacktrace(n.failureDetails.errorStack)}else n.status==="CANCELLED"&&t.skipped();t.time((n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime())/1e3).property("startedAt",n.lastAttemptStartedAt.toISOString()).property("finishedAt",n.finishedAt.toISOString()).property("attempts",n.attempts.toString());for(let r of["testInputs","customHeaders"]){let o=n.parameters[r];Object.keys(o??{}).length>0&&t.multilineProperty(r,JSON.stringify(o))}for(let r of["envName","urlOverride"])n.parameters[r]!==void 0&&t.property(r,n.parameters[r]);return Object.keys(n.outputs).length&&t.multilineProperty("testOutputs",JSON.stringify(n.outputs)),t}function xN(n,{suiteId:e,suiteName:t,startedAt:r,finishedAt:o,runs:i}){let s=n.testSuite().name(t);e&&s.property("id",e),s.timestamp(r).property("startedAt",r.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-r.getTime())/1e3);for(let a of i){let l=s.testCase();vN(a,l)}return s}function Nv(n,e){let t=Ov.newBuilder();xN(t,e),t.writeTo(kv.join(n,`${e.suiteName}.xml`))}import TN from"fs";import EN from"path";function _v(n){return{title:ln(n),duration:n.finishedAt.getTime()-n.startedAt.getTime(),error:n.status==="FAILED"?{value:n.failureReason}:void 0,steps:n.results&&n.type!=="PRESET_ACTION"?n.results.map(_v):[]}}async function CN(n,e,t,r){if(r.results?.length){let o=await Wl(n,e,t,r.results[r.results.length-1].afterScreenshot,r.results[r.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function RN(n,e,t,r){return{status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"interrupted":"failed",duration:r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime(),error:r.status==="FAILED"&&r.failureReason?{value:r.failureDetails?.classification?.reason||r.failureReason,message:r.failureDetails?.classification?.summary||go[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(_v)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await CN(n,e,t,r)}}async function AN(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await RN(n,e,t,r)]}}async function IN(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await AN(n,e,t,r)],id:r.runId,file:r.filePath}}function du(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function PN(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>IN(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:du(r.runs,o=>o.status==="PASSED"),unexpected:du(r.runs,o=>o.status!=="PASSED"),flaky:du(r.runs,o=>!!o.isFlake),skipped:0}}}async function Mv(n,e,t,r){let o=await PN(n,e,t,r);TN.writeFileSync(EN.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function Fv(n,e,t,r,o){switch(LN(o)?kN(o).isDirectory()||(y.error(`The specified reporter output directory '${o}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(y.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),ON(o,{recursive:!0})),t){case"junit":Nv(o,r);return;case"allure":case"allure-json":await Lv(n,e,o,r);return;case"playwright-json":await Mv(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import ZN from"wait-on";import pu from"fs";import{compact as NN}from"lodash-es";import uu from"path";import{cwd as _N}from"process";import MN from"semver";async function Dv({tests:n,momenticFiles:e,project:t,yes:r,include:o,exclude:i,labels:s}){let a=new Set;if(n&&n.length>0){let c=n.some(d=>pu.existsSync(d)),p=_N();c?(p!==t.rootDir&&y.warn(`The current working directory ('${p}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),y.info(`Reading tests from the following local file paths:
3585
+ `),globalThis.console=e}}var wN=5;async function jl({getResults:n,checkDone:e,name:t,timeoutMs:r=Qp}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let s;i>wN&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{s=await n(),i=0}catch(c){i++,Q.warn({err:c},"Failed to fetch run status, retrying..."),y.warn({err:c},"Failed to fetch run status, retrying..."),await new Promise(p=>setTimeout(p,1500*i));continue}if(e(s))return s;let l=Math.max(1e4,Math.floor(r/100));await new Promise(c=>setTimeout(c,l))}y.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(r/1e3)}s).`),process.exit(1)}function ii({results:n,startTime:e,entity:t,getDisplayLine:r,onFailed:o}){let i=n.filter(l=>l.status==="PASSED"),s=n.filter(l=>l.status==="FAILED"),a=n.filter(l=>l.status==="CANCELLED");return Av(()=>{s.forEach(l=>{y.log(""),o(l)}),s.length&&(y.log(""),y.error(`${s.length} ${t}s failed:`),s.forEach(l=>{y.dimmed(r(l))})),a.length&&(y.log(""),y.warn(`${a.length} ${t}s cancelled:`),a.forEach(l=>{y.dimmed(r(l))})),i.length&&(y.log(""),y.success(`${i.length} ${t}s passed:`),i.forEach(l=>{y.dimmed(r(l))})),y.log(""),y.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{passed:i.length,failed:s.length,cancelled:a.length}}var Hl=(n,e)=>{if(!n.failureDetails||!n.failureReason)return;let t=Ys[n.failureDetails?.classification?.reason||n.failureReason],r=n.failureDetails?.classification?.summary||go[n.failureReason];y.error(e),y.log(` Reason: ${Iv.red(t)}`),y.log(` Description: ${Iv.red(r)}`)};function Pv(n){return n?Pe(n):"Unknown suite"}async function Lv({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:s,runGroupIds:a}=await n.queueSuiteRuns({paths:t,...i});Q.info({orgId:e,suiteRunIds:s,runGroupIds:a,suitePaths:t},"Queued suites remotely"),y.dimmed(`Queued ${t.length} suites.`),r||process.exit(0);let l=Date.now();y.dimmed(`Waiting for ${t.length} suites to complete.`);let c=new Set,p=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(x=>x.status==="FAILED"&&(x.failureReason||x.finishedAt&&Date.now()-x.finishedAt.getTime()>30*1e3)||x.status==="PASSED"||x.status==="CANCELLED"),u=await jl({name:"suites",getResults:async()=>{let f=a.filter(b=>!p.some(w=>w.id===b)),S=await n.bulkGetRunGroupStatus(f),x=[];for(let b of S)d(b)?p.push(b):x.push(b);return[...p,...x]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),y.log(`${c.size}/${a.length} ${Pv(S.suite?.name)}`)))}),f.every(d))}),m=n.getAppUrl(),g=ii({results:u,startTime:l,onFailed:f=>{let S=Pv(f.suite?.name),x=f.runs.filter(w=>w.status==="FAILED").length,b=f.runs.length;y.error(`${S} (${x}/${b} tests failed):`);for(let w of f.runs)if(w.status==="FAILED"){let E=w.testName||w.test?.name;y.error(` ${E?Pe(E):"Unknown test"} (${m}/runs/${w.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Pe(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function Ov({tests:n,client:e,orgId:t,...r}){!r.yes&&!await at(`This command will queue ${n.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:n,...r});if(Q.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),y.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.`),r.wait||process.exit(0),!i.length)return;y.dimmed(`Waiting for ${o.length} tests to complete.`);let s=new Set,a=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),p=Date.now(),d=await jl({name:"runs",getResults:async()=>{let m=i.filter(f=>!a.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)l(f)?a.push(f):g.push(f);return[...a,...g]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!s.has(h.id)){s.add(h.id);let g=h.testName||h.test?.name;g&&y.log(`${s.size}/${o.length} ${Pe(g)}`)}}),m.every(l))}),u=ii({results:d,startTime:p,onFailed:m=>{let h=m.testName||m.test?.name;Hl(m,h?Pe(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Pe(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import li,{supportsColor as e_}from"chalk";import{existsSync as NN,mkdirSync as _N,statSync as MN}from"fs";import{randomUUID as du}from"crypto";import $l from"fs";import{hostname as vN}from"os";import Cs from"path";async function Wl(n,e,t,r,o){if(r){let i=Cs.extname(r),s=`${du()}-screenshot${i}`,a=Cs.join(t,s),c=await(await fetch(r)).arrayBuffer();return $l.writeFileSync(a,Buffer.from(c)),s}if(o){let i=await e.getScreenshot(n,o);if(i){let s=`${o}-screenshot.jpeg`,a=Cs.join(t,s);return $l.writeFileSync(a,i),s}}}async function xN(n,e,t,r){let o=r.runId??du(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:Pe(r.test.name),status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"skipped":"failed",start:r.lastAttemptStartedAt.getTime(),stop:r.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:vN()},{name:"platform",value:"momentic"},{name:"attempts",value:r.attempts.toString()}],steps:[]};r.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${r.runId}`});for(let[a,l]of Object.entries(r.parameters))l!=null&&i.parameters.push({name:a,value:JSON.stringify(l)});r.results&&await TN(n,e,t.folder,i.steps,r.results);let s=`${o}-result.json`;$l.writeFileSync(Cs.join(t.folder,s),JSON.stringify(i,void 0,2))}async function si(n,e,t,r){let o={name:ln(r),start:r.startedAt.getTime(),stop:r.finishedAt.getTime(),status:r.status==="SUCCESS"?"passed":r.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};r.beforeUrl&&o.labels?.push({name:"URL before step",value:r.beforeUrl}),r.afterUrl&&o.labels?.push({name:"URL after step",value:r.afterUrl});let i=await Wl(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let s=await Wl(n,e,t,r.afterScreenshot,r.afterSnapshot);if(s&&o.attachments.push({name:"Screenshot after step",source:s,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data){let a=`${du()}-attachment.json`,l=Cs.join(t,a);$l.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:a,type:"text/plain"})}return o}async function TN(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await si(n,e,t,i));break}case"CONDITIONAL":{let s=await si(n,e,t,i);s.steps=[],i.assertion&&s.steps.push(await si(n,e,t,i.assertion)),s.steps.push(...await Promise.all(i.results.map(a=>si(n,e,t,a)))),r.push(s);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let s=await si(n,e,t,i);if(s.steps=await Promise.all(i.results.map(a=>si(n,e,t,a))),i.type==="MODULE"&&i.inputs){s.parameters=[];for(let[a,l]of Object.entries(i.inputs))s.parameters.push({name:a,value:l})}r.push(s)}}}async function kv(n,e,t,r){for(let o of r.runs)await xN(n,e,{folder:t,suiteName:r.suiteName},o)}import Nv from"junit-report-builder";import _v from"path";function EN(n,e){let t=e??Nv.testCase();if(t.name(n.test.name).className(n.test.name).file(_v.relative(".",n.filePath)).property("id",n.test.id),n.baseUrl&&t.property("baseUrl",n.baseUrl),n.runId&&t.property("runUrl",`https://app.momentic.ai/runs/${n.runId}`),n.status==="FAILED"){if(n.failureReason){let r=Ys[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||go[n.failureReason];n.runId&&(o+=` See details: https://app.momentic.ai/runs/${n.runId}`),t.failure(o,r)}n.failureDetails?.errorStack&&t.stacktrace(n.failureDetails.errorStack)}else n.status==="CANCELLED"&&t.skipped();t.time((n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime())/1e3).property("startedAt",n.lastAttemptStartedAt.toISOString()).property("finishedAt",n.finishedAt.toISOString()).property("attempts",n.attempts.toString());for(let r of["testInputs","customHeaders"]){let o=n.parameters[r];Object.keys(o??{}).length>0&&t.multilineProperty(r,JSON.stringify(o))}for(let r of["envName","urlOverride"])n.parameters[r]!==void 0&&t.property(r,n.parameters[r]);return Object.keys(n.outputs).length&&t.multilineProperty("testOutputs",JSON.stringify(n.outputs)),t}function CN(n,{suiteId:e,suiteName:t,startedAt:r,finishedAt:o,runs:i}){let s=n.testSuite().name(t);e&&s.property("id",e),s.timestamp(r).property("startedAt",r.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-r.getTime())/1e3);for(let a of i){let l=s.testCase();EN(a,l)}return s}function Mv(n,e){let t=Nv.newBuilder();CN(t,e),t.writeTo(_v.join(n,`${e.suiteName}.xml`))}import RN from"fs";import AN from"path";function Fv(n){return{title:ln(n),duration:n.finishedAt.getTime()-n.startedAt.getTime(),error:n.status==="FAILED"?{value:n.failureReason}:void 0,steps:n.results&&n.type!=="PRESET_ACTION"?n.results.map(Fv):[]}}async function IN(n,e,t,r){if(r.results?.length){let o=await Wl(n,e,t,r.results[r.results.length-1].afterScreenshot,r.results[r.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function PN(n,e,t,r){return{status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"interrupted":"failed",duration:r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime(),error:r.status==="FAILED"&&r.failureReason?{value:r.failureDetails?.classification?.reason||r.failureReason,message:r.failureDetails?.classification?.summary||go[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(Fv)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await IN(n,e,t,r)}}async function LN(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await PN(n,e,t,r)]}}async function ON(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await LN(n,e,t,r)],id:r.runId,file:r.filePath}}function pu(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function kN(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>ON(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:pu(r.runs,o=>o.status==="PASSED"),unexpected:pu(r.runs,o=>o.status!=="PASSED"),flaky:pu(r.runs,o=>!!o.isFlake),skipped:0}}}async function Dv(n,e,t,r){let o=await kN(n,e,t,r);RN.writeFileSync(AN.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function Uv(n,e,t,r,o){switch(NN(o)?MN(o).isDirectory()||(y.error(`The specified reporter output directory '${o}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(y.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),_N(o,{recursive:!0})),t){case"junit":Mv(o,r);return;case"allure":case"allure-json":await kv(n,e,o,r);return;case"playwright-json":await Dv(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import t_ from"wait-on";import uu from"fs";import{compact as FN}from"lodash-es";import mu from"path";import{cwd as DN}from"process";import UN from"semver";async function Bv({tests:n,momenticFiles:e,project:t,yes:r,include:o,exclude:i,labels:s}){let a=new Set;if(n&&n.length>0){let c=n.some(d=>uu.existsSync(d)),p=DN();c?(p!==t.rootDir&&y.warn(`The current working directory ('${p}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),y.info(`Reading tests from the following local file paths:
3568
3586
  ${n.map(d=>` - ${d}`).join(`
3569
3587
  `)}
3570
- `),n.forEach(d=>{if(!pu.existsSync(d))throw new Error(`Path '${d}' does not exist.`);let u,m;try{u=pu.statSync(d),m=u.isDirectory()}catch(g){y.warn({err:g},`Skipping path ${d} because it cannot be read`);return}let h=uu.resolve(d);Object.values(e.tests).filter(g=>m?g.fullFilePath.startsWith(h):g.fullFilePath===h).forEach(g=>{a.add(g.fullFilePath)})})):(y.info(`Reading all tests from the project and running those matching the following substring filters:
3588
+ `),n.forEach(d=>{if(!uu.existsSync(d))throw new Error(`Path '${d}' does not exist.`);let u,m;try{u=uu.statSync(d),m=u.isDirectory()}catch(g){y.warn({err:g},`Skipping path ${d} because it cannot be read`);return}let h=mu.resolve(d);Object.values(e.tests).filter(g=>m?g.fullFilePath.startsWith(h):g.fullFilePath===h).forEach(g=>{a.add(g.fullFilePath)})})):(y.info(`Reading all tests from the project and running those matching the following substring filters:
3571
3589
  ${n.map(d=>` - ${d}`).join(`
3572
- `)}`),Object.values(e.tests).forEach(d=>{n.some(u=>d.relativePath.includes(u))&&a.add(d.fullFilePath)}))}else{!r&&!await at("No test paths or substrings were provided. Do you want to run all tests?")&&(y.error("Cancelled by user."),process.exit(1));let c=Object.values(e.tests);y.info(`Reading all ${c.length} tests in the project from local disk.`),c.forEach(p=>{a.add(p.fullFilePath)})}for(let c of a){let p=uu.relative(t.rootDir,c);o&&!o.some(d=>new RegExp(d).test(p))&&a.delete(c),i&&i.some(d=>new RegExp(d).test(p))&&a.delete(c)}let l=Array.from(a).map(async c=>{try{let p=await ts(c,Q,e);if(MN.gt(p.schemaVersion,He)&&y.warn(`Test ${c} has schema version ${p.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),p.disabled)return null;if(s&&s.length>0){let d=p.labels||[];if(!s.some(m=>d.includes(m)))return null}return{...p,fullFilePath:c,relativeFilePath:uu.relative(t.rootDir,c)}}catch(p){y.error(`Failed to read and resolve test at '${c}': ${p}`),process.exit(1)}});return Promise.all(l).then(NN)}import{cloneDeep as Hv}from"lodash-es";async function Uv({orgId:n,codeEvalTools:e,logger:t,outputDefinitions:r,testContext:o,flagStore:i}){let s={};for(let a of r){let{name:l,value:c}=a;s[l]=await Dt({orgId:n,s:c,localTools:e,logger:t,context:o,flagStore:i})}return s}async function Bv({baseUrl:n,envName:e,devicePixelRatio:t,apiClient:r,test:o,storageClient:i,codeEvalTools:s,generator:a,orgId:l,variables:c,logger:p,customHeaders:d,testInputs:u,localBrowserConfig:m,visualDiffScreenshotStorage:h,flagStore:g}){let f=await za({advanced:{...m,...o.advanced},customHeaders:d,envVariables:c,envName:e,baseUrl:n,logger:p,localTools:s,orgId:l,flagStore:g}),S={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:Q};f.browserType==="Google Chrome"&&await Zr(["chrome"]);let x=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,p):null,b;try{b=await dn.init({baseUrl:n,logger:p,userBrowserSettings:f,storage:i,flagStore:g,enricher:new Ur(S),contextArgs:{viewport:o.advanced.viewport??rn,deviceScaleFactor:t},iconKnowledgeBase:x})}catch(C){let I=C.message;if(I.includes("Executable doesn't exist")||I.includes("install your dependencies"))y.error("The headless browser used by Momentic is not installed correctly. Re-installing the necessary dependencies before starting the test. We strongly recommend installing browsers correctly before execution."),await Zr(su,!0),b=await dn.init({baseUrl:n,logger:p,userBrowserSettings:f,storage:i,flagStore:g,enricher:new Ur(S),contextArgs:{viewport:o.advanced.viewport??rn,deviceScaleFactor:t},iconKnowledgeBase:x});else throw C}let w=new Do({browser:b,generator:a,logger:p,orgId:l,scratchPadId:void 0,storage:i,flagStore:g,localCodeEvalTools:s,visualDiffScreenshotStorage:h,analytics:new ti,slowMoMs:f.slowMoMs}),E=new It({baseUrl:n,currentUrl:w.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async C=>{let{name:I,defaultValue:N,required:P}=C,D=u?.[I];P&&D===void 0&&(y.error(`Required parameter '${I}' is required by test '${o.name}' but not provided`),process.exit(1));let W=await Dt({orgId:l,s:D??N,localTools:s,logger:p,context:It.dummyContext(E.getEnvName()),flagStore:g});E.setMomenticSystemVariable(I,W)})),{controller:w,context:E}}import{randomUUID as FN}from"crypto";async function zv({testId:n,apiClient:e,testAdvancedSettings:t,aiSettingsFromEnv:r,logger:o,noReport:i}){if(i)return o.debug("The CLI is not running in a CI environment or --no-report was explicitly passed"),!1;if(t.failureRecovery===!1||t.failureRecovery===void 0&&!r?.failureRecovery)return!1;let s;try{s=await e.getPastTestResults(n,{afterTime:Date.now()-7*24*60*60*1e3})}catch(l){return o.error({err:l},"Test is not eligible for recovery since we failed to fetch the recent test results"),!1}return s.some(l=>l.status==="PASSED")?!0:(o.debug({recentRuns:s},"Test is not eligible for recovery because there are only failures in the past 7 days"),!1)}async function jv({attemptInputs:n,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:r,orgId:o,runId:i,runAttemptId:s}=t,{controller:a,context:l,flagStore:c,analytics:p,codeEvalTools:d,storageClient:u,debugDataStorage:m,logger:h,apiClient:g,billingReporter:f,tracer:S}=e,{test:x,orgSettings:b,noReport:w}=n;h.info(`Running test '${x.name}' locally${w?"":` and reporting results to https://app.momentic.ai/runs/${i}`}`);let E={controller:a,storage:u,debugDataStorage:m,billingReporter:f,analytics:p,context:l,logger:h,codeEvalTools:d},C={orgId:o,runId:i||FN(),runAttemptId:s,testMetadata:x,steps:x.steps,beforeSteps:x.beforeSteps,afterSteps:x.afterSteps},I={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await zv({noReport:w,currentAttempt:r,testId:x.id,flagStore:c,apiClient:g,testAdvancedSettings:x.advanced,aiSettingsFromEnv:b.ai,logger:h})};return await Ba({fixtures:E,inputs:C,options:I,callbacks:{step:{},test:{onTestComplete:async()=>{await a.browser.cleanup()},onProposedTestSteps:async D=>g.uploadProposedSteps(D,h)}},testParams:{tracer:S}})}async function $v(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await DN(n)}catch(o){let i="Fatal error running test";return y.error(`${i}: ${o.message}`),t.error({err:o},i),{parameters:n,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{}}}}async function DN(n){let{testDefinition:e,project:t,apiClient:r,orgId:o,urlOverride:i,runSigIntHandlers:s,runGroupTracer:a,logger:l}=n,c=new Eo(r,o),p=Hv(e.steps);try{await c.resolveStepCacheEntries({organizationId:o,testId:e.id,steps:p,schemaVersion:e.schemaVersion,logger:l})}catch(S){throw l.error({err:S},"Failed to resolve step cache entries"),new Error(`Failed to resolve step cache entries. Please ensure you are running using a supported version of Momentic. If you believe this is a Momentic issue, please contact Support with the following error: ${S}`)}let d=n.envName??BN(e),u,m={};if(d){try{u=ns(d,t,l)}catch(S){let x=`Failed to resolve environment ${d} for test ${e.name}: ${S}`;throw new Error(x)}m=u.variables}let h=e.baseUrl;if(i)h=i;else if(!h){let S=m[Ae];typeof S=="string"&&(h=S)}if(!h){let S=`Cannot run test with no base URL and no ${Ae} variable defined in its environment`;throw new Error(S)}let g=await a.startRun({logger:l,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testLabels:e.labels,baseUrl:h,environmentName:d,schemaVersion:e.schemaVersion}),f=l.child(g.loggerBindings||{});Object.entries(g.envVarBindings||{}).forEach(([S,x])=>{m[S]=x});try{s?.push(async()=>{await g.finish({status:"CANCELLED"})});let S=await UN({...n,variables:m,envName:d,stepsWithCaches:p,resolvedEnv:u,baseUrl:h,storageClient:c,tracer:g,logger:f});return await g.finish({status:S.status,finishedAt:S.finishedAt,failureDetails:S.failureDetails,failureReason:S.failureReason,isFlake:S.isFlake}),{runId:g.runId,...S}}finally{s?.pop()}}async function UN(n){let{testDefinition:e,stepsWithCaches:t,project:r,regenerateGoldenFiles:o,apiClient:i,generator:s,baseUrl:a,storageClient:l,orgId:c,envName:p,urlOverride:d,customHeaders:u,testInputs:m,variables:h,resolvedEnv:g,noReport:f,retriesOverride:S,devicePixelRatio:x,logUpdate:b,tracer:w,logger:E}=n,C=new Date,I=new Qo(r,o),N={ai:r.config.ai},P={envName:p,urlOverride:d,customHeaders:u,testInputs:m},D,W=Math.abs(S??r.config.retries??e.retries??0),_=[];E.info("Starting test run using CLI");for(let B=0;B<=W;B++){let L=await w.startAttempt(),j=E.child(L.loggerBindings||{}),O={...e,steps:Hv(t)};B!==0&&b("RETRY",`attempt ${B+1}/${W+1}`);let ee=new Date,me=await Ao.init(c,i),tt=new Qn({httpClient:new _t({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:j}),fakerSeed:me.isBooleanFlagEnabled("faker_constant_seed")?ch:void 0});try{let{controller:ce,context:Se}=await Bv({baseUrl:a,envName:p,apiClient:i,devicePixelRatio:x,logger:j,storageClient:l,codeEvalTools:tt,test:O,generator:s,orgId:c,variables:h,customHeaders:u,testInputs:m,localBrowserConfig:g?.browser??r.config.browser,visualDiffScreenshotStorage:I,flagStore:me});D=await jv({attemptMetadata:{attemptNumber:B+1,orgId:c,runId:w.runId},attemptFixtures:{logger:j,storageClient:l,billingReporter:new wo,analytics:new ti,debugDataStorage:new Lr,codeEvalTools:tt,flagStore:me,apiClient:i,context:Se,controller:ce,tracer:L},attemptInputs:{test:O,orgSettings:N,noReport:f}});let De=new Date;await L.finish({logger:j,result:D}),_.unshift(D.status);let nt=await Uv({orgId:c,codeEvalTools:tt,logger:j,outputDefinitions:e.outputs??[],testContext:Se,flagStore:me}),Ft=jm(_),Pn=B+1;if(D.status!=="FAILED")return{...D,parameters:P,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:De,attempts:Pn,baseUrl:a,outputs:nt,isFlake:Ft};let G=D.failedStepResult,tn=G?.message||"Unknown failure",ci=G?.failureReason??bh(tn)??"UnknownError",Ue=j.child({errResult:G,failureReason:ci,errorMessage:tn,numAttempts:W+1,name:O.name});if(B<W){Ue.warn(`Retrying failed execution attempt for run: ${tn}`);continue}return Ue.error(`Test failed after all exhausting attempts: ${tn}`),{...D,parameters:P,failureDetails:{errorMessage:tn},failureReason:ci,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:De,attempts:B+1,baseUrl:a,outputs:nt}}catch(ce){let Se=`Encountered fatal platform error while running test '${O.name}': ${ce}`,De=new Date,nt=B+1;j.error({err:ce},Se),y.error(Se);let Ft={errorMessage:ce.message,errStack:ce.stack},Pn={status:"FAILED",failureDetails:Ft,failureReason:"InternalPlatformError",finishedAt:De};return await L.finish({logger:j,result:{status:"FAILED",results:[]}}),{...Pn,parameters:P,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:new Date,attempts:nt,baseUrl:a,outputs:{}}}}throw new Error("This code should not be reachable")}function BN(n){for(let e of n.envs??[])if(e.default)return e.name}async function ai(n,e,t,r,o){let i=Fi(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let s=Di(o.command);s&&await e.reportCreditsUsed(n,o.command.type,s,{testId:t,testName:r})}}var mu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}async finish(){}async startSubSteps(){return new Gl(this.testId,this.testName,this.billingReporter,this.asyncWork)}},Gl=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;return this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r)),new mu(this.testId,this.testName,this.billingReporter,this.asyncWork)}},hu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}trackStatus(){}attachNetworkLogs(){}attachConsoleLogs(){}async finish(){}async startStepList(){return new Gl(this.testId,this.testName,this.billingReporter,this.asyncWork)}},gu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}async finish(){}trackStatus(){}async startAttempt(){return new hu(this.testId,this.testName,this.billingReporter,this.asyncWork)}},Vl=class{constructor(e){this.billingReporter=e}asyncWork=[];async finish(){await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){return this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{testId:e.testId,testName:e.testName})),new gu(e.testId,e.testName,this.billingReporter,this.asyncWork)}};import{randomUUID as Wv}from"crypto";import{diff as YN}from"deep-object-diff";import zN from"adm-zip";import Hn from"fs";import Qr from"path";var Cs=class n{constructor(e){this.filePath=e;Hn.rmSync(this.filePath,{recursive:!0,force:!0}),Hn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new n(Qr.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=Qr.join(this.filePath,t);Hn.writeFileSync(o,r)}createRunArchive(e){return new fu(Qr.join(this.filePath,"runs"),e)}},fu=class{constructor(e,t){this.filePath=e;this.tempPath=Qr.join(e,`.${t}`),this.finalPath=Qr.join(e,`${t}.zip`),Hn.rmSync(this.tempPath,{recursive:!0,force:!0}),Hn.rmSync(this.finalPath,{recursive:!0,force:!0}),Hn.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;cd(e){return new Cs(Qr.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=Qr.join(this.tempPath,t);Hn.writeFileSync(o,r)}close(){let e=new zN;e.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let t=e.toBuffer();Hn.writeFileSync(this.finalPath,t),Hn.rmSync(this.tempPath,{recursive:!0,force:!0})}};import jN from"simple-git";var Ee=jN();function ql(n){if(n.startsWith("git@")){let e=n.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let r=t[0],o=t[1];return`${r}/${o}`}}}else if(n.startsWith("http")||n.startsWith("https")){let t=new URL(n).pathname.split("/").filter(Boolean);if(t.length>=2){let r=t[0],o=t[1].replace(".git","");return`${r}/${o}`}}}async function Ce(n){try{return(await n).trim()}catch(e){Q.error({err:e},"Failed to run git command");return}}function HN(){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"}async function $N(){let[n,e,t,r]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function WN(){let[n,e,t]=await Promise.all([Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:n,gitCommitMessage:e,gitCommitAuthorName:t,gitlabProjectPath:process.env.CI_SERVER_HOST,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function GN(){let[n,e,t,r]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),o=e?.includes("github.com"),i=e?.includes("gitlab.com"),s=e?ql(e):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function VN(){let[n,e,t]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),r=process.env.BUILDKITE_REPO,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),s=r?ql(r):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:r,gitCommitMessage:e,gitCommitAuthorName:t,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function qN(){let[n,e,t]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),r=process.env["Build.Repository.Uri"],o=r?.includes("github.com"),i=r?.includes("gitlab.com"),s=r?ql(r):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:r,gitCommitMessage:e,gitCommitAuthorName:t,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function KN(){let[n,e,t,r,o,i,s]=await Promise.all([Ce(Ee.revparse(["HEAD"])),Ce(Ee.revparse(["--short","HEAD"])),Ce(Ee.revparse(["--abbrev-ref","HEAD"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),a=r?.includes("github.com"),l=r?.includes("gitlab.com"),c=r?ql(r):void 0;return{gitCommitSha:n,gitCommitShaShort:e,gitBranchName:t,gitOriginUrl:r,gitCommitTimestamp:o?new Date(o):void 0,gitCommitMessage:i,gitCommitAuthorName:s,githubRepository:a?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:void 0}}async function Kl(n){let e=HN();if(!e)return n.debug("No CI run environment detected, falling back to git"),KN();switch(n.debug(`Using CI runner environment variables from ${e} to get git metadata`),e){case"GithubActions":return $N();case"GitlabCI":return WN();case"CircleCI":return GN();case"Buildkite":return VN();case"AzureDevOps":return qN()}}var Su=class{constructor(e,t,r,o,i,s){this.testId=e;this.testName=t;this.metadata=r;this.diskStorage=o;this.billingReporter=i;this.asyncWork=s}getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.jpeg",contents:r})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.jpeg",contents:r})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.html",contents:r})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.html",contents:r})}heal(e){let{healType:t}=e;this.metadata.healMetadata={healType:t,healedAt:new Date}}async finish(e){let{step:t}=e,r={...this.metadata,status:t.status,finishedAt:t.finishedAt,message:t.message};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)})}async startSubSteps(){let e=this.diskStorage.cd("substeps");return new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork)}},Yl=class{constructor(e,t,r,o,i){this.testId=e;this.testName=t;this.diskStorage=r;this.billingReporter=o;this.asyncWork=i}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r));let o=this.diskStorage.cd(r.id),i={step:r,status:"RUNNING",startedAt:new Date};return o.storeFile({name:"metadata.json",contents:JSON.stringify(i,null,2)}),new Su(this.testId,this.testName,i,o,this.billingReporter,this.asyncWork)}},yu=class{constructor(e,t,r,o,i,s,a,l,c){this.orgId=e;this.testId=t;this.testName=r;this.originalSteps=o;this.metadata=i;this.client=s;this.diskStorage=a;this.billingReporter=l;this.asyncWork=c}trackStatus(){}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}async finish(e){let{logger:t,result:r,updatedSteps:o}=e;if(this.metadata.status=r.status,this.metadata.finishedAt=new Date,this.metadata.results=r.results,this.metadata.beforeResults=r.beforeResults,this.metadata.afterResults=r.afterResults,this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)}),r?.status!=="PASSED"||!o)return;let i=YN(this.originalSteps,o);if(Object.keys(i).length!==0){t.debug({changes:i},"Updating steps post-run success in cli");try{let{cachesToSave:s}=await mt({stepLists:o,cacheCreationParams:{testId:this.testId,orgId:this.orgId}});await this.client.updateStepCaches({testId:this.testId,entries:s})}catch(s){t.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async startStepList(){let e=this.diskStorage.cd("steps");return new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork)}},bu=class{constructor(e,t,r,o,i,s,a,l,c,p){this.orgId=e;this.testId=t;this.testName=r;this.internalRunId=o;this.originalSteps=i;this.metadata=s;this.client=a;this.diskStorage=l;this.billingReporter=c;this.asyncWork=p}get envVarBindings(){return{[Da]:this.internalRunId}}async finish(e){let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}trackStatus(){}async startAttempt(){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let e=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),t={startedAt:new Date,status:"RUNNING"};return e.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),new yu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork)}},Jl=class n{constructor(e,t,r,o,i,s){this.orgId=e;this.runGroupId=t;this.metadata=r;this.client=o;this.diskStorage=i;this.billingReporter=s;this.asyncWork=[]}asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,r,o){let i=await Kl(y),s=Wv(),a={...i,trigger:Pt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:jt||He},l=new Cs(t);return l.storeFile({name:"metadata.json",contents:JSON.stringify(a,null,2)}),new n(e,s,a,r,l,o)}async finish(e){let{status:t}=e,r={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let t=Wv(),r=this.diskStorage.createRunArchive(t),o={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:jt,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0};return r.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)}),this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName})),new bu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork)}};import{diff as JN}from"deep-object-diff";var wu=class{constructor(e,t,r,o,i,s,a,l,c,p,d,u){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.step=s;this.originalSteps=a;this.client=l;this.analytics=c;this.debugDataStorage=p;this.billingReporter=d;this.asyncWork=u}startedAt=new Date;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{logger:t,snapshotId:r,screenshot:o}=e;this.asyncWork.push(this.debugDataStorage.storeScreenshot(t,r,o))}attachAfterScreenshot(e){let{logger:t,snapshotId:r,screenshot:o}=e;this.asyncWork.push(this.debugDataStorage.storeScreenshot(t,r,o))}attachBeforeHtmlSnapshot(e){let{logger:t,snapshotId:r,html:o}=e;this.asyncWork.push(this.debugDataStorage.storeHtmlSnapshot(t,r,o))}attachAfterHtmlSnapshot(e){let{logger:t,snapshotId:r,html:o}=e;this.asyncWork.push(this.debugDataStorage.storeHtmlSnapshot(t,r,o))}heal(e){let{healType:t}=e;this.step.type==="PRESET_ACTION"&&this.analytics.track({type:"execution:step_heal",heal_type:t,step_type:this.step.type,command_type:this.step.command.type,duration_ms:Date.now()-this.startedAt.getTime()})}async finish(e){let{step:t}=e,r=new Date;switch(t.status){case"SUCCESS":this.analytics.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime()});break;case"FAILED":{let o="command"in t?t.command.type:t.type;this.analytics.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime(),fail_reason:t.message??`${o} failed`});break}case"CANCELLED":this.analytics.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime()});break;default:throw new Error(`Unexpected status: ${t.status}`)}}async startSubSteps(){return new Xl(this.orgId,this.testId,this.testName,this.runId,this.attemptId,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},Xl=class{constructor(e,t,r,o,i,s,a,l,c,p,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.originalSteps=s;this.client=a;this.analytics=l;this.debugDataStorage=c;this.billingReporter=p;this.asyncWork=d}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r));let o=this.analytics.child({step_id:r.id});return o.track({type:"execution:step_start",step_type:r.type==="RESOLVED_MODULE"?"MODULE":r.type,command_type:"command"in r?r.command.type:void 0}),new wu(this.orgId,this.testId,this.testName,this.runId,this.attemptId,r,this.originalSteps,this.client,o,this.debugDataStorage,this.billingReporter,this.asyncWork)}},vu=class{constructor(e,t,r,o,i,s,a,l,c,p,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.originalSteps=s;this.client=a;this.analytics=l;this.debugDataStorage=c;this.billingReporter=p;this.asyncWork=d}get loggerBindings(){return{runAttemptId:this.attemptId}}trackStatus(){}attachNetworkLogs(e){let{logger:t,logs:r}=e;this.asyncWork.push(this.debugDataStorage.storeNetworkLogsForRunAttempt(t,this.runId,this.attemptId,r))}attachConsoleLogs(e){let{logger:t,logs:r}=e;this.asyncWork.push(this.debugDataStorage.storeConsoleLogsForRunAttempt(t,this.runId,this.attemptId,r))}async finish(e){let{logger:t,result:r,updatedSteps:o}=e;if(await this.client.updateRunAttempt(this.runId,this.attemptId,{status:r.status,finishedAt:new Date,results:r.results,beforeResults:r.beforeResults,afterResults:r.afterResults}),r?.status!=="PASSED"||!o)return;let i=JN(this.originalSteps,o);if(Object.keys(i).length!==0){t.debug({changes:i},"Updating steps post-run success in cli");try{let{cachesToSave:s}=await mt({stepLists:o,cacheCreationParams:{testId:this.testId,orgId:this.orgId}});await this.client.updateStepCaches({testId:this.testId,entries:s})}catch(s){t.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async startStepList(){return new Xl(this.orgId,this.testId,this.testName,this.runId,this.attemptId,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},xu=class{constructor(e,t,r,o,i,s,a,l,c,p){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.originalSteps=i;this.client=s;this.analytics=a;this.debugDataStorage=l;this.billingReporter=c;this.asyncWork=p;this.startedAt=new Date}attempts=0;startedAt=new Date;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[Da]:this.runId}}async finish(e){let t=e.finishedAt||new Date,r=t.getTime()-this.startedAt.getTime();switch(e.status){case"PASSED":this.analytics.track({type:"execution:test_success",attempt_count:this.attempts,duration_ms:r,is_flake:e.isFlake||!1});break;case"CANCELLED":this.analytics.track({type:"execution:test_cancel",duration_ms:r,attempt_count:this.attempts});break;case"FAILED":this.analytics.track({type:"execution:test_fail",attempt_count:this.attempts,duration_ms:r,fail_reason:e.failureDetails?.errorMessage??"unknown"});break}await this.client.updateRun(this.runId,{status:e.status,finishedAt:t,flake:e.isFlake,failureDetails:e.failureDetails,failureReason:e.failureReason})}trackStatus(){}async startAttempt(){this.attempts++,await this.client.updateRun(this.runId,{status:"RUNNING",attempts:this.attempts});let{id:e}=await this.client.createRunAttempt(this.runId);return new vu(this.orgId,this.testId,this.testName,this.runId,e,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},Zl=class n{constructor(e,t,r,o,i,s,a){this.orgId=e;this.runGroupId=t;this.gitMetadata=r;this.client=o;this.analytics=i;this.debugDataStorage=s;this.billingReporter=a;this.asyncWork=[]}asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.gitMetadata.gitBranchName}}static async start(e,t,r,o,i){let s=await Kl(y),{id:a}=await t.createRunGroup({...s,trigger:Pt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:jt}),l=r.child({commit_sha:s?.gitCommitSha,commit_sha_short:s?.gitCommitShaShort,branch_name:s?.gitBranchName,origin_url:s?.gitOriginUrl,commit_timestamp:s?.gitCommitTimestamp,github_repository:s?.githubRepository,gitlab_project_path:s?.gitlabProjectPath,pipeline_id:s?.pipelineId,run_group_id:a});return new n(e,a,s,t,l,o,i)}async finish(e){let{status:t}=e,r=new Date;await this.client.updateRunGroup(this.runGroupId,{status:t,finishedAt:r});let o=r.getTime()-e.startedAt.getTime();switch(t){case"PASSED":this.analytics.track({type:"execution:run_group_success",duration_ms:o});break;case"FAILED":this.analytics.track({type:"execution:run_group_fail",duration_ms:o});break;case"CANCELLED":this.analytics.track({type:"execution:run_group_cancel",duration_ms:o});break}await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let{id:t}=await this.client.createRun({stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:jt,schemaVersion:e.schemaVersion}),r=this.analytics.child({run_id:t,test_id:e.testId,test_name:e.testName,label_names:e.testLabels});return this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName})),r.track({type:"execution:test_start"}),new xu(this.orgId,e.testId,e.testName,t,e.originalSteps,this.client,r,this.debugDataStorage,this.billingReporter,this.asyncWork)}};async function Gv(n){let{logger:e,tests:t,yes:r,start:o,waitOn:i,client:s,debugDataStorage:a,billingReporter:l,analytics:c,project:p,report:d,retriesOverride:u,urlOverride:m,envName:h,orgId:g,devicePixelRatio:f,customHeaders:S,testInputMatrix:x,reporter:b,include:w,exclude:E,labels:C,reporterDir:I="reports",outputDir:N,waitOnTimeout:P=60,parallel:D=p.config.parallel??1,shardIndex:W=1,shardCount:_=1,regenerateGoldenFiles:B}=n;o&&(e.info({orgId:g},`Executing start command: ${o}`),await $w(o,!1)),i&&(e.info({orgId:g},`Waiting for url: ${i} with timeout: ${P} seconds.`),await ZN({resources:[i],interval:2500,timeout:P*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let L=new Ro({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e}),j=ke(p,y),O=await Dv({tests:t,momenticFiles:j,yes:r,project:p,include:w,exclude:E,labels:C}),ee=[];O.forEach((Ue,Wn)=>{x?x.forEach((to,ft)=>{ee.push({testIndex:Wn,inputs:to,inputIndex:ft})}):ee.push({testIndex:Wn,inputs:void 0,inputIndex:void 0})}),_&&_>1&&(ee=QN(ee,W,_));let me=`Running ${ee.length} tests with ${D} workers`;e.info({allTestsToRunWithInputs:ee,shardCount:_,shardIndex:W,orgId:g},me),y.dimmed(me),ee.forEach(Ue=>{y.dimmed(` - ${[O[Ue.testIndex].relativeFilePath]}${typeof Ue.inputIndex=="number"?` with input set ${Ue.inputIndex}`:""}`)}),y.log("");let tt=[],ce=new Date,Se=new Set,De=()=>{let Ue=s.getAppUrl(),Wn=ii({results:tt,startTime:ce.getTime(),onFailed:ft=>{Hl(ft,ft.filePath)},getDisplayLine:ft=>{let Sr=` - ${ft.filePath}${ft.proposedTest?" [AUTO-HEALED] ":""}`;return d&&ft.runId&&(Sr+=` (${Ue}/runs/${ft.runId})`),Sr},entity:"test"}),to=tt.filter(ft=>!!ft.proposedTest);return to.length>0&&y.warn(`${to.length} tests passed with auto-healing. Please use the run links printed above to review proposed changes and apply them locally.`),Wn},nt=new Vl(l);N?nt=await Jl.start(g,N,s,l):d&&(nt=await Zl.start(g,s,c,a,l));let Ft=e.child(nt.loggerBindings||{}),Pn=[],G=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await nt.finish({startedAt:ce,status:"CANCELLED"}),De(),await Promise.allSettled(Pn.map(Ue=>Ue())),process.exit(1)};process.on("SIGINT",G);let tn={};for(let Ue=0;Ue<ee.length;Ue++){let Wn=Object.values(tn);Wn.length===D&&await Promise.race(Wn.map(Sr=>Sr.promise));let to=ee[Ue],ft=`test-${Ue}`;tn[ft]={done:!1,promise:(async({testIndex:Sr,inputs:Cu})=>{let di=O[Sr];Se.add({testIndex:Sr,inputs:Cu});let tx=di.relativeFilePath.includes("..")?di.fullFilePath:di.relativeFilePath,Rs=(lt,pi)=>{let no=(tc,Ru)=>{let rx=Math.floor((Ru-tc.length)/2);return tc.padStart(rx+tc.length).padEnd(Ru)};lt=lt.toUpperCase();let Ln=lt;lt.includes("FAIL")?Ln=li.bgRed.white(no("FAIL",8)):lt.includes("PASS")?Ln=li.bgGreen.white(no("PASS",8)):lt.includes("START")?Ln=li.bgBlue.white(no("START",8)):lt.includes("CANCEL")?Ln=li.bgYellow.white(no("CANCEL",8)):lt.includes("RETRY")?Ln=li.bgYellow.white(no("RETRY",8)):lt.includes("RUN")||lt.includes("PROG")?Ln=li.bgMagenta.white(no("RUNNING",8)):Ft.warn(`Unknown status tried to be logged in run test locally: ${lt}`),XN||(Ln=`[${Ln}]`),y.log(`${Ln} ${tx} ${pi?`${pi} `:""}(${Se.size}/${ee.length})`)};Rs("START");let nx=setInterval(()=>Rs("RUN"),5*60*1e3);try{let lt=await $v({testDefinition:di,project:p,testInputs:Cu,orgId:g,devicePixelRatio:f,apiClient:s,runGroupTracer:nt,generator:L,retriesOverride:u,urlOverride:m,envName:h,noReport:!d,customHeaders:S,regenerateGoldenFiles:B,logUpdate:Rs,runSigIntHandlers:d?Pn:void 0,logger:Ft});Rs(lt.status),tt.push(lt)}catch(lt){let pi=`Encountered unexpected fatal error when running test '${di.name}': ${lt.message}`;y.error(pi),Ft.error(pi)}finally{clearInterval(nx),tn[ft].done=!0,delete tn[ft]}})(to)}}await Promise.allSettled(Object.values(tn).map(Ue=>Ue.promise));let ci="PASSED";return tt.some(Ue=>Ue.status==="FAILED")&&(ci="FAILED"),await nt.finish({startedAt:ce,status:ci}),process.off("SIGINT",G),b&&await Fv(Ft,a,b,{projectConfigPath:p.configFilePath,suiteName:p.config.name,startedAt:ce,finishedAt:new Date,runs:tt},I??"reports"),De()}function QN(n,e,t){if(t>n.length&&(y.warn(`Shard count ${t} is greater than the number of tests ${n.length}! Some workers won't have any tests to run.`),t=Math.max(t,n.length),e>t))return[];let r=Math.floor((e-1)*(n.length/t)),o=Math.floor(e*(n.length/t));return n.sort().filter((s,a)=>a>=r&&a<o)}import $n from"fs";import eo from"path";var Vv={status:(n,e)=>{if(n===e)return n;if(n==="PASSED"&&e==="PASSED")return"PASSED";if(n==="FAILED"||e==="FAILED")return"FAILED";if(n==="CANCELLED"||e==="CANCELLED")return"PASSED";throw new Error("Invalid run status merge")},startedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid start time merge");return n<e?n:e},updatedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid update time merge");return n>e?n:e},finishedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid finish time merge");return n>e?n:e},gitCommitTimestamp:(n,e)=>{if(!(!n&&!e)){if(!n||!e||n.getTime()!==e.getTime())throw new Error("Git commit timestamps must match to be merged");return n}}};function qv(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function e_(n,e,t){let r=qv(n,t),o=qv(e,t);if(t in Vv){let i=Vv[t];return i(r,o)}if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}function Kv(n,e){$n.rmSync(n,{recursive:!0,force:!0});let t=$n.readdirSync(e).filter(s=>s!==".DS_Store").map(s=>eo.join(e,s));$n.mkdirSync(n,{recursive:!0});let r=eo.join(t[0],"metadata.json"),o=rd.parse(JSON.parse($n.readFileSync(r,"utf-8")));for(let s of t){let a=eo.join(s,"runs");if(!$n.existsSync(a))continue;let l=$n.readdirSync(a);for(let d of l){let u=eo.join(a,d),m=eo.join(n,"runs",d);$n.cpSync(u,m,{recursive:!0})}let c=eo.join(s,"metadata.json"),p=rd.parse(JSON.parse($n.readFileSync(c,"utf-8")));for(let d in p){let u=d;o[u]=e_(o,p,u)}}let i=eo.join(n,"metadata.json");$n.writeFileSync(i,JSON.stringify(o,null,2))}import Yv from"adm-zip";import t_ from"fs";import Ql from"path";function Jv(n){let e=new Yv;e.addLocalFile(Ql.join(n,"metadata.json"));for(let t of t_.readdirSync(Ql.join(n,"runs"))){if(!t.endsWith(".zip"))continue;let r=t.replace(/\.zip$/,""),o=new Yv(Ql.join(n,"runs",t));for(let i of o.getEntries())i.isDirectory||e.addFile(Ql.join("runs",r,i.entryName),i.getData())}return e.toBuffer()}var Xv=new ni({platform:"cli"},{flushAt:1,flushInterval:0});rc||Q.warn("Sentry is not enabled in this environment due to unsupported node version");var a_=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Tu=n=>{a_&&y.dimmed(n)},Tt=new n_;Tt.name("momentic").description("CLI").version(jt||"unknown");Tt.command("install-browsers").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").argument("[browsers...]","Browsers to install",["chromium"]).action(async(n,e)=>{await Zr(Tv(n),e.force)});Tt.addOption(new en("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",n=>{n==="debug"&&y.info("Enabling debug logging"),y.setMinLevel(n.toLowerCase())});Tt.addOption(new en("--verbose","enable verbose logging")).on("option:verbose",()=>{Q.enableConsoleLogs(),y.setMinLevel(0)});Tt.command("check-config").addOption(fr).action(async n=>{gn({configFilePath:n.config})});var Zv=Tt.command("checks").alias("check").description("Perform various project checks");Zv.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(fr).addOption(hv).action(async n=>{let e=await fn(n),t=gn({configFilePath:n.config});await Jw({project:t,fix:e.fix})});Zv.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(fr).action(async n=>{let e=gn({configFilePath:n.config});await Xw({project:e})});var l_=Tt.command("migrate").description("Migrate and upgrade tooling");l_.command("v0-v1").addOption(gr).addOption(jn).action(async n=>{let e=await fn(n);if(!e.yes&&!await at("This command will migrate and then delete your previous Momentic files. All members of your team should transition to the V1 CLI at the same time. Please backup your local directory for safety before proceeding. Continue?",!0)&&process.exit(1),!rv().environments?.length&&await at("In the V1 CLI, all environment configuration should be committed to a central `momentic.config.yaml` file, which you should commit to your source control repository. Sensitive data can be managed through `.env` files or by injecting the secret into the environment and then referencing them in `envVariables` with ${VAR} syntax. Would you like to pull the latest environments from Momentic Cloud into your `momentic.config.yaml` file?",!0)){let{apiKey:r,server:o}=e,i=gn({}),s=new it({baseUrl:o,apiKey:r,logger:Q});await Nl({client:s,project:i,skipPrompts:e.yes}),y.success("Successfully imported environments from Momentic Cloud.")}});Tt.command("import-from-cloud").addOption(jn).addOption(hr).addOption(fr).addOption(gr).action(async n=>{let e=await fn(n),{apiKey:t,server:r,config:o,yes:i}=e,s=gn({configFilePath:o}),a=new it({baseUrl:r,apiKey:t,logger:Q});await nv({client:a,project:s,skipPrompts:i}),process.exit(0)});Tt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new en("--name <name>","Name of the project")).action(async n=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
3573
- `),y.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-from-cloud' command after initialization."),Eu.existsSync(Jo)&&(y.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 t={name:n.name??await Kw("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:bs};Xo(t,Jo),y.success(`Initialized Momentic project file at ${ec.resolve(Jo)}`)});Tt.command("app").addOption(jn).addOption(hr).addOption(gr).addOption(ru).addOption(pv).addOption(fr).action(async n=>{let e=await fn(n),{apiKey:t,port:r=_l,yes:o,server:i,pixelRatio:s}=e,a=new it({baseUrl:i,apiKey:t,logger:Q});await au({client:a,skipPrompts:o,installBrowsers:!0});let l=s_(import.meta.url),c=ec.dirname(l),p=ec.resolve(c,"..","static"),d=ec.resolve(c,"..","assets"),u=s??qp();Kp(u),ui(),await zw({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:p,assetsDir:d,devicePixelRatio:u,version:"1.1.2"});let m=`http://localhost:${r}`;await i_(m)});var Qv=Tt.command("queue").description("Queue tests or suites to run on Momentic Cloud");Qv.command("suites").description("Run one or more suites on Momentic Cloud").addOption(jn).addOption(hr).addOption(Qp).addOption(eu).addOption(gr).addArgument(Sv).addOption(Dl).addOption(Fl).addOption(Ml).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:s,urlOverride:a,customHeaders:l}=await fn(e),c=new it({baseUrl:r,apiKey:t,logger:Q});(!n||!Array.isArray(n)||!n.length)&&(y.error("Must pass at least one suite to run."),process.exit(1));let{orgId:p}=await c.getAuthInfo();await Iv({client:c,orgId:p,wait:o,suitePaths:n,waitTimeout:i,env:s,urlOverride:a,customHeaders:Ul(l)})});Qv.command("tests").description("Run one or more tests on Momentic Cloud").addOption(jn).addOption(hr).addOption(gr).addOption(Ml).addOption(ou).addOption(Dl).addOption(Fl).addOption(Qp).addOption(eu).addArgument(gv).action(async(n,e)=>{let t=await fn(e),{all:r,apiKey:o,customHeaders:i,env:s,server:a,inputCsv:l,urlOverride:c,wait:p,waitTimeout:d,yes:u}=t,m=Ul(i);for(let S of n)(S.endsWith(".yaml")||Eu.existsSync(S))&&y.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 h=new it({baseUrl:a,apiKey:o,logger:Q}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await Yp(l)),await Pv({client:h,orgId:g,tests:n,all:r,customHeaders:m,env:s,urlOverride:c,wait:p,waitTimeout:d,testInputMatrix:f,yes:u}),process.exit(0)});var c_=Tt.command("run").alias("test").description("Run tests on the local machine");c_.addOption(jn).addOption(hr).addOption(fr).addOption(iu).addOption(gr).addOption(Ml).addOption(ou).addOption(Fl).addOption(Dl).addOption(tu).addOption(ru).addOption(new en("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new en("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new en("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.")).addOption(new en("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.")).addOption(new en("-p, --parallel <parallel>","When running with the --local flag, the number of tests to run in parallel. Defaults to 1.")).addOption(new en("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new en("--update-golden-files","Update locally stored golden files for steps that this is enabled for.")).addOption(tu).addOption(av).addOption(lv).addOption(nu).addOption(uv).addOption(mv).addOption(cv).addOption(dv).addArgument(fv).action(async(n,e)=>{y.debug("Run tests invoked");let t=await fn(e);y.debug(t,"Parsed CLI options");let r=Ul(t.customHeaders),o=gn({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let i=new it({baseUrl:t.server,apiKey:t.apiKey,logger:Q});y.debug("Checking API key and dependencies");let{orgId:s,userId:a}=await au({client:i,skipPrompts:t.yes,installBrowsers:!0});y.debug("API key check and browser installation complete");let l=new wa(i),c=new va(i),p=t.outputDir??o.config.outputDir,d=Xv.child({org_id:s,user_id:a,cli_version:jt,trigger:"CLI"}),u;t.inputCsv&&(u=await Yp(t.inputCsv));let m=t.pixelRatio??qp();Kp(m);let h=Q.child({orgId:s,userId:a,cliVersion:jt,trigger:"CLI"});try{(await Gv({...t,retriesOverride:t.retries,devicePixelRatio:m,tests:n,project:o,client:i,debugDataStorage:c,billingReporter:l,analytics:d,outputDir:p,customHeaders:r,envName:t.env,orgId:s,testInputMatrix:u,logger:h,regenerateGoldenFiles:t.updateGoldenFiles})).failed>0?process.exit(1):process.exit(0)}catch(g){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(g),process.exit(1)}});var d_=Tt.command("apply").description("Apply an operation to local resources");d_.command("patch").addOption(jn).addOption(hr).addOption(fr).addOption(iu).addOption(gr).addOption(new en("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new en("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async n=>{let e=await fn(n),{apiKey:t,server:r,config:o,yes:i}=e,s=gn({configFilePath:o}),a=new it({baseUrl:r,apiKey:t,logger:Q}),l=ke(s,y),c=l.tests[n.to]??Object.values(l.tests).find(d=>Pe(d.name)===n.to.trim());c||(y.error(`No test matching '${n.to}' could be found in the current project.`),process.exit(1));let p=await a.fetchTestFragment(n.from);await Yw({client:a,test:c,fragment:p,yes:i,entities:l,logger:Q}),process.exit(0)});var ex=Tt.command("results").description("Merge and upload test results.");ex.command("merge").description("Merge test results files.").addOption(nu).addArgument(yv).action(async(n,e)=>{let t=await fn(e),{outputDir:r}=t;r||(y.error("Output directory is required."),process.exit(1)),Kv(r,n)});ex.command("upload").description("Upload test results to Momentic cloud.").addOption(jn).addOption(hr).addArgument(bv).action(async(n,e)=>{let t=await fn(e),{apiKey:r,server:o}=t,i=new it({baseUrl:o,apiKey:r,logger:Q}),s=new La(i);try{let a=Jv(n);Eu.writeFileSync("test.zip",a);let l=await s.uploadResultsArchive(a),c=`${i.getAppUrl()}/run-groups/${l}`;y.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`),process.exit(0)}catch(a){let l;a instanceof Error?l=a.message:typeof a=="string"?l=a:l="Unknown error",y.error(`Failed to upload test results: ${l}.`),process.exit(1)}});async function p_(){Tu("Main program started"),await Ww(Q),Tu("CLI version check complete");try{await Tt.parseAsync(process.argv),ui()}catch(n){let e={};try{e.playwrightVersion=r_("npx playwright --version").toString()}catch(t){Q.error({err:t},"Error fetching debug information")}Q.error({err:n,debugInfo:e},"Uncaught error in CLI"),Q.flush(),nc(n,e),y.error(n),ui(),process.exit(1)}}o_.setMaxListeners(50);process.on("warning",n=>{Q.warn({err:n},`Node warning received on CLI: ${n.message}`)});Tu("CLI parsing setup complete");p_();
3590
+ `)}`),Object.values(e.tests).forEach(d=>{n.some(u=>d.relativePath.includes(u))&&a.add(d.fullFilePath)}))}else{!r&&!await at("No test paths or substrings were provided. Do you want to run all tests?")&&(y.error("Cancelled by user."),process.exit(1));let c=Object.values(e.tests);y.info(`Reading all ${c.length} tests in the project from local disk.`),c.forEach(p=>{a.add(p.fullFilePath)})}for(let c of a){let p=mu.relative(t.rootDir,c);o&&!o.some(d=>new RegExp(d).test(p))&&a.delete(c),i&&i.some(d=>new RegExp(d).test(p))&&a.delete(c)}let l=Array.from(a).map(async c=>{try{let p=await ns(c,Q,e);if(UN.gt(p.schemaVersion,He)&&y.warn(`Test ${c} has schema version ${p.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),p.disabled)return null;if(s&&s.length>0){let d=p.labels||[];if(!s.some(m=>d.includes(m)))return null}return{...p,fullFilePath:c,relativeFilePath:mu.relative(t.rootDir,c)}}catch(p){y.error(`Failed to read and resolve test at '${c}': ${p}`),process.exit(1)}});return Promise.all(l).then(FN)}import{cloneDeep as Wv}from"lodash-es";async function zv({orgId:n,codeEvalTools:e,logger:t,outputDefinitions:r,testContext:o,flagStore:i}){let s={};for(let a of r){let{name:l,value:c}=a;s[l]=await Dt({orgId:n,s:c,localTools:e,logger:t,context:o,flagStore:i})}return s}async function jv({baseUrl:n,envName:e,devicePixelRatio:t,apiClient:r,test:o,storageClient:i,codeEvalTools:s,generator:a,orgId:l,variables:c,logger:p,customHeaders:d,testInputs:u,localBrowserConfig:m,visualDiffScreenshotStorage:h,flagStore:g}){let f=await za({advanced:{...m,...o.advanced},customHeaders:d,envVariables:c,envName:e,baseUrl:n,logger:p,localTools:s,orgId:l,flagStore:g}),S={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:Q};f.browserType==="Google Chrome"&&await Zr(["chrome"]);let x=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,p):null,b;try{b=await dn.init({baseUrl:n,logger:p,userBrowserSettings:f,storage:i,flagStore:g,enricher:new Ur(S),contextArgs:{viewport:o.advanced.viewport??rn,deviceScaleFactor:t},iconKnowledgeBase:x})}catch(C){let I=C.message;if(I.includes("Executable doesn't exist")||I.includes("install your dependencies"))y.error("The headless browser used by Momentic is not installed correctly. Re-installing the necessary dependencies before starting the test. We strongly recommend installing browsers correctly before execution."),await Zr(au,!0),b=await dn.init({baseUrl:n,logger:p,userBrowserSettings:f,storage:i,flagStore:g,enricher:new Ur(S),contextArgs:{viewport:o.advanced.viewport??rn,deviceScaleFactor:t},iconKnowledgeBase:x});else throw C}let w=new Do({browser:b,generator:a,logger:p,orgId:l,scratchPadId:void 0,storage:i,flagStore:g,localCodeEvalTools:s,visualDiffScreenshotStorage:h,analytics:new ti,slowMoMs:f.slowMoMs}),E=new It({baseUrl:n,currentUrl:w.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async C=>{let{name:I,defaultValue:N,required:P}=C,D=u?.[I];P&&D===void 0&&(y.error(`Required parameter '${I}' is required by test '${o.name}' but not provided`),process.exit(1));let W=await Dt({orgId:l,s:D??N,localTools:s,logger:p,context:It.dummyContext(E.getEnvName()),flagStore:g});E.setMomenticSystemVariable(I,W)})),{controller:w,context:E}}import{randomUUID as BN}from"crypto";async function Hv({testId:n,apiClient:e,testAdvancedSettings:t,aiSettingsFromEnv:r,logger:o,noReport:i}){if(i)return o.debug("The CLI is not running in a CI environment or --no-report was explicitly passed"),!1;if(t.failureRecovery===!1||t.failureRecovery===void 0&&!r?.failureRecovery)return!1;let s;try{s=await e.getPastTestResults(n,{afterTime:Date.now()-7*24*60*60*1e3})}catch(l){return o.error({err:l},"Test is not eligible for recovery since we failed to fetch the recent test results"),!1}return s.some(l=>l.status==="PASSED")?!0:(o.debug({recentRuns:s},"Test is not eligible for recovery because there are only failures in the past 7 days"),!1)}async function $v({attemptInputs:n,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:r,orgId:o,runId:i,runAttemptId:s}=t,{controller:a,context:l,flagStore:c,analytics:p,codeEvalTools:d,storageClient:u,debugDataStorage:m,logger:h,apiClient:g,billingReporter:f,tracer:S}=e,{test:x,orgSettings:b,noReport:w}=n;h.info(`Running test '${x.name}' locally${w?"":` and reporting results to https://app.momentic.ai/runs/${i}`}`);let E={controller:a,storage:u,debugDataStorage:m,billingReporter:f,analytics:p,context:l,logger:h,codeEvalTools:d},C={orgId:o,runId:i||BN(),runAttemptId:s,testMetadata:x,steps:x.steps,beforeSteps:x.beforeSteps,afterSteps:x.afterSteps},I={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await Hv({noReport:w,currentAttempt:r,testId:x.id,flagStore:c,apiClient:g,testAdvancedSettings:x.advanced,aiSettingsFromEnv:b.ai,logger:h})};return await Ba({fixtures:E,inputs:C,options:I,callbacks:{step:{},test:{onTestComplete:async()=>{await a.browser.cleanup()},onProposedTestSteps:async D=>g.uploadProposedSteps(D,h)}},testParams:{tracer:S}})}async function Gv(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await zN(n)}catch(o){let i="Fatal error running test";return y.error(`${i}: ${o.message}`),t.error({err:o},i),{parameters:n,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{}}}}async function zN(n){let{testDefinition:e,project:t,apiClient:r,orgId:o,urlOverride:i,runSigIntHandlers:s,runGroupTracer:a,logger:l}=n,c=new Eo(r,o),p=Wv(e.steps);try{await c.resolveStepCacheEntries({organizationId:o,testId:e.id,steps:p,schemaVersion:e.schemaVersion,logger:l})}catch(S){throw l.error({err:S},"Failed to resolve step cache entries"),new Error(`Failed to resolve step cache entries. Please ensure you are running using a supported version of Momentic. If you believe this is a Momentic issue, please contact Support with the following error: ${S}`)}let d=n.envName??HN(e),u,m={};if(d){try{u=rs(d,t,l)}catch(S){let x=`Failed to resolve environment ${d} for test ${e.name}: ${S}`;throw new Error(x)}m=u.variables}let h=e.baseUrl;if(i)h=i;else if(!h){let S=m[Ae];typeof S=="string"&&(h=S)}if(!h){let S=`Cannot run test with no base URL and no ${Ae} variable defined in its environment`;throw new Error(S)}let g=await a.startRun({logger:l,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testLabels:e.labels,baseUrl:h,environmentName:d,schemaVersion:e.schemaVersion}),f=l.child(g.loggerBindings||{});Object.entries(g.envVarBindings||{}).forEach(([S,x])=>{m[S]=x});try{s?.push(async()=>{await g.finish({status:"CANCELLED"})});let S=await jN({...n,variables:m,envName:d,stepsWithCaches:p,resolvedEnv:u,baseUrl:h,storageClient:c,tracer:g,logger:f});return await g.finish({status:S.status,finishedAt:S.finishedAt,failureDetails:S.failureDetails,failureReason:S.failureReason,isFlake:S.isFlake}),{runId:g.runId,...S}}finally{s?.pop()}}async function jN(n){let{testDefinition:e,stepsWithCaches:t,project:r,regenerateGoldenFiles:o,apiClient:i,generator:s,baseUrl:a,storageClient:l,orgId:c,envName:p,urlOverride:d,customHeaders:u,testInputs:m,variables:h,resolvedEnv:g,noReport:f,retriesOverride:S,devicePixelRatio:x,logUpdate:b,tracer:w,logger:E}=n,C=new Date,I=new Qo(r,o),N={ai:r.config.ai},P={envName:p,urlOverride:d,customHeaders:u,testInputs:m},D,W=Math.abs(S??r.config.retries??e.retries??0),_=[];E.info("Starting test run using CLI");for(let B=0;B<=W;B++){let L=await w.startAttempt(),j=E.child(L.loggerBindings||{}),O={...e,steps:Wv(t)};B!==0&&b("RETRY",`attempt ${B+1}/${W+1}`);let ee=new Date,me=await Ao.init(c,i),tt=new Qn({httpClient:new _t({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:j}),fakerSeed:me.isBooleanFlagEnabled("faker_constant_seed")?ph:void 0});try{let{controller:ce,context:Se}=await jv({baseUrl:a,envName:p,apiClient:i,devicePixelRatio:x,logger:j,storageClient:l,codeEvalTools:tt,test:O,generator:s,orgId:c,variables:h,customHeaders:u,testInputs:m,localBrowserConfig:g?.browser??r.config.browser,visualDiffScreenshotStorage:I,flagStore:me});D=await $v({attemptMetadata:{attemptNumber:B+1,orgId:c,runId:w.runId},attemptFixtures:{logger:j,storageClient:l,billingReporter:new wo,analytics:new ti,debugDataStorage:new Lr,codeEvalTools:tt,flagStore:me,apiClient:i,context:Se,controller:ce,tracer:L},attemptInputs:{test:O,orgSettings:N,noReport:f}});let De=new Date;await L.finish({logger:j,result:D}),_.unshift(D.status);let nt=await zv({orgId:c,codeEvalTools:tt,logger:j,outputDefinitions:e.outputs??[],testContext:Se,flagStore:me}),Ft=$m(_),Pn=B+1;if(D.status!=="FAILED")return{...D,parameters:P,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:De,attempts:Pn,baseUrl:a,outputs:nt,isFlake:Ft};let G=D.failedStepResult,tn=G?.message||"Unknown failure",ci=G?.failureReason??vh(tn)??"UnknownError",Ue=j.child({errResult:G,failureReason:ci,errorMessage:tn,numAttempts:W+1,name:O.name});if(B<W){Ue.warn(`Retrying failed execution attempt for run: ${tn}`);continue}return Ue.error(`Test failed after all exhausting attempts: ${tn}`),{...D,parameters:P,failureDetails:{errorMessage:tn},failureReason:ci,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:De,attempts:B+1,baseUrl:a,outputs:nt}}catch(ce){let Se=`Encountered fatal platform error while running test '${O.name}': ${ce}`,De=new Date,nt=B+1;j.error({err:ce},Se),y.error(Se);let Ft={errorMessage:ce.message,errStack:ce.stack},Pn={status:"FAILED",failureDetails:Ft,failureReason:"InternalPlatformError",finishedAt:De};return await L.finish({logger:j,result:{status:"FAILED",results:[]}}),{...Pn,parameters:P,test:O,filePath:O.relativeFilePath,startedAt:C,lastAttemptStartedAt:ee,finishedAt:new Date,attempts:nt,baseUrl:a,outputs:{}}}}throw new Error("This code should not be reachable")}function HN(n){for(let e of n.envs??[])if(e.default)return e.name}async function ai(n,e,t,r,o){let i=Fi(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let s=Di(o.command);s&&await e.reportCreditsUsed(n,o.command.type,s,{testId:t,testName:r})}}var hu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}async finish(){}async startSubSteps(){return new Gl(this.testId,this.testName,this.billingReporter,this.asyncWork)}},Gl=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;return this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r)),new hu(this.testId,this.testName,this.billingReporter,this.asyncWork)}},gu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}trackStatus(){}attachNetworkLogs(){}attachConsoleLogs(){}async finish(){}async startStepList(){return new Gl(this.testId,this.testName,this.billingReporter,this.asyncWork)}},fu=class{constructor(e,t,r,o){this.testId=e;this.testName=t;this.billingReporter=r;this.asyncWork=o}async finish(){}trackStatus(){}async startAttempt(){return new gu(this.testId,this.testName,this.billingReporter,this.asyncWork)}},Vl=class{constructor(e){this.billingReporter=e}asyncWork=[];async finish(){await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){return this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{testId:e.testId,testName:e.testName})),new fu(e.testId,e.testName,this.billingReporter,this.asyncWork)}};import{randomUUID as Vv}from"crypto";import{diff as ZN}from"deep-object-diff";import $N from"adm-zip";import Hn from"fs";import Qr from"path";var Rs=class n{constructor(e){this.filePath=e;Hn.rmSync(this.filePath,{recursive:!0,force:!0}),Hn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new n(Qr.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=Qr.join(this.filePath,t);Hn.writeFileSync(o,r)}createRunArchive(e){return new Su(Qr.join(this.filePath,"runs"),e)}},Su=class{constructor(e,t){this.filePath=e;this.tempPath=Qr.join(e,`.${t}`),this.finalPath=Qr.join(e,`${t}.zip`),Hn.rmSync(this.tempPath,{recursive:!0,force:!0}),Hn.rmSync(this.finalPath,{recursive:!0,force:!0}),Hn.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;cd(e){return new Rs(Qr.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=Qr.join(this.tempPath,t);Hn.writeFileSync(o,r)}close(){let e=new $N;e.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let t=e.toBuffer();Hn.writeFileSync(this.finalPath,t),Hn.rmSync(this.tempPath,{recursive:!0,force:!0})}};import WN from"simple-git";var Ee=WN();function ql(n){if(n.startsWith("git@")){let e=n.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let r=t[0],o=t[1];return`${r}/${o}`}}}else if(n.startsWith("http")||n.startsWith("https")){let t=new URL(n).pathname.split("/").filter(Boolean);if(t.length>=2){let r=t[0],o=t[1].replace(".git","");return`${r}/${o}`}}}async function Ce(n){try{return(await n).trim()}catch(e){Q.error({err:e},"Failed to run git command");return}}function GN(){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"}async function VN(){let[n,e,t,r]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function qN(){let[n,e,t]=await Promise.all([Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:n,gitCommitMessage:e,gitCommitAuthorName:t,gitlabProjectPath:process.env.CI_SERVER_HOST,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function KN(){let[n,e,t,r]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),o=e?.includes("github.com"),i=e?.includes("gitlab.com"),s=e?ql(e):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function YN(){let[n,e,t]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),r=process.env.BUILDKITE_REPO,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),s=r?ql(r):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:r,gitCommitMessage:e,gitCommitAuthorName:t,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function JN(){let[n,e,t]=await Promise.all([Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),r=process.env["Build.Repository.Uri"],o=r?.includes("github.com"),i=r?.includes("gitlab.com"),s=r?ql(r):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:n?new Date(n):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:r,gitCommitMessage:e,gitCommitAuthorName:t,githubRepository:o?s:void 0,gitlabProjectPath:i?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function XN(){let[n,e,t,r,o,i,s]=await Promise.all([Ce(Ee.revparse(["HEAD"])),Ce(Ee.revparse(["--short","HEAD"])),Ce(Ee.revparse(["--abbrev-ref","HEAD"])),Ce(Ee.listRemote(["--get-url","origin"])),Ce(Ee.show(["--no-patch","--format=%ci"])),Ce(Ee.show(["-s","--pretty=%B"])),Ce(Ee.show(["-s","--pretty=%an"]))]),a=r?.includes("github.com"),l=r?.includes("gitlab.com"),c=r?ql(r):void 0;return{gitCommitSha:n,gitCommitShaShort:e,gitBranchName:t,gitOriginUrl:r,gitCommitTimestamp:o?new Date(o):void 0,gitCommitMessage:i,gitCommitAuthorName:s,githubRepository:a?c:void 0,gitlabProjectPath:l?c:void 0,pipelineId:void 0}}async function Kl(n){let e=GN();if(!e)return n.debug("No CI run environment detected, falling back to git"),XN();switch(n.debug(`Using CI runner environment variables from ${e} to get git metadata`),e){case"GithubActions":return VN();case"GitlabCI":return qN();case"CircleCI":return KN();case"Buildkite":return YN();case"AzureDevOps":return JN()}}var yu=class{constructor(e,t,r,o,i,s){this.testId=e;this.testName=t;this.metadata=r;this.diskStorage=o;this.billingReporter=i;this.asyncWork=s}getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.jpeg",contents:r})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.jpeg",contents:r})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.html",contents:r})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.html",contents:r})}heal(e){let{healType:t}=e;this.metadata.healMetadata={healType:t,healedAt:new Date}}async finish(e){let{step:t}=e,r={...this.metadata,status:t.status,finishedAt:t.finishedAt,message:t.message};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)})}async startSubSteps(){let e=this.diskStorage.cd("substeps");return new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork)}},Yl=class{constructor(e,t,r,o,i){this.testId=e;this.testName=t;this.diskStorage=r;this.billingReporter=o;this.asyncWork=i}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r));let o=this.diskStorage.cd(r.id),i={step:r,status:"RUNNING",startedAt:new Date};return o.storeFile({name:"metadata.json",contents:JSON.stringify(i,null,2)}),new yu(this.testId,this.testName,i,o,this.billingReporter,this.asyncWork)}},bu=class{constructor(e,t,r,o,i,s,a,l,c){this.orgId=e;this.testId=t;this.testName=r;this.originalSteps=o;this.metadata=i;this.client=s;this.diskStorage=a;this.billingReporter=l;this.asyncWork=c}trackStatus(){}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}async finish(e){let{logger:t,result:r,updatedSteps:o}=e;if(this.metadata.status=r.status,this.metadata.finishedAt=new Date,this.metadata.results=r.results,this.metadata.beforeResults=r.beforeResults,this.metadata.afterResults=r.afterResults,this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)}),r?.status!=="PASSED"||!o)return;let i=ZN(this.originalSteps,o);if(Object.keys(i).length!==0){t.debug({changes:i},"Updating steps post-run success in cli");try{let{cachesToSave:s}=await mt({stepLists:o,cacheCreationParams:{testId:this.testId,orgId:this.orgId}});await this.client.updateStepCaches({testId:this.testId,entries:s})}catch(s){t.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async startStepList(){let e=this.diskStorage.cd("steps");return new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork)}},wu=class{constructor(e,t,r,o,i,s,a,l,c,p){this.orgId=e;this.testId=t;this.testName=r;this.internalRunId=o;this.originalSteps=i;this.metadata=s;this.client=a;this.diskStorage=l;this.billingReporter=c;this.asyncWork=p}get envVarBindings(){return{[Da]:this.internalRunId}}async finish(e){let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}trackStatus(){}async startAttempt(){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let e=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),t={startedAt:new Date,status:"RUNNING"};return e.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),new bu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork)}},Jl=class n{constructor(e,t,r,o,i,s){this.orgId=e;this.runGroupId=t;this.metadata=r;this.client=o;this.diskStorage=i;this.billingReporter=s;this.asyncWork=[]}asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,r,o){let i=await Kl(y),s=Vv(),a={...i,trigger:Pt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:jt||He},l=new Rs(t);return l.storeFile({name:"metadata.json",contents:JSON.stringify(a,null,2)}),new n(e,s,a,r,l,o)}async finish(e){let{status:t}=e,r={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let t=Vv(),r=this.diskStorage.createRunArchive(t),o={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:jt,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0};return r.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)}),this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName})),new wu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork)}};import{diff as QN}from"deep-object-diff";var vu=class{constructor(e,t,r,o,i,s,a,l,c,p,d,u){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.step=s;this.originalSteps=a;this.client=l;this.analytics=c;this.debugDataStorage=p;this.billingReporter=d;this.asyncWork=u}startedAt=new Date;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{logger:t,snapshotId:r,screenshot:o}=e;this.asyncWork.push(this.debugDataStorage.storeScreenshot(t,r,o))}attachAfterScreenshot(e){let{logger:t,snapshotId:r,screenshot:o}=e;this.asyncWork.push(this.debugDataStorage.storeScreenshot(t,r,o))}attachBeforeHtmlSnapshot(e){let{logger:t,snapshotId:r,html:o}=e;this.asyncWork.push(this.debugDataStorage.storeHtmlSnapshot(t,r,o))}attachAfterHtmlSnapshot(e){let{logger:t,snapshotId:r,html:o}=e;this.asyncWork.push(this.debugDataStorage.storeHtmlSnapshot(t,r,o))}heal(e){let{healType:t}=e;this.step.type==="PRESET_ACTION"&&this.analytics.track({type:"execution:step_heal",heal_type:t,step_type:this.step.type,command_type:this.step.command.type,duration_ms:Date.now()-this.startedAt.getTime()})}async finish(e){let{step:t}=e,r=new Date;switch(t.status){case"SUCCESS":this.analytics.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime()});break;case"FAILED":{let o="command"in t?t.command.type:t.type;this.analytics.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime(),fail_reason:t.message??`${o} failed`});break}case"CANCELLED":this.analytics.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:r.getTime()-this.startedAt.getTime()});break;default:throw new Error(`Unexpected status: ${t.status}`)}}async startSubSteps(){return new Xl(this.orgId,this.testId,this.testName,this.runId,this.attemptId,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},Xl=class{constructor(e,t,r,o,i,s,a,l,c,p,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.originalSteps=s;this.client=a;this.analytics=l;this.debugDataStorage=c;this.billingReporter=p;this.asyncWork=d}getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(ai(t,this.billingReporter,this.testId,this.testName,r));let o=this.analytics.child({step_id:r.id});return o.track({type:"execution:step_start",step_type:r.type==="RESOLVED_MODULE"?"MODULE":r.type,command_type:"command"in r?r.command.type:void 0}),new vu(this.orgId,this.testId,this.testName,this.runId,this.attemptId,r,this.originalSteps,this.client,o,this.debugDataStorage,this.billingReporter,this.asyncWork)}},xu=class{constructor(e,t,r,o,i,s,a,l,c,p,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.attemptId=i;this.originalSteps=s;this.client=a;this.analytics=l;this.debugDataStorage=c;this.billingReporter=p;this.asyncWork=d}get loggerBindings(){return{runAttemptId:this.attemptId}}trackStatus(){}attachNetworkLogs(e){let{logger:t,logs:r}=e;this.asyncWork.push(this.debugDataStorage.storeNetworkLogsForRunAttempt(t,this.runId,this.attemptId,r))}attachConsoleLogs(e){let{logger:t,logs:r}=e;this.asyncWork.push(this.debugDataStorage.storeConsoleLogsForRunAttempt(t,this.runId,this.attemptId,r))}async finish(e){let{logger:t,result:r,updatedSteps:o}=e;if(await this.client.updateRunAttempt(this.runId,this.attemptId,{status:r.status,finishedAt:new Date,results:r.results,beforeResults:r.beforeResults,afterResults:r.afterResults}),r?.status!=="PASSED"||!o)return;let i=QN(this.originalSteps,o);if(Object.keys(i).length!==0){t.debug({changes:i},"Updating steps post-run success in cli");try{let{cachesToSave:s}=await mt({stepLists:o,cacheCreationParams:{testId:this.testId,orgId:this.orgId}});await this.client.updateStepCaches({testId:this.testId,entries:s})}catch(s){t.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async startStepList(){return new Xl(this.orgId,this.testId,this.testName,this.runId,this.attemptId,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},Tu=class{constructor(e,t,r,o,i,s,a,l,c,p){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.originalSteps=i;this.client=s;this.analytics=a;this.debugDataStorage=l;this.billingReporter=c;this.asyncWork=p;this.startedAt=new Date}attempts=0;startedAt=new Date;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[Da]:this.runId}}async finish(e){let t=e.finishedAt||new Date,r=t.getTime()-this.startedAt.getTime();switch(e.status){case"PASSED":this.analytics.track({type:"execution:test_success",attempt_count:this.attempts,duration_ms:r,is_flake:e.isFlake||!1});break;case"CANCELLED":this.analytics.track({type:"execution:test_cancel",duration_ms:r,attempt_count:this.attempts});break;case"FAILED":this.analytics.track({type:"execution:test_fail",attempt_count:this.attempts,duration_ms:r,fail_reason:e.failureDetails?.errorMessage??"unknown"});break}await this.client.updateRun(this.runId,{status:e.status,finishedAt:t,flake:e.isFlake,failureDetails:e.failureDetails,failureReason:e.failureReason})}trackStatus(){}async startAttempt(){this.attempts++,await this.client.updateRun(this.runId,{status:"RUNNING",attempts:this.attempts});let{id:e}=await this.client.createRunAttempt(this.runId);return new xu(this.orgId,this.testId,this.testName,this.runId,e,this.originalSteps,this.client,this.analytics,this.debugDataStorage,this.billingReporter,this.asyncWork)}},Zl=class n{constructor(e,t,r,o,i,s,a){this.orgId=e;this.runGroupId=t;this.gitMetadata=r;this.client=o;this.analytics=i;this.debugDataStorage=s;this.billingReporter=a;this.asyncWork=[]}asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.gitMetadata.gitBranchName}}static async start(e,t,r,o,i){let s=await Kl(y),{id:a}=await t.createRunGroup({...s,trigger:Pt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:jt}),l=r.child({commit_sha:s?.gitCommitSha,commit_sha_short:s?.gitCommitShaShort,branch_name:s?.gitBranchName,origin_url:s?.gitOriginUrl,commit_timestamp:s?.gitCommitTimestamp,github_repository:s?.githubRepository,gitlab_project_path:s?.gitlabProjectPath,pipeline_id:s?.pipelineId,run_group_id:a});return new n(e,a,s,t,l,o,i)}async finish(e){let{status:t}=e,r=new Date;await this.client.updateRunGroup(this.runGroupId,{status:t,finishedAt:r});let o=r.getTime()-e.startedAt.getTime();switch(t){case"PASSED":this.analytics.track({type:"execution:run_group_success",duration_ms:o});break;case"FAILED":this.analytics.track({type:"execution:run_group_fail",duration_ms:o});break;case"CANCELLED":this.analytics.track({type:"execution:run_group_cancel",duration_ms:o});break}await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let{id:t}=await this.client.createRun({stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:jt,schemaVersion:e.schemaVersion}),r=this.analytics.child({run_id:t,test_id:e.testId,test_name:e.testName,label_names:e.testLabels});return this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName})),r.track({type:"execution:test_start"}),new Tu(this.orgId,e.testId,e.testName,t,e.originalSteps,this.client,r,this.debugDataStorage,this.billingReporter,this.asyncWork)}};async function qv(n){let{logger:e,tests:t,yes:r,start:o,waitOn:i,client:s,debugDataStorage:a,billingReporter:l,analytics:c,project:p,report:d,retriesOverride:u,urlOverride:m,envName:h,orgId:g,devicePixelRatio:f,customHeaders:S,testInputMatrix:x,reporter:b,include:w,exclude:E,labels:C,reporterDir:I="reports",outputDir:N,waitOnTimeout:P=60,parallel:D=p.config.parallel??1,shardIndex:W=1,shardCount:_=1,regenerateGoldenFiles:B}=n;o&&(e.info({orgId:g},`Executing start command: ${o}`),await Ww(o,!1)),i&&(e.info({orgId:g},`Waiting for url: ${i} with timeout: ${P} seconds.`),await t_({resources:[i],interval:2500,timeout:P*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let L=new Ro({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e}),j=ke(p,y),O=await Bv({tests:t,momenticFiles:j,yes:r,project:p,include:w,exclude:E,labels:C}),ee=[];O.forEach((Ue,Wn)=>{x?x.forEach((to,ft)=>{ee.push({testIndex:Wn,inputs:to,inputIndex:ft})}):ee.push({testIndex:Wn,inputs:void 0,inputIndex:void 0})}),_&&_>1&&(ee=n_(ee,W,_));let me=`Running ${ee.length} tests with ${D} workers`;e.info({allTestsToRunWithInputs:ee,shardCount:_,shardIndex:W,orgId:g},me),y.dimmed(me),ee.forEach(Ue=>{y.dimmed(` - ${[O[Ue.testIndex].relativeFilePath]}${typeof Ue.inputIndex=="number"?` with input set ${Ue.inputIndex}`:""}`)}),y.log("");let tt=[],ce=new Date,Se=new Set,De=()=>{let Ue=s.getAppUrl(),Wn=ii({results:tt,startTime:ce.getTime(),onFailed:ft=>{Hl(ft,ft.filePath)},getDisplayLine:ft=>{let Sr=` - ${ft.filePath}${ft.proposedTest?" [AUTO-HEALED] ":""}`;return d&&ft.runId&&(Sr+=` (${Ue}/runs/${ft.runId})`),Sr},entity:"test"}),to=tt.filter(ft=>!!ft.proposedTest);return to.length>0&&y.warn(`${to.length} tests passed with auto-healing. Please use the run links printed above to review proposed changes and apply them locally.`),Wn},nt=new Vl(l);N?nt=await Jl.start(g,N,s,l):d&&(nt=await Zl.start(g,s,c,a,l));let Ft=e.child(nt.loggerBindings||{}),Pn=[],G=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await nt.finish({startedAt:ce,status:"CANCELLED"}),De(),await Promise.allSettled(Pn.map(Ue=>Ue())),process.exit(1)};process.on("SIGINT",G);let tn={};for(let Ue=0;Ue<ee.length;Ue++){let Wn=Object.values(tn);Wn.length===D&&await Promise.race(Wn.map(Sr=>Sr.promise));let to=ee[Ue],ft=`test-${Ue}`;tn[ft]={done:!1,promise:(async({testIndex:Sr,inputs:Ru})=>{let di=O[Sr];Se.add({testIndex:Sr,inputs:Ru});let rx=di.relativeFilePath.includes("..")?di.fullFilePath:di.relativeFilePath,As=(lt,pi)=>{let no=(tc,Au)=>{let ix=Math.floor((Au-tc.length)/2);return tc.padStart(ix+tc.length).padEnd(Au)};lt=lt.toUpperCase();let Ln=lt;lt.includes("FAIL")?Ln=li.bgRed.white(no("FAIL",8)):lt.includes("PASS")?Ln=li.bgGreen.white(no("PASS",8)):lt.includes("START")?Ln=li.bgBlue.white(no("START",8)):lt.includes("CANCEL")?Ln=li.bgYellow.white(no("CANCEL",8)):lt.includes("RETRY")?Ln=li.bgYellow.white(no("RETRY",8)):lt.includes("RUN")||lt.includes("PROG")?Ln=li.bgMagenta.white(no("RUNNING",8)):Ft.warn(`Unknown status tried to be logged in run test locally: ${lt}`),e_||(Ln=`[${Ln}]`),y.log(`${Ln} ${rx} ${pi?`${pi} `:""}(${Se.size}/${ee.length})`)};As("START");let ox=setInterval(()=>As("RUN"),5*60*1e3);try{let lt=await Gv({testDefinition:di,project:p,testInputs:Ru,orgId:g,devicePixelRatio:f,apiClient:s,runGroupTracer:nt,generator:L,retriesOverride:u,urlOverride:m,envName:h,noReport:!d,customHeaders:S,regenerateGoldenFiles:B,logUpdate:As,runSigIntHandlers:d?Pn:void 0,logger:Ft});As(lt.status),tt.push(lt)}catch(lt){let pi=`Encountered unexpected fatal error when running test '${di.name}': ${lt.message}`;y.error(pi),Ft.error(pi)}finally{clearInterval(ox),tn[ft].done=!0,delete tn[ft]}})(to)}}await Promise.allSettled(Object.values(tn).map(Ue=>Ue.promise));let ci="PASSED";return tt.some(Ue=>Ue.status==="FAILED")&&(ci="FAILED"),await nt.finish({startedAt:ce,status:ci}),process.off("SIGINT",G),b&&await Uv(Ft,a,b,{projectConfigPath:p.configFilePath,suiteName:p.config.name,startedAt:ce,finishedAt:new Date,runs:tt},I??"reports"),De()}function n_(n,e,t){if(t>n.length&&(y.warn(`Shard count ${t} is greater than the number of tests ${n.length}! Some workers won't have any tests to run.`),t=Math.max(t,n.length),e>t))return[];let r=Math.floor((e-1)*(n.length/t)),o=Math.floor(e*(n.length/t));return n.sort().filter((s,a)=>a>=r&&a<o)}import $n from"fs";import eo from"path";var Kv={status:(n,e)=>{if(n===e)return n;if(n==="PASSED"&&e==="PASSED")return"PASSED";if(n==="FAILED"||e==="FAILED")return"FAILED";if(n==="CANCELLED"||e==="CANCELLED")return"PASSED";throw new Error("Invalid run status merge")},startedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid start time merge");return n<e?n:e},updatedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid update time merge");return n>e?n:e},finishedAt:(n,e)=>{if(!n||!e)throw new Error("Invalid finish time merge");return n>e?n:e},gitCommitTimestamp:(n,e)=>{if(!(!n&&!e)){if(!n||!e||n.getTime()!==e.getTime())throw new Error("Git commit timestamps must match to be merged");return n}}};function Yv(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function r_(n,e,t){let r=Yv(n,t),o=Yv(e,t);if(t in Kv){let i=Kv[t];return i(r,o)}if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}function Jv(n,e){$n.rmSync(n,{recursive:!0,force:!0});let t=$n.readdirSync(e).filter(s=>s!==".DS_Store").map(s=>eo.join(e,s));$n.mkdirSync(n,{recursive:!0});let r=eo.join(t[0],"metadata.json"),o=od.parse(JSON.parse($n.readFileSync(r,"utf-8")));for(let s of t){let a=eo.join(s,"runs");if(!$n.existsSync(a))continue;let l=$n.readdirSync(a);for(let d of l){let u=eo.join(a,d),m=eo.join(n,"runs",d);$n.cpSync(u,m,{recursive:!0})}let c=eo.join(s,"metadata.json"),p=od.parse(JSON.parse($n.readFileSync(c,"utf-8")));for(let d in p){let u=d;o[u]=r_(o,p,u)}}let i=eo.join(n,"metadata.json");$n.writeFileSync(i,JSON.stringify(o,null,2))}import Xv from"adm-zip";import o_ from"fs";import Ql from"path";function Zv(n){let e=new Xv;e.addLocalFile(Ql.join(n,"metadata.json"));for(let t of o_.readdirSync(Ql.join(n,"runs"))){if(!t.endsWith(".zip"))continue;let r=t.replace(/\.zip$/,""),o=new Xv(Ql.join(n,"runs",t));for(let i of o.getEntries())i.isDirectory||e.addFile(Ql.join("runs",r,i.entryName),i.getData())}return e.toBuffer()}var Qv=new ni({platform:"cli"},{flushAt:1,flushInterval:0});rc||Q.warn("Sentry is not enabled in this environment due to unsupported node version");var d_=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Eu=n=>{d_&&y.dimmed(n)},Tt=new i_;Tt.name("momentic").description("CLI").version(jt||"unknown");Tt.command("install-browsers").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").argument("[browsers...]","Browsers to install",["chromium"]).action(async(n,e)=>{await Zr(Cv(n),e.force)});Tt.addOption(new en("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",n=>{n==="debug"&&y.info("Enabling debug logging"),y.setMinLevel(n.toLowerCase())});Tt.addOption(new en("--verbose","enable verbose logging")).on("option:verbose",()=>{Q.enableConsoleLogs(),y.setMinLevel(0)});Tt.command("check-config").addOption(fr).action(async n=>{gn({configFilePath:n.config})});var ex=Tt.command("checks").alias("check").description("Perform various project checks");ex.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(fr).addOption(fv).action(async n=>{let e=await fn(n),t=gn({configFilePath:n.config});await Zw({project:t,fix:e.fix})});ex.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(fr).action(async n=>{let e=gn({configFilePath:n.config});await Qw({project:e})});var p_=Tt.command("migrate").description("Migrate and upgrade tooling");p_.command("v0-v1").addOption(gr).addOption(jn).action(async n=>{let e=await fn(n);if(!e.yes&&!await at("This command will migrate and then delete your previous Momentic files. All members of your team should transition to the V1 CLI at the same time. Please backup your local directory for safety before proceeding. Continue?",!0)&&process.exit(1),!iv().environments?.length&&await at("In the V1 CLI, all environment configuration should be committed to a central `momentic.config.yaml` file, which you should commit to your source control repository. Sensitive data can be managed through `.env` files or by injecting the secret into the environment and then referencing them in `envVariables` with ${VAR} syntax. Would you like to pull the latest environments from Momentic Cloud into your `momentic.config.yaml` file?",!0)){let{apiKey:r,server:o}=e,i=gn({}),s=new it({baseUrl:o,apiKey:r,logger:Q});await Nl({client:s,project:i,skipPrompts:e.yes}),y.success("Successfully imported environments from Momentic Cloud.")}});Tt.command("import-from-cloud").addOption(jn).addOption(hr).addOption(fr).addOption(gr).action(async n=>{let e=await fn(n),{apiKey:t,server:r,config:o,yes:i}=e,s=gn({configFilePath:o}),a=new it({baseUrl:r,apiKey:t,logger:Q});await ov({client:a,project:s,skipPrompts:i}),process.exit(0)});Tt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new en("--name <name>","Name of the project")).action(async n=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
3591
+ `),y.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-from-cloud' command after initialization."),Cu.existsSync(Jo)&&(y.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 t={name:n.name??await Yw("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:ws};Xo(t,Jo),y.success(`Initialized Momentic project file at ${ec.resolve(Jo)}`)});Tt.command("app").addOption(jn).addOption(hr).addOption(gr).addOption(ou).addOption(mv).addOption(fr).action(async n=>{let e=await fn(n),{apiKey:t,port:r=_l,yes:o,server:i,pixelRatio:s}=e,a=new it({baseUrl:i,apiKey:t,logger:Q});await lu({client:a,skipPrompts:o,installBrowsers:!0});let l=c_(import.meta.url),c=ec.dirname(l),p=ec.resolve(c,"..","static"),d=ec.resolve(c,"..","assets"),u=s??Kp();Yp(u),ui(),await jw({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:p,assetsDir:d,devicePixelRatio:u,version:"1.1.3"});let m=`http://localhost:${r}`;await l_(m)});var tx=Tt.command("queue").description("Queue tests or suites to run on Momentic Cloud");tx.command("suites").description("Run one or more suites on Momentic Cloud").addOption(jn).addOption(hr).addOption(eu).addOption(tu).addOption(gr).addArgument(bv).addOption(Dl).addOption(Fl).addOption(Ml).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:s,urlOverride:a,customHeaders:l}=await fn(e),c=new it({baseUrl:r,apiKey:t,logger:Q});(!n||!Array.isArray(n)||!n.length)&&(y.error("Must pass at least one suite to run."),process.exit(1));let{orgId:p}=await c.getAuthInfo();await Lv({client:c,orgId:p,wait:o,suitePaths:n,waitTimeout:i,env:s,urlOverride:a,customHeaders:Ul(l)})});tx.command("tests").description("Run one or more tests on Momentic Cloud").addOption(jn).addOption(hr).addOption(gr).addOption(Ml).addOption(iu).addOption(Dl).addOption(Fl).addOption(eu).addOption(tu).addArgument(Sv).action(async(n,e)=>{let t=await fn(e),{all:r,apiKey:o,customHeaders:i,env:s,server:a,inputCsv:l,urlOverride:c,wait:p,waitTimeout:d,yes:u}=t,m=Ul(i);for(let S of n)(S.endsWith(".yaml")||Cu.existsSync(S))&&y.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 h=new it({baseUrl:a,apiKey:o,logger:Q}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await Jp(l)),await Ov({client:h,orgId:g,tests:n,all:r,customHeaders:m,env:s,urlOverride:c,wait:p,waitTimeout:d,testInputMatrix:f,yes:u}),process.exit(0)});var u_=Tt.command("run").alias("test").description("Run tests on the local machine");u_.addOption(jn).addOption(hr).addOption(fr).addOption(su).addOption(gr).addOption(Ml).addOption(iu).addOption(Fl).addOption(Dl).addOption(nu).addOption(ou).addOption(new en("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new en("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new en("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.")).addOption(new en("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.")).addOption(new en("-p, --parallel <parallel>","When running with the --local flag, the number of tests to run in parallel. Defaults to 1.")).addOption(new en("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new en("--update-golden-files","Update locally stored golden files for steps that this is enabled for.")).addOption(nu).addOption(cv).addOption(dv).addOption(ru).addOption(hv).addOption(gv).addOption(pv).addOption(uv).addArgument(yv).action(async(n,e)=>{y.debug("Run tests invoked");let t=await fn(e);y.debug(t,"Parsed CLI options");let r=Ul(t.customHeaders),o=gn({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let i=new it({baseUrl:t.server,apiKey:t.apiKey,logger:Q});y.debug("Checking API key and dependencies");let{orgId:s,userId:a}=await lu({client:i,skipPrompts:t.yes,installBrowsers:!0});y.debug("API key check and browser installation complete");let l=new wa(i),c=new va(i),p=t.outputDir??o.config.outputDir,d=Qv.child({org_id:s,user_id:a,cli_version:jt,trigger:"CLI"}),u;t.inputCsv&&(u=await Jp(t.inputCsv));let m=t.pixelRatio??Kp();Yp(m);let h=Q.child({orgId:s,userId:a,cliVersion:jt,trigger:"CLI"});try{(await qv({...t,retriesOverride:t.retries,devicePixelRatio:m,tests:n,project:o,client:i,debugDataStorage:c,billingReporter:l,analytics:d,outputDir:p,customHeaders:r,envName:t.env,orgId:s,testInputMatrix:u,logger:h,regenerateGoldenFiles:t.updateGoldenFiles})).failed>0?process.exit(1):process.exit(0)}catch(g){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(g),process.exit(1)}});var m_=Tt.command("apply").description("Apply an operation to local resources");m_.command("patch").addOption(jn).addOption(hr).addOption(fr).addOption(su).addOption(gr).addOption(new en("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new en("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async n=>{let e=await fn(n),{apiKey:t,server:r,config:o,yes:i}=e,s=gn({configFilePath:o}),a=new it({baseUrl:r,apiKey:t,logger:Q}),l=ke(s,y),c=l.tests[n.to]??Object.values(l.tests).find(d=>Pe(d.name)===n.to.trim());c||(y.error(`No test matching '${n.to}' could be found in the current project.`),process.exit(1));let p=await a.fetchTestFragment(n.from);await Jw({client:a,test:c,fragment:p,yes:i,entities:l,logger:Q}),process.exit(0)});var nx=Tt.command("results").description("Merge and upload test results.");nx.command("merge").description("Merge test results files.").addOption(ru).addArgument(wv).action(async(n,e)=>{let t=await fn(e),{outputDir:r}=t;r||(y.error("Output directory is required."),process.exit(1)),Jv(r,n)});nx.command("upload").description("Upload test results to Momentic cloud.").addOption(jn).addOption(hr).addArgument(vv).action(async(n,e)=>{let t=await fn(e),{apiKey:r,server:o}=t,i=new it({baseUrl:o,apiKey:r,logger:Q}),s=new La(i);try{let a=Zv(n);Cu.writeFileSync("test.zip",a);let l=await s.uploadResultsArchive(a),c=`${i.getAppUrl()}/run-groups/${l}`;y.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`),process.exit(0)}catch(a){let l;a instanceof Error?l=a.message:typeof a=="string"?l=a:l="Unknown error",y.error(`Failed to upload test results: ${l}.`),process.exit(1)}});async function h_(){Eu("Main program started"),await Gw(Q),Eu("CLI version check complete");try{await Tt.parseAsync(process.argv),ui()}catch(n){let e={};try{e.playwrightVersion=s_("npx playwright --version").toString()}catch(t){Q.error({err:t},"Error fetching debug information")}Q.error({err:n,debugInfo:e},"Uncaught error in CLI"),Q.flush(),nc(n,e),y.error(n),ui(),process.exit(1)}}a_.setMaxListeners(50);process.on("warning",n=>{Q.warn({err:n},`Node warning received on CLI: ${n.message}`)});Eu("CLI parsing setup complete");h_();
3574
3592
  /*! Bundled license information:
3575
3593
 
3576
3594
  is-buffer/index.js:
@@ -3582,4 +3600,4 @@ is-buffer/index.js:
3582
3600
  *)
3583
3601
  */
3584
3602
  //# sourceMappingURL=cli.js.map
3585
- //# debugId=4ee28e9c-92b2-5b13-a0be-45d9de847244
3603
+ //# debugId=db115a00-082c-55ef-b6e5-7fbf05267b88