momentic 1.1.0 → 1.1.1
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 +6 -6
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="eb086744-39da-5111-b783-58b6ea0d77cb")}catch(e){}}();
|
|
4
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.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
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
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=(r=>(r.JUNIT="junit",r.ALLURE="allure",r.PLAYWRIGHT_JSON="playwright_json",r))(_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?"":e,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}
|
|
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?"":e,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
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(`
|
|
@@ -3552,7 +3552,7 @@ ${i.stack}`),a.status(500).send("Internal Server Error")}),n){let i=Uw.static(n,
|
|
|
3552
3552
|
|
|
3553
3553
|
Using Command Prompt on Windows:
|
|
3554
3554
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
|
|
3555
|
-
`)}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.
|
|
3555
|
+
`)}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.1",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.1"});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:
|
|
3556
3556
|
${[...i].map(a=>`- ${a}`).join(`
|
|
3557
3557
|
`)}`):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.
|
|
3558
3558
|
|
|
@@ -3562,13 +3562,13 @@ The suite path is a lowercased version of your suite name where spaces and speci
|
|
|
3562
3562
|
`).slice(o).filter(Boolean).join(`
|
|
3563
3563
|
`);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(`
|
|
3564
3564
|
`);process.stderr.write(`${o}
|
|
3565
|
-
`),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":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:
|
|
3565
|
+
`),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:
|
|
3566
3566
|
${n.map(d=>` - ${d}`).join(`
|
|
3567
3567
|
`)}
|
|
3568
3568
|
`),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:
|
|
3569
3569
|
${n.map(d=>` - ${d}`).join(`
|
|
3570
3570
|
`)}`),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}
|
|
3571
|
-
`),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.
|
|
3571
|
+
`),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.1"});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_();
|
|
3572
3572
|
/*! Bundled license information:
|
|
3573
3573
|
|
|
3574
3574
|
is-buffer/index.js:
|
|
@@ -3580,4 +3580,4 @@ is-buffer/index.js:
|
|
|
3580
3580
|
*)
|
|
3581
3581
|
*/
|
|
3582
3582
|
//# sourceMappingURL=cli.js.map
|
|
3583
|
-
//# debugId=
|
|
3583
|
+
//# debugId=eb086744-39da-5111-b783-58b6ea0d77cb
|