momentic 2.104.2 → 2.104.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +10 -10
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/run-viewer-static/assets/{index-NLgYfy6a.js → index-UE2nPcFc.js} +230 -230
- package/run-viewer-static/index.html +1 -1
- package/static/assets/{index-VCGIsEh7.js → index-_x4my3K4.js} +3 -3
- package/static/index.html +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="42b8d727-48f8-5a33-a4a8-92b82d4ae9ba")}catch(e){}}();
|
|
4
4
|
import * as v from 'zod';
|
|
5
5
|
import v__default, { z, ZodFirstPartyTypeKind } from 'zod';
|
|
6
6
|
import { extendZodWithOpenApi } from 'zod-openapi';
|
|
@@ -84,8 +84,8 @@ import yse from 'pixelmatch';
|
|
|
84
84
|
import { elementRoles } from 'aria-query';
|
|
85
85
|
import dce from 'fetch-cookie';
|
|
86
86
|
import { CookieJar } from 'tough-cookie';
|
|
87
|
-
import { writeFile, readFile, mkdir, readdir, stat, unlink, cp as cp$1, rm as rm$1 } from 'fs/promises';
|
|
88
87
|
import { streamObject, pipeUIMessageStreamToResponse, streamText, wrapLanguageModel, stepCountIs, tool, createUIMessageStream, consumeStream, convertToModelMessages, hasToolCall } from 'ai';
|
|
88
|
+
import { writeFile, readFile, mkdir, readdir, stat, unlink, cp as cp$1, rm as rm$1 } from 'fs/promises';
|
|
89
89
|
import Ude from 'node:os';
|
|
90
90
|
import { randomUUID as randomUUID$1 } from 'node:crypto';
|
|
91
91
|
import jde from 'node:path';
|
|
@@ -157,13 +157,13 @@ ${this.decisions.map(t=>t.toString()).join(`
|
|
|
157
157
|
To resolve the conflict:`,sA(c,t))),i=l):ce.warn("A view or instrument with the name ",t.name,` has already been registered and is incompatible with another registered view.
|
|
158
158
|
`,`Details:
|
|
159
159
|
`,aA(c,t),`To resolve the conflict:
|
|
160
|
-
`,sA(c,t));}}catch(u){r={error:u};}finally{try{s&&!s.done&&(o=a.return)&&o.call(a);}finally{if(r)throw r.error}}return i},e}();var lF=function(){function e(t){this._backingStorages=t;}return e.prototype.record=function(t,n,r,o){this._backingStorages.forEach(function(i){i.record(t,n,r,o);});},e}();xt();xt();var cF=function(){function e(t,n){this._instrumentName=t,this._valueType=n,this._buffer=new Ko;}return e.prototype.observe=function(t,n){if(n===void 0&&(n={}),typeof t!="number"){ce.warn("non-number value provided to metric "+this._instrumentName+": "+t);return}this._valueType===Vr.INT&&!Number.isInteger(t)&&(ce.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||this._buffer.set(n,t);},e}();var uF=function(){function e(){this._buffer=new Map;}return e.prototype.observe=function(t,n,r){if(r===void 0&&(r={}),!!gm(t)){var o=this._buffer.get(t);if(o==null&&(o=new Ko,this._buffer.set(t,o)),typeof n!="number"){ce.warn("non-number value provided to metric "+t._descriptor.name+": "+n);return}t._descriptor.valueType===Vr.INT&&!Number.isInteger(n)&&(ce.warn("INT value type cannot accept a floating-point value for "+t._descriptor.name+", ignoring the fractional digits."),n=Math.trunc(n),!Number.isInteger(n))||o.set(r,n);}},e}();var cA=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},uA=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},dF=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},pF=function(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))},mF=function(){function e(){this._callbacks=[],this._batchCallbacks=[];}return e.prototype.addCallback=function(t,n){var r=this._findCallback(t,n);r>=0||this._callbacks.push({callback:t,instrument:n});},e.prototype.removeCallback=function(t,n){var r=this._findCallback(t,n);r<0||this._callbacks.splice(r,1);},e.prototype.addBatchCallback=function(t,n){var r=new Set(n.filter(gm));if(r.size===0){ce.error("BatchObservableCallback is not associated with valid instruments",n);return}var o=this._findBatchCallback(t,r);o>=0||this._batchCallbacks.push({callback:t,instruments:r});},e.prototype.removeBatchCallback=function(t,n){var r=new Set(n.filter(gm)),o=this._findBatchCallback(t,r);o<0||this._batchCallbacks.splice(o,1);},e.prototype.observe=function(t,n){return cA(this,void 0,void 0,function(){var r,o,i,a;return uA(this,function(s){switch(s.label){case 0:return r=this._observeCallbacks(t,n),o=this._observeBatchCallbacks(t,n),[4,d0(pF(pF([],dF(r),!1),dF(o),!1))];case 1:return i=s.sent(),a=i.filter(p0).map(function(l){return l.reason}),[2,a]}})})},e.prototype._observeCallbacks=function(t,n){var r=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return cA(r,void 0,void 0,function(){var s,l;return uA(this,function(c){switch(c.label){case 0:return s=new cF(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),n!=null&&(l=Ka(l,n)),[4,l];case 1:return c.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,t);}),[2]}})})})},e.prototype._observeBatchCallbacks=function(t,n){var r=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return cA(r,void 0,void 0,function(){var s,l;return uA(this,function(c){switch(c.label){case 0:return s=new uF,l=Promise.resolve(i(s)),n!=null&&(l=Ka(l,n)),[4,l];case 1:return c.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,t);});}),[2]}})})})},e.prototype._findCallback=function(t,n){return this._callbacks.findIndex(function(r){return r.callback===t&&r.instrument===n})},e.prototype._findBatchCallback=function(t,n){return this._batchCallbacks.findIndex(function(r){return r.callback===t&&m0(r.instruments,n)})},e}();var q9=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t;}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),fF=function(e){q9(t,e);function t(n,r,o,i,a){var s=e.call(this,n)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new bS(r,s._aggregationCardinalityLimit),s._temporalMetricStorage=new vS(r,i),s}return t.prototype.record=function(n,r,o,i){r=this._attributesProcessor.process(r,o),this._deltaMetricStorage.record(n,r,o,i);},t.prototype.collect=function(n,r){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(n,this._instrumentDescriptor,o,r)},t}(ES);var hF=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t;}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),wu=function(){function e(){}return e.Noop=function(){return Y9},e}();var K9=function(e){hF(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.process=function(n,r){return n},t}(wu);var gF=function(e){hF(t,e);function t(n){var r=e.call(this)||this;return r._allowedAttributeNames=n,r}return t.prototype.process=function(n,r){var o=this,i={};return Object.keys(n).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=n[a]}),i},t}(wu);var Y9=new K9;var X9=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},J9=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},Z9=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},SF=function(){function e(t,n){this._meterProviderSharedState=t,this._instrumentationScope=n,this.metricStorageRegistry=new sF,this.observableRegistry=new mF,this.meter=new rF(this);}return e.prototype.registerMetricStorage=function(t){var n=this._registerMetricStorage(t,fF);return n.length===1?n[0]:new lF(n)},e.prototype.registerAsyncMetricStorage=function(t){var n=this._registerMetricStorage(t,aF);return n},e.prototype.collect=function(t,n,r){return X9(this,void 0,void 0,function(){var o,i,a;return J9(this,function(s){switch(s.label){case 0:return [4,this.observableRegistry.observe(n,r?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(t),i.length===0?[2,null]:(a=i.map(function(l){return l.collect(t,n)}).filter(c0),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},e.prototype._registerMetricStorage=function(t,n){var r=this,o=this._meterProviderSharedState.viewRegistry.findViews(t,this._instrumentationScope),i=o.map(function(l){var c=g0(l,t),u=r.metricStorageRegistry.findOrUpdateCompatibleStorage(c);if(u!=null)return u;var d=l.aggregation.createAggregator(c),p=new n(c,d,l.attributesProcessor,r._meterProviderSharedState.metricCollectors,l.aggregationCardinalityLimit);return r.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(t.type),s=a.map(function(l){var c=Z9(l,2),u=c[0],d=c[1],p=r.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,t);if(p!=null)return p;var m=d.createAggregator(t),f=u.selectCardinalityLimit(t.type),h=new n(t,m,wu.Noop(),[u],f);return r.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s);}return i},e}();var Q9=function(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return {next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},yF=function(){function e(t){this.resource=t,this.viewRegistry=new Y0,this.metricCollectors=[],this.meterSharedStates=new Map;}return e.prototype.getMeterSharedState=function(t){var n=u0(t),r=this.meterSharedStates.get(n);return r==null&&(r=new SF(this,t),this.meterSharedStates.set(n,r)),r},e.prototype.selectAggregations=function(t){var n,r,o=[];try{for(var i=Q9(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(t)]);}}catch(l){n={error:l};}finally{try{a&&!a.done&&(r=i.return)&&r.call(i);}finally{if(n)throw n.error}}return o},e}();var CS=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},AS=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},e7=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},t7=function(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))},TF=function(){function e(t,n){this._sharedState=t,this._metricReader=n;}return e.prototype.collect=function(t){return CS(this,void 0,void 0,function(){var n,r,o,i,a=this;return AS(this,function(s){switch(s.label){case 0:return n=hl(Date.now()),r=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return CS(a,void 0,void 0,function(){var c;return AS(this,function(u){switch(u.label){case 0:return [4,l.collect(this,n,t)];case 1:return c=u.sent(),c?.scopeMetrics!=null&&r.push(c.scopeMetrics),c?.errors!=null&&o.push.apply(o,t7([],e7(c.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:r},errors:o}]}})})},e.prototype.forceFlush=function(t){return CS(this,void 0,void 0,function(){return AS(this,function(n){switch(n.label){case 0:return [4,this._metricReader.forceFlush(t)];case 1:return n.sent(),[2]}})})},e.prototype.shutdown=function(t){return CS(this,void 0,void 0,function(){return AS(this,function(n){switch(n.label){case 0:return [4,this._metricReader.shutdown(t)];case 1:return n.sent(),[2]}})})},e.prototype.selectAggregationTemporality=function(t){return this._metricReader.selectAggregationTemporality(t)},e.prototype.selectAggregation=function(t){return this._metricReader.selectAggregation(t)},e.prototype.selectCardinalityLimit=function(t){var n,r,o;return (o=(r=(n=this._metricReader).selectCardinalityLimit)===null||r===void 0?void 0:r.call(n,t))!==null&&o!==void 0?o:2e3},e}();var EF=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},bF=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},vF=function(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return {next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};function n7(e,t){var n=t??SS.empty();return e?SS.default().merge(n):n}var dA=function(){function e(t){var n,r,o,i,a;if(this._shutdown=!1,this._sharedState=new yF(n7((a=t?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,t?.resource)),t?.views!=null&&t.views.length>0)try{for(var s=vF(t.views),l=s.next();!l.done;l=s.next()){var c=l.value;this._sharedState.viewRegistry.addView(c);}}catch(m){n={error:m};}finally{try{l&&!l.done&&(r=s.return)&&r.call(s);}finally{if(n)throw n.error}}if(t?.readers!=null&&t.readers.length>0)try{for(var u=vF(t.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p);}}catch(m){o={error:m};}finally{try{d&&!d.done&&(i=u.return)&&i.call(u);}finally{if(o)throw o.error}}}return e.prototype.getMeter=function(t,n,r){return n===void 0&&(n=""),r===void 0&&(r={}),this._shutdown?(ce.warn("A shutdown MeterProvider cannot provide a Meter"),gC()):this._sharedState.getMeterSharedState({name:t,version:n,schemaUrl:r.schemaUrl}).meter},e.prototype.addMetricReader=function(t){var n=new TF(this._sharedState,t);t.setMetricProducer(n),this._sharedState.metricCollectors.push(n);},e.prototype.shutdown=function(t){return EF(this,void 0,void 0,function(){return bF(this,function(n){switch(n.label){case 0:return this._shutdown?(ce.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(r){return r.shutdown(t)}))]);case 1:return n.sent(),[2]}})})},e.prototype.forceFlush=function(t){return EF(this,void 0,void 0,function(){return bF(this,function(n){switch(n.label){case 0:return this._shutdown?(ce.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(r){return r.forceFlush(t)}))];case 1:return n.sent(),[2]}})})},e}();var r7=/[\^$\\.+?()[\]{}|]/g,RS=function(){function e(t){t==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(e.escapePattern(t)));}return e.prototype.match=function(t){return this._matchAll?!0:this._regexp.test(t)},e.escapePattern=function(t){return "^"+t.replace(r7,"\\$&").replace("*",".*")+"$"},e.hasWildcard=function(t){return t.includes("*")},e}();var xu=function(){function e(t){this._matchAll=t===void 0,this._pattern=t;}return e.prototype.match=function(t){return !!(this._matchAll||t===this._pattern)},e}();var CF=function(){function e(t){var n;this._nameFilter=new RS((n=t?.name)!==null&&n!==void 0?n:"*"),this._type=t?.type,this._unitFilter=new xu(t?.unit);}return e.prototype.getType=function(){return this._type},e.prototype.getNameFilter=function(){return this._nameFilter},e.prototype.getUnitFilter=function(){return this._unitFilter},e}();var AF=function(){function e(t){this._nameFilter=new xu(t?.name),this._versionFilter=new xu(t?.version),this._schemaUrlFilter=new xu(t?.schemaUrl);}return e.prototype.getNameFilter=function(){return this._nameFilter},e.prototype.getVersionFilter=function(){return this._versionFilter},e.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},e}();function o7(e){return e.instrumentName==null&&e.instrumentType==null&&e.instrumentUnit==null&&e.meterName==null&&e.meterVersion==null&&e.meterSchemaUrl==null}var Sm=function(){function e(t){var n;if(o7(t))throw new Error("Cannot create view with no selector arguments supplied");if(t.name!=null&&(t?.instrumentName==null||RS.hasWildcard(t.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");t.attributeKeys!=null?this.attributesProcessor=new gF(t.attributeKeys):this.attributesProcessor=wu.Noop(),this.name=t.name,this.description=t.description,this.aggregation=(n=t.aggregation)!==null&&n!==void 0?n:bo.Default(),this.instrumentSelector=new CF({name:t.instrumentName,type:t.instrumentType,unit:t.instrumentUnit}),this.meterSelector=new AF({name:t.meterName,version:t.meterVersion,schemaUrl:t.meterSchemaUrl}),this.aggregationCardinalityLimit=t.aggregationCardinalityLimit;}return e}();xt();function a7(){return new a0({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:ml.DELTA})}var s7=[new Sm({instrumentName:"test_event_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Sm({instrumentName:"test_step_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Sm({instrumentName:"test_mobile_step_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],wS=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(t){let n=this.counterCache.get(t);if(n)return n;let r=this.meter.createCounter(t);return this.counterCache.set(t,r),r}getHistogram(t){let n=this.histogramCache.get(t);if(n)return n;let r=this.meter.createHistogram(t);return this.histogramCache.set(t,r),r}ensureObservableGauge(t){let n=this.observableGaugeCache.get(t);if(n)return n;let r=this.meter.createObservableGauge(t);return r.addCallback(o=>{let i=this.gaugeValues.get(t);i!==void 0&&o.observe(i,this.globalAttributes);}),this.observableGaugeCache.set(t,r),r}constructor(t){this.globalAttributes={...t.globalAttributes??{}};let n=typeof process<"u"?"production":"unknown",r=new NC({[$g]:t.serviceName,[nk]:n,[ok]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:v4$1()}),o=a7(),i=new oA({exporter:o,exportIntervalMillis:t.exportIntervalMs??6e4});this.provider=new dA({resource:r,readers:[i],views:s7}),Vg.setGlobalMeterProvider(this.provider),this.meter=Vg.getMeter("momentic-serverless");}increment(t,n,r){try{let o=lC(r,this.globalAttributes);this.getCounter(t).add(typeof n=="number"?n:1,o);}catch{}}gauge(t,n){try{this.ensureObservableGauge(t),this.gaugeValues.set(t,n);}catch{}}distribution(t,n,r){try{let o=lC(r,this.globalAttributes);this.getHistogram(t).record(n,o);}catch{}}async flush(){try{await this.provider.forceFlush();}catch{}}async recordDuration({fn:t,name:n,tags:r}){let o=Date.now();try{return await Promise.resolve(t())}finally{this.distribution(n,Date.now()-o,r);}}};var $t=new Ug;function RF(e){e.disabled||($t=new wS(e));}var pA;function wF(e){pA=e;}function Ja(e){e instanceof Hn||pA&&pA(e);}var mA=!1;try{let e=await import('@sentry/node');e.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",dist:"production",release:"cli-2.104.2",tracesSampleRate:0,sendDefaultPii:!0}),wF(e.captureException),mA=!0;}catch{}function xF(e){try{return existsSync(e)&&statSync(e).isDirectory()}catch(t){return C.error({err:t},`Error reading path ${e} during directory existence check`),!1}}var g7=!1,_F=(()=>{try{return statSync("/.dockerenv"),!0}catch{return !1}})();async function On(e){return ll||g7||_F?!0:(await C.flush(),await new Promise(n=>setTimeout(n,100)),await confirm({message:e}))}async function fA(e){let t=dirname(e);return xF(t)?existsSync(e)?On(`File '${IF(e)}' already exists. Overwrite existing content?`):!0:await On(`Directory '${IF(t)}' doesn't exist. Create it now?`)?(mkdirSync(t,{recursive:!0}),!0):!1}function IF(e){return e.replace(/(\s+)/g,"\\$1")}async function PF(e,t){return ll||_F?t:(await input({message:e,default:t})).trim()||t}var hA=class extends Error{constructor(t,n,r){let o=Error.stackTraceLimit;r&&(Error.stackTraceLimit=Math.max(r,o||10)),super(t),Error.captureStackTrace&&Error.captureStackTrace(this,n),Error.stackTraceLimit=o;}},xS=class e extends Console{_buffer=[];_groupDepth=0;Console=Console;constructor(){super({write:t=>(e.write(this._buffer,"log",t),!0)});}static write(t,n,r,o=2){let i=new hA(void 0,e.write).stack;if(!i)return t;let a=i.split(`
|
|
160
|
+
`,sA(c,t));}}catch(u){r={error:u};}finally{try{s&&!s.done&&(o=a.return)&&o.call(a);}finally{if(r)throw r.error}}return i},e}();var lF=function(){function e(t){this._backingStorages=t;}return e.prototype.record=function(t,n,r,o){this._backingStorages.forEach(function(i){i.record(t,n,r,o);});},e}();xt();xt();var cF=function(){function e(t,n){this._instrumentName=t,this._valueType=n,this._buffer=new Ko;}return e.prototype.observe=function(t,n){if(n===void 0&&(n={}),typeof t!="number"){ce.warn("non-number value provided to metric "+this._instrumentName+": "+t);return}this._valueType===Vr.INT&&!Number.isInteger(t)&&(ce.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||this._buffer.set(n,t);},e}();var uF=function(){function e(){this._buffer=new Map;}return e.prototype.observe=function(t,n,r){if(r===void 0&&(r={}),!!gm(t)){var o=this._buffer.get(t);if(o==null&&(o=new Ko,this._buffer.set(t,o)),typeof n!="number"){ce.warn("non-number value provided to metric "+t._descriptor.name+": "+n);return}t._descriptor.valueType===Vr.INT&&!Number.isInteger(n)&&(ce.warn("INT value type cannot accept a floating-point value for "+t._descriptor.name+", ignoring the fractional digits."),n=Math.trunc(n),!Number.isInteger(n))||o.set(r,n);}},e}();var cA=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},uA=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},dF=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},pF=function(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))},mF=function(){function e(){this._callbacks=[],this._batchCallbacks=[];}return e.prototype.addCallback=function(t,n){var r=this._findCallback(t,n);r>=0||this._callbacks.push({callback:t,instrument:n});},e.prototype.removeCallback=function(t,n){var r=this._findCallback(t,n);r<0||this._callbacks.splice(r,1);},e.prototype.addBatchCallback=function(t,n){var r=new Set(n.filter(gm));if(r.size===0){ce.error("BatchObservableCallback is not associated with valid instruments",n);return}var o=this._findBatchCallback(t,r);o>=0||this._batchCallbacks.push({callback:t,instruments:r});},e.prototype.removeBatchCallback=function(t,n){var r=new Set(n.filter(gm)),o=this._findBatchCallback(t,r);o<0||this._batchCallbacks.splice(o,1);},e.prototype.observe=function(t,n){return cA(this,void 0,void 0,function(){var r,o,i,a;return uA(this,function(s){switch(s.label){case 0:return r=this._observeCallbacks(t,n),o=this._observeBatchCallbacks(t,n),[4,d0(pF(pF([],dF(r),!1),dF(o),!1))];case 1:return i=s.sent(),a=i.filter(p0).map(function(l){return l.reason}),[2,a]}})})},e.prototype._observeCallbacks=function(t,n){var r=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return cA(r,void 0,void 0,function(){var s,l;return uA(this,function(c){switch(c.label){case 0:return s=new cF(a._descriptor.name,a._descriptor.valueType),l=Promise.resolve(i(s)),n!=null&&(l=Ka(l,n)),[4,l];case 1:return c.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,t);}),[2]}})})})},e.prototype._observeBatchCallbacks=function(t,n){var r=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return cA(r,void 0,void 0,function(){var s,l;return uA(this,function(c){switch(c.label){case 0:return s=new uF,l=Promise.resolve(i(s)),n!=null&&(l=Ka(l,n)),[4,l];case 1:return c.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(p){p.record(d,t);});}),[2]}})})})},e.prototype._findCallback=function(t,n){return this._callbacks.findIndex(function(r){return r.callback===t&&r.instrument===n})},e.prototype._findBatchCallback=function(t,n){return this._batchCallbacks.findIndex(function(r){return r.callback===t&&m0(r.instruments,n)})},e}();var q9=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t;}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),fF=function(e){q9(t,e);function t(n,r,o,i,a){var s=e.call(this,n)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new bS(r,s._aggregationCardinalityLimit),s._temporalMetricStorage=new vS(r,i),s}return t.prototype.record=function(n,r,o,i){r=this._attributesProcessor.process(r,o),this._deltaMetricStorage.record(n,r,o,i);},t.prototype.collect=function(n,r){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(n,this._instrumentDescriptor,o,r)},t}(ES);var hF=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o;}||function(r,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(r[i]=o[i]);},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t;}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r);}}(),wu=function(){function e(){}return e.Noop=function(){return Y9},e}();var K9=function(e){hF(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.process=function(n,r){return n},t}(wu);var gF=function(e){hF(t,e);function t(n){var r=e.call(this)||this;return r._allowedAttributeNames=n,r}return t.prototype.process=function(n,r){var o=this,i={};return Object.keys(n).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=n[a]}),i},t}(wu);var Y9=new K9;var X9=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},J9=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},Z9=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},SF=function(){function e(t,n){this._meterProviderSharedState=t,this._instrumentationScope=n,this.metricStorageRegistry=new sF,this.observableRegistry=new mF,this.meter=new rF(this);}return e.prototype.registerMetricStorage=function(t){var n=this._registerMetricStorage(t,fF);return n.length===1?n[0]:new lF(n)},e.prototype.registerAsyncMetricStorage=function(t){var n=this._registerMetricStorage(t,aF);return n},e.prototype.collect=function(t,n,r){return X9(this,void 0,void 0,function(){var o,i,a;return J9(this,function(s){switch(s.label){case 0:return [4,this.observableRegistry.observe(n,r?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(t),i.length===0?[2,null]:(a=i.map(function(l){return l.collect(t,n)}).filter(c0),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},e.prototype._registerMetricStorage=function(t,n){var r=this,o=this._meterProviderSharedState.viewRegistry.findViews(t,this._instrumentationScope),i=o.map(function(l){var c=g0(l,t),u=r.metricStorageRegistry.findOrUpdateCompatibleStorage(c);if(u!=null)return u;var d=l.aggregation.createAggregator(c),p=new n(c,d,l.attributesProcessor,r._meterProviderSharedState.metricCollectors,l.aggregationCardinalityLimit);return r.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(t.type),s=a.map(function(l){var c=Z9(l,2),u=c[0],d=c[1],p=r.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,t);if(p!=null)return p;var m=d.createAggregator(t),f=u.selectCardinalityLimit(t.type),h=new n(t,m,wu.Noop(),[u],f);return r.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s);}return i},e}();var Q9=function(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return {next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},yF=function(){function e(t){this.resource=t,this.viewRegistry=new Y0,this.metricCollectors=[],this.meterSharedStates=new Map;}return e.prototype.getMeterSharedState=function(t){var n=u0(t),r=this.meterSharedStates.get(n);return r==null&&(r=new SF(this,t),this.meterSharedStates.set(n,r)),r},e.prototype.selectAggregations=function(t){var n,r,o=[];try{for(var i=Q9(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(t)]);}}catch(l){n={error:l};}finally{try{a&&!a.done&&(r=i.return)&&r.call(i);}finally{if(n)throw n.error}}return o},e}();var CS=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},AS=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},e7=function(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(!n)return e;var r=n.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=r.next()).done;)i.push(o.value);}catch(s){a={error:s};}finally{try{o&&!o.done&&(n=r.return)&&n.call(r);}finally{if(a)throw a.error}}return i},t7=function(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r<o;r++)(i||!(r in t))&&(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))},TF=function(){function e(t,n){this._sharedState=t,this._metricReader=n;}return e.prototype.collect=function(t){return CS(this,void 0,void 0,function(){var n,r,o,i,a=this;return AS(this,function(s){switch(s.label){case 0:return n=hl(Date.now()),r=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(l){return CS(a,void 0,void 0,function(){var c;return AS(this,function(u){switch(u.label){case 0:return [4,l.collect(this,n,t)];case 1:return c=u.sent(),c?.scopeMetrics!=null&&r.push(c.scopeMetrics),c?.errors!=null&&o.push.apply(o,t7([],e7(c.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:r},errors:o}]}})})},e.prototype.forceFlush=function(t){return CS(this,void 0,void 0,function(){return AS(this,function(n){switch(n.label){case 0:return [4,this._metricReader.forceFlush(t)];case 1:return n.sent(),[2]}})})},e.prototype.shutdown=function(t){return CS(this,void 0,void 0,function(){return AS(this,function(n){switch(n.label){case 0:return [4,this._metricReader.shutdown(t)];case 1:return n.sent(),[2]}})})},e.prototype.selectAggregationTemporality=function(t){return this._metricReader.selectAggregationTemporality(t)},e.prototype.selectAggregation=function(t){return this._metricReader.selectAggregation(t)},e.prototype.selectCardinalityLimit=function(t){var n,r,o;return (o=(r=(n=this._metricReader).selectCardinalityLimit)===null||r===void 0?void 0:r.call(n,t))!==null&&o!==void 0?o:2e3},e}();var EF=function(e,t,n,r){function o(i){return i instanceof n?i:new n(function(a){a(i);})}return new(n||(n=Promise))(function(i,a){function s(u){try{c(r.next(u));}catch(d){a(d);}}function l(u){try{c(r.throw(u));}catch(d){a(d);}}function c(u){u.done?i(u.value):o(u.value).then(s,l);}c((r=r.apply(e,t||[])).next());})},bF=function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(c){return function(u){return l([c,u])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;n;)try{if(r=1,o&&(i=c[0]&2?o.return:c[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,c[1])).done)return i;switch(o=0,i&&(c=[c[0]&2,i.value]),c[0]){case 0:case 1:i=c;break;case 4:return n.label++,{value:c[1],done:!1};case 5:n.label++,o=c[1],c=[0];continue;case 7:c=n.ops.pop(),n.trys.pop();continue;default:if(i=n.trys,!(i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1],i=c;break}if(i&&n.label<i[2]){n.label=i[2],n.ops.push(c);break}i[2]&&n.ops.pop(),n.trys.pop();continue}c=t.call(e,n);}catch(u){c=[6,u],o=0;}finally{r=i=0;}if(c[0]&5)throw c[1];return {value:c[0]?c[1]:void 0,done:!0}}},vF=function(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return {next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};function n7(e,t){var n=t??SS.empty();return e?SS.default().merge(n):n}var dA=function(){function e(t){var n,r,o,i,a;if(this._shutdown=!1,this._sharedState=new yF(n7((a=t?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,t?.resource)),t?.views!=null&&t.views.length>0)try{for(var s=vF(t.views),l=s.next();!l.done;l=s.next()){var c=l.value;this._sharedState.viewRegistry.addView(c);}}catch(m){n={error:m};}finally{try{l&&!l.done&&(r=s.return)&&r.call(s);}finally{if(n)throw n.error}}if(t?.readers!=null&&t.readers.length>0)try{for(var u=vF(t.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p);}}catch(m){o={error:m};}finally{try{d&&!d.done&&(i=u.return)&&i.call(u);}finally{if(o)throw o.error}}}return e.prototype.getMeter=function(t,n,r){return n===void 0&&(n=""),r===void 0&&(r={}),this._shutdown?(ce.warn("A shutdown MeterProvider cannot provide a Meter"),gC()):this._sharedState.getMeterSharedState({name:t,version:n,schemaUrl:r.schemaUrl}).meter},e.prototype.addMetricReader=function(t){var n=new TF(this._sharedState,t);t.setMetricProducer(n),this._sharedState.metricCollectors.push(n);},e.prototype.shutdown=function(t){return EF(this,void 0,void 0,function(){return bF(this,function(n){switch(n.label){case 0:return this._shutdown?(ce.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(r){return r.shutdown(t)}))]);case 1:return n.sent(),[2]}})})},e.prototype.forceFlush=function(t){return EF(this,void 0,void 0,function(){return bF(this,function(n){switch(n.label){case 0:return this._shutdown?(ce.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(r){return r.forceFlush(t)}))];case 1:return n.sent(),[2]}})})},e}();var r7=/[\^$\\.+?()[\]{}|]/g,RS=function(){function e(t){t==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(e.escapePattern(t)));}return e.prototype.match=function(t){return this._matchAll?!0:this._regexp.test(t)},e.escapePattern=function(t){return "^"+t.replace(r7,"\\$&").replace("*",".*")+"$"},e.hasWildcard=function(t){return t.includes("*")},e}();var xu=function(){function e(t){this._matchAll=t===void 0,this._pattern=t;}return e.prototype.match=function(t){return !!(this._matchAll||t===this._pattern)},e}();var CF=function(){function e(t){var n;this._nameFilter=new RS((n=t?.name)!==null&&n!==void 0?n:"*"),this._type=t?.type,this._unitFilter=new xu(t?.unit);}return e.prototype.getType=function(){return this._type},e.prototype.getNameFilter=function(){return this._nameFilter},e.prototype.getUnitFilter=function(){return this._unitFilter},e}();var AF=function(){function e(t){this._nameFilter=new xu(t?.name),this._versionFilter=new xu(t?.version),this._schemaUrlFilter=new xu(t?.schemaUrl);}return e.prototype.getNameFilter=function(){return this._nameFilter},e.prototype.getVersionFilter=function(){return this._versionFilter},e.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},e}();function o7(e){return e.instrumentName==null&&e.instrumentType==null&&e.instrumentUnit==null&&e.meterName==null&&e.meterVersion==null&&e.meterSchemaUrl==null}var Sm=function(){function e(t){var n;if(o7(t))throw new Error("Cannot create view with no selector arguments supplied");if(t.name!=null&&(t?.instrumentName==null||RS.hasWildcard(t.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");t.attributeKeys!=null?this.attributesProcessor=new gF(t.attributeKeys):this.attributesProcessor=wu.Noop(),this.name=t.name,this.description=t.description,this.aggregation=(n=t.aggregation)!==null&&n!==void 0?n:bo.Default(),this.instrumentSelector=new CF({name:t.instrumentName,type:t.instrumentType,unit:t.instrumentUnit}),this.meterSelector=new AF({name:t.meterName,version:t.meterVersion,schemaUrl:t.meterSchemaUrl}),this.aggregationCardinalityLimit=t.aggregationCardinalityLimit;}return e}();xt();function a7(){return new a0({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:ml.DELTA})}var s7=[new Sm({instrumentName:"test_event_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Sm({instrumentName:"test_step_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)}),new Sm({instrumentName:"test_mobile_step_duration",instrumentType:qe.HISTOGRAM,aggregation:new Ru([100,500,1e3,2e3,3e3,4e3,5e3,7500,1e4,15e3,2e4],!1)})],wS=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(t){let n=this.counterCache.get(t);if(n)return n;let r=this.meter.createCounter(t);return this.counterCache.set(t,r),r}getHistogram(t){let n=this.histogramCache.get(t);if(n)return n;let r=this.meter.createHistogram(t);return this.histogramCache.set(t,r),r}ensureObservableGauge(t){let n=this.observableGaugeCache.get(t);if(n)return n;let r=this.meter.createObservableGauge(t);return r.addCallback(o=>{let i=this.gaugeValues.get(t);i!==void 0&&o.observe(i,this.globalAttributes);}),this.observableGaugeCache.set(t,r),r}constructor(t){this.globalAttributes={...t.globalAttributes??{}};let n=typeof process<"u"?"production":"unknown",r=new NC({[$g]:t.serviceName,[nk]:n,[ok]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:v4$1()}),o=a7(),i=new oA({exporter:o,exportIntervalMillis:t.exportIntervalMs??6e4});this.provider=new dA({resource:r,readers:[i],views:s7}),Vg.setGlobalMeterProvider(this.provider),this.meter=Vg.getMeter("momentic-serverless");}increment(t,n,r){try{let o=lC(r,this.globalAttributes);this.getCounter(t).add(typeof n=="number"?n:1,o);}catch{}}gauge(t,n){try{this.ensureObservableGauge(t),this.gaugeValues.set(t,n);}catch{}}distribution(t,n,r){try{let o=lC(r,this.globalAttributes);this.getHistogram(t).record(n,o);}catch{}}async flush(){try{await this.provider.forceFlush();}catch{}}async recordDuration({fn:t,name:n,tags:r}){let o=Date.now();try{return await Promise.resolve(t())}finally{this.distribution(n,Date.now()-o,r);}}};var $t=new Ug;function RF(e){e.disabled||($t=new wS(e));}var pA;function wF(e){pA=e;}function Ja(e){e instanceof Hn||pA&&pA(e);}var mA=!1;try{let e=await import('@sentry/node');e.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",dist:"production",release:"cli-2.104.3",tracesSampleRate:0,sendDefaultPii:!0}),wF(e.captureException),mA=!0;}catch{}function xF(e){try{return existsSync(e)&&statSync(e).isDirectory()}catch(t){return C.error({err:t},`Error reading path ${e} during directory existence check`),!1}}var g7=!1,_F=(()=>{try{return statSync("/.dockerenv"),!0}catch{return !1}})();async function On(e){return ll||g7||_F?!0:(await C.flush(),await new Promise(n=>setTimeout(n,100)),await confirm({message:e}))}async function fA(e){let t=dirname(e);return xF(t)?existsSync(e)?On(`File '${IF(e)}' already exists. Overwrite existing content?`):!0:await On(`Directory '${IF(t)}' doesn't exist. Create it now?`)?(mkdirSync(t,{recursive:!0}),!0):!1}function IF(e){return e.replace(/(\s+)/g,"\\$1")}async function PF(e,t){return ll||_F?t:(await input({message:e,default:t})).trim()||t}var hA=class extends Error{constructor(t,n,r){let o=Error.stackTraceLimit;r&&(Error.stackTraceLimit=Math.max(r,o||10)),super(t),Error.captureStackTrace&&Error.captureStackTrace(this,n),Error.stackTraceLimit=o;}},xS=class e extends Console{_buffer=[];_groupDepth=0;Console=Console;constructor(){super({write:t=>(e.write(this._buffer,"log",t),!0)});}static write(t,n,r,o=2){let i=new hA(void 0,e.write).stack;if(!i)return t;let a=i.split(`
|
|
161
161
|
`).slice(o).filter(Boolean).join(`
|
|
162
162
|
`);return t.push({message:r,origin:a,type:n}),t}_log(t,n){e.write(this._buffer,t," ".repeat(this._groupDepth)+n,3);}debug(t,...n){this._log("debug",format(t,...n));}error(t,...n){this._log("error",format(t,...n));}info(t,...n){this._log("info",format(t,...n));}log(t,...n){this._log("log",format(t,...n));}warn(t,...n){this._log("warn",format(t,...n));}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function OF(e){let t=globalThis.console,n=new xS;globalThis.console=n;try{e();}finally{let o=n.getBuffer()?.map(i=>i.message).join(`
|
|
163
163
|
`);process.stderr.write(`${o}
|
|
164
164
|
`),globalThis.console=t;}}var Dt=" ".repeat(6);function LF(e,t="",n=!1){let r=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(r-t.length,20),i=e.split(`
|
|
165
165
|
`),a=[];for(let s of i)if(n){let l=s;for(;l.length>o;){let u=l.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(t+l.slice(0,d)),l=l.slice(d).trimStart();}a.push(t+l);}else {let l=s.split(" "),c="";for(let u of l){if(!c.length){c=u;continue}let d=`${c} ${u}`;d.length<=o?c=d:(a.push(t+c),c=u);}a.push(t+c);}return a.join(`
|
|
166
|
-
`)}var re=du({app:"cli",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:"2.104.
|
|
166
|
+
`)}var re=du({app:"cli",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:"2.104.3"});var T7=5;async function IS({getResults:e,checkDone:t,name:n,timeoutMs:r=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let a;i>T7&&(C.error(`Failed to fetch ${n} status too many times.`),process.exit(1));try{a=await e(),i=0;}catch(c){i++,re.warn({err:c},"Failed to fetch run status, retrying..."),C.warn({err:c},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(t(a))return a;let l=Math.max(1e4,Math.floor(r/100));await new Promise(c=>setTimeout(c,l));}C.error(`Timeout elapsed waiting for ${n} to complete (${Math.floor(r/1e3)}s).`),process.exit(1);}function Iu({results:e,startTime:t,entity:n,getDisplayLine:r,onFailed:o}){let i=e.filter(u=>u.status==="PASSED"&&u.quarantined),a=e.filter(u=>u.status==="PASSED"&&!u.quarantined),s=e.filter(u=>u.status==="FAILED"&&u.quarantined),l=e.filter(u=>u.status==="FAILED"&&!u.quarantined),c=e.filter(u=>u.status==="CANCELLED");return OF(()=>{if(l.forEach(u=>{C.log(""),o(u);}),l.length){C.log("");let u=l.length===1?"":"s";C.error(`${l.length} ${n}${u} failed:`),l.forEach(d=>{C.dimmed(r(d));});}if(c.length){C.log("");let u=c.length===1?"":"s";C.warn(`${c.length} ${n}${u} cancelled:`),c.forEach(d=>{C.dimmed(r(d));});}if(a.length){C.log("");let u=a.length===1?"":"s";C.success(`${a.length} ${n}${u} passed:`),a.forEach(d=>{C.dimmed(r(d));});}if(s.length){C.log("");let u=s.length===1?"":"s";C.warn(`${s.length} quarantined ${n}${u} failed:`),s.forEach(d=>{C.dimmed(r(d));});}if(i.length){C.log("");let u=i.length===1?"":"s";C.warn(`${i.length} quarantined ${n}${u} passed:`),i.forEach(d=>{C.dimmed(r(d));});}C.log(""),C.dimmed(`Total time: ${Math.round((Date.now()-t)/1e3)}s`);}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:l.length,cancelled:c.length}}var _S=(e,t)=>{if(!e.failureDetails||!e.failureReason)return;let n=Da({failureReason:e.failureReason,classification:e.failureDetails.classification,manualClassification:e.failureDetails.manualClassification}),r=n.title??e.failureReason,o=n.description??n.title??e.failureReason,i=e.failureDetails.classification?.rootCause;if(C.error(t),i){C.log(`${Dt}- Error type: ${Ai.dim(r)}`);let a="- Root cause analysis:",s=LF(`${a} ${i}`,`${Dt} `,!1),l=s.indexOf(":");C.log(`${Dt}${a} ${Ai.dim(s.slice(l+1))}`);}else C.log(`${Dt}Reason: ${Ai.red(r)}`),C.log(`${Dt}Description: ${Ai.red(o)}`);},Em=({status:e,testLogRef:t,getRunningTestsCount:n,getTotalTestsCount:r,additionalText:o})=>{e=e.toUpperCase();let i=e,a;e.includes("FAIL")?(i=Ai.bgRgb(139,0,0).white("FAIL"),a=3):e.includes("PASS")?(i=Ai.bgGreen.white("PASS"),a=3):e.includes("START")?(i=Ai.bgBlue.white("START"),a=2):e.includes("CANCEL")?(i=Ai.bgRgb(191,68,11).white("CANCEL"),a=1):e.includes("RETRY")?(i=Ai.bgRgb(255,140,0).white("RETRY"),a=2):e.includes("RUN")||e.includes("PROG")?(i=Ai.bgMagenta.white("RUNNING"),a=0):(C.warn(`Unknown status tried to be logged in run test locally: ${e}`),a=0),supportsColor||(i=`${i}`),C.log(`${i}${" ".repeat(a)} ${t} ${o?`${o} `:""}(${n()}/${r()})`);};var DF=An__default.join(tmpdir(),"momenticBrowserInstallation");var PS=["chrome","chromium","chrome-for-testing","ffmpeg"],SA=[...PS.filter(e=>e!=="ffmpeg")],R7={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"};function kF(e){switch(e){case"chromium":return "Chromium";case"chrome":return "Google Chrome";case"chrome-for-testing":return "Chrome for Testing";case"ffmpeg":throw new Error(`Unknown browser: ${e}`);default:return (n=>{throw new Error("Unknown browser")})()}}var FF={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function MS(e){if(e==="Org Default")return !1;let t=FF[R7[e]??""]??"",n=registry.findExecutable(t);return !n||n.installType==="none"?!1:yA(n)}function yA(e){let t=e.executablePath();return yn__default.existsSync(t)}function w7(e,t){let n=FF[e];if(!n)throw new Error(`Requested install of unknown browser type ${e}`);let r=registry.findExecutable(n);if(!r||r.installType==="none")throw new Error(`Requested install of unknown browser type ${e}`);if(!(!t&&yA(r)))return r}async function x7({browser:e,force:t}){let n=w7(e,t);if(!n){C.info(`Browser '${e}' is already installed, skipping...`);return}C.info(`Installing browser '${e}'...`);try{await registry.installDeps([n],!1),await registry.install([n],!1);}catch(r){if(r.message.includes("Lock file is already being held")){C.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=registry.findExecutable(e),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!yA(o);)C.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3));}else throw r}}async function I7(){if(platform()==="win32"){C.info("Installing Windows dependencies for Playwright...");try{await program.parseAsync(["","","install","winldd"]);}catch(e){C.warn(`Failed to install Windows dependencies: ${e}. Continuing with browser installation...`);}}}async function UF({rawBrowsers:e,force:t=!1,all:n=!1}){await I7();let r=n?PS:Array.from(new Set(e));try{await NF.lock(DF,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}});}catch(i){C.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of r)try{await x7({browser:i,force:t});}catch(a){o=a,C.error(`Failed to install the ${i} browser: ${a}`);}}finally{await NF.unlock(DF,{realpath:!1});}if(o)throw o}async function OS(e,t,n=30){for(let r=0;r<n;r+=1){let o=e+r;if(await P7(o))return o}C.error(`Could not find an available port for ${t} starting from ${e} after ${n} attempts`),process.exit(1);}async function P7(e){return new Promise((t,n)=>{let r=createServer();r.once("error",o=>{o.code==="EADDRINUSE"?t(!1):(C.warn({err:o},"Unexpected error checking for open ports, continuing..."),r.close(),t(!0));}),r.once("listening",()=>{r.close(()=>{t(!0);});}),r.listen(e);})}function BF(e){L7(e),N7();}function L7(e){M7((t,n)=>{console.warn(`Detected the NodeJS event loop was blocked for ${t.toFixed(0)}ms. This can cause the CLI to hang.`);let r=n.join(`
|
|
167
167
|
`);console.warn(r),e.warn({stack:r,time:t},"NodeJS event loop blocked");},{threshold:1e3,trimFalsePositives:!0});}function N7(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let e=process._getActiveHandles();console.log("Active handles:",e.map(t=>t.constructor?.name));}O7(),setImmediate(()=>{setTimeout(()=>{process.exit(1);},2e3).unref();});});}function zF(e){let t=e?.shardIndex??1,n=e?.shardCount??1;if(t<1)throw new Error("Shard index must be greater than 0.");if(n<1)throw new Error("Shard count must be greater than 0.");if(t>n)throw new Error("Shard index cannot be greater than shard count")}function D7(e,t,n,r){if(n>e.length&&(C.warn(`Shard count ${n} is greater than the number of tests ${e.length}! Some workers won't have any tests to run.`),n=Math.max(n,e.length),t>n))return [];let o=Math.floor((t-1)*(e.length/n)),i=Math.floor(t*(e.length/n));return (r?[...e].sort((s,l)=>r(s).localeCompare(r(l))):[...e].sort()).filter((s,l)=>l>=o&&l<i)}function VF(e){let{items:t,shardIndex:n,shardCount:r,sortKey:o}=e;return r>1?D7(t,n,r,o):t}function k7({regenerateCache:e,alwaysSaveCache:t,noCache:n}){if(n){if(e)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(t)throw new Error("--disable-cache and --save-cache cannot be used together.")}}function vm({disableCache:e,saveCache:t,regenerateCache:n,bustOldestCachePercentage:r}){let o={regenerateCache:n??!1,alwaysSaveCache:t??!1,noCache:e??!1,bustOldestCachePercentage:r};return k7(o),o}function LS(e,t,n){return e instanceof Ic?(e.zodIssues.forEach(r=>{n.push({file:t,stepIndex:typeof r.path[0]=="number"?r.path[0]:void 0,field:r.path.slice(1).join(".")||r.path.join("."),issue:r.message});}),!0):!1}function Cm({parsingErrors:e,parsingErrorDetails:t,failedTestFilePaths:n,failedModuleFilePaths:r}){if(C.error(`
|
|
168
168
|
Found ${e} file(s) with validation errors that must be fixed manually:
|
|
169
169
|
`),t.length>0){let o=new Map;t.forEach(i=>{let a=o.get(i.file)||[];a.push(i),o.set(i.file,a);}),o.forEach((i,a)=>{C.error(` ${a}`),i.forEach(({stepIndex:s,field:l,issue:c})=>{let u=s!==void 0?`Step ${s}`:"File",d=l?`, field "${l}"`:"";C.error(` ${u}${d}:`),C.error(` \u2192 ${c}`);});});}else n.size>0&&C.error(`Failed test files:
|
|
@@ -199,7 +199,7 @@ ${r}`}function iy(e,t={}){let{includeCache:n=!0}=t,r=cloneDeep(e);return xr({ste
|
|
|
199
199
|
`),testStats:s,testDebugTrace:l,moduleRestoreResults:c}}function wB({entries:e,orgId:t,testId:n,logger:r}){let o=new Map,i;for(let a of e)if(a.entity_type==="test")i=nC.parse({orgId:t,entityType:"TEST",entityId:n,stepLists:oa.parse(JSON.parse(a.value))});else if(a.entity_type==="module"){let s=Vp({entityType:"module",entityId:""});if(!a.cache_key.startsWith(s))throw new Error(`Unexpected module snapshot cache key ${a.cache_key}.`);let l=a.cache_key.slice(s.length),c=Uee.parse(JSON.parse(a.value));o.set(l,rC.parse({orgId:t,entityType:"MODULE",entityId:l,steps:c.steps}));}else r.warn({entityType:a.entity_type,cacheKey:a.cache_key},"Unknown step identity snapshot entity type");return {testSnapshot:i,moduleSnapshots:o}}function Fee(e){let t=[];for(let n of [e.steps,e.beforeSteps??[],e.afterSteps??[]])xr({steps:n,onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:r=>{r.type==="RESOLVED_MODULE"&&t.push(r);}});return t}var Uee=z.object({steps:nt.array()});var Bee=new Set(["AI_ACTION","SECTION"]);function xB({stepTypeByStepMatchKeyV2:e,stepMatchersV2:t}){let n=Object.values(ft).filter(r=>Bee.has(r)?!1:!t.some(o=>e[o.matchKey]===r));if(n.length>0)throw new Error(`Missing v2 matcher coverage for step type(s): ${n.join(", ")}`)}var zee=new Set(["SUCCESS","ELEMENT_CHECK"]),Vee=new Set(["AI_ASSERTION","PAGE_CHECK","WAIT_FOR_URL"]);function IB({commandMatchersV2:e}){let t=(a,s)=>{if(a.length!==0)throw new Error(`${s}: ${a.join(", ")}`)},n=e.map(a=>a.matchKey).filter((a,s,l)=>l.indexOf(a)!==s);t(n,"Duplicate command matcher key(s)");let r=e.map(a=>a.commandType).filter((a,s,l)=>!Vee.has(a)&&l.indexOf(a)!==s);t(r,"Duplicate command matcher type(s)");let o=new Set(e.map(a=>a.commandType)),i=Object.values(Ut).filter(a=>!zee.has(a)&&!o.has(a));t(i,"Missing v2 matcher coverage for command type(s)");}function vo(e){return typeof e=="string"?{type:"description",elementDescriptor:e}:{type:"coordinates",pixels:{x:e.x,y:e.y}}}function Ln(e){if(e!==void 0)return Math.max(0,Math.ceil(e/1e3))}function _B({selectorValue:e}){return typeof e=="number"?{type:"INDEX",index:String(e)}:"index"in e?{type:"INDEX",index:String(e.index)}:"regex"in e?{type:"REGEX",pattern:e.regex}:{type:"SUBSTRING",substring:e.substring}}function PB({selectorType:e,selectorValue:t}){switch(e?.toLowerCase()){case"current":return {type:"CURRENT"};case"index":return {type:"INDEX",index:String(t)};case"regex":return {type:"REGEX",pattern:String(t)};case"substring":return {type:"SUBSTRING",substring:String(t)};default:return {type:"CURRENT"}}}function Rl(e){if(e!=null)return vo(e)}function Ee(e){return {matchKey:e.matchKey,commandType:e.commandType,toCommand:({step:t,commandId:n})=>{if(!FB(t,e.matchKey))throw new Error(`Cannot convert step without '${e.matchKey}' using this matcher.`);return e.toCommand({step:t,commandId:n??v4$1()})}}}function $r(e){return {useSelector:e.useSelector,force:e.force,disableCache:e.disableCache,iframeUrl:e.iframe??e.iframeUrl}}function jA(e){return {...$r(e),relativePosition:e.pos}}var wl=[Ee({matchKey:"click",commandType:"CLICK",toCommand:({step:e,commandId:t})=>({id:t,type:"CLICK",target:vo(e.click),...jA(e),doubleClick:e.doubleClick,rightClick:e.rightClick,waitForDownload:e.waitForDownload,delayMs:e.delay,downloadTimeoutMs:e.downloadTimeout})}),Ee({matchKey:"switchTab",commandType:"TAB",toCommand:({step:e,commandId:t})=>({id:t,type:"TAB",action:_B({selectorValue:e.switchTab}),loadTimeout:Ln(e.timeout)})}),Ee({matchKey:"type",commandType:"TYPE",toCommand:({step:e,commandId:t})=>{let n=e.clear,r,o;return n===!1||n==="never"?(r=!1,o=!1):n===!0||n==="always"?(r=!0,o=!0):n==="inputs"&&(r=!0),{id:t,type:"TYPE",...jA(e),target:Rl(e.target),value:e.type,clearContent:r,forceClearContent:o,pressEnter:e.pressEnter,delay:e.delay}}}),Ee({matchKey:"select",commandType:"SELECT_OPTION",toCommand:({step:e,commandId:t})=>{let{select:n}=e,r;if(n.value!==void 0)r={type:"VALUE",value:n.value};else if(n.label!==void 0)r={type:"LABEL",label:n.label};else if(n.index!==void 0)r={type:"INDEX",index:String(n.index)};else throw new Error("select requires exactly one of label, value, or index");return {id:t,type:"SELECT_OPTION",...$r(e),target:vo(n.from),choice:r}}}),Ee({matchKey:"hover",commandType:"HOVER",toCommand:({step:e,commandId:t})=>({id:t,type:"HOVER",...jA(e),target:vo(e.hover)})}),Ee({matchKey:"blur",commandType:"BLUR",toCommand:({step:e,commandId:t})=>({id:t,type:"BLUR",...$r(e),target:vo(e.blur)})}),Ee({matchKey:"focus",commandType:"FOCUS",toCommand:({step:e,commandId:t})=>({id:t,type:"FOCUS",...$r(e),target:vo(e.focus)})}),Ee({matchKey:"dragAndDrop",commandType:"DRAG",toCommand:({step:e,commandId:t})=>{let n;return e.dragAndDrop.hover!==void 0&&(n=e.dragAndDrop.hover/1e3),{id:t,type:"DRAG",...$r(e),fromTarget:vo(e.dragAndDrop.from),toTarget:vo(e.dragAndDrop.to),steps:e.dragAndDrop.steps??e.dragAndDrop.movements,hoverSeconds:n}}}),Ee({matchKey:"mouseDrag",commandType:"MOUSE_DRAG",toCommand:({step:e,commandId:t})=>({id:t,type:"MOUSE_DRAG",...$r(e),target:Rl(e.mouseDrag.container),deltaX:`${e.mouseDrag.deltaX??0}`,deltaY:`${e.mouseDrag.deltaY??0}`,steps:e.mouseDrag.movements})}),Ee({matchKey:"press",commandType:"PRESS",toCommand:({step:e,commandId:t})=>({id:t,type:"PRESS",value:e.press,repeat:e.repeat,delayMs:e.delay,convertMeta:e.convertMeta})}),Ee({matchKey:"keyDown",commandType:"KEY_DOWN",toCommand:({step:e,commandId:t})=>({id:t,type:"KEY_DOWN",value:e.keyDown,convertMeta:e.convertMeta})}),Ee({matchKey:"keyUp",commandType:"KEY_UP",toCommand:({step:e,commandId:t})=>({id:t,type:"KEY_UP",value:e.keyUp,convertMeta:e.convertMeta})}),Ee({matchKey:"navigate",commandType:"NAVIGATE",toCommand:({step:e,commandId:t})=>({id:t,type:"NAVIGATE",url:e.navigate,loadTimeout:Ln(e.timeout)})}),Ee({matchKey:"newTab",commandType:"NEW_TAB",toCommand:({step:e,commandId:t})=>({id:t,type:"NEW_TAB",url:e.newTab,loadTimeout:Ln(e.timeout)})}),Ee({matchKey:"closeTab",commandType:"CLOSE_TAB",toCommand:({step:e,commandId:t})=>({id:t,type:"CLOSE_TAB",action:PB({selectorType:e.type,selectorValue:e.closeTab}),loadTimeout:Ln(e.timeout??e.timeoutMs)})}),Ee({matchKey:"goBack",commandType:"GO_BACK",toCommand:({commandId:e})=>({id:e,type:"GO_BACK"})}),Ee({matchKey:"goForward",commandType:"GO_FORWARD",toCommand:({commandId:e})=>({id:e,type:"GO_FORWARD"})}),Ee({matchKey:"refresh",commandType:"REFRESH",toCommand:({commandId:e})=>({id:e,type:"REFRESH"})}),Ee({matchKey:"scrollUp",commandType:"SCROLL_UP",toCommand:({step:e,commandId:t})=>({id:t,type:"SCROLL_UP",...$r(e),target:Rl(e.container),deltaY:e.scrollUp})}),Ee({matchKey:"scrollDown",commandType:"SCROLL_DOWN",toCommand:({step:e,commandId:t})=>({id:t,type:"SCROLL_DOWN",...$r(e),target:Rl(e.container),deltaY:e.scrollDown})}),Ee({matchKey:"scrollLeft",commandType:"SCROLL_LEFT",toCommand:({step:e,commandId:t})=>({id:t,type:"SCROLL_LEFT",...$r(e),target:Rl(e.container),deltaX:e.scrollLeft})}),Ee({matchKey:"scrollRight",commandType:"SCROLL_RIGHT",toCommand:({step:e,commandId:t})=>({id:t,type:"SCROLL_RIGHT",...$r(e),target:Rl(e.container),deltaX:e.scrollRight})}),Ee({matchKey:"wait",commandType:"WAIT",toCommand:({step:e,commandId:t})=>({id:t,type:"WAIT",delay:Ln(e.wait)??0})}),Ee({matchKey:"check",commandType:"AI_ASSERTION",toCommand:({step:e,commandId:t})=>({id:t,type:"AI_ASSERTION",assertion:e.check,disableCache:e.disableCache,iframeUrl:e.iframe??e.iframeUrl,source:e.source,timeout:Ln(e.timeout)})}),Ee({matchKey:"checkVisual",commandType:"AI_ASSERTION",toCommand:({step:e,commandId:t})=>({id:t,type:"AI_ASSERTION",assertion:e.checkVisual,disableCache:e.disableCache,iframeUrl:e.iframe??e.iframeUrl,contextChoice:"VISION_ONLY",source:e.source,timeout:Ln(e.timeout)})}),Ee({matchKey:"checkPageContains",commandType:"PAGE_CHECK",toCommand:({step:e,commandId:t})=>({id:t,type:"PAGE_CHECK",iframeUrl:e.iframe??e.iframeUrl,timeout:Ln(e.timeout),assertion:{type:"CONTENT",value:e.checkPageContains}})}),Ee({matchKey:"checkPageDoesNotContain",commandType:"PAGE_CHECK",toCommand:({step:e,commandId:t})=>({id:t,type:"PAGE_CHECK",iframeUrl:e.iframe??e.iframeUrl,timeout:Ln(e.timeout),assertion:{type:"CONTENT",value:e.checkPageDoesNotContain,negated:!0}})}),Ee({matchKey:"extract",commandType:"AI_EXTRACT",toCommand:({step:e,commandId:t})=>({id:t,type:"AI_EXTRACT",goal:e.extract,schema:e.schema,disableCache:e.disableCache,iframeUrl:e.iframe??e.iframeUrl})}),Ee({matchKey:"cookie",commandType:"COOKIE",toCommand:({step:e,commandId:t})=>({id:t,type:"COOKIE",value:e.cookie})}),Ee({matchKey:"localStorage",commandType:"LOCAL_STORAGE",toCommand:({step:e,commandId:t})=>({id:t,type:"LOCAL_STORAGE",key:e.localStorage.key,value:e.localStorage.value})}),Ee({matchKey:"request",commandType:"REQUEST",toCommand:({step:e,commandId:t})=>({id:t,type:"REQUEST",url:e.request.url,method:e.request.method,headers:e.request.headers,params:e.request.params,body:$ee(e.request),timeout:Ln(e.request.timeout)})}),Ee({matchKey:"graphqlRequest",commandType:"GRAPHQL_REQUEST",toCommand:({step:e,commandId:t})=>({id:t,type:"GRAPHQL_REQUEST",url:e.graphqlRequest.url,query:e.graphqlRequest.query,variables:e.graphqlRequest.variables,headers:e.graphqlRequest.headers,timeout:Ln(e.graphqlRequest.timeout)})}),Ee({matchKey:"javascript",commandType:"JAVASCRIPT",toCommand:({step:e,commandId:t})=>({id:t,type:"JAVASCRIPT",code:e.javascript,environment:e.environment,fragment:e.fragment,timeout:Ln(e.timeout)})}),Ee({matchKey:"header",commandType:"SET_HEADER",toCommand:({step:e,commandId:t})=>({id:t,type:"SET_HEADER",name:e.header.name,value:e.header.value,requestMatcher:Wee(e.header)})}),Ee({matchKey:"mockRoute",commandType:"MOCK_ROUTE",toCommand:({step:e,commandId:t})=>({id:t,type:"MOCK_ROUTE",requestMatcher:$A(e.mockRoute),responseGenerator:e.mockRoute.responseGenerator,fetchOriginalResponse:e.mockRoute.fetchOriginalResponse,key:e.mockRoute.key})}),Ee({matchKey:"removeRouteMock",commandType:"REMOVE_ROUTE_MOCK",toCommand:({step:e,commandId:t})=>({id:t,type:"REMOVE_ROUTE_MOCK",key:e.removeRouteMock})}),Ee({matchKey:"waitForUrl",commandType:"WAIT_FOR_URL",toCommand:({step:e,commandId:t})=>({id:t,type:"WAIT_FOR_URL",matcher:OB(e.waitForUrl),caseInsensitive:e.caseInsensitive,negated:!1,timeout:Ln(e.timeout)})}),Ee({matchKey:"waitForUrlNotToMatch",commandType:"WAIT_FOR_URL",toCommand:({step:e,commandId:t})=>({id:t,type:"WAIT_FOR_URL",matcher:OB(e.waitForUrlNotToMatch),caseInsensitive:e.caseInsensitive,negated:!0,timeout:Ln(e.timeout)})}),Ee({matchKey:"dialog",commandType:"DIALOG",toCommand:({step:e,commandId:t})=>({id:t,type:"DIALOG",action:e.dialog})}),Ee({matchKey:"fileUpload",commandType:"FILE_UPLOAD",toCommand:({step:e,commandId:t})=>{let n=e.name??e.filename;return typeof e.fileUpload!="string"?{id:t,type:"FILE_UPLOAD",fileSource:{type:"USER_FILE",name:e.fileUpload.name},filename:n}:e.fileUpload.startsWith(Kp)?{id:t,type:"FILE_UPLOAD",fileSource:{type:"USER_FILE",name:e.fileUpload.slice(Kp.length)},filename:n}:{id:t,type:"FILE_UPLOAD",fileSource:{type:"URL",url:e.fileUpload},filename:n}}}),Ee({matchKey:"copy",commandType:"COPY",toCommand:({step:e,commandId:t})=>({id:t,type:"COPY",value:typeof e.copy=="string"?e.copy:""})}),Ee({matchKey:"paste",commandType:"PASTE",toCommand:({commandId:e})=>({id:e,type:"PASTE"})}),Ee({matchKey:"visualDiff",commandType:"VISUAL_DIFF",toCommand:({step:e,commandId:t})=>({id:t,type:"VISUAL_DIFF",...$r(e),threshold:e.threshold,target:vo(e.visualDiff),screenshot:qee(e)})}),Ee({matchKey:"captcha",commandType:"CAPTCHA",toCommand:({step:e,commandId:t})=>({id:t,type:"CAPTCHA",...$r(e)})}),Ee({matchKey:"offlineMode",commandType:"OFFLINE_MODE",toCommand:({step:e,commandId:t})=>({id:t,type:"OFFLINE_MODE",enable:e.offlineMode})}),Ee({matchKey:"registerRequestListener",commandType:"REGISTER_REQUEST_LISTENER",toCommand:({step:e,commandId:t})=>({id:t,type:"REGISTER_REQUEST_LISTENER",requestMatcher:$A(e.registerRequestListener),key:e.registerRequestListener.key})}),Ee({matchKey:"awaitListener",commandType:"AWAIT_LISTENER",toCommand:({step:e,commandId:t})=>({id:t,type:"AWAIT_LISTENER",key:e.awaitListener,timeout:Ln(e.timeout)})}),Ee({matchKey:"recordRequests",commandType:"RECORD_REQUESTS",toCommand:({step:e,commandId:t})=>({id:t,type:"RECORD_REQUESTS",requestMatcher:$A(e.recordRequests),key:e.recordRequests.key})}),Ee({matchKey:"getRecordedRequests",commandType:"GET_RECORDED_REQUESTS",toCommand:({step:e,commandId:t})=>({id:t,type:"GET_RECORDED_REQUESTS",key:e.getRecordedRequests})}),Ee({matchKey:"authLoad",commandType:"AUTH_LOAD",toCommand:({step:e,commandId:t})=>({id:t,type:"AUTH_LOAD",storageState:e.authLoad})}),Ee({matchKey:"authSave",commandType:"AUTH_SAVE",toCommand:({commandId:e})=>({id:e,type:"AUTH_SAVE"})})];IB({commandMatchersV2:wl});function NB({command:e,commandId:t}){if(!Hee(e))return;let n=il(e);if(n!==void 0)return {id:t??v4$1(),type:"ELEMENT_CHECK",...$r(e),target:jee(e[n.alias],n.alias),assertion:Gee({command:e,parsedAlias:n}),timeout:Ln(e.timeout)}}function Hee(e){return il(e)!==void 0}function Gee(e){let{command:t,parsedAlias:n}=e;switch(n.subject){case"content":return {type:"ELEMENT_CONTENT",operation:$p(n.condition),value:dy({alias:n.alias,requiresValue:n.requiresValue,value:t.value}),negated:n.negated};case"attribute":return {type:"ELEMENT_ATTRIBUTE",operation:$p(n.condition),attr:MB(t.name,n.alias),value:dy({alias:n.alias,requiresValue:n.requiresValue,value:t.value}),negated:n.negated};case"tag_name":return {type:"ELEMENT_NAME",operation:$p(n.condition),value:dy({alias:n.alias,requiresValue:n.requiresValue,value:t.value}),negated:n.negated};case"style":return {type:"ELEMENT_STYLE",operation:$p(n.condition),property:MB(t.name,n.alias),value:dy({alias:n.alias,requiresValue:n.requiresValue,value:t.value}),negated:n.negated};case"element":return {type:"ELEMENT_EXISTENCE",condition:nD(n.condition),negated:n.negated};default:return dr(n.subject)}}function jee(e,t){if(typeof e=="string")return vo(e);if(typeof e=="object"&&e!==null&&"x"in e&&typeof e.x=="number"&&"y"in e&&typeof e.y=="number")return vo({x:e.x,y:e.y});throw new Error(`Cannot deserialize element check alias '${t}' without a valid target.`)}function MB(e,t){if(e!==void 0)return e;throw new Error(`Cannot deserialize element check alias '${t}' without a name.`)}function dy({alias:e,requiresValue:t,value:n}){if(!t)return "";if(n!==void 0)return n;throw new Error(`Cannot deserialize element check alias '${e}' without a value.`)}function $ee(e){if(e.body===void 0)return;let t=e.bodyType??"json";switch(t){case"form-urlencoded":if(typeof e.body=="string")throw new Error("V2 request steps with bodyType=form-urlencoded require the body to be an object.");return {type:"form-urlencoded",content:e.body};case"json":return typeof e.body=="string"?{type:"json",content:e.body}:{type:"json",content:JSON.stringify(e.body)};default:return dr(t)}}function Wee(e){let t=DB(e);if(t)return {urlMatcher:t,method:e.method}}function DB(e){if(e.regex!==void 0)return {type:"REGEX",regex:e.regex};if(e.glob!==void 0)return {type:"GLOB",glob:e.glob};if(e.domain!==void 0)return {type:"DOMAIN",domain:e.domain};if(e.substring!==void 0)return {type:"SUBSTRING",url:e.substring}}function kB(e){let t=DB(e);if(t)return t;throw new Error("URL matcher requires one of substring, glob, regex, or domain")}function OB(e){return typeof e=="string"?{type:"SUBSTRING",url:e}:kB(e)}function $A(e){return {urlMatcher:kB(e),method:e.method}}function qee(e){if(e.screenshot!==void 0)return e.screenshot;if(!(e.screenshotUrl===void 0||e.screenshotWidth===void 0||e.screenshotHeight===void 0))return {data:e.screenshotUrl,width:e.screenshotWidth,height:e.screenshotHeight}}function FB(e,t){return t in e}function UB({command:e,commandId:t,matcher:n}){if(FB(e,n.matchKey))return n.toCommand({step:e,commandId:t})}function Vm({command:e,commandId:t}){for(let r of wl){let o=UB({command:e,commandId:t,matcher:r});if(o)return o}let n=NB({command:e,commandId:t});if(n)return n;throw new Error(`Unsupported v2 step action '${JSON.stringify(e)}' while mapping to resolved command.`)}var Kee={act:"AI_ACTION_DYNAMIC",dynamicAction:"AI_ACTION_DYNAMIC",module:"MODULE",if:"CONDITIONAL"},Yee=Object.fromEntries(wl.map(({matchKey:e})=>[e,"PRESET_ACTION"])),BB={...Yee,...Kee};function Hm(e){return {matchKey:e.matchKey,toStep:({step:t,stepId:n})=>{if(!VB(t,e.matchKey))throw new Error(`Cannot convert step without '${e.matchKey}' using this matcher.`);let r=n??v4$1();return e.toStep({step:t,stepId:r})}}}var zB=[...wl.map(({matchKey:e})=>Xee(e)),Hm({matchKey:"act",toStep:({step:e,stepId:t})=>({id:t,type:"AI_ACTION_DYNAMIC",text:e.act,version:"3",...Vu(e)})}),Hm({matchKey:"dynamicAction",toStep:({step:e,stepId:t})=>({id:t,type:"AI_ACTION_DYNAMIC",text:e.dynamicAction,version:e.version==="3"?"3":"2",...Vu(e)})}),Hm({matchKey:"module",toStep:({step:e,stepId:t})=>({id:t,type:"MODULE",moduleId:e.module,moduleName:e.name,inputs:e.inputs,...Vu(e)})}),Hm({matchKey:"if",toStep:({step:e,stepId:t})=>{let n=Vu(e),r={id:v4$1(),type:"PRESET_ACTION",...n,command:Vm({command:e.if})};return {id:t,type:"CONDITIONAL",...n,blocks:[{assertion:r,steps:e.then.map(Hu)}],elseSteps:e.else?.map(Hu)}}})];xB({stepTypeByStepMatchKeyV2:BB,stepMatchersV2:zB});function Xee(e){return Hm({matchKey:e,toStep:({step:t,stepId:n})=>({id:n,type:"PRESET_ACTION",...Vu(t),command:Vm({command:t})})})}function Vu(e){return {envKey:e.env??e.envKey,retries:e.retries,skipped:e.skipped,comment:e.comment}}function VB(e,t){return typeof e=="object"&&e!==null&&t in e}function Jee({step:e,stepId:t,matcher:n}){if(VB(e,n.matchKey))return n.toStep({step:e,stepId:t})}function Hu(e){if(typeof e=="string")return {id:v4$1(),type:"PRESET_ACTION",command:Vm({command:ete(e)})};for(let n of zB){let r=Jee({step:e,matcher:n});if(r)return r}let t=Zee(e);if(t)return t;throw new Error(`Unsupported v2 step action '${JSON.stringify(e)}' while mapping to resolved step.`)}function Zee(e){if(Qee(e))return {id:v4$1(),type:"PRESET_ACTION",...Vu(e),command:Vm({command:e})}}function Qee(e){return typeof e!="object"||e===null?!1:il(e)!==void 0}function ete(e){switch(e){case"goBack":return {goBack:!0};case"goForward":return {goForward:!0};case"refresh":return {refresh:!0};case"paste":return {paste:!0};case"authSave":return {authSave:!0};default:return dr(e)}}function Gm(e){return {steps:e.steps.map(Hu),beforeSteps:e.before?.map(Hu),afterSteps:e.after?.map(Hu)}}async function fy(e){let t=Ga.parse(e.testV2),n={id:t.id,schemaVersion:t.schemaVersion??De},r=Gm(t);return {metadata:n,stepLists:r}}async function Gu(e){let t=Mg.parse(e.moduleV2),n=Xt.omit({moduleId:!0}).parse(t),r=Gm({before:[],steps:lD(t),after:[]});return {module:{...n,moduleId:t.moduleId,schemaVersion:t.schemaVersion,steps:r.steps??[]}}}function ba(e){return v__default.object({fileType:v__default.literal(le.TEST_V2)}).safeParse(e).success}function Wr(e){return v__default.object({fileType:v__default.literal(le.MODULE_V2)}).safeParse(e).success}function jm({testV2:e,testName:t}){let n={id:e.id,name:t,baseUrl:e.url??"",description:e.description??void 0,schemaVersion:e.schemaVersion??De,advanced:Go.parse(e),retries:e.retries??void 0,envs:e.env?[{name:e.env,default:!0}]:void 0,parameters:e.parameters??void 0,disabled:e.disabled,labels:e.labels??[]};return xn.parse(n)}function un(e){return e===void 0?void 0:e*1e3}function is(e){if(e)return e.type==="description"?e.elementDescriptor:{x:e.pixels.x,y:e.pixels.y}}function Ni({target:e,commandType:t}){let n=is(e);if(n!==void 0)return n;throw new Error(`Cannot serialize ${t} command without a target.`)}function HB(e){if(e.forceClearContent)return "always";if(e.clearContent===!0)return "inputs";if(e.clearContent===!1)return "never"}function qn(e){return {useSelector:e.useSelector,force:e.force,disableCache:e.disableCache,iframe:e.iframeUrl}}function hy(e){return {...qn(e),pos:e.relativePosition}}function ju({requestMatcher:e}){if(!e)return {};switch(e.urlMatcher.type){case"SUBSTRING":return {substring:e.urlMatcher.url,method:e.method};case"GLOB":return {glob:e.urlMatcher.glob,method:e.method};case"REGEX":return {regex:e.urlMatcher.regex,method:e.method};case"DOMAIN":return {domain:e.urlMatcher.domain,method:e.method};default:return dr(e.urlMatcher)}}function WA(e){switch(e.type){case"CLICK":return {click:Ni({target:e.target,commandType:e.type}),...hy(e),doubleClick:e.doubleClick,rightClick:e.rightClick,waitForDownload:e.waitForDownload,delay:e.delayMs,downloadTimeout:e.downloadTimeoutMs};case"TYPE":return {type:e.value,...hy(e),target:is(e.target),pressEnter:e.pressEnter,clear:HB(e),delay:e.delay};case"SELECT_OPTION":{let t=Ni({target:e.target,commandType:e.type});switch(e.choice.type){case"LABEL":return {select:{from:t,label:e.choice.label},...qn(e)};case"VALUE":return {select:{from:t,value:e.choice.value},...qn(e)};case"INDEX":return {select:{from:t,index:e.choice.index},...qn(e)};default:return dr(e.choice)}}case"HOVER":return {hover:Ni({target:e.target,commandType:e.type}),...hy(e)};case"BLUR":{if(!e.target)throw new Error("Cannot serialize blur without a target.");return {blur:Ni({target:e.target,commandType:e.type}),...qn(e)}}case"FOCUS":return {focus:Ni({target:e.target,commandType:e.type}),...qn(e)};case"DRAG":{let t=Ni({target:e.fromTarget,commandType:e.type}),n=Ni({target:e.toTarget,commandType:e.type});return {dragAndDrop:{from:t,to:n,steps:e.steps,hover:un(e.hoverSeconds)},...qn(e)}}case"MOUSE_DRAG":return {mouseDrag:{container:is(e.target),deltaX:e.deltaX,deltaY:e.deltaY,movements:e.steps},...qn(e)};case"PRESS":return {press:e.value,repeat:e.repeat,delay:e.delayMs,convertMeta:e.convertMeta};case"KEY_DOWN":return {keyDown:e.value,convertMeta:e.convertMeta};case"KEY_UP":return {keyUp:e.value,convertMeta:e.convertMeta};case"NAVIGATE":return {navigate:e.url,timeout:un(e.loadTimeout)};case"NEW_TAB":return {newTab:e.url,timeout:un(e.loadTimeout)};case"TAB":switch(e.action.type){case"SUBSTRING":return {switchTab:{substring:e.action.substring},timeout:un(e.loadTimeout)};case"REGEX":return {switchTab:{regex:e.action.pattern},timeout:un(e.loadTimeout)};case"INDEX":{let t=Number(e.action.index);return {switchTab:Number.isNaN(t)?{index:e.action.index}:t,timeout:un(e.loadTimeout)}}default:return dr(e.action)}case"CLOSE_TAB":switch(e.action.type){case"SUBSTRING":return {closeTab:e.action.substring,type:"substring",timeout:un(e.loadTimeout)};case"REGEX":return {closeTab:e.action.pattern,type:"regex",timeout:un(e.loadTimeout)};case"INDEX":{let t=Number(e.action.index);return {closeTab:Number.isNaN(t)?e.action.index:t,type:"index",timeout:un(e.loadTimeout)}}case"CURRENT":return {closeTab:"",type:"current",timeout:un(e.loadTimeout)};default:return dr(e.action)}case"GO_BACK":return {goBack:!0};case"GO_FORWARD":return {goForward:!0};case"REFRESH":return {refresh:!0};case"SCROLL_DOWN":return {scrollDown:e.deltaY,container:is(e.target),...qn(e)};case"SCROLL_UP":return {scrollUp:e.deltaY,container:is(e.target),...qn(e)};case"SCROLL_RIGHT":return {scrollRight:e.deltaX,container:is(e.target),...qn(e)};case"SCROLL_LEFT":return {scrollLeft:e.deltaX,container:is(e.target),...qn(e)};case"WAIT":return {wait:un(e.delay)};case"AI_ASSERTION":{let t={disableCache:e.disableCache,iframe:e.iframeUrl,source:e.source,timeout:un(e.timeout)};return e.contextChoice==="VISION_ONLY"?{checkVisual:e.assertion,...t}:{check:e.assertion,...t}}case"PAGE_CHECK":{let t={iframe:e.iframeUrl,timeout:un(e.timeout)};return e.assertion.negated?{checkPageDoesNotContain:e.assertion.value,...t}:{checkPageContains:e.assertion.value,...t}}case"ELEMENT_CHECK":{let t=Ni({target:e.target,commandType:e.type}),n=tD(e.assertion),r=$v(n),o=un(e.timeout);if(r===void 0)throw new Error(`Cannot serialize unsupported element check alias '${n}'.`);let i;switch(e.assertion.type){case"ELEMENT_ATTRIBUTE":i=e.assertion.attr;break;case"ELEMENT_STYLE":i=e.assertion.property;break;case"ELEMENT_EXISTENCE":case"ELEMENT_CONTENT":case"ELEMENT_NAME":i=void 0;break;default:return dr(e.assertion)}if(r.requiresName&&i===void 0)throw new Error(`Cannot serialize element check alias '${n}' without a name.`);return {[n]:t,...qn(e),timeout:o,...r.requiresName?{name:i}:{},...r.requiresValue&&e.assertion.type!=="ELEMENT_EXISTENCE"?{value:e.assertion.value}:{}}}case"AI_EXTRACT":return {extract:e.goal,schema:e.schema,disableCache:e.disableCache,iframe:e.iframeUrl};case"COOKIE":return {cookie:e.value};case"LOCAL_STORAGE":return {localStorage:{key:e.key,value:e.value}};case"REQUEST":{let t,n;return e.body&&(t=e.body.type,n=e.body.content),{request:{url:e.url,method:e.method,headers:e.headers,params:e.params,bodyType:t,body:n,timeout:un(e.timeout)}}}case"GRAPHQL_REQUEST":return {graphqlRequest:{url:e.url,query:e.query,variables:e.variables,headers:e.headers,timeout:un(e.timeout)}};case"JAVASCRIPT":return {javascript:e.code,environment:e.environment,fragment:e.fragment,timeout:un(e.timeout)};case"SET_HEADER":{let t=ju({requestMatcher:e.requestMatcher});return {header:{name:e.name,value:e.value,...t}}}case"MOCK_ROUTE":return {mockRoute:{...ju({requestMatcher:e.requestMatcher}),responseGenerator:e.responseGenerator,fetchOriginalResponse:e.fetchOriginalResponse,key:e.key}};case"REMOVE_ROUTE_MOCK":if(e.key===void 0)throw new Error("Cannot serialize removeRouteMock without a key.");return {removeRouteMock:e.key};case"WAIT_FOR_URL":{let t=ju({requestMatcher:{urlMatcher:e.matcher,method:void 0}});if([t.substring,t.glob,t.regex,t.domain].filter(i=>i!==void 0).length!==1)throw new Error("Cannot serialize waitForUrl without a URL matcher.");let r;if(t.regex!==void 0)r={regex:t.regex};else if(t.glob!==void 0)r={glob:t.glob};else if(t.domain!==void 0)r={domain:t.domain};else if(t.substring!==void 0)r=t.substring;else throw new Error("Cannot serialize waitForUrl without a URL matcher.");let o={caseInsensitive:e.caseInsensitive,timeout:un(e.timeout)};return e.negated?{waitForUrlNotToMatch:r,...o}:{waitForUrl:r,...o}}case"DIALOG":return {dialog:e.action};case"FILE_UPLOAD":return e.fileSource.type==="URL"?{fileUpload:e.fileSource.url,name:e.filename}:{fileUpload:`${Kp}${e.fileSource.name}`,name:e.filename};case"COPY":return {copy:e.value};case"PASTE":return {paste:!0};case"CAPTCHA":return {captcha:!0,...qn(e)};case"VISUAL_DIFF":if(!e.target)throw new Error("Cannot serialize visualDiff without a target.");return {visualDiff:Ni({target:e.target,commandType:e.type}),...qn(e),threshold:e.threshold,screenshot:e.screenshot};case"OFFLINE_MODE":return {offlineMode:e.enable};case"REGISTER_REQUEST_LISTENER":{let t=ju({requestMatcher:e.requestMatcher});return {registerRequestListener:{key:e.key,...t}}}case"AWAIT_LISTENER":return {awaitListener:e.key,timeout:un(e.timeout)};case"RECORD_REQUESTS":{let t=ju({requestMatcher:e.requestMatcher});return {recordRequests:{key:e.key,...t}}}case"GET_RECORDED_REQUESTS":return {getRecordedRequests:e.key};case"AUTH_LOAD":return {authLoad:e.storageState};case"AUTH_SAVE":return {authSave:!0};case"SUCCESS":throw new Error("SUCCESS command is not supported in v2 serialization.");default:return dr(e)}}var tte=z.object({env:z.string().optional(),retries:z.number().optional(),skipped:z.boolean().optional(),comment:z.string().optional()});function xl(e){let t={env:e.envKey,retries:e.retries,skipped:e.skipped,comment:e.comment};switch(e.type){case"PRESET_ACTION":{let n=WA(e.command),r=nte(t)?void 0:rte(n);return r||{...n,...t}}case"AI_ACTION_DYNAMIC":return e.version==="3"?{act:e.text,...t}:{dynamicAction:e.text,...t};case"AI_ACTION":return {act:e.text,...t};case"MODULE":return {module:e.moduleId,name:e.moduleName,inputs:e.inputs,...t};case"CONDITIONAL":{let[n,...r]=e.blocks;if(!n)throw new Error("Conditional step cannot be serialized without blocks.");if(r.length>0)throw new Error("Cannot serialize v2 conditionals with multiple blocks. Only 'if' and 'else' are supported.");let o=WA(n.assertion.command),i=Qv.safeParse(o);if(!i.success)throw new Error(`Unsupported assertion command type: ${JSON.stringify(o)}`);return {if:i.data,then:n.steps.map(a=>xl(a)),else:e.elseSteps?.map(a=>xl(a)),...t}}case"SECTION":throw new Error("SECTION steps are not supported in v2 serialization. Remove SECTION steps before converting.")}}function GB(e){return {before:e.beforeSteps&&e.beforeSteps.length>0?e.beforeSteps.map(xl):void 0,steps:e.steps.map(xl),after:e.afterSteps&&e.afterSteps.length>0?e.afterSteps.map(xl):void 0}}function nte(e){return Object.values(tte.parse(e)).some(t=>t!==void 0)}function rte(e){let t=Object.entries(e);if(t.length!==1)return;let[n]=t;if(!n)return;let[r,o]=n;if(o!==!0)return;let i=_g.safeParse(r);return i.success?i.data:void 0}function gy({metadata:e,stepLists:t,idOverride:n}){let r=vn.parse(e),o=GB(oa.parse(t)),i=r.advanced&&Object.keys(r.advanced).length>0?r.advanced:{};return Oi({fileType:le.TEST_V2,id:n??r.id,schemaVersion:r.schemaVersion===De?void 0:r.schemaVersion,url:r.baseUrl||void 0,description:r.description??void 0,retries:r.retries??void 0,envs:r.envs??void 0,parameters:r.parameters??void 0,disabled:r.disabled,labels:r.labels&&r.labels.length>0?r.labels:void 0,...i,...o})}function Sy({metadata:e,schemaVersion:t,steps:n}){let r=Xt.parse(e);return Oi({fileType:le.MODULE_V2,...r,schemaVersion:t??De,steps:n.map(xl)})}function yy(e,t){let n=t.hooks?.postSave;if(!n)return;let r;n.includes("$1")?r=n.replaceAll("$1",e):r=`${n} ${e}`,C.debug({postSaveCommand:r},"Executing post-save hook command");try{execSync(r,{encoding:"utf-8"});}catch(o){C.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...");}}var jB=new Map;function Co(e){let t=An__default.resolve(e),n=statSync(t),r=jB.get(t);if(r&&r.mtimeMs===n.mtimeMs&&r.size===n.size)return {parsed:structuredClone(r.parsed),stats:n};let i=readFileSync(t,"utf-8").replace(/\r\n|\r/g,`
|
|
200
200
|
`),a=ZB.parse(i);return jB.set(t,{mtimeMs:n.mtimeMs,size:n.size,parsed:a}),{parsed:structuredClone(a),stats:n}}function _l({module:e,filePath:t,projectConfig:n,opts:r}){let o=Tg.parse(e),i=nt.array().parse(e.steps),a;if(n.fileFormat==="v2"?a=Sy({metadata:o,schemaVersion:e.schemaVersion,steps:i}):a=Oi({fileType:le.MODULE,...o,steps:i}),r?.existingModule&&!r?.forceSaveOnNoDiffs){let l=diff(a,r.existingModule);if(l&&Object.keys(l).length===0){C.debug(`Skipping save for module ${t} since there are no changes`);return}}C.debug(`Saving module ${e.name} to ${t}`);let s=ZB.stringify(a);yn__default.writeFileSync(t,s,"utf-8"),yy(t,n);}function Wu({content:e,schemaVersion:t,momenticFiles:n,project:r,forceSaveOnNoDiffs:o}){let i=n.modules[e.moduleId]?.fullFilePath;if(!i||!yn__default.existsSync(i))throw new Error(`Tried to update module ${e.moduleId} that could not be found on disk`);let{parsed:a}=Co(i),s;if(e.name&&e.name!==a.name){let u=`${ht(e.name)}.module.yaml`;if(s=An__default.join(An__default.dirname(i),u),yn__default.existsSync(s))throw new Error(`A conflicting file '${e.name}' already exists at path '${s}'`)}let l={...e,schemaVersion:t},c={fileType:le.MODULE,...Tg.parse(l),steps:e.steps};_l({module:c,filePath:i,projectConfig:r.config,opts:{forceSaveOnNoDiffs:o,existingModule:a}}),s&&yn__default.renameSync(i,s);}function WB({moduleId:e,content:t,momenticFiles:n,project:r,logger:o}){let i=n.modules[e]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${e} that could not be found on disk`);let a=Yo(i,o);if(Wr(a))throw new Error("Updating v2 modules through this path is not supported yet.");let s={...a,...t},l={fileType:le.MODULE,...Tg.parse(s),steps:a.steps};_l({module:l,filePath:i,projectConfig:r.config,opts:{existingModule:a}});let c;if(t.name){let u=`${ht(t.name)}.module.yaml`;if(c=An__default.join(An__default.dirname(i),u),yn__default.existsSync(c))throw new Error(`Module with name '${t.name}' already exists at path '${c}'`);yn__default.renameSync(i,c);}}async function Ty({name:e,description:t,enabled:n,parameters:r,defaultParameters:o,parameterEnums:i,steps:a,folder:s,project:l}){let c=ht(e),u=An__default.join(s,`${c}.module.yaml`),d=v4$1(),p=r!==void 0||o!==void 0||i!==void 0,{stepsToSave:m}=await Sn({stepLists:{steps:a}}),f={fileType:le.MODULE,schemaVersion:De,moduleId:d,name:e,description:t,enabled:n,parameters:p?r??[]:void 0,defaultParameters:o,parameterEnums:i,steps:m.steps};return _l({module:f,filePath:u,projectConfig:l.config}),{moduleId:d,name:e,description:t,enabled:n,parameters:p?r??[]:void 0,defaultParameters:o,parameterEnums:i,steps:a}}function Yo(e,t){let{parsed:n}=Co(e);if(Wr(n))try{return sD.parse(n)}catch(r){throw t.error({err:r,moduleFilePath:e,existingModule:n},`${e} does not parse as a valid V2 module`),r}try{return jM.parse(n)}catch(r){throw t.error({err:r,moduleFilePath:e,existingModule:n},`${e} does not parse as a valid Momentic module`),r}}async function $B({module:e}){return Wr(e)?(await Gu({moduleV2:e})).module:e}async function as(e,t,n,r){let o=Yo(e.fullFilePath,n),i=await $B({module:o}),{resolvedSteps:a}=await ZS({rawSteps:i.steps,migrationMetadata:{id:i.moduleId,schemaVersion:i.schemaVersion},resolvedModuleCache:r,logger:n,callbacks:{onFetchModule:async({id:l})=>{let c=t.modules[l]?.fullFilePath;if(!c)return;let u=Yo(c,n);return $B({module:u})}}}),s={...i,steps:a};return r&&(r[e.id]=cloneDeep(s)),s}async function Ey(e,t){let n={};return await Promise.all(Object.values(e.modules).map(async r=>{await as(r,e,t,n);})),Array.from(Object.values(n))}function ss({test:e,filePath:t,projectConfig:n,opts:r}){let o=xn.parse(e),i=nt.array().optional().parse(e.beforeSteps&&e.beforeSteps.length>0?e.beforeSteps:void 0),a=nt.array().parse(e.steps&&e.steps.length>0?e.steps:[]),s=nt.array().optional().parse(e.afterSteps&&e.afterSteps.length>0?e.afterSteps:void 0),l={beforeSteps:i,steps:a,afterSteps:s},c;if(n.fileFormat==="v2"?c=gy({metadata:o,stepLists:l}):c=Oi({fileType:le.TEST,...o,beforeSteps:i,steps:a,afterSteps:s}),r?.existingTest&&!r?.forceSaveOnNoDiffs){let d=diff(c,r.existingTest);if(d&&Object.keys(d).length===0){C.debug(`Skipping save for test ${t} since there are no changes`);return}}C.debug(`Saving test ${e.name} to ${t}`);let u=ZB.stringify(c);yn__default.writeFileSync(t,u,"utf-8"),yy(t,n);}async function KB({test:e,name:t,folder:n,project:r}){let o=vn.parse(e),{stepsToSave:i,moduleUpdates:a}=await Sn({stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps}});if(a.length>0)throw new Error("A brand new test should not contain any modules in it");let l=`${ht(t)}.test.yaml`,c=An__default.join(n,l);return ss({test:{fileType:le.TEST,...o,beforeSteps:i.beforeSteps,steps:i.steps,afterSteps:i.afterSteps},filePath:c,projectConfig:r.config}),c}function qA(e,t,n){let r=An__default.join(n.rootDir,e);if(!yn__default.existsSync(r))throw new Error(`Test not found at path '${e}' in project '${n.rootDir}'`);let{parsed:o}=Co(r),i=Ml(e,n),a,s;if(t.name&&t.name!==i.name){let c=`${ht(t.name)}.test.yaml`;if(a=An__default.join(An__default.dirname(e),c),s=An__default.join(n.rootDir,a),yn__default.existsSync(s))throw new Error(`Test with name '${t.name}' already exists at path '${s}'`)}let l=xn.parse({...i,...t});if(ba(o)){let c=Gm(Ga.parse(o));ss({test:{fileType:le.TEST,...l,beforeSteps:c.beforeSteps,steps:c.steps,afterSteps:c.afterSteps},filePath:r,projectConfig:n.config});}else ss({test:{fileType:le.TEST,...l,beforeSteps:o.beforeSteps,steps:o.steps,afterSteps:o.afterSteps},filePath:r,projectConfig:n.config});return s&&yn__default.renameSync(r,s),{newRelativeTestPath:a}}function Pl({relativeTestPath:e,steps:t,schemaVersion:n,project:r,forceSaveOnNoDiffs:o}){let i=An__default.join(r.rootDir,e);if(!yn__default.existsSync(i))throw new Error(`Test not found at path '${e}' in project '${r.rootDir}'`);let{parsed:a}=Co(i),s=xn.parse({...Ml(e,r),schemaVersion:n}),l=nt.array().or(z.undefined()).parse(t.beforeSteps),c=nt.array().parse(t.steps),u=nt.array().or(z.undefined()).parse(t.afterSteps),d={fileType:le.TEST,...s,beforeSteps:l&&l.length>0?l:void 0,steps:c,afterSteps:u&&u.length>0?u:void 0};ss({test:d,filePath:i,projectConfig:r.config,opts:{forceSaveOnNoDiffs:o,existingTest:a}});}function KA({relativeTestPath:e,stepsToSave:t,moduleUpdates:n,schemaVersion:r,momenticFiles:o,project:i,forceSaveOnNoDiffs:a}){n.forEach(s=>{Wu({content:s,schemaVersion:r,momenticFiles:o,project:i,forceSaveOnNoDiffs:a});}),Pl({relativeTestPath:e,steps:t,schemaVersion:r,project:i,forceSaveOnNoDiffs:a});}async function qu({relativeTestPath:e,stepLists:t,schemaVersion:n,momenticFiles:r,project:o,forceSaveOnNoDiffs:i}){let a=await Sn({stepLists:t});return KA({relativeTestPath:e,stepsToSave:a.stepsToSave,moduleUpdates:a.moduleUpdates,schemaVersion:n,momenticFiles:r,project:o,forceSaveOnNoDiffs:i}),a}function Ml(e,t){let n=An__default.join(t.rootDir,e);if(!n)throw new Error(`Could not find test with path ${e} in Momentic project (${t.rootDir})`);let r;try{let{parsed:o}=Co(n);r=o;}catch(o){throw new Error(`Could not parse test file ${n} as YAML: ${o}`,{cause:o})}if(ba(r)){let o=Ga.parse(r);return jm({testV2:o,testName:An__default.basename(n,".test.yaml")})}return xn.parse(r)}function Ca(e){let{parsed:t}=Co(e),n=t;if(!ba(n)&&(!n.steps||!Array.isArray(n.steps)))throw new Error(`Test ${e} is missing steps`);return n}async function tn(e,t,n){let r=Ca(e),o,i;if(ba(r)){let s=Ga.parse(r);o=jm({testV2:s,testName:An__default.basename(e,".test.yaml")});let{stepLists:l}=await fy({testV2:s});i=l;}else {try{o=xn.parse(r);}catch(s){throw new Error(`Test ${e} is missing metadata or has invalid metadata`,{cause:s})}i=ia.parse({steps:r.steps??[],beforeSteps:r.beforeSteps,afterSteps:r.afterSteps});}let{resolvedTest:a}=await sB({rawSteps:i,metadata:o,logger:t,callbacks:{onFetchModule:async({id:s,logger:l})=>{let c=n.modules[s]?.fullFilePath;if(!c)return;let u=Yo(c,l);if(!Wr(u))return u;let{module:d}=await Gu({moduleV2:u});return d}}});return a}function by(e,t){return (e.config.environments??[]).map(n=>Ol(n.name,e,t))}function XB(e){return e.includes("${")?e.replace(/\$\{([^}]+)\}/g,(t,n)=>{let r=n.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!r)return process.env[n]||"";let o=r[1];if(!o)return "";let i=r[2],a=r[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):e}function Ste(e){let{envVariables:t,project:n}=e;if(!t)return {};let r={};for(let[o,i]of Object.entries(t)){if(typeof i=="string"){let s=XB(i);s&&(r[o]=s);continue}let a;try{a=yn__default.readFileSync(An__default.resolve(n.rootDir,i.fromFile),"utf-8");}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{r[o]=JSON.parse(a);}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else r[o]=a;}return Object.keys(r).length>0&&C.debug(r,"Set environment variables with interpolation from project configuration"),r}function yte(e){let{project:t,envFile:n,logger:r}=e,o={};if(!n)return o;let i=hte.config({path:An__default.resolve(t.rootDir,n),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return r.debug("Set environment variables from .env file"),o}function Ol(e,t,n){let r=(t.config.environments??[]).find(l=>l.name===e);if(!r)throw new Error(`Environment ${e} not found in local project configuration file`);if(!r.baseUrl)throw new Error(`Browser environment ${e} does not have a baseUrl configured`);let o={[En]:XB(r.baseUrl)},i=Ste({envVariables:r.envVariables,project:t});Object.assign(o,i);let a=yte({project:t,envFile:r.envFile,logger:n});return Object.assign(o,a),r.inheritFromShell&&(n.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:e,variables:o,browser:r.browser}}var YA=["node_modules","__pycache__",".npm",".yarn",".pnpm",".pnpm-store",".pnpm-state",".cache",".gradle",".pytest_cache",".mypy_cache",".ruff_cache",".tox",".nox","dist","bin",".next","out","build","coverage",".nyc_output",".terraform",".serverless",".aws-sam",".momentic-mcp",".vscode",".cursor",".idea",".windsurf",".claude",".codex",".git",".turbo",".env",".venv","venv","env","wheels"],bte=YA.map(e=>`**/${e}`);function vte(e){return e.map(t=>(t.endsWith("/")&&(t=t.slice(0,-1)),An__default.join(t)))}async function Ku(e,t){let n=await glob(e,{cwd:t.cwd,ignore:bte.concat(t.ignore??[]),deep:t.maxDepth,onlyFiles:t.nodir,signal:t.signal});return vte(n)}var vy=["**/*.test.yaml","**/*.module.yaml"],XA=v__default.string().refine(e=>/^[a-zA-Z0-9-]+$/.test(e)),Cy=15;var ls="momentic.config.yaml",ZA="momentic.workspace.yaml",_te=z.object({projects:z.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),Pte=z.union([z.string(),z.object({fromFile:z.string(),json:z.boolean().optional()})]),Mte=z.object({name:XA,baseUrl:z.string().optional().describe("Optional for mobile tests"),envFile:z.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:z.record(z.string(),Pte).optional(),inheritFromShell:z.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Ys.optional().describe("NB: most things should use project-level configuration only")}),Ote=z.object({postSave:z.string().optional()}),Lte=z.union([z.boolean(),z.literal("on-fail")]).describe("Controls video recording for test runs. true records video for all tests, false disables video (default), 'on-fail' records video but removes it for passing tests."),Nte=z.object({name:XA,include:z.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:z.string().array().optional().describe("opposite of include, takes precedence over include"),fileFormat:qN.optional().describe("file format version to use"),goldenFileDir:z.string().optional(),reporterDir:z.string().optional(),outputDir:z.string().optional(),recordVideo:Lte.optional(),retries:z.number().optional().describe("number of retries per test"),parallel:z.union([z.number(),z.literal("AUTO")]).optional().describe("degree of parallelism"),environments:z.array(Mte).optional(),gitMainBranch:z.string().optional().readonly(),gitProtectedBranches:z.string().array().optional().readonly(),ai:la.optional(),browser:Ys.optional(),emulator:Av.optional(),advanced:Gb.optional(),displayRoot:z.string().optional().describe("relative path from project root to use as the Repository root"),hooks:Ote.optional()});function QB(e,t){let n;try{n=readFileSync(e,"utf-8");}catch(o){C.warn(`Could not read possible Momentic ${t} file at ${e}: ${o}`);return}let r;try{if(r=ZB.parse(n),typeof r!="object"||r===null)throw new Error(`The ${t} file should parse as a map with key-value pairs, but is type ${typeof r} instead`)}catch(o){C.warn(`Possible Momentic ${t} file at ${e} does not parse as valid YAML: ${o}`);return}return r}function ez(e,t){let n=[];for(let[r,o]of Object.entries(e)){let a=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;o!==null&&typeof o=="object"?n.push(...ez(o,a)):n.push(a);}return n}function QA(e){let t=QB(e,"project configuration");if(t===void 0)return;let n;try{n=Nte.parse(t);}catch(i){C.warn(`Possible Momentic project configuration file at ${e} does not adhere to the required schema: ${i}`);return}let r=deletedDiff(t,n),o=ez(r,"");return o.length>0&&C.warn(`Momentic config file at ${e} contains unrecognized keys: ${o.join(", ")}. These keys will be ignored.`),n}function Dte(e){let t=QB(e,"workspace configuration");if(t!==void 0)try{return _te.parse(t)}catch(n){C.warn(`Possible Momentic workspace configuration file at ${e} does not adhere to the required schema: ${n}`);return}}function kte(){let e=[],t=cwd(),n=An__default.parse(t).root,r=15,o=0;for(;o<r;){o++;let i=An__default.basename(t);if(YA.includes(i))return C.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),e;for(let a of readdirSync(t))if(a.endsWith(ls)){let s=An__default.join(t,a),l=QA(s);l&&e.push({configFilePath:s,config:l,rootDir:dirname(s)});}if(e.length)return e;if(t=An__default.dirname(t),t===n)break}return e}async function bt(e={}){let{configFilePath:t,nameFilter:n,skipExitOnError:r}=e,o=await eR(t,r);if(n&&(o=o.filter(i=>i.config.name===n)),o.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
201
201
|
${o.map(i=>i.configFilePath)}`);if(o.length===0)throw new Error("No valid Momentic project file available.");return C.debug(`Found valid project configuration at ${o[0].configFilePath}`),o[0]}async function Fte(e){let t=Dte(e);if(!t||!t.projects||!t.projects.length)return;let n=t.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ls}`)),r=AbortSignal.timeout(2e3),o;try{o=await Ku(n,{cwd:cwd(),maxDepth:Cy,ignore:[],nodir:!0,signal:r});}catch(a){throw C.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${ZA} is misconfigured.`),a}let i=[];for(let a of o){let s=An__default.join(cwd(),a),l=QA(s);l&&i.push({configFilePath:s,config:l,rootDir:dirname(s)});}return i}async function eR(e,t){if(e){e=An__default.resolve(e);let r=QA(e);return r?[{config:r,configFilePath:e,rootDir:An__default.dirname(e)}]:(console.error(`No valid Momentic project file found at ${e}.`),t||process.exit(1),[])}if(existsSync(ZA)){let r=await Fte(ZA);if(r)return r}return kte()}function cs(e,t){let n=ZB.stringify(e);writeFileSync(t,n);}var oz=!1,Ute=z.object({fileType:z.nativeEnum(le)});async function he(e,t=!1){let n={project:e,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},r=e.config.include??vy,o=e.config.exclude??[],i=AbortSignal.timeout(5e3),a;try{a=await Ku(r,{cwd:e.rootDir,ignore:o,maxDepth:Cy,nodir:!0,signal:i});}catch(s){throw C.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let l=Bte(e.rootDir,s,n,t?wr:C);l&&(n.duplicateEntities[l.id]=l.paths);}return oz=!0,n}function Bte(e,t,n,r){let o=An__default.join(e,t),i=zte(o,r);if(!i)return;let{entityJs:a,stats:s}=i,l=Ute.safeParse(a);if(l.success===!1){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${l.error}`);return}let c=l.data.fileType,u=Vte(t,o,s);switch(c){case le.TEST:try{return nz(a,c,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case le.TEST_V2:try{return nz(a,c,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic v2 test metadata: ${d}`);return}case le.MODULE:try{return rz(a,c,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case le.MODULE_V2:try{return rz(a,c,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic v2 module metadata: ${d}`);return}case le.MOBILE_TEST:try{return Gte(a,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case le.MOBILE_MODULE:try{return Hte(a,n,u,o,r)}catch(d){r.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{return}}}function zte(e,t){try{let{parsed:n,stats:r}=Co(e);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return {entityJs:n,stats:r}}catch(n){t.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function Vte(e,t,n){return {relativePath:e,fullFilePath:t,platformSep:An__default.sep,fullPathSegments:t.split(An__default.sep),relativePathSegments:e.split(An__default.sep),fileName:An__default.basename(t),lastModified:n.mtime,createdAt:n.birthtime}}function nz(e,t,n,r,o,i){let a=r.fileName.replace(".test.yaml",""),s,l;t===le.TEST_V2?(s=eC.parse(e),l=a):(s=xn.parse(e),l=s.name);let c;if(n.tests[s.id]){let u=n.tests[s.id].fullFilePath;c={id:s.id,paths:[u,o]};}return n.tests[s.id]={type:t,name:l,id:s.id,description:s.description??void 0,labels:s.labels,...r},c}function rz(e,t,n,r,o,i){let a=t===le.MODULE_V2?Pg.parse(e):Xt.parse(e),s=a.moduleId,l;if(n.modules[s]){let u=n.modules[s].fullFilePath;l={id:s,paths:[u,o]};}n.modules[s]={type:t,name:a.name,id:s,description:a.description??void 0,...r};let c=r.fileName.replace(".module.yaml","");return !oz&&ht(a.name)!==c&&i.warn(`The module with ID ${a.moduleId} has a name (${a.name}) that does not match its file name (${c}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),l}function Hte(e,t,n,r,o){let i=fv.parse(e),a;if(t.mobileModules[i.moduleId]){let l=t.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[l,r]};}let s=n.fileName.replace(".module.yaml","");return t.mobileModules[i.moduleId]={type:le.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...n},a}function Gte(e,t,n,r,o){let i=nL.parse(e),a;if(t.mobileTests[i.id]){let l=t.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[l,r]};}let s=n.fileName.replace(".test.yaml","");return t.mobileTests[i.id]={type:le.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...n},a}var iz="golden/visual-diff",az="reports",Yu="test-results";var jte=z.object({width:z.number(),height:z.number()}),Ju=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(t,n,r){let o=An__default.join(t.rootDir,t.config.goldenFileDir??iz);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=r,this.apiClient=n;}async prepareGoldenScreenshotForComparison(t,n,r){if(p_(n.screenshot?.data))return {buffer:(await this.apiClient.fetchOnDemandScreenshot(n.screenshot.data.id)).data,width:n.screenshot.width,height:n.screenshot.height};if(n.screenshot?.data?.startsWith("https://")){let a=await fetch(n.screenshot.data);return {buffer:Buffer.from(await a.arrayBuffer()),width:n.screenshot.width,height:n.screenshot.height}}let o=n.screenshot?.data;o||(o=An__default.join(this.defaultGoldenScreenshotDir,`${n.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return yn__default.mkdirSync(An__default.dirname(o),{recursive:!0}),yn__default.writeFileSync(o,r.buffer),yn__default.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(yn__default.existsSync(o)){let a=yn__default.readFileSync(o),s=jte.parse(JSON.parse(yn__default.readFileSync(i,"utf-8")));return {buffer:a,width:s.width,height:s.height}}else throw new L("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var sz=3e3,pt=lz(),qte=promisify(execFile);async function Ao(e){let{logger:t,operation:n,fn:r,context:o}=e,i=Date.now();try{return await r()}finally{let a=Date.now()-i;a>sz&&!process.env.CI&&t.warn({operation:n,durationMs:a,thresholdMs:sz,...o??{}},"[timing] slow git metadata operation");}}function Di(e){if(e)try{let t=new Date(e);return isNaN(t.getTime())?void 0:t}catch{return}}async function Kte(e){let t=await gt(e,pt.raw(["config","--list"])),n={};if(!t)return n;for(let r of t.split(`
|
|
202
|
-
`)){let o=r.indexOf("=");if(o===-1)continue;let i=r.slice(0,o),a=r.slice(o+1).trim();n[i]=a;}return n}async function Yte(e,t,n){try{let o=n["github.user"]||void 0;if(o)return o}catch{}let r;try{if(t?.startsWith("http://")||t?.startsWith("https://"))r=new URL(t).host;else if(t?.startsWith("git@")){let o=t.indexOf("@"),i=t.indexOf(":",o+1);o!==-1&&i!==-1&&(r=t.slice(o+1,i));}}catch{}if(r=r?.toLowerCase(),!!r&&t?.startsWith("git@")&&r.includes("github"))try{let{stdout:o,stderr:i}=await qte("ssh",["-T","-o","BatchMode=yes",`git@${r}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function Xte(e,t,n){let r=t?.includes("github.com"),o=t?.includes("gitlab.com");try{if(r)return Yte(e,t,n);if(o)return}catch{}}function Ym(e){if(e.startsWith("git@")){let t=e.split(":");if(t.length===2){let n=t[1].replace(".git","").split("/");if(n.length===2){let r=n[0],o=n[1];return `${r}/${o}`}}}else if(e.startsWith("http")||e.startsWith("https")){let n=new URL(e).pathname.split("/").filter(Boolean);if(n.length>=2){let r=n[0],o=n[1].replace(".git","");return `${r}/${o}`}}}function Jte(e){if(!(e instanceof Error))return !1;let t=e.message;return t.includes("not a git repository")||t.includes("ENOENT")}async function gt(e,t){try{return (await t).trim()}catch(n){if(Jte(n))return;e.error({err:n},"Failed to run git command");return}}function Zte(){if(process.env.GITHUB_ACTION)return "GithubActions";if(process.env.GITLAB_CI)return "GitlabCI";if(process.env.CIRCLECI)return "CircleCI";if(process.env.BUILDKITE)return "Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return "AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return "GCPCloudBuild";if(process.env.BITRISE_BUILD_SLUG)return "Bitrise";if(process.env.MOMENTIC_GIT_OVERRIDE)return "Custom"}async function Qte(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return {ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function ene(e){let[t,n,r]=await Promise.all([gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]);return {ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?Di(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:t,gitCommitMessage:n,gitCommitAuthorName:r,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function tne(e){let[t,n,r,o]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??n,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),l=i?Ym(i):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:a?l:void 0,gitlabProjectPath:s?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function nne(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ym(o):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function rne(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ym(o):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function one(e,t,n){let[r,o,i,a,s,l,c,u,d]=await Promise.all([gt(e,pt.revparse(["HEAD"])),gt(e,pt.revparse(["--short","HEAD"])),gt(e,pt.revparse(["--abbrev-ref","HEAD"])),gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"])),t?gt(e,pt.raw(["merge-base","--fork-point",t])):Promise.resolve(void 0),Kte(e)]),p=u||(t?await gt(e,pt.raw(["merge-base",t,"HEAD"])):void 0),m=p?await gt(e,pt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?Ym(a):void 0,S=d["user.email"]||void 0,T=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,P=(n?.includeHostingUsername??!0?await Xte(e,a,d):void 0)??y??b??void 0;return {ciProvider:"none",gitCommitSha:r,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Di(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:P,gitLocalEmail:S,gitLocalName:T,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?Di(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function ine(e){let[t,n]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%an"]))]),r=process.env.GIT_REPOSITORY_URL,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),a=r?Ym(r):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:r,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:n,githubRepository:o?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function ane(){let e=process.env._HEAD_REPO_URL;return {ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:e?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:e?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function sne(){return {ciProvider:"Custom",gitCommitSha:process.env.GIT_COMMIT_SHA,gitCommitShaShort:process.env.GIT_COMMIT_SHA_SHORT??process.env.GIT_COMMIT_SHA?.slice(0,6),gitCommitTimestamp:Di(process.env.GIT_COMMIT_TIMESTAMP),gitBranchName:process.env.GIT_BRANCH_NAME,gitOriginUrl:process.env.GIT_ORIGIN_URL,gitCommitAuthorName:process.env.GIT_COMMIT_AUTHOR_NAME,gitCommitMessage:process.env.GIT_COMMIT_MESSAGE,lastCommitOnMainSha:process.env.LAST_COMMIT_ON_MAIN_SHA,lastCommitOnMainTimestamp:Di(process.env.LAST_COMMIT_ON_MAIN_TIMESTAMP),mergedGitBranchName:process.env.MERGED_GIT_BRANCH_NAME,githubRepository:process.env.GITHUB_REPOSITORY,gitlabProjectPath:process.env.GITLAB_PROJECT_PATH,gitLocalUsername:process.env.GIT_USERNAME,gitLocalEmail:process.env.GIT_EMAIL,gitLocalName:process.env.GIT_NAME}}async function lne(e){let t=[...e.config.gitProtectedBranches??[]];return e.config.gitMainBranch&&t.push(e.config.gitMainBranch),{gitMainBranch:e.config.gitMainBranch,gitProtectedBranches:t}}async function Xo(e,t,n){let r=Zte();if(!r)return one(e,t,n);switch(r){case"GithubActions":return Qte(e);case"GitlabCI":return ene(e);case"CircleCI":return tne(e);case"Buildkite":return nne(e);case"AzureDevOps":return rne(e);case"GCPCloudBuild":return ane();case"Bitrise":return ine(e);case"Custom":return sne()}}async function cne(e,t,n,r){let o=r,i=r.gitCommitSha;if(!i)return o;let a=r.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>t.getMergeBaseCommitFromGitlab(n,a,i),context:{projectPath:n,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){e.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>t.getCommitFromGitlab(n,i),context:{projectPath:n,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message});}catch(s){e.warn({err:s},"Failed to get commit from Gitlab");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!o.mergedGitBranchName){let s=r.gitBranchName;try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>t.getMergedBranchFromGitlab(n,s,i),context:{projectPath:n,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch});}catch(l){e.warn({err:l},"Failed to get merged branch from Gitlab");}}return o}async function une(e,t,n,r,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>t.getMergeBaseCommitFromGithub(n,r,s,a),context:{owner:n,repo:r,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date};}catch(l){e.warn({err:l},"Failed to get merge base commit from GitHub");}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>t.getCommitFromGithub(n,r,a),context:{owner:n,repo:r,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){e.warn({err:l},"Failed to get commit from GitHub");}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>t.getMergedBranchFromGithub(n,r,l,a),context:{owner:n,repo:r,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch});}catch(c){e.warn({err:c},"Failed to get merged branch from GitHub");}}return i}async function dne(e,t,n){try{if(n.githubRepository){let[r,o]=n.githubRepository.split("/");return await Ao({logger:e,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>une(e,t,r,o,n),context:{githubRepository:n.githubRepository}})}else if(n.gitlabProjectPath){let r=n.gitlabProjectPath;return await Ao({logger:e,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>cne(e,t,r,n),context:{gitlabProjectPath:r}})}}catch(r){e.warn({err:r},"Failed to get remote git metadata");}return n}async function pne(e,t,n,r){let o={},i={gitMainBranch:n.config.gitMainBranch};return Ao({logger:e,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([Ao({logger:e,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>lne(n),context:{projectConfigPath:n.configFilePath}}),Ao({logger:e,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await Xo(e,n.config.gitMainBranch,r);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await Ao({logger:e,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>dne(e,t,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:o})}async function cz(e){try{let t=await lz(e).remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function uz(){try{return (await pt.revparse(["--is-inside-work-tree"])).trim()==="true"}catch{return !1}}var rR=new Map;async function mne(e,t,n){let r,o;try{[r,o]=await Promise.all([gt(e,pt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),gt(e,pt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!r||!o)return;let i=`${t.configFilePath}:${t.config.gitMainBranch}:${t.config.gitProtectedBranches?.join(",")}`,a=`${n?.includeHostingUsername}`;return `${r}:${o}:${i}:${a}`}async function Jo(e,t,n,r){let o=await mne(e,n,r);if(o&&rR.has(o))return e.debug("Using cached git metadata"),rR.get(o);let i=await pne(e,t,n,r);return o&&rR.set(o,i),i}var dz=new Set([".DS_Store","__MACOSX"]),pz={status:(e,t)=>{if(e.status===t.status)return e.status;if(e.status==="FAILED"||t.status==="FAILED")return "FAILED";if(e.status==="CANCELLED"||t.status==="CANCELLED")return "CANCELLED";if(e.status==="RETRYING"||t.status==="RETRYING")return "RETRYING";if(e.status==="RUNNING"||t.status==="RUNNING")return "RUNNING";if(e.status==="PENDING"||t.status==="PENDING")return "PENDING";throw new Error(`Invalid run status merge: ${e.status} and ${t.status}`)},startedAt:(e,t)=>e.startedAt<t.startedAt?e.startedAt:t.startedAt,updatedAt:(e,t)=>e.updatedAt>t.updatedAt?e.updatedAt:t.updatedAt,finishedAt:(e,t)=>!e.finishedAt||!t.finishedAt?new Date:e.finishedAt>t.finishedAt?e.finishedAt:t.finishedAt,gitCommitTimestamp:(e,t)=>{if(!(!e&&!t)){if(!e.gitCommitTimestamp||!t.gitCommitTimestamp||e.gitCommitTimestamp.getTime()!==t.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${e.gitCommitTimestamp} and ${t.gitCommitTimestamp}`);return e.gitCommitTimestamp}},pipelineId:(e,t)=>e.pipelineId===t.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:e.startedAt<t.startedAt?t.pipelineId:e.pipelineId,labels:(e,t)=>{let n=new Set([...e.labels??[],...t.labels??[]]);return Array.from(n)}};function hne(e,t,n){if(pz[n]){let i=pz[n];return i(e,t)}let r=e[n],o=t[n];if(r!==o)throw new Error(`Metadata values for key "${n}" do not match: "${r}" vs "${o}"`);return r}var oR=class extends Error{constructor(t,n){let r=`${t} contains invalid Momentic results: ${n}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(r),this.name="InvalidMomenticResultsPathError";}};function mz(e,t){try{let n=An__default.join(t,"metadata.json");return Ri.parse(JSON.parse(yn__default.readFileSync(n,"utf-8")))}catch{throw new oR(e,t)}}function fz(e,t,n){let r=randomUUID(),o=e.child({runGroupId:r});yn__default.rmSync(t,{recursive:!0,force:!0});let i=yn__default.readdirSync(n).filter(l=>!dz.has(l)).map(l=>An__default.join(n,l));if(i.length===0)throw new Error(`No run groups found in results path: ${n}`);yn__default.mkdirSync(t,{recursive:!0});let a={...mz(n,i[0]),id:r};for(let l of i){let c=An__default.join(l,"runs");if(!yn__default.existsSync(c))continue;let u=mz(n,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=hne(a,u,m);}let d=yn__default.readdirSync(c);for(let p of d){if(dz.has(p))continue;let m=An__default.join(c,p),f=An__default.join(t,"runs",p);yn__default.cpSync(m,f,{recursive:!0});}}let s=An__default.join(t,"metadata.json");yn__default.writeFileSync(s,JSON.stringify(a,null,2));}var K="v1",iR="cli",Nl="2.104.2";var gne=9e4,Sne=3,yne=1500,Tne=15e3,Ro=class extends Error{status;rawError;constructor(t,n,r,o={}){super(r,o),this.status=t,this.rawError=n;}};async function Ene(e){return e.text().then(t=>{try{return JSON.parse(t).error}catch{return t}})}var aR=class{baseUrl;logger;constructor(t){this.baseUrl=t.baseUrl,this.logger=t.logger;}getHeaders(){let t={"Content-Type":"application/json"};return (t[vg]=Nl),(t[qL]=iR),t}async sendRequest(t,n){let{retries:r=Sne,requestTimeoutMs:o=gne,initialRetryDelayMs:i=yne,maxRetryDelayMs:a=Tne,onFailedRequest:s}=n,l=r,c=r,u,d={path:t,baseUrl:this.baseUrl,method:n.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(t,n,o)}catch(p){u=p;try{s?.(u);}catch{}if(p instanceof Ro&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new ja),l===0)throw u;let m=c-l,f=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,f));}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(t,n,r){let o={path:t,baseUrl:this.baseUrl,method:n.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();n.signal&&n.signal.addEventListener("abort",s,{once:!0});let l=Date.now(),c={...this.getHeaders(),...n.extraHeaders};try{let u=await fetch(`${this.baseUrl}${t}`,{method:n.method,body:n.body?JSON.stringify(n.body):void 0,headers:c,signal:i.signal});if(!u.ok){let m=await Ene(u);throw new Ro(u.status,m,`Request to ${n.method} ${t} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(n.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m);}else {let m=await u.text();try{d=JSON.parse(m);}catch{d=m;}}this.logger&&n.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-l,...o},"Got response from Momentic server");let p=n.responseHeadersObject;return p&&u.headers.forEach((m,f)=>{p[f.toLowerCase()]=m;}),d}finally{clearTimeout(a),n.signal&&n.signal.removeEventListener("abort",s);}}},Kn=class extends aR{apiKey;mode;constructor(t){super(t),this.apiKey=t.apiKey,this.mode=t.mode;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[WL]:this.mode??""}}};var Ay=class extends Error{constructor(t,n){super(t),this.name="ParseError",this.type=n.type,this.field=n.field,this.value=n.value,this.line=n.line;}};function sR(e){}function hz(e){if(typeof e=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=sR,onError:n=sR,onRetry:r=sR,onComment:o}=e,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,T]=bne(`${i}${g}`);for(let y of S)d(y);i=T,a=!1;}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),T=h[g+1]===" "?2:1,y=h.slice(g+T);p(S,y,h);return}p(h,"",h);}function p(h,g,S){switch(h){case"event":c=g;break;case"data":l=`${l}${g}
|
|
202
|
+
`)){let o=r.indexOf("=");if(o===-1)continue;let i=r.slice(0,o),a=r.slice(o+1).trim();n[i]=a;}return n}async function Yte(e,t,n){try{let o=n["github.user"]||void 0;if(o)return o}catch{}let r;try{if(t?.startsWith("http://")||t?.startsWith("https://"))r=new URL(t).host;else if(t?.startsWith("git@")){let o=t.indexOf("@"),i=t.indexOf(":",o+1);o!==-1&&i!==-1&&(r=t.slice(o+1,i));}}catch{}if(r=r?.toLowerCase(),!!r&&t?.startsWith("git@")&&r.includes("github"))try{let{stdout:o,stderr:i}=await qte("ssh",["-T","-o","BatchMode=yes",`git@${r}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}catch{return}}async function Xte(e,t,n){let r=t?.includes("github.com"),o=t?.includes("gitlab.com");try{if(r)return Yte(e,t,n);if(o)return}catch{}}function Ym(e){if(e.startsWith("git@")){let t=e.split(":");if(t.length===2){let n=t[1].replace(".git","").split("/");if(n.length===2){let r=n[0],o=n[1];return `${r}/${o}`}}}else if(e.startsWith("http")||e.startsWith("https")){let n=new URL(e).pathname.split("/").filter(Boolean);if(n.length>=2){let r=n[0],o=n[1].replace(".git","");return `${r}/${o}`}}}function Jte(e){if(!(e instanceof Error))return !1;let t=e.message;return t.includes("not a git repository")||t.includes("ENOENT")}async function gt(e,t){try{return (await t).trim()}catch(n){if(Jte(n))return;e.error({err:n},"Failed to run git command");return}}function Zte(){if(process.env.GITHUB_ACTION)return "GithubActions";if(process.env.GITLAB_CI)return "GitlabCI";if(process.env.CIRCLECI)return "CircleCI";if(process.env.BUILDKITE)return "Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return "AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return "GCPCloudBuild";if(process.env.BITRISE_BUILD_SLUG)return "Bitrise";if(process.env.MOMENTIC_GIT_OVERRIDE)return "Custom"}async function Qte(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return {ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function ene(e){let[t,n,r]=await Promise.all([gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]);return {ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?Di(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:t,gitCommitMessage:n,gitCommitAuthorName:r,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function tne(e){let[t,n,r,o]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??n,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),l=i?Ym(i):void 0;return {ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:a?l:void 0,gitlabProjectPath:s?l:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function nne(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ym(o):void 0;return {ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function rne(e){let[t,n,r]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ym(o):void 0;return {ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:n,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function one(e,t,n){let[r,o,i,a,s,l,c,u,d]=await Promise.all([gt(e,pt.revparse(["HEAD"])),gt(e,pt.revparse(["--short","HEAD"])),gt(e,pt.revparse(["--abbrev-ref","HEAD"])),gt(e,pt.listRemote(["--get-url","origin"])),gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%B"])),gt(e,pt.show(["-s","--pretty=%an"])),t?gt(e,pt.raw(["merge-base","--fork-point",t])):Promise.resolve(void 0),Kte(e)]),p=u||(t?await gt(e,pt.raw(["merge-base",t,"HEAD"])):void 0),m=p?await gt(e,pt.show(["--no-patch","--format=%ci",p])):void 0,f=a?.includes("github.com"),h=a?.includes("gitlab.com"),g=a?Ym(a):void 0,S=d["user.email"]||void 0,T=d["user.name"]||void 0,y=d["user.username"]||void 0,b=d["github.user"]||void 0,P=(n?.includeHostingUsername??!0?await Xte(e,a,d):void 0)??y??b??void 0;return {ciProvider:"none",gitCommitSha:r,gitCommitShaShort:o,gitBranchName:i,gitOriginUrl:a,gitCommitTimestamp:s?Di(s):void 0,gitCommitMessage:l,gitCommitAuthorName:c,gitLocalUsername:P,gitLocalEmail:S,gitLocalName:T,lastCommitOnMainSha:p,lastCommitOnMainTimestamp:m?Di(m):void 0,githubRepository:f?g:void 0,gitlabProjectPath:h?g:void 0,pipelineId:void 0}}async function ine(e){let[t,n]=await Promise.all([gt(e,pt.show(["--no-patch","--format=%ci"])),gt(e,pt.show(["-s","--pretty=%an"]))]),r=process.env.GIT_REPOSITORY_URL,o=r?.includes("github.com"),i=r?.includes("gitlab.com"),a=r?Ym(r):void 0;return {ciProvider:"Bitrise",gitCommitSha:process.env.BITRISE_GIT_COMMIT,gitCommitShaShort:process.env.BITRISE_GIT_COMMIT?.slice(0,6),gitCommitTimestamp:t?Di(t):void 0,gitBranchName:process.env.BITRISE_GIT_BRANCH,gitOriginUrl:r,gitCommitMessage:process.env.BITRISE_GIT_MESSAGE,gitCommitAuthorName:n,githubRepository:o?a:void 0,gitlabProjectPath:i?a:void 0,pipelineId:`${process.env.BITRISE_APP_SLUG}:${process.env.BITRISE_BUILD_SLUG}`}}async function ane(){let e=process.env._HEAD_REPO_URL;return {ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:e?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:e?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function sne(){return {ciProvider:"Custom",gitCommitSha:process.env.GIT_COMMIT_SHA,gitCommitShaShort:process.env.GIT_COMMIT_SHA_SHORT??process.env.GIT_COMMIT_SHA?.slice(0,6),gitCommitTimestamp:Di(process.env.GIT_COMMIT_TIMESTAMP),gitBranchName:process.env.GIT_BRANCH_NAME,gitOriginUrl:process.env.GIT_ORIGIN_URL,gitCommitAuthorName:process.env.GIT_COMMIT_AUTHOR_NAME,gitCommitMessage:process.env.GIT_COMMIT_MESSAGE,lastCommitOnMainSha:process.env.LAST_COMMIT_ON_MAIN_SHA,lastCommitOnMainTimestamp:Di(process.env.LAST_COMMIT_ON_MAIN_TIMESTAMP),mergedGitBranchName:process.env.MERGED_GIT_BRANCH_NAME,githubRepository:process.env.GITHUB_REPOSITORY,gitlabProjectPath:process.env.GITLAB_PROJECT_PATH,gitLocalUsername:process.env.GIT_USERNAME,gitLocalEmail:process.env.GIT_EMAIL,gitLocalName:process.env.GIT_NAME}}async function lne(e){let t=[...e.config.gitProtectedBranches??[]];return e.config.gitMainBranch&&t.push(e.config.gitMainBranch),{gitMainBranch:e.config.gitMainBranch,gitProtectedBranches:t}}async function Xo(e,t,n){let r=Zte();if(!r)return one(e,t,n);switch(r){case"GithubActions":return Qte(e);case"GitlabCI":return ene(e);case"CircleCI":return tne(e);case"Buildkite":return nne(e);case"AzureDevOps":return rne(e);case"GCPCloudBuild":return ane();case"Bitrise":return ine(e);case"Custom":return sne()}}async function cne(e,t,n,r){let o=r,i=r.gitCommitSha;if(!i)return o;let a=r.gitMainBranch;if(a&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let s=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getMergeBaseCommitFromGitlab",fn:()=>t.getMergeBaseCommitFromGitlab(n,a,i),context:{projectPath:n,mainBranch:a}});o={...o,lastCommitOnMainSha:s.sha,lastCommitOnMainTimestamp:s.committer.date};}catch(s){e.warn({err:s},"Failed to get merge base commit from Gitlab");}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let s=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getCommitFromGitlab",fn:()=>t.getCommitFromGitlab(n,i),context:{projectPath:n,gitCommitSha:i}});s&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??s.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??s.author.name,gitCommitMessage:o.gitCommitMessage??s.message});}catch(s){e.warn({err:s},"Failed to get commit from Gitlab");}if(r.gitBranchName&&r.gitBranchName===r.gitMainBranch&&!o.mergedGitBranchName){let s=r.gitBranchName;try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitlab.getMergedBranchFromGitlab",fn:()=>t.getMergedBranchFromGitlab(n,s,i),context:{projectPath:n,branchName:s,gitCommitSha:i}});l.mergedBranch&&(o={...o,mergedGitBranchName:l.mergedBranch});}catch(l){e.warn({err:l},"Failed to get merged branch from Gitlab");}}return o}async function une(e,t,n,r,o){let i=o,a=o.gitCommitSha;if(!a)return i;let s=o.gitMainBranch;if(s&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getMergeBaseCommitFromGithub",fn:()=>t.getMergeBaseCommitFromGithub(n,r,s,a),context:{owner:n,repo:r,mainBranch:s}});i={...i,lastCommitOnMainSha:l.sha,lastCommitOnMainTimestamp:l.committer.date};}catch(l){e.warn({err:l},"Failed to get merge base commit from GitHub");}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let l=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getCommitFromGithub",fn:()=>t.getCommitFromGithub(n,r,a),context:{owner:n,repo:r,gitCommitSha:a}});l&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??l.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??l.author.name,gitCommitMessage:i.gitCommitMessage??l.message});}catch(l){e.warn({err:l},"Failed to get commit from GitHub");}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName){let l=o.gitBranchName;try{let c=await Ao({logger:e,operation:"getRemoteMetadataFromGitHub.getMergedBranchFromGithub",fn:()=>t.getMergedBranchFromGithub(n,r,l,a),context:{owner:n,repo:r,branchName:l,gitCommitSha:a}});c.mergedBranch&&(i={...i,mergedGitBranchName:c.mergedBranch});}catch(c){e.warn({err:c},"Failed to get merged branch from GitHub");}}return i}async function dne(e,t,n){try{if(n.githubRepository){let[r,o]=n.githubRepository.split("/");return await Ao({logger:e,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitHub",fn:()=>une(e,t,r,o,n),context:{githubRepository:n.githubRepository}})}else if(n.gitlabProjectPath){let r=n.gitlabProjectPath;return await Ao({logger:e,operation:"getRemoteMetadataIfNeeded.getRemoteMetadataFromGitlab",fn:()=>cne(e,t,r,n),context:{gitlabProjectPath:r}})}}catch(r){e.warn({err:r},"Failed to get remote git metadata");}return n}async function pne(e,t,n,r){let o={},i={gitMainBranch:n.config.gitMainBranch};return Ao({logger:e,operation:"getGitMetadata.total",fn:async()=>{let[a,s]=await Promise.all([Ao({logger:e,operation:"getGitMetadata.getConfiguredGitMetadata",fn:()=>lne(n),context:{projectConfigPath:n.configFilePath}}),Ao({logger:e,operation:"getGitMetadata.getEnvironmentGitMetadata",fn:async()=>{let u=await Xo(e,n.config.gitMainBranch,r);return i.ciProvider=u.ciProvider,u},context:i})]),l={...a,...s};o.gitBranchName=l.gitBranchName,o.githubRepository=l.githubRepository,o.gitlabProjectPath=l.gitlabProjectPath,(!l.lastCommitOnMainSha||!l.lastCommitOnMainTimestamp)&&l.gitBranchName===a.gitMainBranch&&(l.lastCommitOnMainSha=l.gitCommitSha,l.lastCommitOnMainTimestamp=l.gitCommitTimestamp);let c=await Ao({logger:e,operation:"getGitMetadata.getRemoteMetadataIfNeeded",fn:()=>dne(e,t,l),context:{githubRepository:l.githubRepository,gitlabProjectPath:l.gitlabProjectPath,gitBranchName:l.gitBranchName}});return {...a,...s,...c}},context:o})}async function cz(e){try{let t=await lz(e).remote(["show","origin"]);return t?t.match(/HEAD branch: (.*)$/m)?.[1]?.trim():void 0}catch{return}}async function uz(){try{return (await pt.revparse(["--is-inside-work-tree"])).trim()==="true"}catch{return !1}}var rR=new Map;async function mne(e,t,n){let r,o;try{[r,o]=await Promise.all([gt(e,pt.raw(["symbolic-ref","--short","-q","HEAD"]).then(s=>s.trim())),gt(e,pt.revparse(["--verify","HEAD"]).then(s=>s.trim()))]);}catch{return}if(!r||!o)return;let i=`${t.configFilePath}:${t.config.gitMainBranch}:${t.config.gitProtectedBranches?.join(",")}`,a=`${n?.includeHostingUsername}`;return `${r}:${o}:${i}:${a}`}async function Jo(e,t,n,r){let o=await mne(e,n,r);if(o&&rR.has(o))return e.debug("Using cached git metadata"),rR.get(o);let i=await pne(e,t,n,r);return o&&rR.set(o,i),i}var dz=new Set([".DS_Store","__MACOSX"]),pz={status:(e,t)=>{if(e.status===t.status)return e.status;if(e.status==="FAILED"||t.status==="FAILED")return "FAILED";if(e.status==="CANCELLED"||t.status==="CANCELLED")return "CANCELLED";if(e.status==="RETRYING"||t.status==="RETRYING")return "RETRYING";if(e.status==="RUNNING"||t.status==="RUNNING")return "RUNNING";if(e.status==="PENDING"||t.status==="PENDING")return "PENDING";throw new Error(`Invalid run status merge: ${e.status} and ${t.status}`)},startedAt:(e,t)=>e.startedAt<t.startedAt?e.startedAt:t.startedAt,updatedAt:(e,t)=>e.updatedAt>t.updatedAt?e.updatedAt:t.updatedAt,finishedAt:(e,t)=>!e.finishedAt||!t.finishedAt?new Date:e.finishedAt>t.finishedAt?e.finishedAt:t.finishedAt,gitCommitTimestamp:(e,t)=>{if(!(!e&&!t)){if(!e.gitCommitTimestamp||!t.gitCommitTimestamp||e.gitCommitTimestamp.getTime()!==t.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${e.gitCommitTimestamp} and ${t.gitCommitTimestamp}`);return e.gitCommitTimestamp}},pipelineId:(e,t)=>e.pipelineId===t.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:e.startedAt<t.startedAt?t.pipelineId:e.pipelineId,labels:(e,t)=>{let n=new Set([...e.labels??[],...t.labels??[]]);return Array.from(n)}};function hne(e,t,n){if(pz[n]){let i=pz[n];return i(e,t)}let r=e[n],o=t[n];if(r!==o)throw new Error(`Metadata values for key "${n}" do not match: "${r}" vs "${o}"`);return r}var oR=class extends Error{constructor(t,n){let r=`${t} contains invalid Momentic results: ${n}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(r),this.name="InvalidMomenticResultsPathError";}};function mz(e,t){try{let n=An__default.join(t,"metadata.json");return Ri.parse(JSON.parse(yn__default.readFileSync(n,"utf-8")))}catch{throw new oR(e,t)}}function fz(e,t,n){let r=randomUUID(),o=e.child({runGroupId:r});yn__default.rmSync(t,{recursive:!0,force:!0});let i=yn__default.readdirSync(n).filter(l=>!dz.has(l)).map(l=>An__default.join(n,l));if(i.length===0)throw new Error(`No run groups found in results path: ${n}`);yn__default.mkdirSync(t,{recursive:!0});let a={...mz(n,i[0]),id:r};for(let l of i){let c=An__default.join(l,"runs");if(!yn__default.existsSync(c))continue;let u=mz(n,l);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=hne(a,u,m);}let d=yn__default.readdirSync(c);for(let p of d){if(dz.has(p))continue;let m=An__default.join(c,p),f=An__default.join(t,"runs",p);yn__default.cpSync(m,f,{recursive:!0});}}let s=An__default.join(t,"metadata.json");yn__default.writeFileSync(s,JSON.stringify(a,null,2));}var K="v1",iR="cli",Nl="2.104.3";var gne=9e4,Sne=3,yne=1500,Tne=15e3,Ro=class extends Error{status;rawError;constructor(t,n,r,o={}){super(r,o),this.status=t,this.rawError=n;}};async function Ene(e){return e.text().then(t=>{try{return JSON.parse(t).error}catch{return t}})}var aR=class{baseUrl;logger;constructor(t){this.baseUrl=t.baseUrl,this.logger=t.logger;}getHeaders(){let t={"Content-Type":"application/json"};return (t[vg]=Nl),(t[qL]=iR),t}async sendRequest(t,n){let{retries:r=Sne,requestTimeoutMs:o=gne,initialRetryDelayMs:i=yne,maxRetryDelayMs:a=Tne,onFailedRequest:s}=n,l=r,c=r,u,d={path:t,baseUrl:this.baseUrl,method:n.method};for(;l>0;)try{return l--,await this.sendSingleRequestHelper(t,n,o)}catch(p){u=p;try{s?.(u);}catch{}if(p instanceof Ro&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new ja),l===0)throw u;let m=c-l,f=Math.min(i*Math.pow(2,m-1),a);await new Promise(h=>setTimeout(h,f));}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(t,n,r){let o={path:t,baseUrl:this.baseUrl,method:n.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();n.signal&&n.signal.addEventListener("abort",s,{once:!0});let l=Date.now(),c={...this.getHeaders(),...n.extraHeaders};try{let u=await fetch(`${this.baseUrl}${t}`,{method:n.method,body:n.body?JSON.stringify(n.body):void 0,headers:c,signal:i.signal});if(!u.ok){let m=await Ene(u);throw new Ro(u.status,m,`Request to ${n.method} ${t} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(n.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m);}else {let m=await u.text();try{d=JSON.parse(m);}catch{d=m;}}this.logger&&n.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-l,...o},"Got response from Momentic server");let p=n.responseHeadersObject;return p&&u.headers.forEach((m,f)=>{p[f.toLowerCase()]=m;}),d}finally{clearTimeout(a),n.signal&&n.signal.removeEventListener("abort",s);}}},Kn=class extends aR{apiKey;mode;constructor(t){super(t),this.apiKey=t.apiKey,this.mode=t.mode;}getHeaders(){return {...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[WL]:this.mode??""}}};var Ay=class extends Error{constructor(t,n){super(t),this.name="ParseError",this.type=n.type,this.field=n.field,this.value=n.value,this.line=n.line;}};function sR(e){}function hz(e){if(typeof e=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=sR,onError:n=sR,onRetry:r=sR,onComment:o}=e,i="",a=!0,s,l="",c="";function u(h){let g=a?h.replace(/^\xEF\xBB\xBF/,""):h,[S,T]=bne(`${i}${g}`);for(let y of S)d(y);i=T,a=!1;}function d(h){if(h===""){m();return}if(h.startsWith(":")){o&&o(h.slice(h.startsWith(": ")?2:1));return}let g=h.indexOf(":");if(g!==-1){let S=h.slice(0,g),T=h[g+1]===" "?2:1,y=h.slice(g+T);p(S,y,h);return}p(h,"",h);}function p(h,g,S){switch(h){case"event":c=g;break;case"data":l=`${l}${g}
|
|
203
203
|
`;break;case"id":s=g.includes("\0")?void 0:g;break;case"retry":/^\d+$/.test(g)?r(parseInt(g,10)):n(new Ay(`Invalid \`retry\` value: "${g}"`,{type:"invalid-retry",value:g,line:S}));break;default:n(new Ay(`Unknown field "${h.length>20?`${h.slice(0,20)}\u2026`:h}"`,{type:"unknown-field",field:h,value:g,line:S}));break}}function m(){l.length>0&&t({id:s,event:c||void 0,data:l.endsWith(`
|
|
204
204
|
`)?l.slice(0,-1):l}),s=void 0,l="",c="";}function f(h={}){i&&h.consume&&d(i),a=!0,s=void 0,l="",c="",i="";}return {feed:u,reset:f}}function bne(e){let t=[],n="",r=0;for(;r<e.length;){let o=e.indexOf("\r",r),i=e.indexOf(`
|
|
205
205
|
`,r),a=-1;if(o!==-1&&i!==-1?a=Math.min(o,i):o!==-1?a=o:i!==-1&&(a=i),a===-1){n=e.slice(r);break}else {let s=e.slice(r,a);t.push(s),r=a+1,e[r-1]==="\r"&&e[r]===`
|
|
@@ -224,7 +224,7 @@ ${t}:`]}}function kz({id:e,model:t,created:n}){return {id:e??void 0,modelId:t??v
|
|
|
224
224
|
`)}var gie="MOMENTIC_OPENAI_RESPONSES_WEBSOCKET_COMPACT_THRESHOLD",Sie=2e5;function RR(e){let{apiKey:t,sessionId:n,extraHeaders:r,loggerTags:o}=e,i={Authorization:`Bearer ${t}`,[vg]:Nl,...n&&{[YL]:n},...r||{}};return o&&(i[KL]=JSON.stringify(o)),i}var Qz=e=>t=>{let n=RR(e);return createAnthropic({baseURL:`${e.baseUrl}/v1/llm/anthropic/${t}`,headers:n,apiKey:e.apiKey})(t)},eV=e=>t=>{let n=RR(e),r=e.useOpenAIResponsesWebSocket??!1,o=r?e.openAIResponsesWebSocketCompactThreshold??yie(process.env[gie])??Sie:void 0;return Ny({baseURL:`${e.baseUrl}/v1/llm/provider/openai/${t}`,headers:n,apiKey:e.apiKey,fetch:r?Jz({compactThreshold:o}):void 0})(t)},tV=e=>t=>{let n=RR(e);return Ny({baseURL:`${e.baseUrl}/v1/llm/provider/azure/${t}`,headers:n,apiKey:e.apiKey})(t)};function yie(e){if(!e)return;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:void 0}var Xn=class extends Kn{agentConfig;constructor(t,n){let r={...Wc,...t};GM(r),super(n),this.agentConfig=r;}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(t,n){let r={...t,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:n.abortSignal});return wM.parse(o)}async rankChunksWithRag(t,n){let r=await this.sendRequest(`/${K}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Nl,...t},signal:n.abortSignal});return RM.parse(r)}async getScreenshotFromS3(t){let n=await this.sendRequest(`/${K}/s3/visual-diff-screenshot`,{method:"POST",body:{url:t}});return z.string().parse(n)}async getElementLocation(t,n){let r={...t,disableCache:n.disableCache,loggerTags:n.loggerTags,useMemory:n.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${K}/web-agent/locate-element`,{method:"POST",body:r,signal:n.abortSignal});return tN.parse(o)}async getAssertionResult(t,n){let r={...t,disableCache:!!n.disableCache,useConsensus:!!n.useConsensus,attemptNumber:n.attemptNumber,loggerTags:n.loggerTags,useMemory:n.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${K}/web-agent/assertion`,{method:"POST",body:r,signal:n.abortSignal});return Dv.parse(o)}async getLintStepResult(t,n){let r={...t,disableCache:!!n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/lint/step`,{method:"POST",body:r,signal:n.abortSignal});return eN.parse(o)}async getLintMcpCopilotMessageResult(t,n){let r={message:t.message,disableCache:!!n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/lint/mcp-copilot`,{method:"POST",body:r,signal:n.abortSignal});return JL.parse(o)}async getMcpCopilotConversationEvaluation(t,n){let r={messagesAndToolCalls:t.messagesAndToolCalls,disableCache:!!n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:r,signal:n.abortSignal});return ZL.parse(o)}async getMcpCopilotChatSummary(t,n){let r={messagesAndToolCalls:t.messagesAndToolCalls,disableCache:!!n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:r,signal:n.abortSignal});return QL.parse(o)}async getVisualAssertionResult(t,n){let r={...t,disableCache:!!n.disableCache,useConsensus:!!n.useConsensus,attemptNumber:n.attemptNumber,loggerTags:n.loggerTags,useMemory:n.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${K}/web-agent/visual-assertion`,{method:"POST",body:r,signal:n.abortSignal});return Dv.parse(o)}async getAiActionCommand(t,n){let r=await this.sendRequest(`/${K}/web-agent/next-command-dynamic`,{method:"POST",body:{...t,disableCache:n.disableCache,loggerTags:n.loggerTags},signal:n.abortSignal});return XL.parse(r)}async getMultiturnAiActionCommand(t,n){return await this.sendRequest(`/${K}/web-agent/ai-action/next-command`,{method:"POST",body:{...t,disableCache:n.disableCache,loggerTags:n.loggerTags},signal:n.abortSignal})}async getMultiturnAiActionEvaluation(t,n){let r=await this.sendRequest(`/${K}/web-agent/ai-action/evaluate`,{method:"POST",body:{...t,disableCache:n.disableCache,loggerTags:n.loggerTags},signal:n.abortSignal});return Lb.parse(r)}async getReverseMappedDescription(t,n){let r=await this.sendRequest(`/${K}/web-agent/reverse-mapped-description`,{method:"POST",body:{...t,disableCache:n.disableCache,loggerTags:n.loggerTags},signal:n.abortSignal});return nN.parse(r)}async getTextExtraction(t,n){let r={...t,disableCache:n.disableCache,loggerTags:n.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${K}/web-agent/text-extraction`,{method:"POST",body:r,signal:n.abortSignal});return Ob.parse(o)}async getPageSummary(t,n){let r={...t,disableCache:n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/page-summary`,{method:"POST",body:r,signal:n.abortSignal});return $P.parse(o)}async getSmartWaitingDecision(t,n){let r={...t,disableCache:n.disableCache,loggerTags:n.loggerTags},o=await this.sendRequest(`/${K}/web-agent/smart-waiting`,{method:"POST",body:r,signal:n.abortSignal});return WP.parse(o)}async getTestResultClassification(t,n){let r=await this.sendRequest(`/${K}/web-agent/result-classification`,{method:"POST",body:{...t,loggerTags:n.loggerTags},signal:n.abortSignal});return bh.parse(r)}async getExtractedKeywords(t,n){let r=await this.sendRequest(`/${K}/web-agent/extract-keywords`,{method:"POST",body:t,signal:n.abortSignal});return VM.parse(r)}async getAutohealingProposal(t,n){let r=await this.sendRequest(`/${K}/web-agent/autoheal-section`,{method:"POST",body:{...t,loggerTags:n.loggerTags},signal:n.abortSignal});return zP.parse(r)}async getFailureRecoveryProposal(t,n){let r=await this.sendRequest(`/${K}/web-agent/failure-recovery`,{method:"POST",body:{...t,loggerTags:n.loggerTags},signal:n.abortSignal});return GP.parse(r)}async getFailureRecoveryPlan(t,n){let r=await this.sendRequest(`/${K}/web-agent/failure-recovery-plan`,{method:"POST",body:{...t,loggerTags:n.loggerTags,agentConfigVersion:this.agentConfig?.["failure-recovery"]},signal:n.abortSignal});return HP.parse(r)}async getIframeRegex(t,n){let r=await this.sendRequest(`/${K}/web-agent/iframe-regex`,{method:"POST",body:{...t,loggerTags:n.loggerTags},signal:n.abortSignal});return PI.parse(r)}getAnthropicModelFactory(t){let{sessionId:n,logger:r,streamType:o}=t;return Qz({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Je(r),promptType:o},sessionId:n})}getOpenAIModelFactory(t){let{sessionId:n,logger:r,streamType:o,useOpenAIResponsesWebSocket:i}=t;return eV({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Je(r),promptType:o},sessionId:n,useOpenAIResponsesWebSocket:i})}getAzureOpenAIModelFactory(t){let{sessionId:n,logger:r,streamType:o}=t;return tV({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:{...Je(r),promptType:o},sessionId:n})}};var Tt=class extends Kn{constructor(t){super({...t,mode:void 0});}getAppUrl(){return cu(this.baseUrl)}async getAuthInfo(){let t;try{t=await this.sendRequest(`/${K}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:n=>{let r=n.name==="AbortError"?"Request timed out":n.message;C.warn(`API key check failed: ${r}`);}});}catch(n){throw n instanceof Ro?n.status>=400&&n.status<500?new Error(n.rawError,{cause:n}):new Error(`Momentic server error (HTTP ${n.status}). Please try again in a moment.`,{cause:n}):new Error(`Could not reach Momentic server at ${this.baseUrl}. Check your network connection. If you're on a restricted network (VPN, firewall, or proxy), you may need to whitelist Momentic's servers: https://momentic.ai/docs/environment/authentication#ip-whitelist`,{cause:n})}return yN.parse(t)}async bulkGetRunStatus(t){let n=await this.sendRequest(`/${K}/runs/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return mN.parse(n)}async getRunExport(t){let n=await this.sendRequest(`/${K}/runs/${encodeURIComponent(t)}/export`,{method:"GET",retries:3,requestTimeoutMs:1e4});return hN.parse(n)}async getTestYAMLExport(t){let n=await this.sendRequest(`/${K}/tests/export`,{method:"POST",body:t,retries:3,requestTimeoutMs:3e4});return oN.parse(n)}async updateStepCaches(t,n){await this.sendRequest(`/${K}/cache`,{method:"PATCH",body:t,extraHeaders:n,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3});}async updateSnapshotCaches(t,n){await this.sendRequest(`/${K}/snapshot-cache`,{method:"PATCH",body:t,extraHeaders:n,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3});}async getStepCacheForTest(t,n){let r=await this.sendRequest(`/${K}/cache`,{method:"POST",body:t,extraHeaders:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return sN.parse(r)}async getSnapshotCacheForTest(t,n){let r=await this.sendRequest(`/${K}/snapshot-cache`,{method:"POST",body:t,extraHeaders:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return lN.parse(r)}async deleteStepCacheEntry(t,n){await this.sendRequest(`/${K}/cache/entry`,{method:"DELETE",body:t,extraHeaders:n,retries:3,requestTimeoutMs:1e4});}async getWebStepCacheMemoryTraces(t){let n=await this.sendRequest(`/${K}/cache/traces`,{method:"POST",body:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return kv.parse(n)}cacheRouteForPlatform(t){switch(t){case"ANDROID":return "android-cache";case"IOS":return "ios-cache"}}async deleteMobileStepCacheEntry({platform:t,body:n,headers:r}){await this.sendRequest(`/${K}/${this.cacheRouteForPlatform(t)}/entry`,{method:"DELETE",body:n,extraHeaders:r,retries:3,requestTimeoutMs:1e4});}async getMobileStepCacheMemoryTraces(t,n){let r=await this.sendRequest(`/${K}/${this.cacheRouteForPlatform(t)}/traces`,{method:"POST",body:n,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return kv.parse(r)}async updateMobileStepCaches(t){await this.sendRequest(`/${K}/${this.cacheRouteForPlatform(t.platform)}`,{method:"PATCH",body:t.body,extraHeaders:t.headers,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3});}async getMobileStepCacheForTest({platform:t,body:n,headers:r}){let o=await this.sendRequest(`/${K}/${this.cacheRouteForPlatform(t)}`,{method:"POST",body:n,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return cN(ZO[t]).parse(o)}async queueTests(t){let n=await this.sendRequest(`/${K}/tests/queue`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return rN.parse(n)}async uploadScreenshot(t){let n=await this.sendRequest(`/${K}/screenshots`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return SN.parse(n)}async uploadOnDemandScreenshot(t){return await this.sendRequest(`/${K}/on-demand-screenshots`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${K}/on-demand-screenshots/${t.id}`}}async fetchOnDemandScreenshot(t){let n={};return {data:await this.sendRequest(`/${K}/on-demand-screenshots/${encodeURIComponent(t)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:n}),contentType:n["content-type"]??"image/jpeg"}}async getAllEnvironments(){let t=await this.sendRequest(`/${K}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return TN.parse(t)}async acquireCacheLock(t,n){let r=await this.sendRequest(`/${K}/result-cache/lock`,{method:"POST",body:t,signal:n,retries:3,requestTimeoutMs:3e4});return DN.parse(r)}async releaseCacheLock(t){await this.sendRequest(`/${K}/result-cache/lock`,{method:"DELETE",body:{key:t},retries:3,requestTimeoutMs:5e3});}async deleteCacheResult(t){await this.sendRequest(`/${K}/result-cache/entry`,{method:"DELETE",body:t,retries:3,requestTimeoutMs:5e3});}async setCacheResult(t){await this.sendRequest(`/${K}/result-cache/entry`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:5e3});}async getCacheResult(t){try{return await this.sendRequest(`/${K}/result-cache/entry`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3})}catch(n){if(n instanceof Error&&n.message.includes("404"))return null;throw n}}async queueSuiteRuns(t){let n=await this.sendRequest(`/${K}/suites/queue`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return EN.parse(n)}async bulkGetRunGroupStatus(t){let n={runGroupIds:t},r=await this.sendRequest(`/${K}/run-groups/status`,{method:"POST",body:n,retries:3,requestTimeoutMs:5e3});return TM.array().parse(r)}async uploadProposedSteps(t,n){try{await this.sendRequest(`/${K}/test-fragments/`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});}catch(r){n.error({err:r},"Failed to upload proposed steps");}}async reportBillableEvents(t,n){try{await this.sendRequest(`/${K}/billing/events`,{method:"POST",body:n,retries:10,requestTimeoutMs:1e4});}catch(r){t.error({err:r},"Failed to report billable event");}}async fetchTestFragment(t){let n=await this.sendRequest(`/${K}/test-fragments/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return bN.parse(n)}async patchTestFragment(t,n){await this.sendRequest(`/${K}/test-fragments/${t}`,{method:"PATCH",body:n,retries:3,requestTimeoutMs:1e4});}async getPastTestResults(t,n){let r=await this.sendRequest(`/${K}/results/tests/${t}`,{method:"POST",body:n,retries:3,requestTimeoutMs:1e4});return vN.parse(r)}async listRuns(t){let n=await this.sendRequest(`/${K}/results/runs`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return CN.parse(n)}async generateTestResultsUploadUrl(){let t=await this.sendRequest(`/${K}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return AN.parse(t)}async startProcessingResultsUpload(t,n){let r=await this.sendRequest(`/${K}/results/uploads/${t}/process`,{method:"POST",body:n,retries:3,requestTimeoutMs:1e4});return RN.parse(r)}async fetchIconKnowledgeBase(t){try{let n=await this.sendRequest(`/${K}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return zN.parse(n)}catch(n){return t.error({err:n},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(t,n){try{await this.sendRequest(`/${K}/knowledge-base/icons`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});}catch(r){n.error({err:r},"Failed to save new icons to icon knowledge base");}}async getMergeBaseCommitFromGithub(t,n,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let a=await this.sendRequest(`/${K}/git/github/${t}/${n}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Hp.parse(a)}async createGithubPullRequest(t,n,r){let o=await this.sendRequest(`/${K}/git/github/${t}/${n}/pull-requests`,{method:"POST",body:r,retries:3,requestTimeoutMs:6e4});return vL.parse(o)}async getCommitFromGithub(t,n,r){let o=await this.sendRequest(`/${K}/git/github/${t}/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Hp.parse(o)}async getMergedBranchFromGithub(t,n,r,o){let i=encodeURIComponent(r),a=await this.sendRequest(`/${K}/git/github/${t}/${n}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Uv.parse(a)}async getMergeBaseCommitFromGitlab(t,n,r){let o=new URLSearchParams;o.set("base",n),o.set("head",r);let i=encodeURIComponent(t),a=await this.sendRequest(`/${K}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Hp.parse(a)}async getCommitFromGitlab(t,n){let r=encodeURIComponent(t),o=await this.sendRequest(`/${K}/git/gitlab/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Hp.parse(o)}async getMergedBranchFromGitlab(t,n,r){let o=encodeURIComponent(n),i=encodeURIComponent(t),a=await this.sendRequest(`/${K}/git/gitlab/${i}/${o}/${r}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Uv.parse(a)}async getAgentConfig(){let t=await this.sendRequest(`/${K}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return z.record(z.string(),z.string()).parse(t)}async getQuarantinedTests(){let t=await this.sendRequest(`/${K}/quarantine`,{method:"GET"});return wN.parse(t)}async quarantineTest(t,n,r){await this.sendRequest(`/${K}/quarantine`,{method:"POST",body:{testId:t.id,testName:t.name,reason:n,...r??{}},retries:3,requestTimeoutMs:1e4});}async unquarantineTest(t,n,r){await this.sendRequest(`/${K}/quarantine/${t.id}`,{method:"DELETE",body:{testName:t.name,reason:n,...r??{}},retries:3,requestTimeoutMs:1e4});}platformRoute(t){switch(t){case"ANDROID":return "android";case"IOS":return "ios"}}async createAndroidEmulator(t){let n=await this.sendRequest(`/${K}/limbar/android`,{method:"POST",retries:3,body:t,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return xN.parse(n)}async extendEmulatorTtl(t,n){try{await this.sendRequest(`/${K}/limbar/${this.platformRoute(t)}/${n}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3});}catch{}}async generateAssetUploadUrl({channel:t,tag:n,md5:r,platform:o}){let i={channel:t,tag:n,md5:r},a=await this.sendRequest(`/${K}/limbar/${this.platformRoute(o)}/upload-url`,{method:"POST",retries:3,body:i,requestTimeoutMs:15e3,logResponse:!0});return _N.parse(a)}async deleteAndroidEmulator(t){await this.sendRequest(`/${K}/limbar/android/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4});}async getMobileAssets(){let t=await this.sendRequest(`/${K}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return PN.parse(t)}async getLimbarAssetDownloadUrl(t,n,r){let o=await this.sendRequest(`/${K}/limbar/assets/${t}/${n}/${this.platformRoute(r)}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return MN.parse(o)}async deleteAsset(t,n,r){await this.sendRequest(`/${K}/limbar/assets/${t}/${n}/${this.platformRoute(r)}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4});}async createIosEmulator(t){let n=await this.sendRequest(`/${K}/limbar/ios`,{method:"POST",retries:3,body:t,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return IN.parse(n)}async deleteIosEmulator(t){await this.sendRequest(`/${K}/limbar/ios/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4});}async generateMobileLogcatUploadUrl(t){let n=await this.sendRequest(`/${K}/logcat/mobile/upload`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return dL.parse(n)}async generateMcpSessionTraceUploadUrl(t){let n=await this.sendRequest(`/${K}/mcp/upload`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return Fv.parse(n)}};async function Jm(e){let t=process.versions.node,n=parseInt(t.split(".")[0]);(isNaN(n)||n<18)&&(C.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),C.debug(`Identified node version ${t}`);let r=await e.client.getAuthInfo();return C.debug("Got auth info from API"),r}var fs=class{apiClient;constructor(t){this.apiClient=t;}async reportBillableEvents(t,n){await this.apiClient.reportBillableEvents(t,n);}};var hs=class extends Kn{generator;constructor(t,n){super(t),this.generator=n;}async runTemplateMatching(t,n={}){let r=await this.sendRequest(`/${K}/web-agent/template-matching`,{method:"POST",body:t,signal:n?.signal});return MI.parse(r)}async constructIframeRegex(t,n={}){return this.generator.getIframeRegex(t,{abortSignal:n.signal,loggerTags:n.loggerTags})}};var td=class{constructor(t,n){this.client=t;this.orgId=n;}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let t=this.getApiServerUrl();return cu(t)}async acquireCacheLock(t,n){return this.client.acquireCacheLock(t,n)}async createOnDemandScreenshot(t,n,r){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:t,screenshot:n.toString("base64"),contentType:r});return {apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${t}`,universalHandle:{id:t,contentType:r}}}async fetchOnDemandScreenshot(t){return this.client.fetchOnDemandScreenshot(t.id)}async releaseCacheLock(t){return this.client.releaseCacheLock(t)}async deleteCacheResult(t){return this.client.deleteCacheResult(t)}async setCacheResult(t){return this.client.setCacheResult(t)}async getCacheResult(t){return this.client.getCacheResult(t)}fetchIconKnowledgeBase(t){return this.client.fetchIconKnowledgeBase(t)}saveNewIcons(t,n){return this.client.saveNewIcons(t,n)}};var Zm="v1",Bi=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};constructor(t){this.httpClient=t.httpClient,t.fakerSeed&&(this.fakerInstance=new Faker({locale:en}),this.fakerInstance.seed(t.fakerSeed));}async sendSms(t){return this.httpClient.sendRequest(`/${Zm}/tools/sms/send`,{method:"POST",body:t}).then(()=>{}).catch(n=>{throw n instanceof Ro?new Error(n.rawError):new Error(`Failed to send sms: ${n.message}`)})}async fetchLatestSms(t){return this.httpClient.sendRequest(`/${Zm}/tools/sms/fetchLatest`,{method:"POST",body:t}).catch(n=>{throw n instanceof Ro?new Error(n.rawError):n})}async sendEmail(t){return this.httpClient.sendRequest(`/${Zm}/tools/email/send`,{method:"POST",body:t}).then(()=>{}).catch(n=>{throw n instanceof Ro?new Error(n.rawError):new Error(`Failed to send email: ${n.message}`)})}async fetchAllEmails(t){return this.httpClient.sendRequest(`/${Zm}/tools/email/fetchAll`,{method:"POST",body:t}).catch(n=>{throw n instanceof Ro?new Error(n.rawError):new Error(`Failed to fetch all emails: ${n.message}`)})}async fetchLatestEmail(t){return this.httpClient.sendRequest(`/${Zm}/tools/email/fetchLatest`,{method:"POST",body:t}).catch(n=>{throw n instanceof Ro?new Error(n.rawError):new Error(`Failed to fetch latest emails: ${n.message}`)})}};function nV(e,t,n){return fetch(e,{method:"PUT",body:n,headers:{"Content-Type":t}})}var ky=class{constructor(t){this.client=t;}async uploadResultsArchive(t,n){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await nV(r,"application/zip",n);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:t});return a}};function Fy({logger:e,orgId:t,client:n,gitMetadata:r,regenerateCache:o,alwaysSaveCache:i,noCache:a,isolateCachesByEnvironment:s=!1,bustOldestCachePercentage:l}){return a?new Cg:new xR(e,t,n,r,{regenerateCache:o,alwaysSaveCache:i,bustOldestCachePercentage:l,isolateCachesByEnvironment:s})}var xR=class{constructor(t,n,r,o,i){this.orgId=n;this.client=r;let{regenerateCache:a,alwaysSaveCache:s,bustOldestCachePercentage:l,isolateCachesByEnvironment:c}=i,{gitBranchName:u,gitProtectedBranches:d}=o;t.info({options:i,gitBranchName:u,gitProtectedBranches:d},"Cache storage initialization options"),this.cacheHeaders=iN(o),this.isolateCachesByEnvironment=c,this.readCaches=!a;let p=u&&d.includes(u);s||!p?this.writeCaches=!0:this.writeCaches=!1,p||(this.bustOldestCachePercentage=l);}cacheHeaders;readCaches;writeCaches;isolateCachesByEnvironment;bustOldestCachePercentage;async saveStepCacheEntries({entries:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:Bv(t,this.isolateCachesByEnvironment)},this.cacheHeaders);}catch(r){n.error({err:r},"Failed to save step cache entries");}}async saveSnapshotCacheEntries({entries:t,logger:n}){if(!this.writeCaches){n.debug("Skipping snapshot cache storage because branch is protected");return}try{await this.client.updateSnapshotCaches({entries:Bv(t,this.isolateCachesByEnvironment)},this.cacheHeaders);}catch(r){n.error({err:r},"Failed to save snapshot cache entries");}}async deleteStepCacheEntry({logger:t,testId:n,key:r,environment:o}){try{await this.client.deleteStepCacheEntry({testId:n,key:r,environment:this.isolateCachesByEnvironment?o:void 0},this.cacheHeaders);}catch(i){t.error({err:i},"Failed to delete step cache entry");}}async resolveStepCacheEntries(t){if(!this.readCaches){t.logger.debug("Skipping cache resolution because of regenerate flag");return}t.useSnapshotIdentityCache&&await this.restoreStepIdsFromSnapshot(t);let{steps:n,beforeSteps:r,afterSteps:o}=t.stepLists,i=await this.client.getStepCacheForTest({testId:t.testId,environment:this.isolateCachesByEnvironment?t.environment:void 0},this.cacheHeaders);if(this.bustOldestCachePercentage!==void 0){let l=Object.entries(i).map(([d,p])=>({key:d,time:p.value.cache?.updatedAt?.getTime()??0}));l.sort((d,p)=>d.time-p.time);let c=l.length,u=Math.max(1,Math.floor(c*this.bustOldestCachePercentage/100));l.slice(0,u).forEach(({key:d})=>{delete i[d];}),t.logger.info({nCachesToBust:u,bustOldestCachePercentage:this.bustOldestCachePercentage,totalCaches:c},"Busted oldest caches");}for(let l of [n,r,o])l&&El({steps:l,stepCacheEntries:i,logger:t.logger});if(!this.writeCaches){t.logger.debug("Skipping cache last used at update because branch is protected");return}let{cachesToSave:a,snapshotCachesToSave:s}=await Sn({stepLists:t.stepLists,useSnapshotIdentityCache:t.useSnapshotIdentityCache,cacheCreationParams:{environment:t.environment,testId:t.testId,orgId:this.orgId}});t.useSnapshotIdentityCache&&this.saveSnapshotCacheEntries({entries:s,logger:t.logger}),this.saveStepCacheEntries({entries:a,logger:t.logger});}async restoreStepIdsFromSnapshot(t){let{logger:n,testId:r}=t,o=await this.client.getSnapshotCacheForTest({testId:r,environment:this.isolateCachesByEnvironment?t.environment:void 0},this.cacheHeaders),i=wB({entries:o,orgId:this.orgId,testId:r,logger:n}),a=RB({currentStepLists:t.stepLists,previousSnapshot:i.testSnapshot,previousModuleSnapshots:i.moduleSnapshots,generateUuid:randomUUID});t.stepLists.steps.splice(0,t.stepLists.steps.length,...a.stepLists.steps),t.stepLists.beforeSteps=a.stepLists.beforeSteps,t.stepLists.afterSteps=a.stepLists.afterSteps,n.debug({snapshotEntries:o.length,moduleSnapshots:Array.from(i.moduleSnapshots.keys()),mintedSteps:a.stats.mintedSteps,stats:a.stats,moduleRestoreResults:a.moduleRestoreResults.map(({moduleId:s,snapshotHit:l,stats:c})=>({moduleId:s,snapshotHit:l,stats:c}))},"Restored step ids from snapshot cache"),n.debug({testDebugTrace:a.testDebugTrace,moduleDebugTraces:a.moduleRestoreResults.map(({moduleId:s,debugTrace:l})=>({moduleId:s,debugTrace:l}))},"Step identity restoration debug trace");}};function Cie(e){let t=new rV,n=An__default.join(e,"metadata.json"),r=Ri.parse(JSON.parse(yn__default.readFileSync(n,"utf-8")));t.addLocalFile(n);for(let o of yn__default.readdirSync(An__default.join(e,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new rV(An__default.join(e,"runs",o));for(let s of a.getEntries())s.isDirectory||t.addFile(An__default.join("runs",i,s.entryName),s.getData());}return {runGroupId:r.id,buffer:t.toBuffer()}}async function By(e){let{client:t,consoleLogger:n,resultsPath:r}=e;if(!yn__default.existsSync(r))return n.warn("Results path does not exist, skipping upload."),{success:!1};let o=new ky(t);try{let{runGroupId:i,buffer:a}=Cie(r),s=await o.uploadResultsArchive(i,a),l=`${t.getAppUrl()}/run-groups/${s}`;return n.success(`Successfully uploaded test results. Once processed, your results can be found at ${l}`),{success:!0}}catch(i){let a;return i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",n.error(`Failed to upload test results: ${a}.`),{success:!1}}}var Qm=class e{constructor(t){this.filePath=t;yn__default.rmSync(this.filePath,{recursive:!0,force:!0}),yn__default.mkdirSync(this.filePath,{recursive:!0});}children=[];streams=[];close(){for(let t of this.children)t.close();for(let t of this.streams)t.end();}cd(t){let n=new e(An__default.join(this.filePath,t));return this.children.push(n),n}cwd(){return this.filePath}mkdir(t){yn__default.mkdirSync(An__default.join(this.filePath,t),{recursive:!0});}readFile(t){let n=An__default.join(this.filePath,t);if(yn__default.existsSync(n))return yn__default.readFileSync(n)}storeFile(t){let{name:n,contents:r}=t,o=An__default.join(this.filePath,n);try{yn__default.writeFileSync(o,r);}catch{}}createFileStream(t){let n=An__default.join(this.filePath,t),r=yn__default.createWriteStream(n);return this.streams.push(r),r}createRunArchive(t){let n=new _R(An__default.join(this.filePath,"runs"),t);return this.children.push(n),n}},_R=class{children=[];tempPath;finalPath;constructor(t,n){this.tempPath=An__default.join(t,`temp-storage-${n}`),this.finalPath=An__default.join(t,`${n}.zip`),yn__default.rmSync(this.tempPath,{recursive:!0,force:!0}),yn__default.rmSync(this.finalPath,{recursive:!0,force:!0}),yn__default.mkdirSync(this.tempPath,{recursive:!0});}readFile(t){let n=An__default.join(this.tempPath,t);if(yn__default.existsSync(n))return yn__default.readFileSync(n)}mkdir(t){yn__default.mkdirSync(An__default.join(this.tempPath,t),{recursive:!0});}cd(t){let n=new Qm(An__default.join(this.tempPath,t));return this.children.push(n),n}cwd(){return this.tempPath}storeFile(t){let{name:n,contents:r}=t,o=An__default.join(this.tempPath,n);yn__default.writeFileSync(o,r);}close(){for(let r of this.children)r.close();let t=new rV;t.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let n=t.toBuffer();yn__default.writeFileSync(this.finalPath,n),yn__default.rmSync(this.tempPath,{recursive:!0,force:!0});}};function sV(e){try{return yn__default.existsSync(e)?JSON.parse(yn__default.readFileSync(e,"utf-8")):void 0}catch{return}}function oV(e){return yn__default.existsSync(e)?yn__default.readFileSync(e,"utf-8").split(`
|
|
225
225
|
`).map(n=>n.trim()).filter(n=>n.length>0):[]}function xie(e,t){let n=e.attemptIdToAttemptNumber.get(t);if(n)return An__default.join(e.inflatedPath,"attempts",n);let r=An__default.join(e.inflatedPath,"attempts");if(!yn__default.existsSync(r))return;let o=yn__default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=An__default.join(r,i,"metadata.json"),s=sV(a);if(typeof s!="object"||s===null)continue;let l=s.id;if(typeof l=="string"&&l===t)return e.attemptIdToAttemptNumber.set(t,i),An__default.join(r,i)}}function iV(e,t,n){let r=An__default.join(e,"attempts");if(!yn__default.existsSync(r))return;let o=yn__default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=An__default.join(r,i,"assets",`${t}.${n}`);if(yn__default.existsSync(a))return a}}var zy=class{constructor(t,n,r){this.outputDir=t;this.runId=n;this.runAttemptId=r;this.runsDir=An__default.join(t,"runs"),this.zipPath=An__default.join(this.runsDir,`${n}.zip`);}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(t){let n=this.inflatedByRunId.get(t);if(n)return n;if(t!==this.runId||!yn__default.existsSync(this.zipPath))return;let r=An__default.join(this.runsDir,`temp-unzipped-${t}-${randomUUID()}`);yn__default.mkdirSync(r,{recursive:!0}),new rV(this.zipPath).extractAllTo(r,!0);let i={runId:t,zipPath:this.zipPath,inflatedPath:r,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(t,i),i}close(){for(let t of this.inflatedByRunId.values())yn__default.rmSync(t.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear();}getAttemptDir(){let t=this.ensureInflatedRun(this.runId);if(t)return xie(t,this.runAttemptId)}listVideoAssetPaths(){let t=this.getAttemptDir();if(!t)return [];let n=An__default.join(t,"assets");return yn__default.existsSync(n)?yn__default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>An__default.join(n,o.name)).filter(o=>{let i=An__default.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(t,n){let r=this.getAttemptDir();if(!r)return;let o=An__default.join(r,"assets",`${t}.${n}`);if(yn__default.existsSync(o))try{return yn__default.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(t,n,r){if(n!==this.runId||r!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=sV(An__default.join(o,"console.json")),a=wv.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(t,n,r){if(n!==this.runId||r!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=An__default.join(o,"assets","har-pages.log"),a=An__default.join(o,"assets","har-entries.log"),s={};for(let u of oV(i)){let d=Dp.safeParse(aV(u));d.success&&(s[d.data.id]=d.data);}let l={},c=oV(a);for(let u=0;u<c.length;u++){let d=c[u],p=kp.safeParse(aV(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;l[m]=p.data;}if(Object.keys(l).length!==0)return xv(s,l)}async getHtmlSnapshot(t,n){let r=this.readAttemptAssetText(n,"html");if(r)return r;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=iV(o.inflatedPath,n,"html");if(i)try{return yn__default.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(t,n){let r=this.readAttemptAssetText(n,"xml");if(r)return r;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=iV(o.inflatedPath,n,"xml");if(i)try{return yn__default.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(t,n){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir();if(o)for(let i of ["png","jpeg"])try{return yn__default.readFileSync(An__default.join(o,"assets",`${n}.${i}`))}catch{continue}}};function aV(e){try{return JSON.parse(e)}catch{return}}function Vy({test:e,envNameOverride:t,urlOverride:n,resolveEnv:r}){let o=t??Iie(e),i,a={};if(o){try{i=r(o);}catch(l){throw new Error(`Failed to resolve environment ${o} for test ${e.name}: ${se(l)}`)}a=i.variables;}let s=e.baseUrl;if(n)s=n;else if(!s){let l=a[En];typeof l=="string"&&(s=l);}if(!s)throw new Error(`Cannot run test with no base URL and no ${En} variable defined in its environment`);return {envName:o,resolvedEnv:i,environmentVariables:a,baseUrl:s}}function Iie(e){for(let t of e.envs??[])if(t.default)return t.name}async function kl(e,t,n){let r=await he(e),o=r[n],i=_ie(o,t);if(t.id){if(i.length===0)throw new Gn(`No ${n} found with id '${t.id}' in project '${e.rootDir}'.`);return Hy(i,r)}if(t.name){if(i.length===0)throw new Gn(`No ${n} found with exact name '${t.name}' in project '${e.rootDir}'.`);if(i.length>1){let a=i.map(s=>({id:s.id,path:s.relativePath}));throw new Gn([`Multiple ${n} found with exact name '${t.name}'. Please disambiguate by id or path.`,JSON.stringify(a,null,2)].join(`
|
|
226
226
|
`))}return Hy(i,r)}if(t.path){let a=t.path;if(i.length===0)throw new Gn(`No ${n} found at path '${a}'. Provide an absolute path or a path relative to '${e.rootDir}'.`);if(i.length>1){let s=i.filter(c=>c.fullFilePath===a||c.relativePath===a||c.fullFilePath.endsWith(`/${a}`)||c.relativePath.endsWith(`/${a}`));if(s.length===1)return Hy(s,r);let l=i.map(c=>({id:c.id,path:c.fullFilePath}));throw new Gn([`Multiple ${n} matched the provided path '${a}'. Please pass the absolute path.`,JSON.stringify(l,null,2)].join(`
|
|
227
|
-
`))}return Hy(i,r)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function Hy(e,t){let n=e[0];if(!n)throw e.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return {entity:n,momenticFiles:t}}function _ie(e,t){if(t.id){let n=Object.values(e).find(r=>r.id===t.id);return n?[n]:[]}if(t.name)return Object.values(e).filter(n=>n.name===t.name);if(t.path){let n=t.path;return Object.values(e).filter(r=>r.fullFilePath.includes(n)||r.relativePath.includes(n))}throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}async function lV({cwd:e,projectName:t}){let n=An__default.join(e,ls);if(yn__default.existsSync(n))throw new Error(`A ${ls} file already exists at ${n}. Please rename or remove it to initialize a new project.`);let r=await cz(e)??"main",o={name:t,include:vy,gitMainBranch:r,ai:{useMemory:!0,failureRecovery:!0,agentConfig:{...Wc}}};return cs(o,n),{configPath:n,createdFiles:[n]}}var cV=["cursor","claude-code","codex","opencode","copilot"],Lie={cursor:An__default.join(".cursor","skills"),"claude-code":An__default.join(".claude","skills"),codex:An__default.join(".agents","skills"),opencode:An__default.join(".opencode","skills"),copilot:An__default.join(".github","skills")};function uV({editor:e,skillsDir:t,cwd:n=process.cwd()}){yn__default.existsSync(t)||(C.error(`Could not find skills directory at ${t}. Is the CLI package installed correctly?`),process.exit(1));let r=yn__default.readdirSync(t).filter(a=>a.endsWith(".md"));r.length===0&&(C.error(`No skill markdown files found in ${t}. Is the CLI package installed correctly?`),process.exit(1));let o=Nie({cwd:n}),i=An__default.join(o,Lie[e]);for(let a of r){let s=An__default.basename(a,".md"),l=An__default.join(i,s),c=yn__default.readFileSync(An__default.join(t,a),"utf8");yn__default.mkdirSync(l,{recursive:!0}),yn__default.writeFileSync(An__default.join(l,"SKILL.md"),c),C.success(`Installed SKILL.md at ${An__default.join(l,"SKILL.md")}`);}}function Nie({cwd:e}){try{let t=execSync("git rev-parse --show-toplevel",{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(t)return t}catch{return e}return e}var kie=An__default.join(ga.homedir(),".momentic"),pV=An__default.join(kie,"auth.json"),Fie=z.object({workos:z.object({accessToken:z.string(),refreshToken:z.string(),expiresAt:z.number()}),user:z.object({id:z.string(),email:z.string().optional()}),organizationId:z.string(),apiKey:z.string(),apiKeyName:z.string(),serverUrl:z.string(),createdAt:z.string()});function fV(){if(!yn__default.existsSync(pV))return null;try{let e=yn__default.readFileSync(pV,"utf-8"),t=Fie.safeParse(JSON.parse(e));return t.success?t.data:null}catch{return null}}function hV(){let e=fV();if(e?.apiKey&&e.apiKey.length>0)return e.apiKey}function gV(){let e=fV();if(e?.serverUrl&&e.serverUrl.length>0)return e.serverUrl}var Bie=new $S(30,60*1e3),Wy="https://api.momentic.ai",PR,SV,rd=e=>{Wy=e;},Zn=()=>Wy,yV=()=>cu(Wy),qy=e=>{SV=e;},Fl=()=>SV,gs=()=>PR;var nd,MR,TV,EV,jy,od=async e=>{if(PR&&nd&&jy)return nd;let t=new Tt({baseUrl:Wy,apiKey:e,logger:C});PR=t;try{let n=await t.getAuthInfo();return nd=n.orgId,MR=n.userId,TV=n.email,EV=n.pylonEmailHash,jy=e,nd}catch(n){throw new Error(`Error checking API key against server: ${n}`,{cause:n})}},kt=()=>{if(!nd)throw new Error("Your organization ID is invalid.");return nd},ti=()=>{if(!MR)throw new Error("Your user ID is invalid.");return MR},bV=()=>TV,vV=()=>EV,_o=()=>{if(!jy)throw new Error("Your API key is invalid.");return jy},OR,$y,Ul=()=>{$y?.abort(),$y=void 0;},id=(e,t)=>{OR=e,Ul(),$y=new AbortController;let n=$y.signal,r=[e.configFilePath];e.config.environments?.forEach(o=>{if(!o.envFile)return;let i=An__default.resolve(e.rootDir,o.envFile);try{if(yn__default.lstatSync(i).isSymbolicLink())return;yn__default.existsSync(i)&&r.push(i);}catch(a){C.warn({err:a},`Failed to check if env file ${i} exists`);}});try{zie({filesToWatch:r,revalidator:t,signal:n,project:e});}catch(o){C.error({err:o},"Failed to start config file watchers");}},xe=()=>OR;function zie({filesToWatch:e,revalidator:t,signal:n,project:r}){C.debug("Starting watch on the following files:"),e.forEach(o=>{C.debug(`- ${o}`);}),e.forEach(o=>{let i=async(s,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(Bie.increment("setLocalProject")&&C.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),OR=await Promise.resolve(t(r.configFilePath)));};yn__default.watchFile(o,{persistent:!1},i);let a=()=>{yn__default.unwatchFile(o,i),n.removeEventListener("abort",a);};n.addEventListener("abort",a);});}function Ve(e){return function(...t){let n=t[t.length-1],r=e(...t);Promise.resolve(r).catch(n);}}var Hie="2.104.2",Bl=du({app:"desktop-server",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:Hie});(async()=>{try{let e=await Xo(Bl);e.gitBranchName&&Bl.addBinding("branch",e.gitBranchName);}catch{}})();var CV=Router();CV.get("/",async(e,t)=>{let n=xe(),r=gs();if(!r){t.status(500).json({message:"API client not initialized"});return}let o=await Jo(Bl,r,n),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Fl(),l=!a&&(s||!i);t.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName});});var LR=CV;var $ie=5e3;function NR(e={}){let t=Router();function n(i){let a=xe(),s=An__default.dirname(a.configFilePath);return An__default.join(s,...i)}function r(i){let a=xe(),s=An__default.dirname(a.configFilePath),l=An__default.relative(s,i);return l?l.split(An__default.sep):[]}function o(i,a){let s=yn__default.statSync(i),l=r(i);return Mv.parse({name:a,absolutePath:i,relativePath:l.join(An__default.sep),pathSegments:l,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return t.post("/",Ve(async(i,a,s)=>{let l;try{l=OL.parse(i.body).pathSegments;}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=n(l);if(!yn__default.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(An__default.sep)}`});return}if(!yn__default.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(An__default.sep)}`});return}let p=xe().config.exclude??[],m=AbortSignal.timeout($ie),f;try{f=await Ku(["*"],{cwd:c,ignore:p,maxDepth:1,nodir:!1,signal:m});}catch(S){if(S instanceof Error&&S.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw S}let h=f.map(S=>{let T=An__default.join(c,S);return o(T,S)});if(e.allowedFileTypes){let S=new Set(e.allowedFileTypes);h=(await Promise.all(h.map(async T=>{if(T.isDirectory||!(T.name.endsWith(".test.yaml")||T.name.endsWith(".module.yaml")))return T;let b=await Wie(T.absolutePath);return b!==void 0&&S.has(b)?T:null}))).filter(T=>T!==null);}let g={absolutePath:c,pathSegments:l,contents:h};a.status(200).json(g);})),t.put("/",Ve(async(i,a,s)=>{let l;try{l=LL.parse(i.body).pathSegments;}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=n(l);if(yn__default.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(An__default.sep)}`,pathSegments:l});return}yn__default.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(An__default.sep)}`,pathSegments:l};a.status(201).json(u);})),t.patch("/",Ve(async(i,a,s)=>{let l,c;try{let f=NL.parse(i.body);l=f.pathSegments,c=f.newPathSegments;}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=n(l),d=n(c);if(!yn__default.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(An__default.sep)}`});return}if(yn__default.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(An__default.sep)}`});return}let p=An__default.dirname(d);yn__default.existsSync(p)||yn__default.mkdirSync(p,{recursive:!0}),yn__default.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(An__default.sep)} to ${c.join(An__default.sep)}`,pathSegments:c};a.status(200).json(m);})),t.delete("/",Ve(async(i,a,s)=>{let l,c=!0;try{let m=DL.parse(i.body);l=m.pathSegments,c=m.recursive??!0;}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=n(l);if(!yn__default.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(An__default.sep)}`,pathSegments:l});return}if(!yn__default.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(An__default.sep)}`});return}if(c)yn__default.rmSync(u,{recursive:!0,force:!0});else {if(yn__default.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}yn__default.rmdirSync(u);}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p);})),t}async function Wie(e){try{let t=await yn__default.promises.open(e,"r");try{let n=Buffer.alloc(4096),{bytesRead:r}=await t.read(n,0,n.length,0);return n.toString("utf-8",0,r).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await t.close();}}catch{}}var AV=Router();AV.get("/",async(e,t)=>{let n=xe(),r=gs();if(!r){t.status(500).json({message:"API client not initialized"});return}let o=await Jo(Bl,r,n);t.status(200).json(o);});var DR=AV;var Kie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async()=>{t.info({sessionId:r},"Cancel event received");let o=n.getSession(r);if(!o)throw new Error("No active session found");try{o.controller.setClosed();}catch{}}},RV={event:"cancel",createHandler:Kie};var Yie=({metadata:e,logger:t,cacheStorageFactory:n})=>{let{testId:r,orgId:o}=e;return async(i,a)=>{let{stepId:s,environment:l}=i;t.info({testId:r,stepId:s},"Clearing AI action cache");try{await(await n(o)).deleteStepCacheEntry({logger:t,testId:r,key:s,environment:l}),a({ok:!0});}catch(c){t.error({testId:r,stepId:s,err:c},"Failed to clear AI action cache"),a({ok:!1,error:se(c)});}}},wV={event:"clearAIActionCache",createHandler:Yie};var Xie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async(o,i)=>{let a=n.getSession(r);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=(await s.getBrowserState({skipWait:!0})).serialize();t.debug({a11yTree:c},"Fetched a11y tree from the browser"),i({a11yTree:c});}catch(l){t.error({err:l},"Error fetching a11y tree from the browser"),i({err:l.message});}}},xV={event:"fetchA11yTree",createHandler:Xie};var Jie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async(o,i)=>{let a=n.getSession(r);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=await s.html();i({html:l});}catch(l){t.error({err:l},"Error fetching DOM from the browser"),l.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:l.message});}}},IV={event:"fetchDom",createHandler:Jie};var Zie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return o=>{t.info({sessionId:r,reason:o},`Disconnect event received (${o})`),n.removeSession(r,t);}},_V={event:"disconnect",createHandler:Zie};function Po(e){let{result:t,nestedResults:n}=e;if(!e.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=Qie(n);eae(t,r,o);let i=[...e.asyncTasks];e.asyncTasks.push((async()=>{try{await tae(i,t,r,o);}catch(a){e.logger.error({result:e.result,err:a},"Error hoisting scalar result metadata");}})());}function Qie(e){let t=e[0],n;for(;;){switch(t.type){case"PRESET_ACTION":case"CONDITIONAL":n=t;break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!t.results.length){n=t;break}t=t.results[0];break;default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}if(n)break}let r=e[e.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!r.results.length){o=r;break}r=r.results[r.results.length-1];break;default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}if(o)break}return {firstMetadata:n,lastMetadata:o}}function eae(e,t,n){t&&(e.beforeUrl=t.beforeUrl),n&&(e.afterUrl=n.afterUrl,e.data=n.data,n.status!=="SUCCESS"&&(e.message=n.message));}async function tae(e,t,n,r){await Promise.allSettled(e),n&&(t.beforeSnapshot=n.beforeSnapshot),r&&(t.afterSnapshot=r.afterSnapshot);}async function PV(e){let t;try{t=new URL(e.url).hostname;}catch{}let n=[];return e.headers.getSetCookie()?.forEach(r=>{let o=mg(r,t);n.push(...o);}),n}function cae(e,t){if(!e&&!t)return;let n;if(e){let{url:o,options:i}=e;n=new Request(o,i);}let r;if(t){let{body:o,options:i}=t;r=new Response(o??null,i);}return {request:n,response:r}}async function uae(e,t){switch(e){case"RAW":return t;case"RESPONSE":if(t instanceof Response){let n=[];return t.headers.forEach((o,i)=>{n.push([i,o]);}),{status:t.status,headers:n,body:await t.text()}}else throw new Error("Result is not a Response object")}}var dae=Object.getPrototypeOf(async function(){}).constructor;async function MV(e,t,n){let r=t.code;t.options.fragment&&(r=`return ${t.code}`);let{env:o,additionalBindings:i,request:a,response:s}=t.bindings,l=t.tools,c={},u=(y,b)=>{o[y]=b,c[y]=b;},d={},p=(y,b)=>{o[y]=b,d[y]=b;},m;r.includes("Octokit")&&(m=(await import('@octokit/rest')).Octokit);let f;r.includes("createAppAuth")&&(f=(await import('@octokit/auth-app')).createAppAuth);let h=async()=>await Promise.resolve(new dae("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","mock",...Object.keys(i??{}),r)(oae,aae,l.fakerInstance??faker,OW,lae,m,f,sae,iae,PV,o,t.options.disallowVariableUpdates?void 0:u,t.options.disallowVariableUpdates?void 0:p,b=>l.sms.send(b),b=>l.sms.fetchLatest(b),l.email,l.sms,cae(a,s),...Object.values(i??{}))),g=!0,S,T;try{let y=await ne(h(),{milliseconds:t.options.timeoutMs,message:`Timeout of ${t.options.timeoutMs}ms exceeded for code execution`,signal:t.signal});S=await uae(t.options.responseSerialization??"RAW",y);}catch(y){n.error({err:y,env:o,evalCode:r},`[${e}] Error executing code: ${y}`),g=!1,y instanceof ja?T=`Timeout of ${t.options.timeoutMs}ms exceeded for code execution`:T=y instanceof Error?y.message:`${y}`;}return {result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:T}}async function OV({code:e,fragment:t,context:n,localTools:r,logger:o,signal:i,timeoutMs:a=Va,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=randomUUID(),p=await MV(d,{code:e,options:{fragment:t,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:c},bindings:{...n.toObjectCopy(),...u,additionalBindings:l},tools:r,signal:i},o);return C.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}var gae=CZ(global.fetch,{retries:3,retryOn:function(e,t,n){return !!(t!==null||n&&n.status>=500)},retryDelay:function(e){return Math.pow(2,e)*500}}),LV=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,NV=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function DV({orgId:e,code:t,fragment:n,context:r,timeoutMs:o=Va,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!LV)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!NV)throw new Error("Missing lambda auth secret.");let h=createHmac("sha256",NV).update(e).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:randomUUID(),orgId:e,momenticLambdaAuthHash:h,code:t,fragment:n,state:{...r.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await ne(gae(LV,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(T){m=T;}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=fL.parse(await p.json());}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(g.error)throw new Error(`Code evaluation error: ${g.error}`);return g}async function Ss(e){let t;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)t=await DV(e);else if(e.localTools)t=await OV({...e,localTools:e.localTools});else throw new Error("No code evaluation environment available");if(t.error){let n=`Failed to evaluate code:
|
|
227
|
+
`))}return Hy(i,r)}throw new Error("No valid selector field provided. Exactly one of id, name, or path must be specified.")}function Hy(e,t){let n=e[0];if(!n)throw e.length>0?new Error("No entity found: matches array is not empty. Unknown error."):new Error("No entity found.");return {entity:n,momenticFiles:t}}function _ie(e,t){if(t.id){let n=Object.values(e).find(r=>r.id===t.id);return n?[n]:[]}if(t.name)return Object.values(e).filter(n=>n.name===t.name);if(t.path){let n=t.path;return Object.values(e).filter(r=>r.fullFilePath.includes(n)||r.relativePath.includes(n))}throw new Error("No valid selector field provided: expected exactly one of 'id', 'name', or 'path'.")}async function lV({cwd:e,projectName:t}){let n=An__default.join(e,ls);if(yn__default.existsSync(n))throw new Error(`A ${ls} file already exists at ${n}. Please rename or remove it to initialize a new project.`);let r=await cz(e)??"main",o={name:t,include:vy,gitMainBranch:r,ai:{useMemory:!0,failureRecovery:!0,agentConfig:{...Wc}}};return cs(o,n),{configPath:n,createdFiles:[n]}}var cV=["cursor","claude-code","codex","opencode","copilot"],Lie={cursor:An__default.join(".cursor","skills"),"claude-code":An__default.join(".claude","skills"),codex:An__default.join(".agents","skills"),opencode:An__default.join(".opencode","skills"),copilot:An__default.join(".github","skills")};function uV({editor:e,skillsDir:t,cwd:n=process.cwd()}){yn__default.existsSync(t)||(C.error(`Could not find skills directory at ${t}. Is the CLI package installed correctly?`),process.exit(1));let r=yn__default.readdirSync(t).filter(a=>a.endsWith(".md"));r.length===0&&(C.error(`No skill markdown files found in ${t}. Is the CLI package installed correctly?`),process.exit(1));let o=Nie({cwd:n}),i=An__default.join(o,Lie[e]);for(let a of r){let s=An__default.basename(a,".md"),l=An__default.join(i,s),c=yn__default.readFileSync(An__default.join(t,a),"utf8");yn__default.mkdirSync(l,{recursive:!0}),yn__default.writeFileSync(An__default.join(l,"SKILL.md"),c),C.success(`Installed SKILL.md at ${An__default.join(l,"SKILL.md")}`);}}function Nie({cwd:e}){try{let t=execSync("git rev-parse --show-toplevel",{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(t)return t}catch{return e}return e}var kie=An__default.join(ga.homedir(),".momentic"),pV=An__default.join(kie,"auth.json"),Fie=z.object({workos:z.object({accessToken:z.string(),refreshToken:z.string(),expiresAt:z.number()}),user:z.object({id:z.string(),email:z.string().optional()}),organizationId:z.string(),apiKey:z.string(),apiKeyName:z.string(),serverUrl:z.string(),createdAt:z.string()});function fV(){if(!yn__default.existsSync(pV))return null;try{let e=yn__default.readFileSync(pV,"utf-8"),t=Fie.safeParse(JSON.parse(e));return t.success?t.data:null}catch{return null}}function hV(){let e=fV();if(e?.apiKey&&e.apiKey.length>0)return e.apiKey}function gV(){let e=fV();if(e?.serverUrl&&e.serverUrl.length>0)return e.serverUrl}var Bie=new $S(30,60*1e3),Wy="https://api.momentic.ai",PR,SV,rd=e=>{Wy=e;},Zn=()=>Wy,yV=()=>cu(Wy),qy=e=>{SV=e;},Fl=()=>SV,gs=()=>PR;var nd,MR,TV,EV,jy,od=async e=>{if(PR&&nd&&jy)return nd;let t=new Tt({baseUrl:Wy,apiKey:e,logger:C});PR=t;try{let n=await t.getAuthInfo();return nd=n.orgId,MR=n.userId,TV=n.email,EV=n.pylonEmailHash,jy=e,nd}catch(n){throw new Error(`Error checking API key against server: ${n}`,{cause:n})}},kt=()=>{if(!nd)throw new Error("Your organization ID is invalid.");return nd},ti=()=>{if(!MR)throw new Error("Your user ID is invalid.");return MR},bV=()=>TV,vV=()=>EV,_o=()=>{if(!jy)throw new Error("Your API key is invalid.");return jy},OR,$y,Ul=()=>{$y?.abort(),$y=void 0;},id=(e,t)=>{OR=e,Ul(),$y=new AbortController;let n=$y.signal,r=[e.configFilePath];e.config.environments?.forEach(o=>{if(!o.envFile)return;let i=An__default.resolve(e.rootDir,o.envFile);try{if(yn__default.lstatSync(i).isSymbolicLink())return;yn__default.existsSync(i)&&r.push(i);}catch(a){C.warn({err:a},`Failed to check if env file ${i} exists`);}});try{zie({filesToWatch:r,revalidator:t,signal:n,project:e});}catch(o){C.error({err:o},"Failed to start config file watchers");}},xe=()=>OR;function zie({filesToWatch:e,revalidator:t,signal:n,project:r}){C.debug("Starting watch on the following files:"),e.forEach(o=>{C.debug(`- ${o}`);}),e.forEach(o=>{let i=async(s,l)=>{s.mtime.getTime()!==l.mtime.getTime()&&(Bie.increment("setLocalProject")&&C.warn(`A file change under the ${r.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),OR=await Promise.resolve(t(r.configFilePath)));};yn__default.watchFile(o,{persistent:!1},i);let a=()=>{yn__default.unwatchFile(o,i),n.removeEventListener("abort",a);};n.addEventListener("abort",a);});}function Ve(e){return function(...t){let n=t[t.length-1],r=e(...t);Promise.resolve(r).catch(n);}}var Hie="2.104.3",Bl=du({app:"desktop-server",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:Hie});(async()=>{try{let e=await Xo(Bl);e.gitBranchName&&Bl.addBinding("branch",e.gitBranchName);}catch{}})();var CV=Router();CV.get("/",async(e,t)=>{let n=xe(),r=gs();if(!r){t.status(500).json({message:"API client not initialized"});return}let o=await Jo(Bl,r,n),i=o?.gitProtectedBranches&&o?.gitBranchName&&o.gitProtectedBranches.includes(o.gitBranchName),{noCache:a,alwaysSaveCache:s}=Fl(),l=!a&&(s||!i);t.status(200).json({saveCaches:l,checkedOutBranch:o?.gitBranchName});});var LR=CV;var $ie=5e3;function NR(e={}){let t=Router();function n(i){let a=xe(),s=An__default.dirname(a.configFilePath);return An__default.join(s,...i)}function r(i){let a=xe(),s=An__default.dirname(a.configFilePath),l=An__default.relative(s,i);return l?l.split(An__default.sep):[]}function o(i,a){let s=yn__default.statSync(i),l=r(i);return Mv.parse({name:a,absolutePath:i,relativePath:l.join(An__default.sep),pathSegments:l,isDirectory:s.isDirectory(),size:s.size,createdAt:s.birthtime,modifiedAt:s.mtime,accessedAt:s.atime})}return t.post("/",Ve(async(i,a,s)=>{let l;try{l=OL.parse(i.body).pathSegments;}catch(S){a.status(400).json({error:`Failed to parse folder read body: ${S}`});return}let c=n(l);if(!yn__default.existsSync(c)){a.status(404).json({error:`Path not found: ${l.join(An__default.sep)}`});return}if(!yn__default.statSync(c).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(An__default.sep)}`});return}let p=xe().config.exclude??[],m=AbortSignal.timeout($ie),f;try{f=await Ku(["*"],{cwd:c,ignore:p,maxDepth:1,nodir:!1,signal:m});}catch(S){if(S instanceof Error&&S.name==="TimeoutError"){a.status(408).json({error:"Folder listing timed out. This directory may contain too many files."});return}throw S}let h=f.map(S=>{let T=An__default.join(c,S);return o(T,S)});if(e.allowedFileTypes){let S=new Set(e.allowedFileTypes);h=(await Promise.all(h.map(async T=>{if(T.isDirectory||!(T.name.endsWith(".test.yaml")||T.name.endsWith(".module.yaml")))return T;let b=await Wie(T.absolutePath);return b!==void 0&&S.has(b)?T:null}))).filter(T=>T!==null);}let g={absolutePath:c,pathSegments:l,contents:h};a.status(200).json(g);})),t.put("/",Ve(async(i,a,s)=>{let l;try{l=LL.parse(i.body).pathSegments;}catch(d){a.status(400).json({error:`Failed to parse folder create body: ${d}`});return}let c=n(l);if(yn__default.existsSync(c)){a.status(200).json({success:!0,message:`Folder already exists: ${l.join(An__default.sep)}`,pathSegments:l});return}yn__default.mkdirSync(c,{recursive:!0});let u={success:!0,message:`Folder created: ${l.join(An__default.sep)}`,pathSegments:l};a.status(201).json(u);})),t.patch("/",Ve(async(i,a,s)=>{let l,c;try{let f=NL.parse(i.body);l=f.pathSegments,c=f.newPathSegments;}catch(f){a.status(400).json({error:`Failed to parse folder update body: ${f}`});return}let u=n(l),d=n(c);if(!yn__default.existsSync(u)){a.status(400).json({error:`Folder not found: ${l.join(An__default.sep)}`});return}if(yn__default.existsSync(d)){a.status(400).json({error:`Destination already exists: ${c.join(An__default.sep)}`});return}let p=An__default.dirname(d);yn__default.existsSync(p)||yn__default.mkdirSync(p,{recursive:!0}),yn__default.renameSync(u,d);let m={success:!0,message:`Folder moved from ${l.join(An__default.sep)} to ${c.join(An__default.sep)}`,pathSegments:c};a.status(200).json(m);})),t.delete("/",Ve(async(i,a,s)=>{let l,c=!0;try{let m=DL.parse(i.body);l=m.pathSegments,c=m.recursive??!0;}catch(m){a.status(400).json({error:`Failed to parse folder delete body: ${m}`});return}let u=n(l);if(!yn__default.existsSync(u)){a.status(200).json({success:!0,message:`Folder not found: ${l.join(An__default.sep)}`,pathSegments:l});return}if(!yn__default.statSync(u).isDirectory()){a.status(400).json({error:`Path is not a directory: ${l.join(An__default.sep)}`});return}if(c)yn__default.rmSync(u,{recursive:!0,force:!0});else {if(yn__default.readdirSync(u).length>0){a.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${l.join("/")}`});return}yn__default.rmdirSync(u);}let p={success:!0,message:`Folder deleted: ${l.join("/")}`,pathSegments:l};a.status(200).json(p);})),t}async function Wie(e){try{let t=await yn__default.promises.open(e,"r");try{let n=Buffer.alloc(4096),{bytesRead:r}=await t.read(n,0,n.length,0);return n.toString("utf-8",0,r).match(/^fileType:\s*(.+)$/m)?.[1]?.trim()}finally{await t.close();}}catch{}}var AV=Router();AV.get("/",async(e,t)=>{let n=xe(),r=gs();if(!r){t.status(500).json({message:"API client not initialized"});return}let o=await Jo(Bl,r,n);t.status(200).json(o);});var DR=AV;var Kie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async()=>{t.info({sessionId:r},"Cancel event received");let o=n.getSession(r);if(!o)throw new Error("No active session found");try{o.controller.setClosed();}catch{}}},RV={event:"cancel",createHandler:Kie};var Yie=({metadata:e,logger:t,cacheStorageFactory:n})=>{let{testId:r,orgId:o}=e;return async(i,a)=>{let{stepId:s,environment:l}=i;t.info({testId:r,stepId:s},"Clearing AI action cache");try{await(await n(o)).deleteStepCacheEntry({logger:t,testId:r,key:s,environment:l}),a({ok:!0});}catch(c){t.error({testId:r,stepId:s,err:c},"Failed to clear AI action cache"),a({ok:!1,error:se(c)});}}},wV={event:"clearAIActionCache",createHandler:Yie};var Xie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async(o,i)=>{let a=n.getSession(r);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=(await s.getBrowserState({skipWait:!0})).serialize();t.debug({a11yTree:c},"Fetched a11y tree from the browser"),i({a11yTree:c});}catch(l){t.error({err:l},"Error fetching a11y tree from the browser"),i({err:l.message});}}},xV={event:"fetchA11yTree",createHandler:Xie};var Jie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return async(o,i)=>{let a=n.getSession(r);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=await s.html();i({html:l});}catch(l){t.error({err:l},"Error fetching DOM from the browser"),l.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:l.message});}}},IV={event:"fetchDom",createHandler:Jie};var Zie=({metadata:e,logger:t,globalE2eStateManager:n})=>{let{sessionId:r}=e;return o=>{t.info({sessionId:r,reason:o},`Disconnect event received (${o})`),n.removeSession(r,t);}},_V={event:"disconnect",createHandler:Zie};function Po(e){let{result:t,nestedResults:n}=e;if(!e.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=Qie(n);eae(t,r,o);let i=[...e.asyncTasks];e.asyncTasks.push((async()=>{try{await tae(i,t,r,o);}catch(a){e.logger.error({result:e.result,err:a},"Error hoisting scalar result metadata");}})());}function Qie(e){let t=e[0],n;for(;;){switch(t.type){case"PRESET_ACTION":case"CONDITIONAL":n=t;break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!t.results.length){n=t;break}t=t.results[0];break;default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}if(n)break}let r=e[e.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!r.results.length){o=r;break}r=r.results[r.results.length-1];break;default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}if(o)break}return {firstMetadata:n,lastMetadata:o}}function eae(e,t,n){t&&(e.beforeUrl=t.beforeUrl),n&&(e.afterUrl=n.afterUrl,e.data=n.data,n.status!=="SUCCESS"&&(e.message=n.message));}async function tae(e,t,n,r){await Promise.allSettled(e),n&&(t.beforeSnapshot=n.beforeSnapshot),r&&(t.afterSnapshot=r.afterSnapshot);}async function PV(e){let t;try{t=new URL(e.url).hostname;}catch{}let n=[];return e.headers.getSetCookie()?.forEach(r=>{let o=mg(r,t);n.push(...o);}),n}function cae(e,t){if(!e&&!t)return;let n;if(e){let{url:o,options:i}=e;n=new Request(o,i);}let r;if(t){let{body:o,options:i}=t;r=new Response(o??null,i);}return {request:n,response:r}}async function uae(e,t){switch(e){case"RAW":return t;case"RESPONSE":if(t instanceof Response){let n=[];return t.headers.forEach((o,i)=>{n.push([i,o]);}),{status:t.status,headers:n,body:await t.text()}}else throw new Error("Result is not a Response object")}}var dae=Object.getPrototypeOf(async function(){}).constructor;async function MV(e,t,n){let r=t.code;t.options.fragment&&(r=`return ${t.code}`);let{env:o,additionalBindings:i,request:a,response:s}=t.bindings,l=t.tools,c={},u=(y,b)=>{o[y]=b,c[y]=b;},d={},p=(y,b)=>{o[y]=b,d[y]=b;},m;r.includes("Octokit")&&(m=(await import('@octokit/rest')).Octokit);let f;r.includes("createAppAuth")&&(f=(await import('@octokit/auth-app')).createAppAuth);let h=async()=>await Promise.resolve(new dae("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","mock",...Object.keys(i??{}),r)(oae,aae,l.fakerInstance??faker,OW,lae,m,f,sae,iae,PV,o,t.options.disallowVariableUpdates?void 0:u,t.options.disallowVariableUpdates?void 0:p,b=>l.sms.send(b),b=>l.sms.fetchLatest(b),l.email,l.sms,cae(a,s),...Object.values(i??{}))),g=!0,S,T;try{let y=await ne(h(),{milliseconds:t.options.timeoutMs,message:`Timeout of ${t.options.timeoutMs}ms exceeded for code execution`,signal:t.signal});S=await uae(t.options.responseSerialization??"RAW",y);}catch(y){n.error({err:y,env:o,evalCode:r},`[${e}] Error executing code: ${y}`),g=!1,y instanceof ja?T=`Timeout of ${t.options.timeoutMs}ms exceeded for code execution`:T=y instanceof Error?y.message:`${y}`;}return {result:S,variableUpdates:c,persistentVariableUpdates:d,success:g,error:T}}async function OV({code:e,fragment:t,context:n,localTools:r,logger:o,signal:i,timeoutMs:a=Va,disallowVariableUpdates:s,additionalBindings:l,responseSerialization:c,mock:u}){let d=randomUUID(),p=await MV(d,{code:e,options:{fragment:t,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:c},bindings:{...n.toObjectCopy(),...u,additionalBindings:l},tools:r,signal:i},o);return C.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}var gae=CZ(global.fetch,{retries:3,retryOn:function(e,t,n){return !!(t!==null||n&&n.status>=500)},retryDelay:function(e){return Math.pow(2,e)*500}}),LV=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,NV=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function DV({orgId:e,code:t,fragment:n,context:r,timeoutMs:o=Va,retries:i=2,signal:a,logger:s,additionalBindings:l,disallowVariableUpdates:c,responseSerialization:u,mock:d}){if(!LV)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,f=0;if(!NV)throw new Error("Missing lambda auth secret.");let h=createHmac("sha256",NV).update(e).digest("hex");for(;f<=i;){f++,a?.throwIfAborted();let S={id:randomUUID(),orgId:e,momenticLambdaAuthHash:h,code:t,fragment:n,state:{...r.toObjectCopy(),...d,additionalBindings:l},timeoutMs:o,disallowVariableUpdates:c,responseSerialization:u};try{if(p=await ne(gae(LV,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(T){m=T;}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let g;try{g=fL.parse(await p.json());}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(g.error)throw new Error(`Code evaluation error: ${g.error}`);return g}async function Ss(e){let t;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)t=await DV(e);else if(e.localTools)t=await OV({...e,localTools:e.localTools});else throw new Error("No code evaluation environment available");if(t.error){let n=`Failed to evaluate code:
|
|
228
228
|
${t.error}
|
|
229
229
|
Code received:
|
|
230
230
|
${e.code}`;throw e.logger.error({err:t.error,code:e.code,env:e.context.toObjectCopy()},n),new Error(n)}if(t.variableUpdates)for(let[n,r]of Object.entries(t.variableUpdates))e.context.setVariable(n,r);if(t.persistentVariableUpdates&&Object.keys(t.persistentVariableUpdates).length>0){await e.callbacks?.onPersistentVariableUpdates?.(t.persistentVariableUpdates);for(let[n,r]of Object.entries(t.persistentVariableUpdates))e.context.setVariable(n,r);}return t.result}async function er(e){let{orgId:t,s:n,context:r,logger:o,signal:i,retries:a=2,timeoutMs:s=Va,allowUndefined:l=!1}=e,c=/{{(.*?)}}/g,u=n.matchAll(c),d=n;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),f;try{f=await Ss({orgId:t,code:m,fragment:!0,context:r,timeoutMs:s,logger:o,retries:a,localTools:e.localTools,signal:i});}catch(g){throw o.error({err:g,value:n},"Error evaluating template string"),g}if(f===void 0&&!l)throw new L("UserConfigurationError",`Template fragment '${m}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let h=typeof f=="string"?f:`${f}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(p[0],h);}return d}async function Ky(e){return kV(e)}async function kV({obj:e,bannedKeys:t,allowList:n,context:r,prefixPath:o=[],replacements:i=[],...a}){for(let s in e){if(t.includes(s))continue;let l=!1;if(n)if(n.includes(s))l=!0;else continue;let c=e[s],u=[...o,s];if(typeof c=="string"&&c.includes("{{")){let d=await er({s:c,context:r,...a});if(c===d)continue;i.push({path:u,original:c}),e[s]=d;}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await kV({obj:c,bannedKeys:t,context:r,prefixPath:u,replacements:i,allowList:l?void 0:n,...a});}return i}function FV(e,t){for(let{path:n,original:r}of t)set(e,n,r);}var kR={vimiumJs:'var _=Object.defineProperty;var D=(t,e,n)=>e in t?_(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(D(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return {bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return {bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of ["top","bottom","left","right","width","height"])if(t[n]!==e[n])return !1;return !0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var M={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null;}),!0);}return function(n){if(t)return n();e.push(n);}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let i of e)i();e=null;}}),!0);}return function(n){t?n():e.push(n);}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(i){return i==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let r=[];for(n of t.getClientRects())r.push(E.copy(n));return r})(),i=function(){let r=window.getComputedStyle(t,null),h=r.getPropertyValue("display").indexOf("inline")===0&&r.getPropertyValue("font-size")==="0px";return i=()=>h,h};for(n of o){let r;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){r=window.getComputedStyle(h,null);let m=r.getPropertyValue("position");if(r.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&i()&&r.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else {if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(r=window.getComputedStyle(t,null),r.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let i,r,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([i,h,r,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);i=l-p,r=l+p,h=c-p,m=c+p;}}else a==="default"?s.length==2&&([i,h,r,m]=[0,0,t.width,t.height]):s.length>=4&&([i,h,r,m]=s);let u=E.translate(E.create(i,h,r,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u});}return n},isSelectable(t){if(!(t instanceof Element))return !1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return ["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return !0;n=n.parentNode;}return !1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return !1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let i of n){let r=this.simulateMouseEvent(i,t,e);o.push(r);}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:i,metaKey:r,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=r===!0&&o===!1:n=r===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:i===!0}):i===!0&&r===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0});},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),i=parseInt(e.marginLeft);return {top:-n.top+o,left:-n.left+i}}else {let o,i;return M.isFirefox()?(i=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:i,clientLeft:o}=t,{top:-n.top-i,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation();},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t);},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:i}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(r){return r.code!==i||(this.remove(),o?f.suppressPropagation(r):f.suppressEvent(r)),handlerStack.continueBubbling},blur(r){return r.target===window&&this.remove(),handlerStack.continueBubbling}});}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let i=n;for(;i&&i.nodeType!==1;)i=i.previousSibling;return n=i||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return (typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t);}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return ["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),i=document.getElementById(o);i&&(e.target=this.describe(i));}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var N=null,k=()=>j()||document.scrollingElement||document.body,P=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(M.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,i=t[o];if(t.scrollBy){let r={behavior:"instant"};r[e==="x"?"left":"top"]=n,t.scrollBy(r);}else t[o]+=n;return t[o]!==i},V=function(t,e){let n=window.getComputedStyle(t);return !(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let i=o*O(t,e,n)||-1;return i=P(i),I(t,e,i)&&I(t,e,-i)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k();}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,i)=>i.area-o.area)){let o=H(e.element);if(o)return o}return null}},T={init(){N=null;},isScrollableElement(t){return N||(N=k()&&H()||k()),t!==N&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window._momentic=window._momentic||{};window._momentic.scroller=T;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e);}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,i=!1,r=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(C=>Object.assign(C,{image:t})),h.push(...g);}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return [];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return ()=>!1;{let c=[];for(let d of ["","data-","x-"])for(let p of ["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return !0;return !1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else {let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else {let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0);}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,C]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&C!=="_");}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&T.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&T.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,i=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:i,reason:m}));r.push(...l);}else {let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:i,reason:m});r.push(c);}}return r},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let i=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(i)?i:(o.push(i),i&&i.shadowRoot?S.getElementFromPoint(t,e,i.shadowRoot,o):i)},getLocalHints(t){if(!document.body)return [];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a);}o=o.reverse();let i=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return !0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of i)if(l=l?.parentElement,l===s.element)return !1;w+=1;}return !0});let r=o.filter(s=>{if(s.secondClassCitizen)return !1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return !0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return !0}});r.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of r)s.rect.top+=h,s.rect.left+=m;return r}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null;}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null;}async capture(){this.reset(),this.createMarkers(),this.displayMarkers();}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),i=e.element.attributes["data-momentic-id"]?.value??void 0;if(!i){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,i),this.hintMarkers.set(i,{hint:e,marker:o});});}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}));}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})));}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null);}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers();}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o);}};window._momentic??={};window._momentic.hintManagerConstructor=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`(function () {
|
|
@@ -5207,7 +5207,7 @@ ${e}`;case"ELEMENT_CHECK":return `${L1}
|
|
|
5207
5207
|
${e}`;default:return e}}async function Oo({frameConfig:e,action:t,browser:n}){let r=n.getActiveFrameConfig();e?n.setActiveFrameConfig(e):r?.type==="auto"&&n.setActiveFrameConfig(void 0);try{return await t()}finally{n.setActiveFrameConfig(r);}}var Dle=["NAVIGATE","NEW_TAB","CLOSE_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function k1({beforeUrl:e,beforePages:t,browser:n,command:r,logger:o}){if(Dle.includes(r.type))return;await rn().startAsyncSpan("AUTO_FOLLOW_NEW_TABS",async a=>{let c=("cache"in r&&r.cache&&"target"in r.cache?r.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,u=Date.now(),d=0;for(o.info({command:r.type,beforePages:t,beforeUrl:e,timeout:c},"Checking for new tabs to auto-follow");d===0||Date.now()-u<c;){await ve(250),d++;let p=(await n.getOpenPages()).map(f=>f.url),m=n.url();if(p.length!==t.length)for(let f=p.length-1;f>=t.length;f--){let h=p[f];if(ts(h,o)&&h!==e&&h!==m){o.info({beforePages:t,afterPages:p,beforeUrl:e},"Auto-following new tab after preset action"),await n.switchToPage({type:"INDEX",index:String(f)}),a.result={followed:!0};return}}}a.result={followed:!1};});}async function Rs(e,t={}){let n=await e.getBrowserState(t);return {serializedTree:n.serialize(t.serializationOpts),tree:n}}var F1=e=>!!e&&fc(e),U1=e=>{let{cache:t,description:n,disableSecondaryCacheResolution:r,logger:o}=e,i=t,a=!1,s;return i&&r&&i.targetSource==="HEURISTIC_HEALED"&&(a=!0,s="Heuristic healed cache incompatible",i=void 0),i?.inputDescription&&!N1(n,i.inputDescription)&&(o.warn({old:i.inputDescription,new:n},"Target cache was generated with a different description, clearing it automatically"),a=!0,s="Description changed",i=void 0),{cache:i,cacheBustedBeforeAction:a,cacheBustReason:s}};var z1={minChunkTokenCount:1e4,acceptableChunkTokenCount:25e3,maxChunkTokenCount:5e4,maxLineLength:4e3},B1=/<(\S+) id="(\d+)".*?>/g,Fle=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,V1=["h1","h2","section","footer","nav","aside","form","label","dialog"],Ule=[...V1,"span","div","h3"],Ble=["table","select","form","ul","ol","menu","pre","code","dialog"],zle=["table","form","dialog","nav","section","ul","select"];function H1(e){return Vle(e)}function Vle({logger:e,serializedTree:t,options:n}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=n,s=[],l=t.split(`
|
|
5208
5208
|
`),c=0,u=[],d=0,p=[],m=[],f=!1;for(;c<l.length;){f&&(s.push({ids:p,content:u.join(`
|
|
5209
5209
|
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],f=!1);let h=l[c],g=ze(h);d+=g,h.length>a&&(h=h.slice(0,a));let y=Array.from(h.matchAll(B1)).map(H=>H&&H.length>=3?{tagName:H[1],id:H[2]}:void 0).filter(H=>!!H),A=Array.from(h.matchAll(Fle)).map(H=>H&&(H[2]||H[4])).filter(H=>!!H);A.reverse();let R=h.replace(/ id="[0-9]+"/g,"");u.push(R);for(let H of y)p.push(H.id),m.push(H);for(let H of A){let ee=m[m.length-1];ee&&ee.tagName===H&&m.pop();}let P=m.some(H=>Ble.includes(H.tagName)),x=l[c+1]??"",I=ze(x),U=Array.from(x.matchAll(B1)).map(H=>H&&H.length>2?H[1]:void 0).filter(H=>!!H),F=U.some(H=>V1.includes(H)),q=U.some(H=>Ule.includes(H));d+I>=i&&(f=!0),d>=r&&(F&&!P||A.some(H=>zle.includes(H)))&&(f=!0),d>=o&&q&&!P&&(f=!0),c++;}return u.length&&s.push({ids:p,content:u.join(`
|
|
5210
|
-
`),tokenLength:d}),s.forEach((h,g)=>{let S=h.ids[0],T=h.ids[h.ids.length-1];e.debug({tokenLength:h.tokenLength,minId:S,maxId:T},`Chunk for page filtering (index ${g+1}/${s.length})`);}),{chunks:s}}var G1=5e6,Gle=15e4;async function $l(e){let{fixtures:t}=e,{logger:n}=t,r=e.tree,o=e.serializedTree,i=ze(o);if(i>G1)throw new L("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${G1} tokens.`);if(i>Gle){let a=H1({serializedTree:o,options:z1,logger:n}),s=randomUUID();r=await jle({...e,chunks:a.chunks,callId:s}),o=r.serialize();let l=ze(o);n.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return o}async function jle({type:e,callId:t,chunks:n,description:r,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:n,description:r,type:e,softTokenLimit:3e4,mediumTokenLimit:6e4,hardTokenLimit:18e4,callId:t},{abortSignal:s,logger:l,loggerTags:Je(l)}),u=[];return n.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function Aw(e,t){if(!e.description)throw new L("UserConfigurationError","Cannot locate element with empty description");return Oo({action:async()=>Wle(e,t),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,browser:t.browser,logger:e.logger})}async function Wle(e,t){let{disableCache:n,testContext:r,filterByViewport:o,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:p,isAutoHeal:m,cacheBustReason:f,acceptElementMovedError:h}=e,{orgId:g,browser:S,localCodeEvalTools:T,generator:y,abortSignal:b}=t,A=e.description,R=rn(),P=e.useMemory&&!n;r&&(A=await er({orgId:g,s:A,context:r,localTools:T,signal:b,logger:l})),a&&(A=D1(A,a));let{serializedTree:x,tree:I}=await R.startAsyncSpan("GET_PAGE_STATE",async()=>Rs(S,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:o,abortSignal:b,skipWait:i,logger:l}),{}),N=await R.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let fe,ue=Date.now(),te;for(;!fe&&Date.now()-ue<3e3;){b.throwIfAborted();try{fe=await S.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(we){te=we;}}if(!fe)throw new L("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${te?.message}`);return fe}),U=x,F=!1,H=`data:image/jpeg;base64,${N.toString("base64")}`;U=await $l({type:"locator",description:A,screenshot:H,serializedTree:x,tree:I,fixtures:{generator:y,signal:b,logger:l,orgId:g}}),U!==x&&(F=!0);let ee=await R.startAsyncSpan("AI_LOCATOR_CALL",async fe=>{m&&(fe.attributes.isAutoHeal=!0),f&&(fe.attributes.cacheBustReason=f);let ue=await y.getElementLocation({browserState:U,goal:A,screenshot:H,source:a,memory:P?s:void 0},{disableCache:n,abortSignal:b,loggerTags:Je(l),useMemory:P});if(fe.result=ue,R.storeTraceAsset){let te=randomUUID();R.storeTraceAsset({snapshotId:te,data:N}),fe.screenshotSnapshotId=te;}return ue});if(l.debug({usedRag:F,result:ee},"Got locator result"),!(ee.id>0))throw new _c(`Could not find any relevant element: ${ee.thoughts}`,ee.updatedMemory?{type:"GCS_TRACES",traces:ee.updatedMemory}:void 0);let{resolution:D,target:W,frameConfig:Z}=await R.startAsyncSpan("TARGET_RESOLUTION",async fe=>{let ue=await S.createTargetFromA11yId({id:ee.id,requirements:ee.requirements,additionalElements:ee.additionalElements,description:A,targetSource:"AI",logger:l,skipSavingVisualAttributes:p,acceptElementMovedError:h});return fe.result={serializedElement:ue.target.nodeOnlySerializedHtml??"Unknown HTML element"},ue});if(D.a11yNode?.properties?.hidden&&D.a11yNode?.properties?.hidden!=="false")throw new L("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${D.displayString}`);return P&&(ee.updatedMemory?W.memory={type:"GCS_TRACES",traces:ee.updatedMemory}:s&&(W.memory=s)),{thoughts:ee.thoughts,target:W,resolution:D,frameConfig:Z,screenshot:H}}var qle=15;async function pT({command:e,logger:t,fixtures:n,useMemory:r,maxRetries:o=qle}){if(!e.assertion.trim())throw new L("ActionFailureError","Assertion command is missing the assertion content");let i=qb.optional().catch(void 0).parse(e.source);e.source&&!i&&t.warn(`Invalid source ${e.source} for AI assertion, ignoring...`);let a=rn();return a.startAsyncSpan("AI_ASSERTION_CALL",async s=>{let{browser:l}=n,c=e.timeout?e.timeout*1e3:l.smartWaitingTimeout,u=lB(c,o-1),d=0,p=Date.now(),m=p+c,f=p,h,g,S;try{await Oo({action:()=>l.clearHighlights(),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,browser:l,logger:t});}catch(b){t.warn({err:b},"Failed to clear highlights before AI check, continuing...");}for(;d<o;){n.abortSignal.throwIfAborted();let b=Date.now();if(d>0){if(b>=m)break;let P=m-b,x=f-b,I=Math.min(x,P);I>0&&await ve(I,n.abortSignal);}let A=Date.now();if(d>0&&A>=m)break;let R=!1;try{if(h=await Oo({action:async()=>{let x=await $1(l,t,n.abortSignal);return g&&g.serializedTree===x.serializedTree&&g.screenshotBuff.equals(x.screenshotBuff)?(R=!0,h):(g=x,W1({command:e,state:x,fixtures:n,useMemory:r,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:d,logger:t,source:i}))},frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,logger:t,browser:l}),h?.success){h?.updatedMemory&&_m(e,h.updatedMemory,t);break}else throw h?.thoughts?new L("AssertionFailureError",h.thoughts):new L("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(P){n.abortSignal.throwIfAborted(),S=P instanceof Error?P:new Error(`${P}`),R?t.info(`AI check attempt ${d} failed (re-used previous result)`):t.info({err:P},`AI check assert attempt ${d} failed, retrying...`);}finally{d++,f=A+u;}}if(!h?.success){let b=m-Date.now();b>0&&await ve(b,n.abortSignal);}if(!h?.success)try{h=await Oo({action:async()=>W1({command:e,state:await $1(l,t,n.abortSignal),fixtures:n,useMemory:r,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:d,logger:t}),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,logger:t,browser:l});}catch(b){n.abortSignal.throwIfAborted(),S=b instanceof Error?b:new Error(`${b}`);}finally{d++;}h?.updatedMemory&&_m(e,h.updatedMemory,t);let T=h?.afterScreenshotOverride;if(T&&a.storeTraceAsset){let b=randomUUID();a.storeTraceAsset({snapshotId:b,data:T}),s.screenshotSnapshotId=b;}let y=h?.elementScreenshotOverride;if(y&&a.storeTraceAsset){let b=randomUUID();a.storeTraceAsset({snapshotId:b,data:y}),s.elementScreenshotSnapshotId=b;}if(!h?.success){s.result={thoughts:S?.message??"AI check failed after all attempts",result:!1};let b=`AI check still failing after ${d} attempts.`;throw S&&(b+=` Latest result: ${S.message}`),new L("AssertionFailureError",b)}return s.result={thoughts:h.thoughts,result:!0},{...h,succeedImmediately:!1,urlAfterCommand:l.url()}})}async function $1(e,t,n){await e.waitForPageLoad({signal:n});let[r,o]=await Promise.all([Rs(e,{abortSignal:n,skipWait:!0,skipWaitForPageLoad:!0,logger:t}),e.screenshot({retries:1,respectActiveFrame:!0})]);return {...r,screenshotBuff:o}}async function W1({command:e,state:t,fixtures:n,useConsensus:r,useMemory:o,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l}){let {browser:c,generator:u,abortSignal:d}=n,{serializedTree:m,tree:f}=t,h=t.screenshotBuff,g=h.toString("base64"),S=c.url(),T=e.contextChoice??"MULTIMODAL",y=m;T!=="VISION_ONLY"&&(y=await $l({type:"assertion",serializedTree:m,tree:f,description:e.assertion,screenshot:g,fixtures:{generator:u,signal:d,logger:l,orgId:n.orgId}}),y);let b={goal:e.assertion,url:S,memory:o?e.cache?.memory:void 0,browserState:y,screenshot:g,contextChoice:T,source:s},R=await(T==="VISION_ONLY"?(x,I)=>u.getVisualAssertionResult(x,I):(x,I)=>u.getAssertionResult(x,I))(b,{useConsensus:r,attemptNumber:a,useMemory:o,disableCache:!!e.disableCache,abortSignal:d,logger:l,loggerTags:Je(l)}),P;if((R.result||i)&&R.relevantElements?.length){R.relevantElements.map(x=>c.getSerializedFormFromA11yId(x)).filter(x=>!!x);try{let x=R.relevantElements[0],{resolution:I}=await c.createTargetFromA11yId({id:x,description:null,targetSource:"AI",skipSaveToCache:!0});P=await c.screenshot({locator:I.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(x){l.debug({err:x},"Failed to capture element screenshot for trace, continuing...");}await Kle(R.relevantElements,c,l);}return {success:R.result,thoughts:R.thoughts,afterScreenshotOverride:h,elementScreenshotOverride:P,updatedMemory:o?R.updatedMemory:void 0}}async function Kle(e,t,n){let r=Date.now();for(let o of e){if(Date.now()-r>2e3){n.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await ne(t.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){n.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function K1(e){let{command:t,logger:n,fixtures:r,disableCache:o}=e,{browser:i,generator:a,abortSignal:s}=r;if(!t.goal.trim())throw new L("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let d=VN(t.schema);if(d)throw new L("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=rn();try{return await u.startAsyncSpan("AI_EXTRACTION_CALL",async d=>{let p=await a.getTextExtraction({goal:t.goal,browserState:l,returnSchema:t.schema,screenshot:`data:image/jpeg;base64,${c.toString("base64")}`},{disableCache:o,abortSignal:s,loggerTags:Je(n)});if(d.result=p,Yle({tracer:u,span:d,screenshot:c,htmlState:l,logger:n}),p.result==="NOT_FOUND")throw new L("ActionFailureError","No relevant data found for extraction goal on this page");if(p.thoughts?.includes("MaxGenerationLengthExceededError"))throw new L("UserConfigurationError",p.thoughts);return {thoughts:p.thoughts||void 0,data:p.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let p=se(d);throw p.includes("MaxGenerationLengthExceededError")?new L("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):p.includes("AIProviderError")&&p.includes("time")?new L("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function Yle(e){let{tracer:t,span:n,screenshot:r,htmlState:o,logger:i}=e;if(t.storeTraceAsset)try{let a=randomUUID();t.storeTraceAsset({snapshotId:a,data:r}),n.screenshotSnapshotId=a;let s=randomUUID();t.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"html"}),n.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function Y1(e,t){let{logger:n}=e,{abortSignal:r,browser:o}=t,i=Date.now();try{await Xle(i,e,t);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||r.aborted)return;n.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ve(s,r);}finally{n.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function Xle(e,t,n){let{abortSignal:r,browser:o}=n;if(o.smartWaitingTimeout<3e3){await ve(o.smartWaitingTimeout,r);return}if(!t.description)throw new L("UserConfigurationError","Cannot locate element with empty description");await ne(Jle(e,t,n),{milliseconds:o.smartWaitingTimeout});}async function Jle(e,t,n){let{logger:r,iframeUrl:o}=t,{browser:i}=n;for(;Date.now()-e<i.smartWaitingTimeout;)if(await Oo({action:async()=>Zle(t,n),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:r}))return}async function Zle(e,t){let{testContext:n,logger:r}=e,{browser:o,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=t,c=e.description;n&&(c=await er({orgId:s,s:c,context:n,localTools:a,signal:i,logger:r})),i.throwIfAborted();let u;try{u=await o.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new L("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${f instanceof Error?f.message:f}`)}let p=`data:image/jpeg;base64,${u.toString("base64")}`;i.throwIfAborted();let m=await l.getSmartWaitingDecision({description:c,screenshot:p},{abortSignal:i,loggerTags:Je(r)});return r.debug({result:m},"Got smart waiting result"),m.isPageReady}async function Z1(e){return rn().startAsyncSpan("ELEMENT_ASSERTION",async n=>Qle(e,n),{name:"Element check"})}async function Qle(e,t){let{command:n,timeoutMs:r,fixtures:o,disableCache:i}=e,{abortSignal:a}=o,s=()=>uh(n.cache)?n.cache:void 0,l=s(),c=!i&&!!l?.target&&fc(l.target),u=cloneDeep(l),d=(T=!1)=>{if(l=s(),!!l)if(T){let y=RA(u,l);l.target=y.target,l.updatedAt=y.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},p=Date.now(),m=0,f,h=500,g=!1;for(;m<2||Date.now()-p<r;){m++,m>1&&await ve(h,a),a?.throwIfAborted(),l=s();let T=m===1,{result:y,elementWasFound:b}=await X1({cacheToUse:l,skipAISmartWaiting:!T,useAIIfCacheFails:!c,params:e});if(f=y,g=g||b,y.success)break;d(),h=Math.min(h*1.25,1e4);}if(!f)throw new L("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(a?.throwIfAborted(),!f.success){let T=s(),y=T?.target?.memory?{target:{id:-1,memory:T.target.memory}}:void 0,{result:b,elementWasFound:A}=await X1({cacheToUse:y,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:e});f=b,g=g||A,f.success||d(!0);}let S=s();return f.success&&S?.target&&!g&&(S.target=Im(S.target),S.updatedAt=new Date),t.result={success:f.success,message:f.err?.message},f}async function X1({cacheToUse:e,skipAISmartWaiting:t,useAIIfCacheFails:n,params:r}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=r,{logger:c}=a;if(o.target&&!Oa(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=KF(o.assertion),d=ece(o.assertion),p,m=!1,f=cloneDeep(e);try{let{elementInteractedDisplayString:h,result:g,thoughts:S}=await l({tracer:s,command:o,target:o.target,cache:f?.target,action:async T=>tce(T.locator,r),options:{...o,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ks(o),skipAISmartWaiting:t,targetName:"target"},retriesWithAI:n?1:0});return p={success:g.success,data:g.data,err:g.err,elementInteractedDisplayString:h,thoughts:S},m=!0,g.success||(c.warn({aiThoughts:S,elementString:h,err:g.err},"Element check found an element but failed"),p={...g,thoughts:S}),{result:p,elementWasFound:m}}catch(h){if(u)return p={success:!0,thoughts:`The element described does not exist on the page: ${h.message}`,err:void 0,data:void 0},{result:p,elementWasFound:m};if(!(h instanceof L)||h.reason!="ActionFailureError")throw h;return p={success:!1,err:h,data:void 0,thoughts:void 0},c.warn({err:h},"Element check did not find an element and failed"),{result:p,elementWasFound:m}}}function ece(e){return !(e.type==="ELEMENT_EXISTENCE"&&e.condition==="VISIBLE"&&!e.negated)}async function tce(e,{command:t,fixtures:n}){return await n.browser.highlight(e),await nce(e,t.assertion)}async function nce(e,t){let n=!0,r,o;switch(t.type){case"ELEMENT_CONTENT":{let a=await e.textContent()??"";if(o={elementTextContent:Pt(a,500,!0)},!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,r=new L("AssertionFailureError",`The content ${s} '${t.value}': ${a}`);}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Pt(await e.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await e.getAttribute(t.attr,{timeout:3e3});}catch(s){r=new L("AssertionFailureError",se(s)),n=!1;break}if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,t.operation==="EXISTS"?r=new L("AssertionFailureError",`The attribute ${t.attr} ${s}`):r=new L("AssertionFailureError",`The attribute ${t.attr} ${s} '${t.value}': ${a}`);}break}case"ELEMENT_EXISTENCE":{switch(t.condition){case"VISIBLE":{n=await e.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return !0}return !1},lo*1e3);break}case"EDITABLE":{n=await e.isEditable({timeout:lo*1e3});break}case"EXISTS":{n=!0;break}case"ENABLED":{n=await e.isEnabled({timeout:lo*1e3});break}case"FOCUSED":{n=await e.evaluate(s=>s===document.activeElement);break}default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})(t.condition)}if(n=t.negated?!n:n,!n){let a=Pu(t);r=new L("AssertionFailureError",`The element ${a}`);}break}case"ELEMENT_NAME":{let a=await e.evaluate(s=>s.tagName);if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!0})){let s=Pu(t);n=!1,r=new L("AssertionFailureError",`The element tag name ${s} '${t.value}': ${a}`);}break}case"ELEMENT_STYLE":{let a=await e.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),t.property);if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,t.operation==="EXISTS"?r=new L("AssertionFailureError",`The style property ${t.property} ${s}`):r=new L("AssertionFailureError",`The style property ${t.property} ${s} '${t.value}': ${a}`);}break}default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {thoughts:void 0,success:n,data:o,err:r}}function Q1(e){return e.type==="ELEMENT_EXISTENCE"&&e.negated&&e.condition==="EXISTS"}async function of(e,t){let n=await e.screenshot(t),r=await Jimp.fromBuffer(n);return {buffer:n,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}async function tG({tracer:e,command:t,disableCache:n,browser:r,targetingWrapper:o,logger:i,screenshotStorage:a}){if(t.target&&!Oa(t.target))throw new Error("Visual Diff with x/y is not supported yet");await r.waitForStability({logger:i});let s={clearHighlights:!0,hideCaret:!0},l;t.target?.elementDescriptor?l=(await o({tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async N=>of(r,{locator:N.locator,...s}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await of(r,s);let c=await a.prepareGoldenScreenshotForComparison(i,t,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let I=`${l.width}x${l.height}`,N=`${c.width}x${c.height}`;return {fail:!0,thoughts:`Current screenshot (${I}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:r.url()}}let u=await Jimp.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Jimp.fromBuffer(c.buffer),m={width:c.width,height:c.height},f,h=d.width*d.height,g=m.width*m.height,S=Math.abs(d.height-m.height),T=Math.abs(d.width-m.width);if(h>g){let I=u.cover({w:m.width,h:m.height});l.buffer=await I.getBuffer("image/jpeg"),f="current",l.width=m.width,l.height=m.height;}else if(g>h){let I=p.cover({w:d.width,h:d.height});c.buffer=await I.getBuffer("image/jpeg"),f="saved";}let y={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=t.threshold??.1,R=yse(Rw.decode(c.buffer).data,Rw.decode(l.buffer).data,y.data,l.width,l.height,{threshold:b,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,P=R>b*100,x=`Visual diff of ${R.toFixed(2)}% detected, which is ${P?"over":"under"} the threshold of ${b*100}%.`;if(f&&(x+=` The ${f} screenshot was cropped since it was taller by ${S} pixels and wider by ${T} pixels.`),P)throw new L("ActionFailureError",x);return {fail:P,thoughts:x,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Rw.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:r.url()}}var ice=3e4;function ace(e){if(!e.body)return {};switch(e.body.type){case"json":return {content:e.body.content,contentType:"application/json"};case"form-urlencoded":{let t=new URLSearchParams;return Object.entries(e.body.content).forEach(([n,r])=>{t.append(n,r);}),{content:t.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function nG({command:e,logger:t,baseUrl:n,fetchImplementation:r=fetch}){let o=e.timeout??ice/1e3,i=Object.fromEntries(Object.entries(e.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(e.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h);});let s=a.toString(),l;if(Du(e.url)&&(l=e.url),n&&ku(e.url,n)&&(l=new URL(e.url,n).toString()),!l)throw new L("ActionFailureError",`Invalid URL: ${e.url}`);let c=l;t.info({url:c,searchParams:s,headers:i,body:e.body,method:e.method},"Making HTTP request");let d=await ne((async()=>{let f=s?`${c}?${s}`:c;try{let h=ace(e),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await r(f,{headers:g,method:e.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new L("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new L("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let p={};d.headers.forEach((f,h)=>{p[h]=f;});let m={status:d.status,headers:p,request:{url:d.url,method:e.method,headers:i}};if(e.body?.type==="json"&&e.body.content)try{m.request.json=JSON.parse(e.body.content);}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json();}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var sce=5e3;async function mT({timeout:e=lo,...t}){let n=Date.now(),r=e*1e3,o=r+1e4,i,a=0,s=500;for(;a-n<r;){if(Date.now()-n>o){t.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}t.signal?.throwIfAborted();let l=Date.now();i=await rG(t),a=Date.now();let c=a-l;if(c>1e3&&t.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ve(s,t.signal),s=Math.min(Math.floor(s*1.5),sce);else return i}return i=await rG(t),i}async function rG(e){return rn().startAsyncSpan("PAGE_ASSERTION",async n=>{let r=await lce(e);return n.result={success:r.success,message:r.err?.message},r},{name:"Page check"})}async function lce({assertion:e,browser:t,autoExpandIframes:n}){switch(e.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(n){let l=await t.evaluateFunctionInAllFrames(oG,{value:e.value,negated:!!e.negated,returnHtml:!1});i=e.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml;}else ({evaluation:i,pageHtml:s}=await t.evaluateFunctionInPage(oG,{value:e.value,negated:!!e.negated,returnHtml:!0},"checking page content"));if(!i){let l=e.negated?Ta.CONTAINS:Ea.CONTAINS;a=new L("AssertionFailureError",`The page ${l} '${e.value}'.`),o=s;}}catch(s){a=new L("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return (o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function oG({value:e,negated:t,returnHtml:n}){let r=document.body.innerHTML,o=r.includes(e)===!t;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&n?r:void 0}}var cce=3e4;async function iG({command:e,logger:t,baseUrl:n,fetchImplementation:r=fetch}){let o=e.timeout??cce/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(e.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Du(e.url)&&(s=e.url),n&&ku(e.url,n)&&(s=new URL(e.url,n).toString()),!s)throw new L("ActionFailureError",`Invalid URL: ${e.url}`);let c=await ne((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:e.query,variables:e.variables?JSON.parse(e.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!c)throw new L("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,p=await c.text();try{d=JSON.parse(p);}catch{throw new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}let u={};return c.headers.forEach((d,p)=>{u[p]=d;}),{status:c.status,headers:u,json:await c.json()}}var cd=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:t,generator:n,logger:r,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:l,options:c}){this.orgId=i,this.options=c,this.browser=t,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=n,this.logger=r;}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal);}setClosed(){this.executeAbortController.abort();}throwIfClosed(){this.executeAbortController.signal.throwIfAborted();}get closed(){return this.executeAbortController.signal.aborted}async withExecutionOptions(t,n){this.executionOptionsStack.push(t);try{return await n()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:t,startingScreenshot:n,history:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([Rs(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await $l({type:"ai-action",description:t,screenshot:u,serializedTree:l.serializedTree,tree:l.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:n,history:r,goal:t,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Je(s)},langfuseSessionId:i})}async promptToCommand({goal:t,startingScreenshot:n,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Rs(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,p=await $l({type:"ai-action",description:t,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:l,browserState:p,startingScreenshot:n,history:r,goal:t,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Je(a)},langfuseSessionId:s})}catch(f){throw new L("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(t){return Rs(this.browser,t)}async locateElement(t){return await Aw(t,this.getControllerFixtures())}async locateElementWithSelector(t,n){return Oo({action:async()=>{let r=await this.browser.resolveHardcodedCssSelector({selector:t,timeoutMs:2e3,logger:this.logger});return {thoughts:"Located element with selector",target:{id:-1,selector:t,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:r}},frameConfig:n?{type:"url",url:n}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??!0}async wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:r,descriptions:o,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<o.length;u++){let d=o[u],p=await this.wrapElementTargetingCommand({tracer:t,command:n,target:d,cache:i[u],action:async m=>m,options:{...s,targetName:r[u]}});c.push(p);}try{let u=await a(...c.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=c.map((m,f)=>m.thoughts?`${d(r[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return {result:u,elementInteractedDisplayStrings:c.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),l>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:r,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new L("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:t,action:n,options:r,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=r;if(t.type!=="description")throw new L("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:t.elementDescriptor,targetName:a,logger:i});return {result:await n({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await ve(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(t){let{resolutionResult:n,disableGlobalLocatorRedirect:r,logger:o}=t,i=rn(),a=!r&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(n.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(n,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let p=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:p});}catch(p){o.debug({err:p},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:n.locator,serverSideBoundingBox:await n.locator.boundingBox({timeout:ge}),originalElementLocationResult:n.originalElementLocationResult}),s}async resolveCachedTargetForAction(t){let{cache:n,options:r,logger:o}=t,a=await rn().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=n.targetSource;try{let c=await this.browser.resolveTarget(n,{allowNotActionableNodesOverride:r.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...r.resolveTargetOptions,acceptElementMovedError:r.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Er&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:r.disableGlobalLocatorRedirect,logger:o});return r.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(t){return await Oo({action:()=>this.wrapElementTargetingCommandHelper(t),frameConfig:t.options.iframeUrl?{type:"url",url:t.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(t){let{tracer:n,target:r,action:o,options:i,command:a,finalAttempt:s=!1,originalCache:l=t.cache}=t,{retriesWithAI:c=1}=t,{disableCache:u,useSelector:d,targetName:p}=i,m=rn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=cloneDeep(t.cache);if((!g||u)&&!LI(r))throw new L("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(t);let S=!1,T;u&&(f.info("Cache explicitly disabled for this step"),S=!0,T="Cache explicitly disabled",g=void 0);let y=U1({cache:g,description:r.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=y.cache,S=S||y.cacheBustedBeforeAction,!T&&y.cacheBustReason&&(T=y.cacheBustReason);let b=!0;if(!F1(g))return c--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:n,target:r,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:S,cacheBustReason:T});try{let{resolutionResult:A,finalTarget:R}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),P=await o(R);if($t.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.104.2"]),HS({cmd:a,key:p,newTarget:g,logger:f,updatedWithAI:!1}),b){let x=A.decisions.filter(I=>I.matched);if(x.length!==1)f.warn({decisions:A.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let I=x[0].type;n.recordTargetAutoHeal({healType:I});}}return {result:P,elementInteractedDisplayString:A.displayString}}catch(A){this.throwIfClosed();let R=gb(A);if(R&&!s)return f.warn({err:A},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:i});if(A instanceof L&&!R)throw f.warn({err:A},"Failed to execute command with target (fatal)"),A;if(c>0&&r){f.info({err:A},"Failed to execute action with cached target, retrying with AI"),$t.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.104.2",`missReason:${A instanceof Er?A.cacheMissReason:"unknown"}`]);let P;return g.memory&&lh(g.memory)&&(P=g.memory),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:{...i,memory:P,targetHealingInProgress:!0}})}throw new L("ActionFailureError",`Failed to execute interactive command: ${A instanceof Error?A.message:`${A}`}`,{errOptions:{cause:A}})}}async executeTargetingCommandWithAI(t){let{tracer:n,stepTracer:r,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=t;c.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let m=!1;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await n.startAsyncSpan("SMART_WAITING",async()=>await Y1({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),m=!0):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let f=2;for(let h=1;h<=f;h++){let g=!1,S=this.browser.getActiveFrameConfig(),T=i.force||h>1;try{let y;try{y=await Aw({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:m,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p,acceptElementMovedError:T},this.getControllerFixtures());}catch(R){if(R instanceof _c&&R.updatedLocatorMemory){let P={id:-1,...l,memory:R.updatedLocatorMemory};HS({cmd:a,key:i.targetName,newTarget:P,logger:c,updatedWithAI:!0});}throw R}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),g=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),A=await s(b);return HS({cmd:a,key:i.targetName,newTarget:y.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(r.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=Je(c)),{result:A,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(g&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),h<f&&gb(y)){c.warn({err:y,aiAttempt:h},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof L?y:new L("ActionFailureError",y.message)}}throw new L("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(t){return of(this.browser,t)}async executePresetCommand(t,n,r,o){this.options?.slowMoMs&&await ve(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(n,r);}catch(l){throw this.throwIfClosed(),new L("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(t,n,r,o);return this.options?.autoFollowNewTabs&&await k1({beforeUrl:a,command:n,beforePages:i.map(c=>c.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{FV(n,s);}}createCallbacksForBrowser(t){return {createIsolatedFolder:()=>qR(t)}}async traceBrowserInteraction(t,n,r){return rn().startAsyncSpan("BROWSER_INTERACTION",async()=>n(),{name:t,...r})}async resolveCommandTemplateStrings(t,n){return Ky({obj:t,context:n,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(t,n,r,o){o=o||"disableCache"in n&&!!n.disableCache;let i=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":{let a=n.condition;return a?.assertion.trim()?pT({command:a,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:i}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AI_ASSERTION":{if(!n.assertion.trim())throw new L("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new L("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return pT({command:n,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:i})}case"AI_EXTRACT":return K1({command:n,logger:i,fixtures:this.getControllerFixtures(),disableCache:o});case"NAVIGATE":if(!Du(n.url)&&!ku(n.url,this.browser.baseUrl))throw new L("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new L("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case"GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let a,s;if(n.target&&di(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:u,thoughts:d}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:p=>this.browser.hover(p),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:o}});a=u,s=d;}let l=this.browser.getViewport()?.height??Ar.height,c=this.browser.getViewport()?.width??Ar.width;switch(n.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(n.deltaY??l)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(n.deltaY??l));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(n.deltaX??c)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(n.deltaX??c));break}return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new L("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let a=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:a},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":{if(n.delay>1800)throw new L("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=n.delay*1e3;await ve(a,this.executeAbortController.signal);break}case"REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case"CLICK":{if(di(n.target)){let{pixels:d}=n.target;await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(d,n),{coordinates:d});break}let a=this.browser.url(),{elementInteractedDisplayString:s,result:l,thoughts:c}=await this.wrapElementTargetingCommand({tracer:t,target:n.target,command:n,cache:n.cache?.target,action:d=>this.traceBrowserInteraction("Click",()=>this.browser.click(d,this.createCallbacksForBrowser(this.orgId),n),{selector:d.locator.toString()}),options:{...n,targetName:"target",disableCache:o}}),u={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:c,data:l.downloadedFile?{downloadedFile:l.downloadedFile}:void 0};return ny(a,u.urlAfterCommand)&&(u.succeedImmediately=!0,u.succeedImmediatelyReason="URL changed"),u}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(di(n.fromTarget)&&di(n.toTarget)){let l=n.fromTarget.pixels,c=n.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(l,c,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0}),{coordinates:l});break}if(di(n.fromTarget)||di(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:a,thoughts:s}=await this.wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(l,c)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(l,c,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps})),options:{...n,disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a[0],thoughts:s}}case"MOUSE_DRAG":{let a=parseInt(n.deltaX),s=parseInt(n.deltaY),l=n.steps??5;if(isNaN(a)||isNaN(s))throw new L("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&di(n.target)){let d=n.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:l,fromTarget:d}),{coordinates:d});break}let c,u;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:d,thoughts:p}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async m=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,m.locator,{force:n.force})),options:{...n,targetName:"target",disableCache:o}});c=d,u=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,void 0,{force:n.force}));return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case"SELECT_OPTION":{if(!Oa(n.target))throw new Error("Select with x/y is not supported yet");let a=n.target.elementDescriptor,s=n.choice,{elementInteractedDisplayString:l,thoughts:c}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:{type:"description",elementDescriptor:a},cache:n.cache?.target,action:u=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(u,s,n.force),{value:s.type==="LABEL"?s.label:s.type==="VALUE"?s.value:s.index}),options:{...n,targetName:"target",disableCache:o,source:Ks(n)}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:c}}case"TAB":{let a={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,a);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLOSE_TAB":await this.browser.closePage(n.action,{retry:!0});break;case"COOKIE":{if(!n.value)break;let a=await this.browser.setCookie(n.value);i.debug({results:a},"Set cookies");break}case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let a;try{n.environment==="BROWSER"?(a=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:r.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),i.info({result:a},"Executed JavaScript in browser")):a=await Ss({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:r,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async s=>{if(!this.options?.scratchPadId){i.warn({updates:s},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:s,logger:i});}}});}catch(s){throw this.throwIfClosed(),new L("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a);}catch(s){throw new L("ActionFailureError",`Return value is not serializable: ${s instanceof Error?s.message:`${s}`}`,{errOptions:{cause:s}})}return {urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:a}}case"TYPE":{if(n.target&&di(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0),{value:n.value});break}let a=this.browser.url(),s,l,c=cloneDeep(n.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(c){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:c,cache:n.cache?.target,action:f=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(n.value,f,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),{value:n.value,selector:f.locator.toString()}),options:{...n,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!u,source:Ks(n)}});s=p,l=m;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0),{value:n.value});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:l};return ny(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(di(n.target)){let{pixels:l}=n.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(l),{coordinates:l});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:l=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(l,{relativePosition:n.relativePosition}),{selector:l.locator.toString()}),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!Oa(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:l=>this.browser.focus(l),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(n.target&&!Oa(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,target:n.target,command:n,cache:n.cache?.target,action:l=>this.browser.blur(l),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"PRESS":{let a=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs}),{value:n.value});let s={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return ny(a,s.urlAfterCommand)&&(s.succeedImmediately=!0,s.succeedImmediatelyReason="URL changed"),s}case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let a=new CookieJar,s=dce(fetch,a),l;try{l=new URL(n.url).hostname;}catch{}let c=await nG({command:n,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return {data:Xd.parse({...c,cookies:qO(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return {data:await iG({command:n,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return tG({tracer:t,command:n,disableCache:o,browser:this.browser,logger:i,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:a=>this.wrapElementTargetingCommand(a)});case"FILE_UPLOAD":{let a,s;if(n.fileSource.type==="URL"?(s=n.fileSource.url,a=await ZV({uri:n.fileSource.url,logger:i,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(s=n.fileSource.name,a=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!a)throw new L("UserConfigurationError",`Attempted to use non-existent file for upload step: ${s}`);await this.browser.setFileChooserHandler({...a,filename:n.filename});break}case"AUTH_SAVE":return {data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let a;if(!n.storageState.trim())a=void 0;else if(a=await Ss({orgId:this.orgId,code:n.storageState,fragment:!1,context:r,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new L("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=fg.optional().parse(a);}catch(l){throw new L("ActionFailureError",`Credentials provided do not follow the required format: ${l}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(n.timeout??lo)*1e3,s=this.generator.getAgentConfig()?.assertion;if(Q1(n.assertion)&&!n.useSelector&&n.target.type==="description"&&s&&s!=="v1"){let c={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let u=await pT({command:c,logger:i,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory()});return {succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${u.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:u.afterScreenshotOverride}}finally{c.cache?.memory&&_m(n,c.cache?.memory.traces,i);}}let l=await Z1({command:n,tracer:t,timeoutMs:a,targetingWrapper:c=>this.wrapElementTargetingCommand(c),fixtures:this.getControllerFixtures(),disableCache:o});return {fail:!l.success,data:l.data,elementInteracted:l.elementInteractedDisplayString,thoughts:l.err?.message??l.thoughts??`Element assertion ${l.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await Oo({action:async()=>mT({assertion:n.assertion,browser:this.browser,logger:i,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:i});return {fail:!a.success,data:a.data,thoughts:a.success?"Page assertion passed.":a.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let a=new vs(n.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[n.key]=s.then(async l=>await JR(l)).catch(l=>{i.error({err:l},"Failed to get request listener response");}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let a=this.registeredListeners[n.key];if(!a)throw new L("ActionFailureError",`No listener registered with key: ${n.key}`);let s=n.timeout??10;return {data:await ne(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new vs(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:s=>a.matches({url:s.request.url,method:s.request.method}),onRequestStart:(s,l)=>{this.recordedRequests[n.key][s]=Zy(l);},onRequestComplete:(s,l)=>{this.recordedRequests[n.key]?.[s]&&(this.recordedRequests[n.key][s]=Zy(l));}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[n.key];if(!a)throw new L("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(a),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let a;return n.requestMatcher&&(a=new vs(n.requestMatcher)),this.browser.setHeader(n.name,n.value,a),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return {data:{key:this.browser.registerMock(n.key,new vs(n.requestMatcher),async(s,l)=>{let c=await Ss({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:r,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:l},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=mL.parse(c);return new Response(u.body,{status:u.status,headers:u.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:t,targetId:n,disableCache:r,screenshot:o}){return (await this.generator.getReverseMappedDescription({browserState:t,target:n,screenshot:o},{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:Je(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights();}async startRecordMode({params:t,abortController:n,isClickToRecord:r}){this.recordAbortController=n;let o=new sT({signal:n.signal,...t});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(t){return this.generator.getAutohealingProposal(t,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Je(this.logger)})}async getFailureRecoveryPlan(t,n){return this.generator.getFailureRecoveryPlan(t,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Je(n??this.logger)})}};var ww=async e=>{let{step:t,resolvedInputs:n}=e.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:a,controller:s}=e.fixtures,l=s.browser,{orgId:c,runId:u}=e.inputs,d=s.executeAbortController.signal;Object.keys(n).length>0&&(o.setInputs(n),r.info(Li({json:{inputs:n,moduleId:t.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(t.cacheConfig||t.defaultCacheAllInvocations){let g=t.cacheConfig?.cacheKey||t.defaultCacheKey||"",S=await er({orgId:c,s:g,context:o,logger:r,localTools:a,signal:d});h={orgId:c,cacheKeys:[S,...Object.entries(n).map(([y,b])=>`${y}:${b}`)]},r.info({original:g,keyParams:h},"Module cache key params");let T=Date.now();for(;Date.now()-T<VL;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){r.info({cacheResult:Pt(y,1e3,!0)},"Got result from module execution cache"),p=fT(t,n,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else r.info({cacheKey:g,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${hostname()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Failed to acquire cache lock, retrying...");await ve(2500+Math.random()*1e4,d);}}try{if(!p)p=await fce(e);else if(t.autoAuth){let g=fg.safeParse(p.data);if(!g.success)throw new L("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${g.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(g.data);let S=!1,T=t.advanced?.cacheInvalidation;if(T&&T.type==="PAGE_CHECK"){let y={type:"CONTENT",value:T.substring},b=await mT({timeout:lo,assertion:y,browser:l,logger:r,signal:d,autoExpandIframes:!!l.userBrowserSettings.autoExpandIframes});b.success?r.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(r.info({invalResult:b},"Invalidating cached result due to page check failure"),S=!0);}if(h&&S)return await i.deleteCacheResult(h),ww(e)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await hce({step:t,result:p,browser:s.browser,cacheKeyPrefix:f,logger:r,storage:i});}finally{f!==void 0&&await i.releaseCacheLock(f);}}return p},fce=async e=>{let{currentParentIdChain:t}=e,{step:n,tracer:r}=e.moduleParams,o=fT(n,e.moduleParams.resolvedInputs,"SUCCESS"),i=await r.startSubSteps(),{status:a,results:s}=await e.executeStepList({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:i,currentParentIdChain:t}});return o.results=s,o.status=a,o.finishedAt=new Date,Po({asyncTasks:e.work.asyncTasks,nestedResults:s,result:o,logger:e.fixtures.logger}),o};function fT(e,t,n){let r={};return Object.entries(t).forEach(([i,a])=>{r[i]=JSON.stringify(a);}),{type:"MODULE",id:e.id,moduleId:e.moduleId,moduleName:e.name,startedAt:new Date,cacheConfig:e.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:n}}async function sG({orgId:e,step:t,context:n,logger:r,codeEvalTools:o,signal:i}){let a={};try{for(let s of t.parameters??[]){let l=t.inputs?.[s]??t.defaultParameters?.[s];if(!l){r.warn(`No value or default found for parameter '${s}' that is required by module '${t.name}'`);continue}a[s]=await Ss({orgId:e,code:l,fragment:!0,context:n,logger:r,localTools:o,signal:i});}return a}catch(s){throw i?.throwIfAborted(),new L("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function hce({step:e,result:t,browser:n,cacheKeyPrefix:r,logger:o,storage:i}){let a=e.cacheConfig?.cacheExpiryMs;(!a||a===kN)&&(a=e.defaultCacheTtl??FN);let s;e.autoAuth?s=JSON.stringify(await n.saveAuthState()):t.data!==void 0?s=JSON.stringify(t.data):s='""',o.debug({cacheKeyPrefix:r,ttlMs:a,truncatedCacheResultJson:Li({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a});}async function Wl(e,t,n){return gce(e,t,n)}async function gce(e,t,n){let r=new Date;try{return n.throwIfAborted(),await t()}catch(o){let i=new Date,a="FAILED",s;if(n.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof L?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,e.type==="RESOLVED_MODULE"){let l=fT(e,{},"FAILED");return l.message=s,l.startedAt=r,l.finishedAt=i,l}return {...ey(e),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Ir(e,t){let n=!1;try{return e&&!e.state.failureRecoveryDisabled&&(e.state.failureRecoveryDisabled=!0,n=!0),await t()}finally{e&&n&&(e.state.failureRecoveryDisabled=void 0);}}var hT=async e=>{let{step:t,tracer:n}=e.presetParams,{logger:r,controller:o,context:i}=e.fixtures,{collectDebugData:a}=e.options,{testMetadata:s}=e.inputs,l=t.command.type,c=r.child({commandType:l,stepId:t.id,commandId:t.command.id}),u="cache"in t.command&&t.command.cache?cloneDeep(t.command.cache):{},d=o.browser.url(),p=new Date,m,f=randomUUID(),h=randomUUID();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let y=await o.browser.getRawCondensedHtml();n.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:y});}}catch(y){o.throwIfClosed(),c.debug({err:y},"Failed to take before screenshot, continuing...");}let g,S,T;try{let y=await o.executePresetCommand(n,t.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),T=y.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},g={...t,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[S]},"assertion"in t.command&&(g.message=y.thoughts||"Assertion passed.");}catch(y){c.error({message:y.message,stack:y.stack},`Failed executing preset step ${Hr(t.command)}`);let b=o.browser.url(),A=new Date,R=y instanceof Error?y.message:`${y}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:R},g={...t,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:R,failureReason:y instanceof L?y.reason:void 0,results:[S]};}finally{let y="cache"in t.command&&t.command.cache?cloneDeep(t.command.cache):{},b=diff(u,y);b&&Object.keys(b).length>0&&c.info({diffs:Jh(b)},"Updated cache");}if(a)try{if(T||(T=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let y=await o.browser.getRawCondensedHtml();n.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:y});}}catch(y){o.throwIfClosed(),c.debug({err:y},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.");}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&n.attachBeforeScreenshot({snapshotId:f,screenshot:m}),T&&n.attachAfterScreenshot({snapshotId:h,screenshot:T}),g};async function yce(e,t,n){let{tracer:r}=e.conditionalParams,{logger:o,controller:i}=e.fixtures,a=t.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Ir(e.work,()=>hT({...e,presetParams:{tracer:r,step:t.assertion}})),l=a.type;switch(l){case"AI_ASSERTION":case"ELEMENT_CHECK":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:t.steps}:(o.info(s.message,`${a.type} condition ${n} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return {type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${n} evaluated`),c?{type:"passed",conditionResult:s,steps:t.steps}:{type:"failed",conditionResult:s}}default:return (u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(l)}}catch(s){i.throwIfClosed(),o.error({err:s},`Condition ${n} failed with error`);let l=s instanceof Error?s.message:"Unknown error during condition evaluation";return {type:"execution_error",conditionResult:{...t.assertion,status:"FAILED",message:l,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed();}}function Tce(e,t,n,r){let o=r.slice(n.length);for(let i=0;i<e.blocks.length;i++){let a=e.blocks[i],{result:s}=Tl(a.steps,t,o);if(s)return i}return -1}async function uG(e){let t=new Date,{currentParentIdChain:n}=e,{step:r}=e.conditionalParams,{logger:o}=e.fixtures,{fromStep:i}=e.inputs,a=ey(r),s=!!i&&xm(n,i.parentStepIdChain),l=r.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=Tce(r,i.fromStepId,n,i.parentStepIdChain);S>=0&&(l=r.blocks[S].steps,c=!1,p=!0,o.info(`Skipping conditional assertion (execution starts from step within block ${S}), running ${l.length} steps`));}if(!p)for(let S=0;S<r.blocks.length;S++){o.info(`Evaluating condition ${S} in conditional step`);let T=r.blocks[S],y=await yce(e,T,S);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:t,finishedAt:new Date,message:y.conditionResult.message,results:[]};return Po({asyncTasks:e.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(y.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,l=y.steps;break}}if(l)c&&o.info("No conditions resolved to true, executing the else block steps");else {o.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let S={...a,assertionResult:d,status:"SUCCESS",startedAt:t,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return Po({asyncTasks:e.work.asyncTasks,nestedResults:[...u],result:S,logger:o}),S}o.info(`Executing ${l.length} steps in the selected conditional block`);let m=await e.conditionalParams.tracer.startSubSteps(),f=await e.executeStepList({...e,listParams:{steps:l,containerName:"conditional block",tracer:m,currentParentIdChain:n}}),g={...a,assertionResult:d,...f,startedAt:t,finishedAt:new Date};return Po({asyncTasks:e.work.asyncTasks,nestedResults:[...u,...f.results],result:g,logger:o}),g}var pG=async e=>{let{tracer:t}=e.aiStepParams,{controller:n}=e.fixtures;await n.browser.waitForStability();let r=await n.browser.screenshot({}),o=await Ece(e);o.finishedAt=new Date,Po({asyncTasks:e.work.asyncTasks,result:o,nestedResults:o.results,logger:e.fixtures.logger});let i=await n.browser.screenshot({}),a=randomUUID();o.beforeSnapshot=a,t.attachBeforeScreenshot({snapshotId:a,screenshot:r});let s=randomUUID();return o.afterSnapshot=s,t.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},Ece=async e=>{let{currentParentIdChain:t}=e,{step:n,tracer:r}=e.aiStepParams,{controller:o,context:i,logger:a}=e.fixtures,s={...n,startedAt:new Date,beforeTestContext:i.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in n&&n.steps&&n.steps.length>0&&n.steps[n.steps.length-1]?.command.type==="SUCCESS"))throw new L("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:u}=await e.executeStepList({...e,listParams:{steps:n.steps,containerName:"AI action",results:s.results,tracer:c,currentParentIdChain:t}});return s.finishedAt=new Date,s.status=u,s}catch(c){a.warn({err:c},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=c instanceof Error?c.message:`${c}`,s.status=u?"CANCELLED":"FAILED";}return s};var mG=e=>{throw new Error(`Exhaustive check failed for value: ${e}`)};function J({text:e,section:t}){if(!t)return [{type:"text",text:e}];let n=`### ${t}`;return e.length===0?[{type:"text",text:n}]:[{type:"text",text:`${n}
|
|
5210
|
+
`),tokenLength:d}),s.forEach((h,g)=>{let S=h.ids[0],T=h.ids[h.ids.length-1];e.debug({tokenLength:h.tokenLength,minId:S,maxId:T},`Chunk for page filtering (index ${g+1}/${s.length})`);}),{chunks:s}}var G1=5e6,Gle=15e4;async function $l(e){let{fixtures:t}=e,{logger:n}=t,r=e.tree,o=e.serializedTree,i=ze(o);if(i>G1)throw new L("UserConfigurationError",`Page accessibility tree is too large for AI page filtering (${i} tokens). Maximum supported size is ${G1} tokens.`);if(i>Gle){let a=H1({serializedTree:o,options:z1,logger:n}),s=randomUUID();r=await jle({...e,chunks:a.chunks,callId:s}),o=r.serialize();let l=ze(o);n.info({oldTokens:i,newTokens:l,langfuseCallId:s},"Filtered page using AI chunk ranking");}return o}async function jle({type:e,callId:t,chunks:n,description:r,fixtures:o,tree:i}){let{generator:a,signal:s,logger:l}=o,c=await a.rankChunksWithAi({chunks:n,description:r,type:e,softTokenLimit:3e4,mediumTokenLimit:6e4,hardTokenLimit:18e4,callId:t},{abortSignal:s,logger:l,loggerTags:Je(l)}),u=[];return n.forEach((p,m)=>{c.indices.includes(m)&&(u=u.concat(p.ids));}),i.pruneUsingRelevantIds(new Set(u))}async function Aw(e,t){if(!e.description)throw new L("UserConfigurationError","Cannot locate element with empty description");return Oo({action:async()=>Wle(e,t),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,browser:t.browser,logger:e.logger})}async function Wle(e,t){let{disableCache:n,testContext:r,filterByViewport:o,skipWait:i,source:a,memory:s,logger:l,allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,skipSavingVisualAttributes:p,isAutoHeal:m,cacheBustReason:f,acceptElementMovedError:h}=e,{orgId:g,browser:S,localCodeEvalTools:T,generator:y,abortSignal:b}=t,A=e.description,R=rn(),P=e.useMemory&&!n;r&&(A=await er({orgId:g,s:A,context:r,localTools:T,signal:b,logger:l})),a&&(A=D1(A,a));let{serializedTree:x,tree:I}=await R.startAsyncSpan("GET_PAGE_STATE",async()=>Rs(S,{allowNotActionableNodesOverride:c,allowIneligibleTagRedirect:u,showZeroOpacityElementsOverride:d,filterByViewport:o,abortSignal:b,skipWait:i,logger:l}),{}),N=await R.startAsyncSpan("GET_PAGE_SCREENSHOT",async()=>{let fe,ue=Date.now(),te;for(;!fe&&Date.now()-ue<3e3;){b.throwIfAborted();try{fe=await S.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(we){te=we;}}if(!fe)throw new L("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${te?.message}`);return fe}),U=x,F=!1,H=`data:image/jpeg;base64,${N.toString("base64")}`;U=await $l({type:"locator",description:A,screenshot:H,serializedTree:x,tree:I,fixtures:{generator:y,signal:b,logger:l,orgId:g}}),U!==x&&(F=!0);let ee=await R.startAsyncSpan("AI_LOCATOR_CALL",async fe=>{m&&(fe.attributes.isAutoHeal=!0),f&&(fe.attributes.cacheBustReason=f);let ue=await y.getElementLocation({browserState:U,goal:A,screenshot:H,source:a,memory:P?s:void 0},{disableCache:n,abortSignal:b,loggerTags:Je(l),useMemory:P});if(fe.result=ue,R.storeTraceAsset){let te=randomUUID();R.storeTraceAsset({snapshotId:te,data:N}),fe.screenshotSnapshotId=te;}return ue});if(l.debug({usedRag:F,result:ee},"Got locator result"),!(ee.id>0))throw new _c(`Could not find any relevant element: ${ee.thoughts}`,ee.updatedMemory?{type:"GCS_TRACES",traces:ee.updatedMemory}:void 0);let{resolution:D,target:W,frameConfig:Z}=await R.startAsyncSpan("TARGET_RESOLUTION",async fe=>{let ue=await S.createTargetFromA11yId({id:ee.id,requirements:ee.requirements,additionalElements:ee.additionalElements,description:A,targetSource:"AI",logger:l,skipSavingVisualAttributes:p,acceptElementMovedError:h});return fe.result={serializedElement:ue.target.nodeOnlySerializedHtml??"Unknown HTML element"},ue});if(D.a11yNode?.properties?.hidden&&D.a11yNode?.properties?.hidden!=="false")throw new L("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${D.displayString}`);return P&&(ee.updatedMemory?W.memory={type:"GCS_TRACES",traces:ee.updatedMemory}:s&&(W.memory=s)),{thoughts:ee.thoughts,target:W,resolution:D,frameConfig:Z,screenshot:H}}var qle=15;async function pT({command:e,logger:t,fixtures:n,useMemory:r,maxRetries:o=qle}){if(!e.assertion.trim())throw new L("ActionFailureError","Assertion command is missing the assertion content");let i=qb.optional().catch(void 0).parse(e.source);e.source&&!i&&t.warn(`Invalid source ${e.source} for AI assertion, ignoring...`);let a=rn();return a.startAsyncSpan("AI_ASSERTION_CALL",async s=>{let{browser:l}=n,c=e.timeout?e.timeout*1e3:l.smartWaitingTimeout,u=lB(c,o-1),d=0,p=Date.now(),m=p+c,f=p,h,g,S;try{await Oo({action:()=>l.clearHighlights(),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,browser:l,logger:t});}catch(b){t.warn({err:b},"Failed to clear highlights before AI check, continuing...");}for(;d<o;){n.abortSignal.throwIfAborted();let b=Date.now();if(d>0){if(b>=m)break;let P=m-b,x=f-b,I=Math.min(x,P);I>0&&await ve(I,n.abortSignal);}let A=Date.now();if(d>0&&A>=m)break;let R=!1;try{if(h=await Oo({action:async()=>{let x=await $1(l,t,n.abortSignal);return g&&g.serializedTree===x.serializedTree&&g.screenshotBuff.equals(x.screenshotBuff)?(R=!0,h):(g=x,W1({command:e,state:x,fixtures:n,useMemory:r,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:d,logger:t,source:i}))},frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,logger:t,browser:l}),h?.success){h?.updatedMemory&&_m(e,h.updatedMemory,t);break}else throw h?.thoughts?new L("AssertionFailureError",h.thoughts):new L("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(P){n.abortSignal.throwIfAborted(),S=P instanceof Error?P:new Error(`${P}`),R?t.info(`AI check attempt ${d} failed (re-used previous result)`):t.info({err:P},`AI check assert attempt ${d} failed, retrying...`);}finally{d++,f=A+u;}}if(!h?.success){let b=m-Date.now();b>0&&await ve(b,n.abortSignal);}if(!h?.success)try{h=await Oo({action:async()=>W1({command:e,state:await $1(l,t,n.abortSignal),fixtures:n,useMemory:r,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:d,logger:t}),frameConfig:e.iframeUrl?{type:"url",url:e.iframeUrl}:void 0,logger:t,browser:l});}catch(b){n.abortSignal.throwIfAborted(),S=b instanceof Error?b:new Error(`${b}`);}finally{d++;}h?.updatedMemory&&_m(e,h.updatedMemory,t);let T=h?.afterScreenshotOverride;if(T&&a.storeTraceAsset){let b=randomUUID();a.storeTraceAsset({snapshotId:b,data:T}),s.screenshotSnapshotId=b;}let y=h?.elementScreenshotOverride;if(y&&a.storeTraceAsset){let b=randomUUID();a.storeTraceAsset({snapshotId:b,data:y}),s.elementScreenshotSnapshotId=b;}if(!h?.success){s.result={thoughts:S?.message??"AI check failed after all attempts",result:!1};let b=`AI check still failing after ${d} attempts.`;throw S&&(b+=` Latest result: ${S.message}`),new L("AssertionFailureError",b)}return s.result={thoughts:h.thoughts,result:!0},{...h,succeedImmediately:!1,urlAfterCommand:l.url()}})}async function $1(e,t,n){await e.waitForPageLoad({signal:n});let[r,o]=await Promise.all([Rs(e,{abortSignal:n,skipWait:!0,skipWaitForPageLoad:!0,logger:t}),e.screenshot({retries:1,respectActiveFrame:!0})]);return {...r,screenshotBuff:o}}async function W1({command:e,state:t,fixtures:n,useConsensus:r,useMemory:o,highlightElementsOnFailure:i,attemptNumber:a,source:s,logger:l}){let {browser:c,generator:u,abortSignal:d}=n,{serializedTree:m,tree:f}=t,h=t.screenshotBuff,g=h.toString("base64"),S=c.url(),T=e.contextChoice??"MULTIMODAL",y=m;T!=="VISION_ONLY"&&(y=await $l({type:"assertion",serializedTree:m,tree:f,description:e.assertion,screenshot:g,fixtures:{generator:u,signal:d,logger:l,orgId:n.orgId}}),y);let b={goal:e.assertion,url:S,memory:o?e.cache?.memory:void 0,browserState:y,screenshot:g,contextChoice:T,source:s},R=await(T==="VISION_ONLY"?(x,I)=>u.getVisualAssertionResult(x,I):(x,I)=>u.getAssertionResult(x,I))(b,{useConsensus:r,attemptNumber:a,useMemory:o,disableCache:!!e.disableCache,abortSignal:d,logger:l,loggerTags:Je(l)}),P;if((R.result||i)&&R.relevantElements?.length){R.relevantElements.map(x=>c.getSerializedFormFromA11yId(x)).filter(x=>!!x);try{let x=R.relevantElements[0],{resolution:I}=await c.createTargetFromA11yId({id:x,description:null,targetSource:"AI",skipSaveToCache:!0});P=await c.screenshot({locator:I.locator,clearHighlights:!0,respectActiveFrame:!0});}catch(x){l.debug({err:x},"Failed to capture element screenshot for trace, continuing...");}await Kle(R.relevantElements,c,l);}return {success:R.result,thoughts:R.thoughts,afterScreenshotOverride:h,elementScreenshotOverride:P,updatedMemory:o?R.updatedMemory:void 0}}async function Kle(e,t,n){let r=Date.now();for(let o of e){if(Date.now()-r>2e3){n.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await ne(t.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}});}catch(i){n.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}async function K1(e){let{command:t,logger:n,fixtures:r,disableCache:o}=e,{browser:i,generator:a,abortSignal:s}=r;if(!t.goal.trim())throw new L("ActionFailureError","Cannot perform AI extraction without goal");if(t.schema){let d=VN(t.schema);if(d)throw new L("UserConfigurationError",d)}let l=await i.getCondensedHtml(),c=await i.screenshot({retries:2}),u=rn();try{return await u.startAsyncSpan("AI_EXTRACTION_CALL",async d=>{let p=await a.getTextExtraction({goal:t.goal,browserState:l,returnSchema:t.schema,screenshot:`data:image/jpeg;base64,${c.toString("base64")}`},{disableCache:o,abortSignal:s,loggerTags:Je(n)});if(d.result=p,Yle({tracer:u,span:d,screenshot:c,htmlState:l,logger:n}),p.result==="NOT_FOUND")throw new L("ActionFailureError","No relevant data found for extraction goal on this page");if(p.thoughts?.includes("MaxGenerationLengthExceededError"))throw new L("UserConfigurationError",p.thoughts);return {thoughts:p.thoughts||void 0,data:p.result,succeedImmediately:!1,urlAfterCommand:i.url()}})}catch(d){let p=se(d);throw p.includes("MaxGenerationLengthExceededError")?new L("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):p.includes("AIProviderError")&&p.includes("time")?new L("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:d}}):d}}function Yle(e){let{tracer:t,span:n,screenshot:r,htmlState:o,logger:i}=e;if(t.storeTraceAsset)try{let a=randomUUID();t.storeTraceAsset({snapshotId:a,data:r}),n.screenshotSnapshotId=a;let s=randomUUID();t.storeTraceAsset({snapshotId:s,data:Buffer.from(o),extension:"html"}),n.browserStateSnapshotId=s;}catch(a){i.debug({err:a},"Failed to store extraction trace assets");}}async function Y1(e,t){let{logger:n}=e,{abortSignal:r,browser:o}=t,i=Date.now();try{await Xle(i,e,t);}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||r.aborted)return;n.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await ve(s,r);}finally{n.debug({durationMs:Date.now()-i},"AI smart waiting complete");}}async function Xle(e,t,n){let{abortSignal:r,browser:o}=n;if(o.smartWaitingTimeout<3e3){await ve(o.smartWaitingTimeout,r);return}if(!t.description)throw new L("UserConfigurationError","Cannot locate element with empty description");await ne(Jle(e,t,n),{milliseconds:o.smartWaitingTimeout});}async function Jle(e,t,n){let{logger:r,iframeUrl:o}=t,{browser:i}=n;for(;Date.now()-e<i.smartWaitingTimeout;)if(await Oo({action:async()=>Zle(t,n),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:r}))return}async function Zle(e,t){let{testContext:n,logger:r}=e,{browser:o,abortSignal:i,localCodeEvalTools:a,orgId:s,generator:l}=t,c=e.description;n&&(c=await er({orgId:s,s:c,context:n,localTools:a,signal:i,logger:r})),i.throwIfAborted();let u;try{u=await o.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2});}catch(f){throw new L("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${f instanceof Error?f.message:f}`)}let p=`data:image/jpeg;base64,${u.toString("base64")}`;i.throwIfAborted();let m=await l.getSmartWaitingDecision({description:c,screenshot:p},{abortSignal:i,loggerTags:Je(r)});return r.debug({result:m},"Got smart waiting result"),m.isPageReady}async function Z1(e){return rn().startAsyncSpan("ELEMENT_ASSERTION",async n=>Qle(e,n),{name:"Element check"})}async function Qle(e,t){let{command:n,timeoutMs:r,fixtures:o,disableCache:i}=e,{abortSignal:a}=o,s=()=>uh(n.cache)?n.cache:void 0,l=s(),c=!i&&!!l?.target&&fc(l.target),u=cloneDeep(l),d=(T=!1)=>{if(l=s(),!!l)if(T){let y=RA(u,l);l.target=y.target,l.updatedAt=y.updatedAt;}else {if(!u){l=void 0;return}l.target=u.target,l.updatedAt=u.updatedAt;}},p=Date.now(),m=0,f,h=500,g=!1;for(;m<2||Date.now()-p<r;){m++,m>1&&await ve(h,a),a?.throwIfAborted(),l=s();let T=m===1,{result:y,elementWasFound:b}=await X1({cacheToUse:l,skipAISmartWaiting:!T,useAIIfCacheFails:!c,params:e});if(f=y,g=g||b,y.success)break;d(),h=Math.min(h*1.25,1e4);}if(!f)throw new L("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(a?.throwIfAborted(),!f.success){let T=s(),y=T?.target?.memory?{target:{id:-1,memory:T.target.memory}}:void 0,{result:b,elementWasFound:A}=await X1({cacheToUse:y,skipAISmartWaiting:!0,useAIIfCacheFails:!0,params:e});f=b,g=g||A,f.success||d(!0);}let S=s();return f.success&&S?.target&&!g&&(S.target=Im(S.target),S.updatedAt=new Date),t.result={success:f.success,message:f.err?.message},f}async function X1({cacheToUse:e,skipAISmartWaiting:t,useAIIfCacheFails:n,params:r}){let{command:o,disableCache:i,fixtures:a,tracer:s,targetingWrapper:l}=r,{logger:c}=a;if(o.target&&!Oa(o.target))throw new Error("Element assertion with x/y is not supported yet");let u=KF(o.assertion),d=ece(o.assertion),p,m=!1,f=cloneDeep(e);try{let{elementInteractedDisplayString:h,result:g,thoughts:S}=await l({tracer:s,command:o,target:o.target,cache:f?.target,action:async T=>tce(T.locator,r),options:{...o,allowNotActionableNodesOverride:d,allowIneligibleTagRedirect:d,showZeroOpacityElementsOverride:!0,disableCache:i,memory:f?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ks(o),skipAISmartWaiting:t,targetName:"target"},retriesWithAI:n?1:0});return p={success:g.success,data:g.data,err:g.err,elementInteractedDisplayString:h,thoughts:S},m=!0,g.success||(c.warn({aiThoughts:S,elementString:h,err:g.err},"Element check found an element but failed"),p={...g,thoughts:S}),{result:p,elementWasFound:m}}catch(h){if(u)return p={success:!0,thoughts:`The element described does not exist on the page: ${h.message}`,err:void 0,data:void 0},{result:p,elementWasFound:m};if(!(h instanceof L)||h.reason!="ActionFailureError")throw h;return p={success:!1,err:h,data:void 0,thoughts:void 0},c.warn({err:h},"Element check did not find an element and failed"),{result:p,elementWasFound:m}}}function ece(e){return !(e.type==="ELEMENT_EXISTENCE"&&e.condition==="VISIBLE"&&!e.negated)}async function tce(e,{command:t,fixtures:n}){return await n.browser.highlight(e),await nce(e,t.assertion)}async function nce(e,t){let n=!0,r,o;switch(t.type){case"ELEMENT_CONTENT":{let a=await e.textContent()??"";if(o={elementTextContent:Pt(a,500,!0)},!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,r=new L("AssertionFailureError",`The content ${s} '${t.value}': ${a}`);}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:Pt(await e.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a=null;try{a=await e.getAttribute(t.attr,{timeout:3e3});}catch(s){r=new L("AssertionFailureError",se(s)),n=!1;break}if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,t.operation==="EXISTS"?r=new L("AssertionFailureError",`The attribute ${t.attr} ${s}`):r=new L("AssertionFailureError",`The attribute ${t.attr} ${s} '${t.value}': ${a}`);}break}case"ELEMENT_EXISTENCE":{switch(t.condition){case"VISIBLE":{n=await e.evaluate(async(s,l)=>{let c=Date.now();for(;Date.now()-c<l;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return !0}return !1},lo*1e3);break}case"EDITABLE":{n=await e.isEditable({timeout:lo*1e3});break}case"EXISTS":{n=!0;break}case"ENABLED":{n=await e.isEnabled({timeout:lo*1e3});break}case"FOCUSED":{n=await e.evaluate(s=>s===document.activeElement);break}default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})(t.condition)}if(n=t.negated?!n:n,!n){let a=Pu(t);r=new L("AssertionFailureError",`The element ${a}`);}break}case"ELEMENT_NAME":{let a=await e.evaluate(s=>s.tagName);if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!0})){let s=Pu(t);n=!1,r=new L("AssertionFailureError",`The element tag name ${s} '${t.value}': ${a}`);}break}case"ELEMENT_STYLE":{let a=await e.evaluate((s,l)=>window.getComputedStyle(s).getPropertyValue(l),t.property);if(!Rm(a,t.value,t.operation,{negated:!!t.negated,ignoreCase:!1})){let s=Pu(t);n=!1,t.operation==="EXISTS"?r=new L("AssertionFailureError",`The style property ${t.property} ${s}`):r=new L("AssertionFailureError",`The style property ${t.property} ${s} '${t.value}': ${a}`);}break}default:return (a=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {thoughts:void 0,success:n,data:o,err:r}}function Q1(e){return e.type==="ELEMENT_EXISTENCE"&&e.negated&&e.condition==="EXISTS"}async function of(e,t){let n=await e.screenshot(t),r=await Jimp.fromBuffer(n);return {buffer:n,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}async function tG({tracer:e,command:t,disableCache:n,browser:r,targetingWrapper:o,logger:i,screenshotStorage:a}){if(t.target&&!Oa(t.target))throw new Error("Visual Diff with x/y is not supported yet");await r.waitForStability({logger:i});let s={clearHighlights:!0,hideCaret:!0},l;t.target?.elementDescriptor?l=(await o({tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async N=>of(r,{locator:N.locator,...s}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await of(r,s);let c=await a.prepareGoldenScreenshotForComparison(i,t,l);if((l.height!==c.height||l.width!==c.width)&&i.warn({currHeight:l.height,currWidth:l.width,savedHeight:c.height,savedWidth:c.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-c.height)>10||Math.abs(l.width-c.width)>10){let I=`${l.width}x${l.height}`,N=`${c.width}x${c.height}`;return {fail:!0,thoughts:`Current screenshot (${I}) does not match saved screenshot dimensions (${N}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:r.url()}}let u=await Jimp.fromBuffer(l.buffer),d={width:l.width,height:l.height},p=await Jimp.fromBuffer(c.buffer),m={width:c.width,height:c.height},f,h=d.width*d.height,g=m.width*m.height,S=Math.abs(d.height-m.height),T=Math.abs(d.width-m.width);if(h>g){let I=u.cover({w:m.width,h:m.height});l.buffer=await I.getBuffer("image/jpeg"),f="current",l.width=m.width,l.height=m.height;}else if(g>h){let I=p.cover({w:d.width,h:d.height});c.buffer=await I.getBuffer("image/jpeg"),f="saved";}let y={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},b=t.threshold??.1,R=yse(Rw.decode(c.buffer).data,Rw.decode(l.buffer).data,y.data,l.width,l.height,{threshold:b,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,P=R>b*100,x=`Visual diff of ${R.toFixed(2)}% detected, which is ${P?"over":"under"} the threshold of ${b*100}%.`;if(f&&(x+=` The ${f} screenshot was cropped since it was taller by ${S} pixels and wider by ${T} pixels.`),P)throw new L("ActionFailureError",x);return {fail:P,thoughts:x,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Rw.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:r.url()}}var ice=3e4;function ace(e){if(!e.body)return {};switch(e.body.type){case"json":return {content:e.body.content,contentType:"application/json"};case"form-urlencoded":{let t=new URLSearchParams;return Object.entries(e.body.content).forEach(([n,r])=>{t.append(n,r);}),{content:t.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function nG({command:e,logger:t,baseUrl:n,fetchImplementation:r=fetch}){let o=e.timeout??ice/1e3,i=Object.fromEntries(Object.entries(e.headers||{}).filter(([f,h])=>f&&h)),a=new URLSearchParams;Object.entries(e.params||{}).filter(([f,h])=>f&&h).forEach(([f,h])=>{a.append(f,h);});let s=a.toString(),l;if(Du(e.url)&&(l=e.url),n&&ku(e.url,n)&&(l=new URL(e.url,n).toString()),!l)throw new L("ActionFailureError",`Invalid URL: ${e.url}`);let c=l;t.info({url:c,searchParams:s,headers:i,body:e.body,method:e.method},"Making HTTP request");let d=await ne((async()=>{let f=s?`${c}?${s}`:c;try{let h=ace(e),g=new Headers(i);return h.contentType&&!g.has("Content-Type")&&g.set("Content-Type",h.contentType),await r(f,{headers:g,method:e.method,body:h.content})}catch(h){throw new Error(`Failed to make HTTP request: ${h}`,{cause:h})}})(),{milliseconds:o*1e3,fallback:()=>{throw new L("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let f;try{f=await d.text();}catch(h){f=`Failed to read response body: ${h}`;}throw new L("ActionFailureError",`Fetch request failed with status ${d.status}: ${f}`)}let p={};d.headers.forEach((f,h)=>{p[h]=f;});let m={status:d.status,headers:p,request:{url:d.url,method:e.method,headers:i}};if(e.body?.type==="json"&&e.body.content)try{m.request.json=JSON.parse(e.body.content);}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json();}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var sce=5e3;async function mT({timeout:e=lo,...t}){let n=Date.now(),r=e*1e3,o=r+1e4,i,a=0,s=500;for(;a-n<r;){if(Date.now()-n>o){t.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}t.signal?.throwIfAborted();let l=Date.now();i=await rG(t),a=Date.now();let c=a-l;if(c>1e3&&t.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ve(s,t.signal),s=Math.min(Math.floor(s*1.5),sce);else return i}return i=await rG(t),i}async function rG(e){return rn().startAsyncSpan("PAGE_ASSERTION",async n=>{let r=await lce(e);return n.result={success:r.success,message:r.err?.message},r},{name:"Page check"})}async function lce({assertion:e,browser:t,autoExpandIframes:n}){switch(e.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(n){let l=await t.evaluateFunctionInAllFrames(oG,{value:e.value,negated:!!e.negated,returnHtml:!1});i=e.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml;}else ({evaluation:i,pageHtml:s}=await t.evaluateFunctionInPage(oG,{value:e.value,negated:!!e.negated,returnHtml:!0},"checking page content"));if(!i){let l=e.negated?Ta.CONTAINS:Ea.CONTAINS;a=new L("AssertionFailureError",`The page ${l} '${e.value}'.`),o=s;}}catch(s){a=new L("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`);}return {success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return (o=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}}function oG({value:e,negated:t,returnHtml:n}){let r=document.body.innerHTML,o=r.includes(e)===!t;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&n?r:void 0}}var cce=3e4;async function iG({command:e,logger:t,baseUrl:n,fetchImplementation:r=fetch}){let o=e.timeout??cce/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(e.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Du(e.url)&&(s=e.url),n&&ku(e.url,n)&&(s=new URL(e.url,n).toString()),!s)throw new L("ActionFailureError",`Invalid URL: ${e.url}`);let c=await ne((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:e.query,variables:e.variables?JSON.parse(e.variables):void 0}),signal:i.signal})}catch(d){throw new Error(`Failed to make HTTP request: ${d}`,{cause:d})}})(),{milliseconds:o*1e3});if(!c)throw new L("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let d,p=await c.text();try{d=JSON.parse(p);}catch{throw new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${d.errors[0].message}`):new L("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p}`)}let u={};return c.headers.forEach((d,p)=>{u[p]=d;}),{status:c.status,headers:u,json:await c.json()}}var cd=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;executionOptionsStack=[];recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:t,generator:n,logger:r,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:l,options:c}){this.orgId=i,this.options=c,this.browser=t,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=l,this.localCodeEvalTools=a,this.generator=n,this.logger=r;}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal);}setClosed(){this.executeAbortController.abort();}throwIfClosed(){this.executeAbortController.signal.throwIfAborted();}get closed(){return this.executeAbortController.signal.aborted}async withExecutionOptions(t,n){this.executionOptionsStack.push(t);try{return await n()}finally{this.executionOptionsStack.pop();}}getCurrentExecutionOptions(){return this.executionOptionsStack[this.executionOptionsStack.length-1]??{}}async evaluateAiAction({goal:t,startingScreenshot:n,history:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([Rs(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${c.toString("base64")}`,d=await $l({type:"ai-action",description:t,screenshot:u,serializedTree:l.serializedTree,tree:l.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:n,history:r,goal:t,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Je(s)},langfuseSessionId:i})}async promptToCommand({goal:t,startingScreenshot:n,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,u]=await Promise.all([Rs(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,p=await $l({type:"ai-action",description:t,screenshot:d,serializedTree:c.serializedTree,tree:c.tree,fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:l,browserState:p,startingScreenshot:n,history:r,goal:t,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Je(a)},langfuseSessionId:s})}catch(f){throw new L("InternalWebAgentError",`Error generating command: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}}async getBrowserState(t){return Rs(this.browser,t)}async locateElement(t){return await Aw(t,this.getControllerFixtures())}async locateElementWithSelector(t,n){return Oo({action:async()=>{let r=await this.browser.resolveHardcodedCssSelector({selector:t,timeoutMs:2e3,logger:this.logger});return {thoughts:"Located element with selector",target:{id:-1,selector:t,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:r}},frameConfig:n?{type:"url",url:n}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(){return {browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??!0}async wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:r,descriptions:o,caches:i,action:a,options:s,retriesWithAI:l=1}){let c=[];for(let u=0;u<o.length;u++){let d=o[u],p=await this.wrapElementTargetingCommand({tracer:t,command:n,target:d,cache:i[u],action:async m=>m,options:{...s,targetName:r[u]}});c.push(p);}try{let u=await a(...c.map(m=>m.result)),d=m=>m==="fromTarget"?"From Target":m==="toTarget"?"To Target":"Target",p=c.map((m,f)=>m.thoughts?`${d(r[f])}: ${m.thoughts}`:void 0).filter(m=>!!m).join(" -------------- ")||void 0;return {result:u,elementInteractedDisplayStrings:c.map(m=>m.elementInteractedDisplayString),thoughts:p}}catch(u){if(this.throwIfClosed(),l>0)return this.logger.warn({err:u},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:r,descriptions:o,caches:o.map(()=>{}),action:a,options:s,retriesWithAI:l-1});throw new L("ActionFailureError",u.message,{errOptions:{cause:u}})}}async wrapHardcodedCssTargetingCommandHelper({target:t,action:n,options:r,command:o}){let i=this.logger.child({commandId:o.id}),{targetName:a}=r;if(t.type!=="description")throw new L("ActionFailureError","Cannot use selector with non-description target");let s,l=Date.now(),c=Date.now();for(;Date.now()-c<this.browser.smartWaitingTimeout;){l=Date.now();try{let u=await this.browser.resolveHardcodedCssSelector({selector:t.elementDescriptor,targetName:a,logger:i});return {result:await n({locator:u.locator,originalElementLocationResult:void 0,serverSideBoundingBox:null}),elementInteractedDisplayString:u.displayString}}catch(u){if(u.name==="AbortError")throw u;s=u,i.warn({err:u},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await ve(500);}}throw s}async scrollIntoViewAndResolveFinalTarget(t){let{resolutionResult:n,disableGlobalLocatorRedirect:r,logger:o}=t,i=rn(),a=!r&&this.browser.userBrowserSettings.globalLocatorRedirect!==!1;(this.browser.userBrowserSettings.visualActions||a)&&await i.startAsyncSpan("SCROLL_ELEMENT_INTO_VIEW",async()=>{await this.browser.scrollIntoViewIfNeeded(n.locator);});let s;return a&&(s=await i.startAsyncSpan("LOCATOR_REDIRECT",async l=>{let{targetingResult:c,metadata:u}=await this.browser.performTargetRedirection(n,o);if(l.result=u,u.outcome==="redirected to new element"&&c&&i.storeTraceAsset&&!this.browser.userBrowserSettings.disableBrowserMonitoring){let d=randomUUID();(async()=>{try{let p=await this.browser.screenshot({locator:c.locator,clearHighlights:!0,boundingBoxOverride:c.serverSideBoundingBox??void 0});i.storeTraceAsset?.({snapshotId:d,data:p});}catch(p){o.debug({err:p},"Failed to capture element screenshot for redirect trace");}})(),l.elementScreenshotSnapshotId=d;}return c})),s||(s={locator:n.locator,serverSideBoundingBox:await n.locator.boundingBox({timeout:ge}),originalElementLocationResult:n.originalElementLocationResult}),s}async resolveCachedTargetForAction(t){let{cache:n,options:r,logger:o}=t,a=await rn().startAsyncSpan("CACHE_RESOLUTION",async l=>{l.targetSource=n.targetSource;try{let c=await this.browser.resolveTarget(n,{allowNotActionableNodesOverride:r.allowNotActionableNodesOverride,logger:o,signal:this.executeAbortController.signal,...r.resolveTargetOptions,acceptElementMovedError:r.force});l.attributes.targetDisplayString=c.displayString,l.attributes.decisions=c.decisions;let u=c.decisions.find(d=>d.matched);return u&&(l.resolutionMethod=u.type),c}catch(c){throw c instanceof Er&&(l.cacheMissReason=c.cacheMissReason,l.attributes.decisions=c.decisions),c}}),s=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:a,disableGlobalLocatorRedirect:r.disableGlobalLocatorRedirect,logger:o});return r.force||await a.revalidator?.(),{resolutionResult:a,finalTarget:s}}async wrapElementTargetingCommand(t){return await Oo({action:()=>this.wrapElementTargetingCommandHelper(t),frameConfig:t.options.iframeUrl?{type:"url",url:t.options.iframeUrl}:void 0,browser:this.browser,logger:this.logger})}async wrapElementTargetingCommandHelper(t){let{tracer:n,target:r,action:o,options:i,command:a,finalAttempt:s=!1,originalCache:l=t.cache}=t,{retriesWithAI:c=1}=t,{disableCache:u,useSelector:d,targetName:p}=i,m=rn(),f=this.logger.child({commandId:a.id}),h=this.shouldUseMemory(),g=cloneDeep(t.cache);if((!g||u)&&!LI(r))throw new L("ActionFailureError","Cannot target element with no cached data or element descriptor");if(d)return this.wrapHardcodedCssTargetingCommandHelper(t);let S=!1,T;u&&(f.info("Cache explicitly disabled for this step"),S=!0,T="Cache explicitly disabled",g=void 0);let y=U1({cache:g,description:r.elementDescriptor,disableSecondaryCacheResolution:!!this.browser.userBrowserSettings.disableSecondaryCacheResolution,logger:f});g=y.cache,S=S||y.cacheBustedBeforeAction,!T&&y.cacheBustReason&&(T=y.cacheBustReason);let b=!0;if(!F1(g))return c--,b=!1,this.executeTargetingCommandWithAI({tracer:m,stepTracer:n,target:r,options:i,command:a,action:o,originalCache:l,logger:f,useMemory:h,cacheBustedBeforeAction:S,cacheBustReason:T});try{let{resolutionResult:A,finalTarget:R}=await this.resolveCachedTargetForAction({cache:g,options:i,logger:f}),P=await o(R);if($t.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.104.3"]),HS({cmd:a,key:p,newTarget:g,logger:f,updatedWithAI:!1}),b){let x=A.decisions.filter(I=>I.matched);if(x.length!==1)f.warn({decisions:A.decisions},"Expected exactly 1 matching method for element location, got more or less");else {let I=x[0].type;n.recordTargetAutoHeal({healType:I});}}return {result:P,elementInteractedDisplayString:A.displayString}}catch(A){this.throwIfClosed();let R=gb(A);if(R&&!s)return f.warn({err:A},"Encountered error that is retryable with cache"),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,action:o,cache:l,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:i});if(A instanceof L&&!R)throw f.warn({err:A},"Failed to execute command with target (fatal)"),A;if(c>0&&r){f.info({err:A},"Failed to execute action with cached target, retrying with AI"),$t.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.104.3",`missReason:${A instanceof Er?A.cacheMissReason:"unknown"}`]);let P;return g.memory&&lh(g.memory)&&(P=g.memory),this.wrapElementTargetingCommandHelper({tracer:n,command:a,target:r,cache:void 0,action:o,originalCache:l,retriesWithAI:c,finalAttempt:!0,options:{...i,memory:P,targetHealingInProgress:!0}})}throw new L("ActionFailureError",`Failed to execute interactive command: ${A instanceof Error?A.message:`${A}`}`,{errOptions:{cause:A}})}}async executeTargetingCommandWithAI(t){let{tracer:n,stepTracer:r,target:o,options:i,command:a,action:s,originalCache:l,logger:c,useMemory:u,cacheBustedBeforeAction:d,cacheBustReason:p}=t;c.info({description:o.elementDescriptor,targetHealingInProgress:i.targetHealingInProgress,cacheBustedBeforeAction:d,memory:i.memory,useMemory:u},"Prompting AI for an updated element location");let m=!1;(d||!l)&&!this.getCurrentExecutionOptions().skipAISmartWaiting&&!i.skipAISmartWaiting?(await n.startAsyncSpan("SMART_WAITING",async()=>await Y1({description:o.elementDescriptor,iframeUrl:i.iframeUrl,source:i.source,logger:c,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride},this.getControllerFixtures())),m=!0):(d||!l)&&(i.skipAISmartWaiting?c.debug("Skipping AI smart waiting for this targeting attempt"):c.debug("Skipping AI smart waiting due to controller execution options"));let f=2;for(let h=1;h<=f;h++){let g=!1,S=this.browser.getActiveFrameConfig(),T=i.force||h>1;try{let y;try{y=await Aw({description:o.elementDescriptor,disableCache:!!i.disableCache,iframeUrl:i.iframeUrl,source:i.source,useMemory:u,memory:u?i.memory:void 0,allowNotActionableNodesOverride:i.allowNotActionableNodesOverride,allowIneligibleTagRedirect:i.allowIneligibleTagRedirect,showZeroOpacityElementsOverride:i.showZeroOpacityElementsOverride,logger:c,skipWait:m,isAutoHeal:!!i.targetHealingInProgress,cacheBustReason:p,acceptElementMovedError:T},this.getControllerFixtures());}catch(R){if(R instanceof _c&&R.updatedLocatorMemory){let P={id:-1,...l,memory:R.updatedLocatorMemory};HS({cmd:a,key:i.targetName,newTarget:P,logger:c,updatedWithAI:!0});}throw R}y.frameConfig&&(this.browser.setActiveFrameConfig(y.frameConfig),g=!0);let b=await this.scrollIntoViewAndResolveFinalTarget({resolutionResult:y.resolution,disableGlobalLocatorRedirect:i.disableGlobalLocatorRedirect,logger:c}),A=await s(b);return HS({cmd:a,key:i.targetName,newTarget:y.target,logger:c,updatedWithAI:!0}),i.targetHealingInProgress&&(r.recordTargetAutoHeal({healType:"AI"}),y.target.targetSource="AI_HEALED",y.target.targetUpdateTime=new Date().toUTCString(),y.target.targetUpdateLoggerTags=Je(c)),{result:A,elementInteractedDisplayString:y.resolution.displayString,thoughts:y.thoughts}}catch(y){if(g&&this.browser.setActiveFrameConfig(S),this.throwIfClosed(),h<f&&gb(y)){c.warn({err:y,aiAttempt:h},"Encountered retryable AI targeting error; retrying with AI once");continue}throw y instanceof L?y:new L("ActionFailureError",y.message)}}throw new L("ActionFailureError","Failed to execute AI targeting after retry")}async screenshotWithDimensions(t){return of(this.browser,t)}async executePresetCommand(t,n,r,o){this.options?.slowMoMs&&await ve(this.options.slowMoMs);let i=await this.browser.getOpenPages(),a=this.browser.url(),s;try{s=await this.resolveCommandTemplateStrings(n,r);}catch(l){throw this.throwIfClosed(),new L("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(t,n,r,o);return this.options?.autoFollowNewTabs&&await k1({beforeUrl:a,command:n,beforePages:i.map(c=>c.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{FV(n,s);}}createCallbacksForBrowser(t){return {createIsolatedFolder:()=>qR(t)}}async traceBrowserInteraction(t,n,r){return rn().startAsyncSpan("BROWSER_INTERACTION",async()=>n(),{name:t,...r})}async resolveCommandTemplateStrings(t,n){return Ky({obj:t,context:n,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(t,n,r,o){o=o||"disableCache"in n&&!!n.disableCache;let i=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":{let a=n.condition;return a?.assertion.trim()?pT({command:a,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:i}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AI_ASSERTION":{if(!n.assertion.trim())throw new L("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new L("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return pT({command:n,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory(),logger:i})}case"AI_EXTRACT":return K1({command:n,logger:i,fixtures:this.getControllerFixtures(),disableCache:o});case"NAVIGATE":if(!Du(n.url)&&!ku(n.url,this.browser.baseUrl))throw new L("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.traceBrowserInteraction("Navigate",()=>this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new L("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.traceBrowserInteraction("Go back",()=>this.browser.goBack());break;case"GO_FORWARD":await this.traceBrowserInteraction("Go forward",()=>this.browser.goForward());break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let a,s;if(n.target&&di(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:u,thoughts:d}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:p=>this.browser.hover(p),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:o}});a=u,s=d;}let l=this.browser.getViewport()?.height??Ar.height,c=this.browser.getViewport()?.width??Ar.width;switch(n.type){case"SCROLL_UP":await this.traceBrowserInteraction("Scroll up",()=>this.browser.scrollVertical(-(n.deltaY??l)));break;case"SCROLL_DOWN":await this.traceBrowserInteraction("Scroll down",()=>this.browser.scrollVertical(n.deltaY??l));break;case"SCROLL_LEFT":await this.traceBrowserInteraction("Scroll left",()=>this.browser.scrollHorizontal(-(n.deltaX??c)));break;case"SCROLL_RIGHT":await this.traceBrowserInteraction("Scroll right",()=>this.browser.scrollHorizontal(n.deltaX??c));break}return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new L("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let a=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:a},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":{if(n.delay>1800)throw new L("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let a=n.delay*1e3;await ve(a,this.executeAbortController.signal);break}case"REFRESH":await this.traceBrowserInteraction("Refresh",()=>this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0}));break;case"CLICK":{if(di(n.target)){let{pixels:d}=n.target;await this.traceBrowserInteraction("Click",()=>this.browser.clickUsingVisualCoordinates(d,n),{coordinates:d});break}let a=this.browser.url(),{elementInteractedDisplayString:s,result:l,thoughts:c}=await this.wrapElementTargetingCommand({tracer:t,target:n.target,command:n,cache:n.cache?.target,action:d=>this.traceBrowserInteraction("Click",()=>this.browser.click(d,this.createCallbacksForBrowser(this.orgId),n),{selector:d.locator.toString()}),options:{...n,targetName:"target",disableCache:o}}),u={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:c,data:l.downloadedFile?{downloadedFile:l.downloadedFile}:void 0};return ny(a,u.urlAfterCommand)&&(u.succeedImmediately=!0,u.succeedImmediatelyReason="URL changed"),u}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(di(n.fromTarget)&&di(n.toTarget)){let l=n.fromTarget.pixels,c=n.toTarget.pixels;await this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDropUsingVisualCoordinates(l,c,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0}),{coordinates:l});break}if(di(n.fromTarget)||di(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:a,thoughts:s}=await this.wrapMultiElementTargetingCommand({tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(l,c)=>this.traceBrowserInteraction("Drag",()=>this.browser.dragAndDrop(l,c,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps})),options:{...n,disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a[0],thoughts:s}}case"MOUSE_DRAG":{let a=parseInt(n.deltaX),s=parseInt(n.deltaY),l=n.steps??5;if(isNaN(a)||isNaN(s))throw new L("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&di(n.target)){let d=n.target.pixels;await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDragUsingVisualCoordinates({deltaX:a,deltaY:s,steps:l,fromTarget:d}),{coordinates:d});break}let c,u;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:d,thoughts:p}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async m=>this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,m.locator,{force:n.force})),options:{...n,targetName:"target",disableCache:o}});c=d,u=p;}else await this.traceBrowserInteraction("Mouse drag",()=>this.browser.mouseDrag(a,s,l,void 0,{force:n.force}));return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:c,thoughts:u}}case"SELECT_OPTION":{if(!Oa(n.target))throw new Error("Select with x/y is not supported yet");let a=n.target.elementDescriptor,s=n.choice,{elementInteractedDisplayString:l,thoughts:c}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:{type:"description",elementDescriptor:a},cache:n.cache?.target,action:u=>this.traceBrowserInteraction("Select option",()=>this.browser.selectOption(u,s,n.force),{value:s.type==="LABEL"?s.label:s.type==="VALUE"?s.value:s.index}),options:{...n,targetName:"target",disableCache:o,source:Ks(n)}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:l,thoughts:c}}case"TAB":{let a={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,a);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLOSE_TAB":await this.browser.closePage(n.action,{retry:!0});break;case"COOKIE":{if(!n.value)break;let a=await this.browser.setCookie(n.value);i.debug({results:a},"Set cookies");break}case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let a;try{n.environment==="BROWSER"?(a=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:r.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),i.info({result:a},"Executed JavaScript in browser")):a=await Ss({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:r,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async s=>{if(!this.options?.scratchPadId){i.warn({updates:s},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:s,logger:i});}}});}catch(s){throw this.throwIfClosed(),new L("ActionFailureError",s instanceof Error?s.message:`${s}`,{errOptions:{cause:s}})}try{JSON.stringify(a);}catch(s){throw new L("ActionFailureError",`Return value is not serializable: ${s instanceof Error?s.message:`${s}`}`,{errOptions:{cause:s}})}return {urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:a}}case"TYPE":{if(n.target&&di(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0),{value:n.value});break}let a=this.browser.url(),s,l,c=cloneDeep(n.target),u=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(c){let{elementInteractedDisplayString:p,thoughts:m}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:c,cache:n.cache?.target,action:f=>this.traceBrowserInteraction("Type",()=>this.browser.typeIntoTarget(n.value,f,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),{value:n.value,selector:f.locator.toString()}),options:{...n,targetName:"target",disableCache:o,disableGlobalLocatorRedirect:!u,source:Ks(n)}});s=p,l=m;}else await this.traceBrowserInteraction("Type",()=>this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0),{value:n.value});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:s,thoughts:l};return ny(a,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d}case"HOVER":{if(di(n.target)){let{pixels:l}=n.target;await this.traceBrowserInteraction("Hover",()=>this.browser.hoverUsingVisualCoordinates(l),{coordinates:l});break}let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:l=>this.traceBrowserInteraction("Hover",()=>this.browser.hover(l,{relativePosition:n.relativePosition}),{selector:l.locator.toString()}),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"FOCUS":{if(!Oa(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,command:n,target:n.target,cache:n.cache?.target,action:l=>this.browser.focus(l),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"BLUR":{if(n.target&&!Oa(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:a,thoughts:s}=await this.wrapElementTargetingCommand({tracer:t,target:n.target,command:n,cache:n.cache?.target,action:l=>this.browser.blur(l),options:{...n,targetName:"target",disableCache:o}});return {succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:a,thoughts:s}}case"PRESS":{let a=this.browser.url();await this.traceBrowserInteraction("Press key",()=>this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs}),{value:n.value});let s={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return ny(a,s.urlAfterCommand)&&(s.succeedImmediately=!0,s.succeedImmediatelyReason="URL changed"),s}case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let a=new CookieJar,s=dce(fetch,a),l;try{l=new URL(n.url).hostname;}catch{}let c=await nG({command:n,baseUrl:this.browser.baseUrl,logger:i,fetchImplementation:s});return {data:Xd.parse({...c,cookies:qO(a,l)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return {data:await iG({command:n,baseUrl:this.browser.baseUrl,logger:i}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return tG({tracer:t,command:n,disableCache:o,browser:this.browser,logger:i,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:a=>this.wrapElementTargetingCommand(a)});case"FILE_UPLOAD":{let a,s;if(n.fileSource.type==="URL"?(s=n.fileSource.url,a=await ZV({uri:n.fileSource.url,logger:i,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(s=n.fileSource.name,a=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!a)throw new L("UserConfigurationError",`Attempted to use non-existent file for upload step: ${s}`);await this.browser.setFileChooserHandler({...a,filename:n.filename});break}case"AUTH_SAVE":return {data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let a;if(!n.storageState.trim())a=void 0;else if(a=await Ss({orgId:this.orgId,code:n.storageState,fragment:!1,context:r,logger:i,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof a!="object")throw new L("ActionFailureError",`Credentials must evaluate to an object (received ${typeof a} instead)`);let s;try{s=fg.optional().parse(a);}catch(l){throw new L("ActionFailureError",`Credentials provided do not follow the required format: ${l}`)}await this.browser.loadAuthState(s);break}case"ELEMENT_CHECK":{let a=(n.timeout??lo)*1e3,s=this.generator.getAgentConfig()?.assertion;if(Q1(n.assertion)&&!n.useSelector&&n.target.type==="description"&&s&&s!=="v1"){let c={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let u=await pT({command:c,logger:i,fixtures:this.getControllerFixtures(),useMemory:this.shouldUseMemory()});return {succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${u.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:u.afterScreenshotOverride}}finally{c.cache?.memory&&_m(n,c.cache?.memory.traces,i);}}let l=await Z1({command:n,tracer:t,timeoutMs:a,targetingWrapper:c=>this.wrapElementTargetingCommand(c),fixtures:this.getControllerFixtures(),disableCache:o});return {fail:!l.success,data:l.data,elementInteracted:l.elementInteractedDisplayString,thoughts:l.err?.message??l.thoughts??`Element assertion ${l.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let a=await Oo({action:async()=>mT({assertion:n.assertion,browser:this.browser,logger:i,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:i});return {fail:!a.success,data:a.data,thoughts:a.success?"Page assertion passed.":a.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let a=new vs(n.requestMatcher),s=this.browser.registerRequestListener(a);return this.registeredListeners[n.key]=s.then(async l=>await JR(l)).catch(l=>{i.error({err:l},"Failed to get request listener response");}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let a=this.registeredListeners[n.key];if(!a)throw new L("ActionFailureError",`No listener registered with key: ${n.key}`);let s=n.timeout??10;return {data:await ne(a,{milliseconds:s*1e3,message:`Request listener timed out after ${s} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let a=new vs(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:s=>a.matches({url:s.request.url,method:s.request.method}),onRequestStart:(s,l)=>{this.recordedRequests[n.key][s]=Zy(l);},onRequestComplete:(s,l)=>{this.recordedRequests[n.key]?.[s]&&(this.recordedRequests[n.key][s]=Zy(l));}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let a=this.recordedRequests[n.key];if(!a)throw new L("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(a),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let a;return n.requestMatcher&&(a=new vs(n.requestMatcher)),this.browser.setHeader(n.name,n.value,a),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return {data:{key:this.browser.registerMock(n.key,new vs(n.requestMatcher),async(s,l)=>{let c=await Ss({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:r,timeoutMs:void 0,logger:i,localTools:this.localCodeEvalTools,mock:{request:s,response:l},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),u=mL.parse(c);return new Response(u.body,{status:u.status,headers:u.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return (s=>{throw "If Typescript complains about the line below, you missed a case or break in the switch above"})()}return {succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:t,targetId:n,disableCache:r,screenshot:o}){return (await this.generator.getReverseMappedDescription({browserState:t,target:n,screenshot:o},{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:Je(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights();}async startRecordMode({params:t,abortController:n,isClickToRecord:r}){this.recordAbortController=n;let o=new sT({signal:n.signal,...t});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(t){return this.generator.getAutohealingProposal(t,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Je(this.logger)})}async getFailureRecoveryPlan(t,n){return this.generator.getFailureRecoveryPlan(t,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Je(n??this.logger)})}};var ww=async e=>{let{step:t,resolvedInputs:n}=e.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:a,controller:s}=e.fixtures,l=s.browser,{orgId:c,runId:u}=e.inputs,d=s.executeAbortController.signal;Object.keys(n).length>0&&(o.setInputs(n),r.info(Li({json:{inputs:n,moduleId:t.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,f,h;if(t.cacheConfig||t.defaultCacheAllInvocations){let g=t.cacheConfig?.cacheKey||t.defaultCacheKey||"",S=await er({orgId:c,s:g,context:o,logger:r,localTools:a,signal:d});h={orgId:c,cacheKeys:[S,...Object.entries(n).map(([y,b])=>`${y}:${b}`)]},r.info({original:g,keyParams:h},"Module cache key params");let T=Date.now();for(;Date.now()-T<VL;){d?.throwIfAborted();let y=await i.getCacheResult(h);if(y){r.info({cacheResult:Pt(y,1e3,!0)},"Got result from module execution cache"),p=fT(t,n,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(y),m=!0;break}else r.info({cacheKey:g,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${hostname()};runId:${u}`},d);if(b.acquired){f=b.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:f,cacheKey:g,keyParams:h},"Failed to acquire cache lock, retrying...");await ve(2500+Math.random()*1e4,d);}}try{if(!p)p=await fce(e);else if(t.autoAuth){let g=fg.safeParse(p.data);if(!g.success)throw new L("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${g.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(g.data);let S=!1,T=t.advanced?.cacheInvalidation;if(T&&T.type==="PAGE_CHECK"){let y={type:"CONTENT",value:T.substring},b=await mT({timeout:lo,assertion:y,browser:l,logger:r,signal:d,autoExpandIframes:!!l.userBrowserSettings.autoExpandIframes});b.success?r.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(r.info({invalResult:b},"Invalidating cached result due to page check failure"),S=!0);}if(h&&S)return await i.deleteCacheResult(h),ww(e)}}finally{try{f!==void 0&&!m&&p?.status==="SUCCESS"&&await hce({step:t,result:p,browser:s.browser,cacheKeyPrefix:f,logger:r,storage:i});}finally{f!==void 0&&await i.releaseCacheLock(f);}}return p},fce=async e=>{let{currentParentIdChain:t}=e,{step:n,tracer:r}=e.moduleParams,o=fT(n,e.moduleParams.resolvedInputs,"SUCCESS"),i=await r.startSubSteps(),{status:a,results:s}=await e.executeStepList({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:i,currentParentIdChain:t}});return o.results=s,o.status=a,o.finishedAt=new Date,Po({asyncTasks:e.work.asyncTasks,nestedResults:s,result:o,logger:e.fixtures.logger}),o};function fT(e,t,n){let r={};return Object.entries(t).forEach(([i,a])=>{r[i]=JSON.stringify(a);}),{type:"MODULE",id:e.id,moduleId:e.moduleId,moduleName:e.name,startedAt:new Date,cacheConfig:e.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:n}}async function sG({orgId:e,step:t,context:n,logger:r,codeEvalTools:o,signal:i}){let a={};try{for(let s of t.parameters??[]){let l=t.inputs?.[s]??t.defaultParameters?.[s];if(!l){r.warn(`No value or default found for parameter '${s}' that is required by module '${t.name}'`);continue}a[s]=await Ss({orgId:e,code:l,fragment:!0,context:n,logger:r,localTools:o,signal:i});}return a}catch(s){throw i?.throwIfAborted(),new L("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function hce({step:e,result:t,browser:n,cacheKeyPrefix:r,logger:o,storage:i}){let a=e.cacheConfig?.cacheExpiryMs;(!a||a===kN)&&(a=e.defaultCacheTtl??FN);let s;e.autoAuth?s=JSON.stringify(await n.saveAuthState()):t.data!==void 0?s=JSON.stringify(t.data):s='""',o.debug({cacheKeyPrefix:r,ttlMs:a,truncatedCacheResultJson:Li({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a});}async function Wl(e,t,n){return gce(e,t,n)}async function gce(e,t,n){let r=new Date;try{return n.throwIfAborted(),await t()}catch(o){let i=new Date,a="FAILED",s;if(n.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof L?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,e.type==="RESOLVED_MODULE"){let l=fT(e,{},"FAILED");return l.message=s,l.startedAt=r,l.finishedAt=i,l}return {...ey(e),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Ir(e,t){let n=!1;try{return e&&!e.state.failureRecoveryDisabled&&(e.state.failureRecoveryDisabled=!0,n=!0),await t()}finally{e&&n&&(e.state.failureRecoveryDisabled=void 0);}}var hT=async e=>{let{step:t,tracer:n}=e.presetParams,{logger:r,controller:o,context:i}=e.fixtures,{collectDebugData:a}=e.options,{testMetadata:s}=e.inputs,l=t.command.type,c=r.child({commandType:l,stepId:t.id,commandId:t.command.id}),u="cache"in t.command&&t.command.cache?cloneDeep(t.command.cache):{},d=o.browser.url(),p=new Date,m,f=randomUUID(),h=randomUUID();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let y=await o.browser.getRawCondensedHtml();n.attachBeforeHtmlSnapshot({logger:c,snapshotId:f,html:y});}}catch(y){o.throwIfClosed(),c.debug({err:y},"Failed to take before screenshot, continuing...");}let g,S,T;try{let y=await o.executePresetCommand(n,t.command,i,s?.advanced.disableAICaching??!1);y.beforeScreenshotOverride&&(m=y.beforeScreenshotOverride),T=y.afterScreenshotOverride;let b=new Date,A=o.browser.url();S={beforeUrl:d,afterUrl:A,startedAt:p,finishedAt:b,viewport:o.browser.getViewport(),status:y.fail?"FAILED":"SUCCESS",elementInteracted:y.elementInteracted},g={...t,message:y.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:A,finishedAt:b,startedAt:p,status:y.fail?"FAILED":"SUCCESS",data:y.data,results:[S]},"assertion"in t.command&&(g.message=y.thoughts||"Assertion passed.");}catch(y){c.error({message:y.message,stack:y.stack},`Failed executing preset step ${Hr(t.command)}`);let b=o.browser.url(),A=new Date,R=y instanceof Error?y.message:`${y}`;S={beforeUrl:d,afterUrl:b,startedAt:p,finishedAt:A,viewport:o.browser.getViewport(),status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:R},g={...t,startedAt:p,finishedAt:A,beforeUrl:d,afterUrl:b,status:y instanceof DOMException&&y.name==="AbortError"?"CANCELLED":"FAILED",message:R,failureReason:y instanceof L?y.reason:void 0,results:[S]};}finally{let y="cache"in t.command&&t.command.cache?cloneDeep(t.command.cache):{},b=diff(u,y);b&&Object.keys(b).length>0&&c.info({diffs:Jh(b)},"Updated cache");}if(a)try{if(T||(T=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots&&!o.browser.userBrowserSettings.disableBrowserMonitoring){let y=await o.browser.getRawCondensedHtml();n.attachAfterHtmlSnapshot({logger:c,snapshotId:h,html:y});}}catch(y){o.throwIfClosed(),c.debug({err:y},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.");}return S.beforeSnapshot=f,g.beforeSnapshot=f,S.afterSnapshot=h,g.afterSnapshot=h,m&&n.attachBeforeScreenshot({snapshotId:f,screenshot:m}),T&&n.attachAfterScreenshot({snapshotId:h,screenshot:T}),g};async function yce(e,t,n){let{tracer:r}=e.conditionalParams,{logger:o,controller:i}=e.fixtures,a=t.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Ir(e.work,()=>hT({...e,presetParams:{tracer:r,step:t.assertion}})),l=a.type;switch(l){case"AI_ASSERTION":case"ELEMENT_CHECK":case"PAGE_CHECK":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:t.steps}:(o.info(s.message,`${a.type} condition ${n} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return {type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${n} evaluated`),c?{type:"passed",conditionResult:s,steps:t.steps}:{type:"failed",conditionResult:s}}default:return (u=>{throw new Error(`Unsupported conditional command type: ${u}`)})(l)}}catch(s){i.throwIfClosed(),o.error({err:s},`Condition ${n} failed with error`);let l=s instanceof Error?s.message:"Unknown error during condition evaluation";return {type:"execution_error",conditionResult:{...t.assertion,status:"FAILED",message:l,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed();}}function Tce(e,t,n,r){let o=r.slice(n.length);for(let i=0;i<e.blocks.length;i++){let a=e.blocks[i],{result:s}=Tl(a.steps,t,o);if(s)return i}return -1}async function uG(e){let t=new Date,{currentParentIdChain:n}=e,{step:r}=e.conditionalParams,{logger:o}=e.fixtures,{fromStep:i}=e.inputs,a=ey(r),s=!!i&&xm(n,i.parentStepIdChain),l=r.elseSteps,c=!0,u=[],d,p=!1;if(s&&i){let S=Tce(r,i.fromStepId,n,i.parentStepIdChain);S>=0&&(l=r.blocks[S].steps,c=!1,p=!0,o.info(`Skipping conditional assertion (execution starts from step within block ${S}), running ${l.length} steps`));}if(!p)for(let S=0;S<r.blocks.length;S++){o.info(`Evaluating condition ${S} in conditional step`);let T=r.blocks[S],y=await yce(e,T,S);if(u.push(y.conditionResult),d=y.conditionResult,y.type==="execution_error"){let b={...a,assertionResult:y.conditionResult,status:"FAILED",startedAt:t,finishedAt:new Date,message:y.conditionResult.message,results:[]};return Po({asyncTasks:e.work.asyncTasks,nestedResults:u,result:b,logger:o}),b}if(y.type==="passed"){o.info(`Condition ${S} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,l=y.steps;break}}if(l)c&&o.info("No conditions resolved to true, executing the else block steps");else {o.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let S={...a,assertionResult:d,status:"SUCCESS",startedAt:t,data:u[u.length-1]?.data,message:u[u.length-1]?.message,results:[],finishedAt:new Date};return Po({asyncTasks:e.work.asyncTasks,nestedResults:[...u],result:S,logger:o}),S}o.info(`Executing ${l.length} steps in the selected conditional block`);let m=await e.conditionalParams.tracer.startSubSteps(),f=await e.executeStepList({...e,listParams:{steps:l,containerName:"conditional block",tracer:m,currentParentIdChain:n}}),g={...a,assertionResult:d,...f,startedAt:t,finishedAt:new Date};return Po({asyncTasks:e.work.asyncTasks,nestedResults:[...u,...f.results],result:g,logger:o}),g}var pG=async e=>{let{tracer:t}=e.aiStepParams,{controller:n}=e.fixtures;await n.browser.waitForStability();let r=await n.browser.screenshot({}),o=await Ece(e);o.finishedAt=new Date,Po({asyncTasks:e.work.asyncTasks,result:o,nestedResults:o.results,logger:e.fixtures.logger});let i=await n.browser.screenshot({}),a=randomUUID();o.beforeSnapshot=a,t.attachBeforeScreenshot({snapshotId:a,screenshot:r});let s=randomUUID();return o.afterSnapshot=s,t.attachAfterScreenshot({snapshotId:s,screenshot:i}),o},Ece=async e=>{let{currentParentIdChain:t}=e,{step:n,tracer:r}=e.aiStepParams,{controller:o,context:i,logger:a}=e.fixtures,s={...n,startedAt:new Date,beforeTestContext:i.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in n&&n.steps&&n.steps.length>0&&n.steps[n.steps.length-1]?.command.type==="SUCCESS"))throw new L("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:u}=await e.executeStepList({...e,listParams:{steps:n.steps,containerName:"AI action",results:s.results,tracer:c,currentParentIdChain:t}});return s.finishedAt=new Date,s.status=u,s}catch(c){a.warn({err:c},"Failed executing saved deprecated AI action steps");let u=o.executeAbortController.signal.aborted;s.message=c instanceof Error?c.message:`${c}`,s.status=u?"CANCELLED":"FAILED";}return s};var mG=e=>{throw new Error(`Exhaustive check failed for value: ${e}`)};function J({text:e,section:t}){if(!t)return [{type:"text",text:e}];let n=`### ${t}`;return e.length===0?[{type:"text",text:n}]:[{type:"text",text:`${n}
|
|
5211
5211
|
${e}`}]}function ni({base64Data:e,mediaType:t,section:n}){return n?[{type:"text",text:`### ${n}`},{type:"media",data:e,mediaType:t}]:[{type:"media",data:e,mediaType:t}]}function ot(e){if(e.length===0)throw new Gn("No content parts provided to construct the tool response content.");return {type:"content",value:e}}function fG(e,t=2e4){let n={};for(let[r,o]of Object.entries(e)){if(typeof o=="object"&&o!==null){let i=JSON.stringify(o,null,2);if(ze(i)>t){n[r]="[too large truncated]";continue}n[r]=o;continue}n[r]=o;}return n}function hG(e,t){let n={},r=0,o=Object.entries(e).map(([i,a])=>{let s=JSON.stringify(a,null,2),l=ze(s);return {key:i,value:a,tokens:l}}).sort((i,a)=>i.tokens-a.tokens);for(let{key:i,value:a,tokens:s}of o)r+s<=t&&(n[i]=a,r+=s);return n}function gG({projectRoot:e,filePath:t,pathLabel:n="path"}){if(!t||!An__default.isAbsolute(t))return t;let r=An__default.relative(e,t);if(r.startsWith("..")||An__default.isAbsolute(r))throw new Error(`Error: ${n} "${t}" must be inside project root "${e}".`);return r}function SG(e){return e.map(t=>{switch(t.type){case"text":return t;case"media":return {type:"image",data:t.data,mimeType:t.mediaType};default:return (r=>{throw new Error("Unhandled content part")})()}})}var bce=[401,403,408,409,413,429,498,500,502,503,504],vce=["overloaded","service unavailable","bad gateway","too many requests","toomanyrequests","internal server error","gateway timeout","rate_limit","ratelimit","rate limit","wrong-key","unexpected","capacity","timeout","terminated","other side closed","server_error","you can retry your request","429","500","502","503","504"];function yG(e){if(e&&typeof e=="object"&&"statusCode"in e){let n=e.statusCode;if(typeof n=="number"&&(bce.includes(n)||n>500))return !0}let t=TG(e).toLowerCase();return vce.some(n=>t.includes(n))}function TG(e){if(e instanceof Error){let t="cause"in e?e.cause:void 0,n="code"in e&&typeof e.code=="string"?e.code:"";return `${e.name} ${e.message} ${n} ${TG(t)}`}if(typeof e=="string")return e;if(e&&typeof e=="object")try{return JSON.stringify(e)}catch{return ""}return ""}function bG(e){return new Iw(e)}var Iw=class{specificationVersion="v2";settings;retryAfterOutput;models;constructor(t){if(this.settings=t,this.models=[...t.models],this.retryAfterOutput=t.retryAfterOutput??!0,this.models.length===0)throw new Error("No models available in settings")}get supportedUrls(){return this.currentModel.supportedUrls}get modelId(){return this.currentModel.modelId}get provider(){return this.currentModel.provider}doGenerate(t){return this.retry(()=>this.currentModel.doGenerate(t))}doStream(t){return this.retry(async()=>{let n=await this.currentModel.doStream(t);return {...n,stream:this.createRetryingStream({stream:n.stream,options:t})}})}get currentModel(){let t=this.models[0];if(!t)throw new Error("No model available at current fallback index");return t}moveCurrentModelToBack(){let t=this.models.shift();t&&this.models.push(t);}shouldRetry(t){return this.settings.shouldRetryThisError?this.settings.shouldRetryThisError(t):yG(t)}async notifyError(t){await this.settings.onError?.(t,this.modelId);}async retry(t){let n=this.models.length;for(let r=0;r<n;r++)try{return await t()}catch(o){if(!this.shouldRetry(o)||(await this.notifyError(o),this.moveCurrentModelToBack(),r===n-1))throw o}throw new Error("No models available in settings")}createRetryingStream(t){let{stream:n,options:r}=t,o={hasStreamedAny:!1,hasEmittedClientExecutedToolCall:!1,remainingFallbackAttempts:this.models.length-1};return new ReadableStream({start:async i=>{let a;try{a=n.getReader(),await this.pipeStreamToController({reader:a,controller:i,retryState:o}),i.close();}catch(s){await this.retryStreamAfterError({error:s,options:r,controller:i,retryState:o});}finally{EG(a);}}})}async pipeStreamToController(t){let{reader:n,controller:r,retryState:o}=t,i=await n.read();for(;!i.done;){let a=i.value;if(o&&a.type==="error"&&this.shouldRetry(a.error))throw a.error;r.enqueue(a),o&&(o.hasStreamedAny||=a.type!=="stream-start",a.type==="tool-call"&&a.providerExecuted!==!0&&(o.hasEmittedClientExecutedToolCall=!0)),i=await n.read();}}async retryStreamAfterError(t){let{error:n,options:r,controller:o,retryState:i}=t;if(!this.shouldRetry(n)){o.error(n);return}if(await this.notifyError(n),i.hasEmittedClientExecutedToolCall||i.hasStreamedAny&&!this.retryAfterOutput||i.remainingFallbackAttempts<=0){o.error(n);return}this.moveCurrentModelToBack(),i.remainingFallbackAttempts-=1;let a;try{a=(await this.currentModel.doStream(r)).stream.getReader(),await this.pipeStreamToController({reader:a,controller:o,retryState:i}),o.close();}catch(s){await this.retryStreamAfterError({error:s,options:r,controller:o,retryState:i});}finally{EG(a);}}};function EG(e){try{e?.releaseLock();}catch{}}var Ace=new Set(["itemId","reasoningEncryptedContent"]);function vG({model:e,logger:t,logMessage:n}){return wrapLanguageModel({model:e,middleware:{transformParams:async({params:o})=>{let{messages:i,wasPruned:a}=Rce(o.prompt);return a&&t.info({messageCount:i.length,fallbackModel:e.modelId},n),{...o,prompt:i}}}})}function Rce(e){let t=!1,n=[];for(let r of e){let{message:o,wasPruned:i}=wce(r);t=t||i,o&&n.push(o);}return {messages:n,wasPruned:t}}function wce(e){let t=CG(e.providerOptions),n=t.wasPruned;switch(e.role){case"system":return {message:{...e,providerOptions:t.providerOptions},wasPruned:n};case"assistant":{let r=[];for(let i of e.content){if(i.type==="reasoning"){n=!0;continue}r.push(i);}let o=_w(r);return n=n||o.wasPruned,o.parts.length===0?{message:void 0,wasPruned:!0}:{message:{...e,content:o.parts,providerOptions:t.providerOptions},wasPruned:n}}case"user":{let r=_w(e.content);return n=n||r.wasPruned,{message:{...e,content:r.parts,providerOptions:t.providerOptions},wasPruned:n}}case"tool":{let r=_w(e.content);return n=n||r.wasPruned,{message:{...e,content:r.parts,providerOptions:t.providerOptions},wasPruned:n}}}}function CG(e){if(!e)return {providerOptions:e,wasPruned:!1};let t=!1,n={};for(let[r,o]of Object.entries(e)){let i={};for(let[a,s]of Object.entries(o)){if(Ace.has(a)){t=!0;continue}i[a]=s;}Object.keys(i).length>0&&(n[r]=i);}return {providerOptions:Object.keys(n).length>0?n:void 0,wasPruned:t}}function _w(e){let t=!1;return {parts:e.map(n=>{let r=xce(n);return t=t||r.wasPruned,r.part}),wasPruned:t}}function xce(e){let t=CG(e.providerOptions);return t.wasPruned?{part:{...e,providerOptions:t.providerOptions},wasPruned:!0}:{part:e,wasPruned:!1}}var Ra="openai-websocket";function AG(e){if(!e||typeof e!="object"||!("modelId"in e))return !1;let t=e.modelId;return typeof t=="string"&&t.startsWith(`${Ra}/`)}function wG(){let e=new Map;return {get(t){return e.get(t)},set(t,n){e.set(t,n);}}}var Oce=wG();function ws(e){let{providerFallback:t,prepareStep:n,onChunk:r,streamTelemetry:o,...i}=e,a=IG(t);return streamText({...i,prepareStep:Fce(n),onChunk:Lce({logger:t.logger,onChunk:r,telemetry:o}),model:a})}async function xG(e){let{providerFallback:t,...n}=e,r={...t,websocketFirst:void 0},o=IG(r),i=streamObject({...n,model:o,output:"object"});return await consumeStream({stream:i.fullStream,onError(a){throw a}}),i.object}function Lce(e){let{logger:t,onChunk:n,telemetry:r}=e;if(!r)return n;let o=new Map;return async i=>{Nce({logger:t,buffers:o,telemetry:r,chunk:i.chunk}),await n?.(i);}}function Nce(e){let{logger:t,buffers:n,telemetry:r,chunk:o}=e;if(o.type==="text-delta"&&r.textDeltas){RG({logger:t,buffers:n,telemetry:r,chunk:o});return}if(o.type==="reasoning-delta"&&r.reasoningDeltas){RG({logger:t,buffers:n,telemetry:r,chunk:o});return}if(o.type==="text-end"||o.type==="reasoning-end"){Mw({logger:t,buffers:n,telemetry:r,id:o.id,kind:o.type==="text-end"?"text-delta":"reasoning-delta",flushReason:"end"});return}(o.type==="finish"||o.type==="abort"||o.type==="error")&&kce({logger:t,buffers:n,telemetry:r,flushReason:o.type});}function RG(e){let{logger:t,buffers:n,telemetry:r,chunk:o}=e,i=`${o.type}:${o.id}`,s=n.get(i)??{id:o.id,kind:o.type,text:"",deltaCount:0,timer:void 0};s.timer&&clearTimeout(s.timer),s.text+=o.text,s.deltaCount+=1,s.timer=setTimeout(()=>{Mw({logger:t,buffers:n,telemetry:r,id:o.id,kind:o.type,flushReason:"debounce"});},r.debounceMs??2e3),Dce(s.timer),n.set(i,s);}function Dce(e){if(typeof e!="object"||e===null||!("unref"in e))return;let t=e.unref;typeof t=="function"&&t.call(e);}function Mw(e){let{logger:t,buffers:n,telemetry:r,id:o,kind:i,flushReason:a}=e,s=`${i}:${o}`,l=n.get(s);if(!l)return;l.timer&&clearTimeout(l.timer),n.delete(s);let c=r.maxLoggedChars,u=typeof c=="number"&&l.text.length>c?l.text.slice(0,c):l.text;t.info({...r.attributes,chunkId:l.id,chunkType:l.kind,deltaCount:l.deltaCount,flushReason:a,text:u,textLength:l.text.length,truncated:u.length!==l.text.length},`streamText ${i}`);}function kce(e){let{logger:t,buffers:n,telemetry:r,flushReason:o}=e;for(let i of Array.from(n.values()))Mw({logger:t,buffers:n,telemetry:r,id:i.id,kind:i.kind,flushReason:o});}function Fce(e){if(e)return t=>{if(!AG(t.model))return e(t)}}function IG(e){let t=e.scopeKey,n=t?e.state??Oce:wG(),r=Uce({...e,scopeKey:t,state:n});if(r.length===0)throw new Error("No streamText fallback providers configured");return bG({models:r.map(o=>o.model),retryAfterOutput:!0,onError:async(o,i)=>{let a=r.find(s=>s.model.modelId===i)?.id??i;e.logger.warn({err:o,modelId:i,providerId:a},"streamText provider failed, trying next fallback"),await e.onError?.({error:iP(o),failedProviderId:a,failedModelId:i});}})}function Uce(e){let t=e.scopeKey?e.state.get(e.scopeKey):void 0;if(e.websocketFirst?.enabled&&(!t||t===e.websocketFirst.provider.id))return [Pw({candidate:e.websocketFirst.provider,config:e,pruneProviderState:!1}),...e.providers.map(i=>Pw({candidate:i,config:e,pruneProviderState:!0}))];let n=t?e.providers.findIndex(i=>i.id===t):-1,r=n>=0?n:0;return [...e.providers.slice(r),...e.providers.slice(0,r)].map((i,a)=>Pw({candidate:i,config:e,pruneProviderState:a>0}))}function Pw(e){let{candidate:t,config:n,pruneProviderState:r}=e,o=Bce({model:t.model,providerId:t.id,scopeKey:n.scopeKey,state:n.state});return r&&(o=vG({model:o,logger:n.logger,logMessage:"Stripped provider-local state from streamText fallback step"})),{...t,model:o}}function Bce(e){let{model:t,providerId:n,scopeKey:r,state:o}=e;return wrapLanguageModel({model:t,middleware:{overrideModelId:()=>`${n}/${t.modelId}`,wrapGenerate:async({doGenerate:i})=>{let a=await i();return r&&o.set(r,n),a},wrapStream:async({doStream:i})=>{let a=await i();return {...a,stream:zce({stream:a.stream,providerId:n,scopeKey:r,state:o})}}}})}function zce(e){let{stream:t,providerId:n,scopeKey:r,state:o}=e,i=!1,a,s=!1;return new ReadableStream({async start(l){a=t.getReader();try{for(;;){let{done:c,value:u}=await a.read();if(c)break;!i&&u.type!=="stream-start"&&u.type!=="error"&&(i=!0,r&&o.set(r,n)),l.enqueue(u);}s||l.close();}catch(c){s||l.error(c);}finally{a.releaseLock(),a=void 0;}},cancel(l){return s=!0,a?.cancel(l)}})}async function Vce(e){let{agentConfig:t,streamResponseMessages:n,userMessage:r,...o}=e,i={role:"user",content:r};return xG({...o,providerFallback:t.providerFallback,system:t.system,providerOptions:t.providerOptions,messages:[...t.messages??[],...n,i]})}async function af({validate:e,maxAttempts:t,logger:n,...r}){let o;for(let i=1;i<=t;i++){r.abortSignal?.throwIfAborted();try{let a=await Vce(r);return await e(a),a}catch(a){if(r.abortSignal?.aborted||(o=a,i===t))throw a;n.warn({err:a,attempt:i,nextAttempt:i+1},"Failed to validate generated object to repair missing submission tool call, retrying");}}throw o}var _G=500;function PG(e){return e.map((t,n)=>({index:n,finishReason:t.finishReason,textLength:t.text.length,toolCalls:t.toolCalls.map(r=>({toolName:r.toolName,input:r.input})),toolResults:t.toolResults.map(r=>({toolName:r.toolName})),response:{id:t.response.id,modelId:t.response.modelId,messageCount:t.response.messages.length},usage:t.usage}))}function MG(e){return !e||typeof e!="object"||!("type"in e)||e.type!=="content"||!("value"in e)||!Array.isArray(e.value)?e:{type:e.type,value:e.value.map(t=>{if(!t||typeof t!="object"||!("type"in t))return t;if(t.type==="text"&&"text"in t){let n=typeof t.text=="string"?t.text:"";return {type:t.type,textLength:n.length,preview:n.slice(0,_G),truncated:n.length>_G}}if(t.type==="media"&&"data"in t){let n=typeof t.data=="string"?t.data:"";return {type:t.type,dataLength:n.length,mediaType:"mediaType"in t?t.mediaType:void 0}}return t})}}var OG=z.object({type:z.literal("tool-call"),toolCallId:z.string(),toolName:z.string(),input:z.unknown()}).passthrough(),Hce=z.object({type:z.literal("content"),value:z.array(z.discriminatedUnion("type",[z.object({type:z.literal("text"),text:z.string()}),z.object({type:z.literal("media"),data:z.string(),mediaType:z.string()})]))}),Gce=z.discriminatedUnion("type",[z.object({type:z.literal("text"),value:z.string()}),z.object({type:z.literal("json"),value:z.unknown()}),z.object({type:z.literal("error-text"),value:z.string()}),z.object({type:z.literal("error-json"),value:z.unknown()}),Hce]),LG=z.object({type:z.literal("tool-result"),toolCallId:z.string(),toolName:z.string(),output:Gce}).passthrough(),NG=z.object({text:z.string()}).passthrough();var DG=2,jce=1600,$ce=.3,ql="[trimmed: omitted due to context budget]",UG="[screenshot truncated]",BG="[browser state truncated]",zG={_momenticTrimmed:!0,summary:ql},VG={type:"text",value:ql},Wce=z.object({type:z.literal("text"),value:z.literal(ql)}),qce=["reasoning","tool-result","image","tool-call","text"];function xs(e){let{messages:t,phase1:n,phase2:r,logger:o}=e,i=Kce(t,n.toolResultPruningRules??[],{trimReasoning:n.trimReasoning??!1});if(typeof n.numScreenshots=="number"&&(i=Yce(i,n.numScreenshots)),typeof n.numBrowserStates=="number"&&n.browserStateMarkers&&n.browserStateMarkers.length>0&&(i=eue(i,n.numBrowserStates,n.browserStateMarkers)),!r)return i;let a=ze(i);return a<=r.tokensThreshold||(o.info({totalTokens:a,threshold:r.tokensThreshold,target:r.targetTokens,messageCount:i.length,breakdown:FG(i)},"Phase 2 triggered \u2014 token breakdown before compaction"),i=Sue(i,r.targetTokens,o),o.info({totalTokens:ze(i),messageCount:i.length,breakdown:FG(i)},"Phase 2 complete \u2014 token breakdown after compaction")),i}function Kce(e,t,n){let r=e;n.trimReasoning&&(r=r.map((o,i)=>o.role!=="assistant"?o:mue(o,i===e.length-1)));for(let o of t)r=iue(r,o);return r}function Yce(e,t){let n={count:t},r=[...e];for(let o=r.length-1;o>=0;o--)r[o]=Xce(r[o],n);return r}function Xce(e,t){if(e.role==="user"){if(typeof e.content=="string")return e;let n=Jce(e.content,t);return {...e,content:n}}if(e.role==="tool"){let n=Zce(e.content,t);return {...e,content:n}}return e}function Jce(e,t){let n=[...e];for(let r=n.length-1;r>=0;r--)if(n[r].type==="image"){if(t.count>0){t.count--;continue}n[r]={type:"text",text:UG};}return n}function Zce(e,t){let n=[...e];for(let r=n.length-1;r>=0;r--){let o=n[r];if(o.output.type!=="content")continue;let i=Qce(o.output.value,t);i!==o.output.value&&(n[r]={...o,output:{...o.output,value:i}});}return n}function Qce(e,t){let n=[...e],r=!1;for(let o=n.length-1;o>=0;o--)if(n[o].type==="media"){if(t.count>0){t.count--;continue}n[o]={type:"text",text:UG},r=!0;}return r?n:e}function eue(e,t,n){let r={count:t},o=[...e];for(let i=o.length-1;i>=0;i--)o[i]=tue(o[i],r,n);return o}function tue(e,t,n){if(e.role==="user"){if(typeof e.content=="string")return e;let r=nue(e.content,t,n);return {...e,content:r}}if(e.role==="tool"){let r=rue(e.content,t,n);return {...e,content:r}}return e}function nue(e,t,n){let r=[...e];for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(i.type!=="text"||!HG(i.text,n))){if(t.count>0){t.count--;continue}r[o]={type:"text",text:BG};}}return r}function rue(e,t,n){let r=[...e];for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.output.type!=="content")continue;let a=oue(i.output.value,t,n);a!==i.output.value&&(r[o]={...i,output:{...i.output,value:a}});}return r}function oue(e,t,n){let r=[...e],o=!1;for(let i=r.length-1;i>=0;i--){let a=r[i];if(!(a.type!=="text"||!HG(a.text,n))){if(t.count>0){t.count--;continue}r[i]={type:"text",text:BG},o=!0;}}return o?r:e}function HG(e,t){for(let n of t)if(e.includes(n))return !0;return !1}function iue(e,t){let n=new Set;for(let r of e.slice(-t.keepLastMessages))if(typeof r.content!="string")for(let o of r.content)aue(o)&&t.tools.includes(o.toolName)&&n.add(o.toolCallId);return e.map((r,o)=>o>=e.length-t.keepLastMessages?r:gue(r,t,n))}function gT(e){return OG.safeParse(e).success}function Nw(e){return LG.safeParse(e).success}function aue(e){return gT(e)||Nw(e)}function sue(e){return NG.safeParse(e).success}function GG(e){return !e||typeof e!="object"||Array.isArray(e)?!1:e._momenticTrimmed===!0}function jG(e){return Wce.safeParse(e).success}function Lw(e){return e.text===ql?{part:e,trimmedTokens:0}:{part:{...e,text:ql},trimmedTokens:ze(e.text)}}function lue(e){return e.input===void 0||GG(e.input)?{part:e,trimmedTokens:0}:{part:{...e,input:zG},trimmedTokens:ze(e.input)}}function $G(e){return e.output===void 0||jG(e.output)?{part:e,trimmedTokens:0}:{part:{...e,output:VG},trimmedTokens:ze(e.output)}}function cue(e,t,n){let r=0,o=[];for(let i of e){if(r>=t){o.push(i);continue}switch(i.role){case"assistant":{let a=uue(i,t-r,n);r+=a.trimmedTokens,o.push(a.message);continue}case"tool":{let a=pue(i,t-r,n);r+=a.trimmedTokens,o.push(a.message);continue}case"user":{let a=due(i,t-r,n);r+=a.trimmedTokens,o.push(a.message);continue}default:o.push(i);}}return {messages:o,trimmedTokens:r}}function uue(e,t,n){if(typeof e.content=="string")return {message:e,trimmedTokens:0};let r=[],o=0;for(let i of e.content){if(o>=t){r.push(i);continue}if(n==="image"){r.push(i);continue}if(n==="reasoning"){if(i.type!=="reasoning"){r.push(i);continue}let s=Lw(i);o+=s.trimmedTokens,r.push(s.part);continue}if(n==="text"){if(i.type!=="text"){r.push(i);continue}let s=Lw(i);o+=s.trimmedTokens,r.push(s.part);continue}if(n==="tool-call"){if(!gT(i)){r.push(i);continue}let s=lue(i);o+=s.trimmedTokens,r.push(s.part);continue}if(!Nw(i)){r.push(i);continue}let a=$G(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...e,content:r},trimmedTokens:o}}function due(e,t,n){if(typeof e.content=="string")return {message:e,trimmedTokens:0};let r=[],o=0;for(let i of e.content){if(o>=t){r.push(i);continue}if(n==="image"){if(i.type!=="image"){r.push(i);continue}o+=jce;continue}if(n!=="text"||!sue(i)){r.push(i);continue}let a=Lw(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...e,content:r},trimmedTokens:o}}function pue(e,t,n){if(n!=="tool-result")return {message:e,trimmedTokens:0};let r=[],o=0;for(let i of e.content){if(o>=t){r.push(i);continue}let a=$G(i);o+=a.trimmedTokens,r.push(a.part);}return {message:{...e,content:r},trimmedTokens:o}}function mue(e,t){return t||typeof e.content=="string"?e:{...e,content:e.content.map(n=>n.type!=="reasoning"||n.text===ql?n:{...n,text:ql})}}function fue(e,t,n){return !t.tools.includes(e.toolName)||n.has(e.toolCallId)||e.input===void 0||GG(e.input)?e:{...e,input:zG}}function WG(e,t,n){return !t.tools.includes(e.toolName)||n.has(e.toolCallId)||e.output===void 0||jG(e.output)?e:{...e,output:VG}}function hue(e,t,n){return gT(e)?fue(e,t,n):Nw(e)?WG(e,t,n):e}function gue(e,t,n){return e.role==="assistant"&&typeof e.content!="string"?{...e,content:e.content.map(r=>hue(r,t,n))}:e.role==="tool"?{...e,content:e.content.map(r=>WG(r,t,n))}:e}function sf(e,t,n){let r=[...e];for(let o of qce){let i=ze(r);if(i<=t)break;let a=i-t,s=cue(r,a,o);r=s.messages,s.trimmedTokens>0&&n.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:ze(r)},"Trimmed content");}return r}function qG(e){return e.role!=="assistant"||typeof e.content=="string"?!1:e.content.some(t=>gT(t))}function kG(e){if(e.length===0)return;let t=e[0];if(qG(t)){e.shift(),e.length>0&&e[0].role==="tool"&&e.shift();return}e.shift();}function FG(e){let t={};for(let n of e)if(n.role==="system")t.system=(t.system??0)+ze(n);else if(n.role==="user")t.user=(t.user??0)+ze(n);else if(n.role==="assistant")if(typeof n.content=="string")t.assistant_text=(t.assistant_text??0)+ze(n);else for(let r of n.content)if(r.type==="tool-call"){let o=`tool_call:${r.toolName}`;t[o]=(t[o]??0)+ze(r);}else t.assistant_text=(t.assistant_text??0)+ze(r);else if(n.role==="tool"){for(let r of n.content)if(r.type==="tool-result"){let o=`tool_result:${r.toolName}`;t[o]=(t[o]??0)+ze(r);}}return t}function Sue(e,t,n){let r=ze(e);if(r<=t||e.length<=1)return e;let o=e[0],i=[],a=[];if(e.length>DG+1){let u=e.length-DG;u>1&&e[u]?.role==="tool"&&qG(e[u-1])&&u++,i=e.slice(1,u),a=e.slice(u);}else a=e.slice(1);if(i.length>0){i=sf(i,t,n);let u=[o,...i,...a];if(r=ze(u),r<=t)return u}let s=ze(i),l=s/t;if(l<$ce){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=sf(d,t,n),m=[o,...p,u];if(r=ze(m),r<=t)return m;let f=sf([...p,u],t,n),h=[o,...f];if(r=ze(h),r<=t)return h}else if(a.length===1){let u=[...i,...a],d=sf(u,t,n),p=[o,...d];if(r=ze(p),r<=t)return p}}else for(n.debug({headBudgetRatio:l,middleMsgTokens:s,targetTokens:t},"Middle exceeds 30% budget, removing messages");i.length>0;){kG(i);let u=[o,...i,...a];if(r=ze(u),r<=t)return u}a=sf(a,t,n);let c=[o,...i,...a];if(r=ze(c),r<=t)return c;for(;a.length>0;)if(kG(a),c=[o,...i,...a],r=ze(c),r<=t)return c;return r>t&&n.warn({targetTokens:t,finalTokenCount:r,remainingMessages:c.length},"Unable to meet token target after all pruning phases"),c}var Kl="Page State",lf="Screenshot",ud=`### ${Kl}`;function ST({url:e,title:t,pageSnapshotXml:n}){let r=[`- Page URL: ${e}`,`- Page Title: ${t}`];return n.length>0&&r.push("- Page Snapshot:","```xml",n,"```"),r.join(`
|
|
5212
5212
|
`)}var yue=3.18,KG=`
|
|
5213
5213
|
|
|
@@ -6188,7 +6188,7 @@ with this test we are editing:
|
|
|
6188
6188
|
to pick which of these modules are relevant:
|
|
6189
6189
|
|
|
6190
6190
|
`;let h=Lfe(p);f+=h;let g=streamObject({schema:bx,model:m("claude-sonnet-4-5-20250929"),system:Ofe,messages:[{role:"user",content:f}]}),S=[];for await(let R of g.textStream)S.push(R);let T=S.join(""),y;try{let R=JSON.parse(T);y=bx.parse(R);}catch(R){i.error({rawResponse:T,parseError:R},"Failed to parse AI response as JSON"),n.addError(`Failed to parse AI response: ${se(R)}. Raw response: ${T}`);return}let b=new Set(p.map(R=>R.moduleId)),A=y.recommendations.filter(R=>b.has(R.moduleId)?!0:(i.warn({moduleId:R.moduleId,moduleName:R.moduleName},"AI recommended a module that doesn't exist"),!1));n.addPartFromText(JSON.stringify({recommendations:A,totalModulesAnalyzed:p.length},null,2));}catch(u){i.error({err:u},"Error in module recommendation"),n.addError(`Failed to recommend modules: ${se(u)}`);}}}),gE=[Dfe,Pfe];var FW=Fn({schema:{name:_b,description:"Get the current browser state for a granular session. Defaults: screenshot on, browser snapshot off. The browser snapshot includes the URL, accessibility tree, and other context. Ask for it (returnBrowserState: true) when you need it for locator resolution or richer page structure\u2014e.g. when screenshot-only output is insufficient.",inputSchema:{sessionId:z.string().describe("The session id to query."),returnBrowserState:z.boolean().default(!1).describe("Include the serialized browser snapshot. Default false. Set to true when you need the browser snapshot for element targeting or page structure."),returnScreenshot:z.boolean().default(!0).describe("Include a screenshot. Default true. Set to false if you already have a screenshot of the present state and don't need a new one. EX: you just previewed a step and see that the page is too complicated and need the browser snapshot.")}},handle:async(e,t,n)=>{let r=ec({response:n,sessionId:t.sessionId,toolName:_b});if(!r)return;r.controller.setOpen();let o=await gx({browser:r.controller.browser,supportsFileOutput:e.supportsFileOutput,returnBrowserState:t.returnBrowserState,returnScreenshot:t.returnScreenshot});n.addContentParts(o);}}),UW=Fn({schema:{name:Pb,description:"Get the current environment variables for a session.",inputSchema:{sessionId:z.string()}},handle:async(e,t,n)=>{let r=ec({response:n,sessionId:t.sessionId,toolName:Pb});if(!r)return;let o=await Do({testContext:r.context,supportsFileOutput:e.supportsFileOutput});n.addContentParts(o);}});var BW=Fn({schema:{name:Dc,description:`Start a granular browser session for a specific test. Requires a testId. Returns session metadata (sessionId, testId, testFileAbsolutePath, projectConfigAbsolutePath, cwd, viewport, etc.) and a Step Authoring Guide artifact that includes projectRootAbsolutePath, projectConfigAbsolutePath, and cwd. ${pf} Read the Step Authoring Guide artifact before creating, previewing, running, or splicing CLI-style steps. Use testFileAbsolutePath to read the test file for step IDs when calling tools that require step IDs.`,inputSchema:{testId:z.string().describe("The test id to target when starting a session."),envName:z.string().optional().describe("Optional environment override (matches CLI --env behavior). Defaults to the test's default env when omitted."),projectConfigPath:z.string().optional().describe("Optional path to a momentic.config.yaml file (matches CLI --config)."),projectNameFilter:z.string().optional().describe("Optional project name filter for workspace configs (matches CLI --filter)."),headfulBrowser:z.boolean().optional().describe("Whether to launch a headful browser for the session. When omitted, uses the MCP server default if configured."),video:z.boolean().optional().describe("Whether to record a video of the browser session. When omitted, uses the MCP server default if configured. When the session is terminated, the response will include the path to the video output directory.")}},handle:async(e,t,n)=>{let{logger:r}=e,o=t.video??e.videoDefault??!1,i;o&&(ri(e.project.rootDir),i=oi({rootDir:e.project.rootDir,entity:"video",ext:"d"}),mkdirSync(i,{recursive:!0}));let a;try{a=await eo.startSession({logger:r,testId:t.testId,idleTimeoutMs:e.sessionIdleTimeoutMs,envName:t.envName,projectConfigPath:t.projectConfigPath??e.project.configFilePath,projectNameFilter:t.projectNameFilter,headfulOverride:t.headfulBrowser??e.headfulDefault??!0,customHeaders:e.customHeaders,devicePixelRatio:e.devicePixelRatio,skipExitOnError:!0,videoOutputDir:i});}catch(l){n.addError(se(l));return}Qr({type:"mcp:session_started",test_platform:"web"});let s=a.controller.browser.getViewport();n.addPartFromText(JSON.stringify({sessionId:a.sessionId,testId:a.testId,testFileAbsolutePath:a.testFileAbsolutePath,projectRootAbsolutePath:e.project.rootDir,projectConfigAbsolutePath:e.project.configFilePath,cwd:process.cwd(),createdAt:a.createdAt,expiresAt:a.lastAccessedAt+a.idleTimeoutMs,idleTimeoutMinutes:a.idleTimeoutMs/(60*1e3),envName:a.envName,baseUrl:a.baseUrl,viewport:s},null,2)),n.addContentParts(await aj({projectRootAbsolutePath:e.project.rootDir,projectConfigAbsolutePath:e.project.configFilePath,cwd:process.cwd(),stepSchema:$i(),stepSchemaTitle:"Step schema",supportsFileOutput:e.supportsFileOutput}));try{n.addContentParts(await rr({browser:a.controller.browser,supportsFileOutput:e.supportsFileOutput}));}catch(l){r.warn({sessionId:a.sessionId,err:l},"Session started but initial screenshot capture failed"),n.addPartFromText(JSON.stringify({warning:"Session started successfully, but initial screenshot capture failed.",screenshotError:se(l)},null,2));}i&&n.addContentParts(J({text:nr({filePath:i,title:"Video output directory"}),section:"Video Output"}));}}),zW=Fn({schema:{name:IP,description:"Kill a granular browser session by sessionId. Returns available session ids if the target is missing.",inputSchema:{sessionId:z.string().describe("The session id to terminate.")}},handle:async(e,t,n)=>{let{sessionId:r}=t;try{let o=eo.getSession(r),i=o?.videoOutputDir,a=await eo.killSession(t.sessionId,"explicit kill");if(a.killed&&Qr({type:"mcp:session_killed",test_platform:"web",reason:"explicit kill"}),!a.killed){o?n.addError(`Failed to terminate session '${t.sessionId}'.`):n.addError(JSON.stringify({message:`No active session found for id '${t.sessionId}'.`,availableSessionIds:eo.listSessionIds()},null,2));return}n.addPartFromText(JSON.stringify({sessionId:t.sessionId,killed:!0},null,2));let s=await sj({killResult:a,rootDir:e.project.rootDir});s&&n.addContentParts(J({text:nr({filePath:s.filePath,title:"Session span report"}),section:"Session Spans"})),i&&n.addContentParts(J({text:nr({filePath:i,title:"Video output directory"}),section:"Video Output"}));}catch(o){n.addError(se(o));}}});async function Nf({project:e,input:t}){try{gi(t.name);}catch(c){throw new Gn(`${c} when validating the test entity name`)}if(!t.baseUrl&&!t.environment)throw new Gn("Either 'baseUrl' or 'environment' must be provided when creating a test.");let n=await he(e);if(Object.values(n.tests).find(c=>c.name===t.name))throw new Gn(`A test with the name "${t.name}" already exists. Please use a different name.`);let i={id:v4$1(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:De,advanced:{browserType:t.browserType??"Chromium",viewport:t.viewport??Ar},steps:[]};t.environment&&(i.envs=[{name:t.environment,default:!0}]);let a=An__default.join(e.rootDir,...t.pathSegments||[]),s=await KB({test:i,name:t.name,folder:a,project:e});return {...i,relativeFilePath:An__default.relative(e.rootDir,s)}}var vd=async({step:e,controller:t,executionOptions:n,storage:r,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l,usageTracker:c})=>{let{results:u}=await vx({steps:[e],controller:t,executionOptions:n,storage:r,codeEvalTools:o,logger:i,socket:a,testContext:s,orgId:l,usageTracker:c});return u[0]},vx=async({steps:e,fromStep:t,toStep:n,tracer:r,controller:o,executionOptions:i,storage:a,codeEvalTools:s,logger:l,socket:c,testContext:u,orgId:d,usageTracker:p})=>{let m={controller:o,storage:a,codeEvalTools:s,logger:l,context:u,usageTracker:p},f=r??(c?new Ia({orgId:d,parentStep:null,parentTracer:null,socket:c}):new Gp);o.setOpen();let h={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0,failureRecoveryAttempts:0},...t&&{fastForwardingToStep:!0}},g=()=>ii({listParams:{containerName:"agent-step-list",steps:e,tracer:f},fixtures:m,options:{collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},inputs:{orgId:d,runId:randomUUID(),steps:e,testMetadata:null,orgSettings:{},fromStep:t,toStep:n},callbacks:{test:{},step:{}},work:h});return i?o.withExecutionOptions(i,g):g()};async function yE({step:e,project:t,logger:n,storage:r,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,tempCaches:u,usageTracker:d}){let p=await DT(e,{project:t,logger:n,tempCaches:u});switch(p.type){case"PRESET_ACTION":return Vfe({step:p,logger:n,storage:r,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,tempCaches:u,usageTracker:d});case"AI_ACTION_DYNAMIC":return Hfe({step:p,logger:n,storage:r,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,usageTracker:d});case"RESOLVED_MODULE":return Gfe({step:p,logger:n,storage:r,controller:o,codeEvalTools:i,socket:a,orgId:s,testContext:l,supportsFileOutput:c,usageTracker:d});default:{let[m,f]=await Promise.all([rr({browser:o.browser,supportsFileOutput:c}),Do({testContext:l,supportsFileOutput:c})]);return [...J({text:`Preview for step type ${p.type} is not supported. Only PRESET_ACTION, RESOLVED_MODULE, and AI_ACTION_DYNAMIC are supported.`,section:"Error"}),...m,...f]}}}async function Vfe({step:e,logger:t,storage:n,controller:r,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l,tempCaches:c,usageTracker:u}){let d=await vd({step:e,logger:t,storage:n,controller:r,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s,usageTracker:u}),p=[];d?d.status==="SUCCESS"?(jfe({logger:t,tempCaches:c,command:e.command,parts:p}),p.push(...J({text:`Step Execution successful: ${d.message}`,section:"Successful Result"}))):p.push(...J({text:`Step Execution failed: ${d.message}`,section:"Error"})):p.push(...J({text:"Step Execution errored for an unknown reason.",section:"Error"}));let[m,f]=await Promise.all([rr({browser:r.browser,supportsFileOutput:l}),Do({testContext:s,supportsFileOutput:l})]);return p.push(...m,...f),p}async function Hfe({step:e,logger:t,storage:n,controller:r,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l,usageTracker:c}){let u=await vd({step:e,logger:t,storage:n,controller:r,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s,usageTracker:c}),d=[];u?u.status==="SUCCESS"?d.push(...J({text:`AI action completed successfully: ${u.message??"Goal achieved"}`,section:"Successful Result"})):d.push(...J({text:`AI action failed: ${u.message??"Unknown error while previewing AI action"}`,section:"Error"})):d.push(...J({text:"AI action executed with unknown result.",section:"Error"}));let[p,m]=await Promise.all([rr({browser:r.browser,supportsFileOutput:l}),Do({testContext:s,supportsFileOutput:l})]);return d.push(...p,...m),d}async function Gfe({step:e,logger:t,storage:n,controller:r,codeEvalTools:o,socket:i,orgId:a,testContext:s,supportsFileOutput:l,usageTracker:c}){let u=await vd({step:e,logger:t,storage:n,controller:r,executionOptions:{skipAISmartWaiting:!0},codeEvalTools:o,socket:i,orgId:a,testContext:s,usageTracker:c}),d=[];u?u.status==="SUCCESS"?d.push(...J({text:`Module executed successfully: ${u.message}`,section:"Successful Result"})):d.push(...J({text:`Module execution failed: ${u.message}`,section:"Error"})):d.push(...J({text:"Module execution errored for an unknown reason.",section:"Error"}));let[p,m]=await Promise.all([rr({browser:r.browser,supportsFileOutput:l}),Do({testContext:s,supportsFileOutput:l})]);return d.push(...p,...m),d}function jfe({logger:e,tempCaches:t,command:n,parts:r}){if(t&&Tr(n)&&n.cache)try{let o=randomUUID();t[o]=mi.parse(cloneDeep({type:n.type,cache:n.cache})),r.push(...J({text:o,section:"CacheId"}));}catch(o){e.warn({err:o},"Failed to save temp cache for step. Continuing...");}}var Ox=Symbol.for("immer-nothing"),Df=Symbol.for("immer-draftable"),to=Symbol.for("immer-state");function or(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var rc=Object.getPrototypeOf;function oc(e){return !!e&&!!e[to]}function Ds(e){return e?WW(e)||Array.isArray(e)||!!e[Df]||!!e.constructor?.[Df]||zf(e)||Vf(e):!1}var $fe=Object.prototype.constructor.toString();function WW(e){if(!e||typeof e!="object")return !1;let t=rc(e);if(t===null)return !0;let n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object?!0:typeof n=="function"&&Function.toString.call(n)===$fe}function kf(e,t){ic(e)===0?Reflect.ownKeys(e).forEach(n=>{t(n,e[n],e);}):e.forEach((n,r)=>t(r,n,e));}function ic(e){let t=e[to];return t?t.type_:Array.isArray(e)?1:zf(e)?2:Vf(e)?3:0}function Ff(e,t){return ic(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function Cx(e,t){return ic(e)===2?e.get(t):e[t]}function qW(e,t,n){let r=ic(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n;}function Wfe(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function zf(e){return e instanceof Map}function Vf(e){return e instanceof Set}function nc(e){return e.copy_||e.base_}function wx(e,t){if(zf(e))return new Map(e);if(Vf(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);let n=WW(e);if(t===!0||t==="class_only"&&!n){let r=Object.getOwnPropertyDescriptors(e);delete r[to];let o=Reflect.ownKeys(r);for(let i=0;i<o.length;i++){let a=o[i],s=r[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(r[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:e[a]});}return Object.create(rc(e),r)}else {let r=rc(e);if(r!==null&&n)return {...e};let o=Object.create(r);return Object.assign(o,e)}}function Lx(e,t=!1){return bE(e)||oc(e)||!Ds(e)||(ic(e)>1&&(e.set=e.add=e.clear=e.delete=qfe),Object.freeze(e),t&&Object.entries(e).forEach(([n,r])=>Lx(r,!0))),e}function qfe(){or(2);}function bE(e){return Object.isFrozen(e)}var xx={};function ac(e){let t=xx[e];return t||or(0,e),t}function Kfe(e,t){xx[e]||(xx[e]=t);}var Uf;function KW(){return Uf}function Yfe(e,t){return {drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function HW(e,t){t&&(ac("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t);}function Ix(e){_x(e),e.drafts_.forEach(Xfe),e.drafts_=null;}function _x(e){e===Uf&&(Uf=e.parent_);}function GW(e){return Uf=Yfe(Uf,e)}function Xfe(e){let t=e[to];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0;}function jW(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];return e!==void 0&&e!==n?(n[to].modified_&&(Ix(t),or(4)),Ds(e)&&(e=TE(t,e),t.parent_||EE(t,e)),t.patches_&&ac("Patches").generateReplacementPatches_(n[to].base_,e,t.patches_,t.inversePatches_)):e=TE(t,n,[]),Ix(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==Ox?e:void 0}function TE(e,t,n){if(bE(t))return t;let r=t[to];if(!r)return kf(t,(o,i)=>$W(e,r,t,o,i,n)),t;if(r.scope_!==e)return t;if(!r.modified_)return EE(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;let o=r.copy_,i=o,a=!1;r.type_===3&&(i=new Set(o),o.clear(),a=!0),kf(i,(s,l)=>$W(e,r,o,s,l,n,a)),EE(e,o,!1),n&&e.patches_&&ac("Patches").generatePatches_(r,n,e.patches_,e.inversePatches_);}return r.copy_}function $W(e,t,n,r,o,i,a){if(oc(o)){let s=i&&t&&t.type_!==3&&!Ff(t.assigned_,r)?i.concat(r):void 0,l=TE(e,o,s);if(qW(n,r,l),oc(l))e.canAutoFreeze_=!1;else return}else a&&n.add(o);if(Ds(o)&&!bE(o)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;TE(e,o),(!t||!t.scope_.parent_)&&typeof r!="symbol"&&Object.prototype.propertyIsEnumerable.call(n,r)&&EE(e,o);}}function EE(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Lx(t,n);}function Jfe(e,t){let n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:KW(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=r,i=Nx;n&&(o=[r],i=Bf);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}var Nx={get(e,t){if(t===to)return e;let n=nc(e);if(!Ff(n,t))return Zfe(e,n,t);let r=n[t];return e.finalized_||!Ds(r)?r:r===Ax(e.base_,t)?(Rx(e),e.copy_[t]=Mx(r,e)):r},has(e,t){return t in nc(e)},ownKeys(e){return Reflect.ownKeys(nc(e))},set(e,t,n){let r=YW(nc(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let o=Ax(nc(e),t),i=o?.[to];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(Wfe(n,o)&&(n!==void 0||Ff(e.base_,t)))return !0;Rx(e),Px(e);}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty(e,t){return Ax(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,Rx(e),Px(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=nc(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:r.enumerable,value:n[t]}},defineProperty(){or(11);},getPrototypeOf(e){return rc(e.base_)},setPrototypeOf(){or(12);}},Bf={};kf(Nx,(e,t)=>{Bf[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)};});Bf.deleteProperty=function(e,t){return Bf.set.call(this,e,t,void 0)};Bf.set=function(e,t,n){return Nx.set.call(this,e[0],t,n,e[0])};function Ax(e,t){let n=e[to];return (n?nc(n):e)[t]}function Zfe(e,t,n){let r=YW(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}function YW(e,t){if(!(t in e))return;let n=rc(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=rc(n);}}function Px(e){e.modified_||(e.modified_=!0,e.parent_&&Px(e.parent_));}function Rx(e){e.copy_||(e.copy_=wx(e.base_,e.scope_.immer_.useStrictShallowCopy_));}var Qfe=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(t,n,r)=>{if(typeof t=="function"&&typeof n!="function"){let i=n;n=t;let a=this;return function(l=i,...c){return a.produce(l,u=>n.call(this,u,...c))}}typeof n!="function"&&or(6),r!==void 0&&typeof r!="function"&&or(7);let o;if(Ds(t)){let i=GW(this),a=Mx(t,void 0),s=!0;try{o=n(a),s=!1;}finally{s?Ix(i):_x(i);}return HW(i,r),jW(o,i)}else if(!t||typeof t!="object"){if(o=n(t),o===void 0&&(o=t),o===Ox&&(o=void 0),this.autoFreeze_&&Lx(o,!0),r){let i=[],a=[];ac("Patches").generateReplacementPatches_(t,o,i,a),r(i,a);}return o}else or(1,t);},this.produceWithPatches=(t,n)=>{if(typeof t=="function")return (a,...s)=>this.produceWithPatches(a,l=>t(l,...s));let r,o;return [this.produce(t,n,(a,s)=>{r=a,o=s;}),r,o]},typeof e?.autoFreeze=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof e?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy);}createDraft(e){Ds(e)||or(8),oc(e)&&(e=ehe(e));let t=GW(this),n=Mx(e,void 0);return n[to].isManual_=!0,_x(t),n}finishDraft(e,t){let n=e&&e[to];(!n||!n.isManual_)&&or(9);let{scope_:r}=n;return HW(r,t),jW(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e;}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e;}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let o=t[n];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}n>-1&&(t=t.slice(n+1));let r=ac("Patches").applyPatches_;return oc(e)?r(e,t):this.produce(e,o=>r(o,t))}};function Mx(e,t){let n=zf(e)?ac("MapSet").proxyMap_(e,t):Vf(e)?ac("MapSet").proxySet_(e,t):Jfe(e,t);return (t?t.scope_:KW()).drafts_.push(n),n}function ehe(e){return oc(e)||or(10,e),XW(e)}function XW(e){if(!Ds(e)||bE(e))return e;let t=e[to],n;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=wx(e,t.scope_.immer_.useStrictShallowCopy_);}else n=wx(e,!0);return kf(n,(r,o)=>{qW(n,r,XW(o));}),t&&(t.finalized_=!1),n}function JW(){let t="replace",n="add",r="remove";function o(p,m,f,h){switch(p.type_){case 0:case 2:return a(p,m,f,h);case 1:return i(p,m,f,h);case 3:return s(p,m,f,h)}}function i(p,m,f,h){let{base_:g,assigned_:S}=p,T=p.copy_;T.length<g.length&&([g,T]=[T,g],[f,h]=[h,f]);for(let y=0;y<g.length;y++)if(S[y]&&T[y]!==g[y]){let b=m.concat([y]);f.push({op:t,path:b,value:d(T[y])}),h.push({op:t,path:b,value:d(g[y])});}for(let y=g.length;y<T.length;y++){let b=m.concat([y]);f.push({op:n,path:b,value:d(T[y])});}for(let y=T.length-1;g.length<=y;--y){let b=m.concat([y]);h.push({op:r,path:b});}}function a(p,m,f,h){let{base_:g,copy_:S}=p;kf(p.assigned_,(T,y)=>{let b=Cx(g,T),A=Cx(S,T),R=y?Ff(g,T)?t:n:r;if(b===A&&R===t)return;let P=m.concat(T);f.push(R===r?{op:R,path:P}:{op:R,path:P,value:A}),h.push(R===n?{op:r,path:P}:R===r?{op:n,path:P,value:d(b)}:{op:t,path:P,value:d(b)});});}function s(p,m,f,h){let{base_:g,copy_:S}=p,T=0;g.forEach(y=>{if(!S.has(y)){let b=m.concat([T]);f.push({op:r,path:b,value:y}),h.unshift({op:n,path:b,value:y});}T++;}),T=0,S.forEach(y=>{if(!g.has(y)){let b=m.concat([T]);f.push({op:n,path:b,value:y}),h.unshift({op:r,path:b,value:y});}T++;});}function l(p,m,f,h){f.push({op:t,path:[],value:m===Ox?void 0:m}),h.push({op:t,path:[],value:p});}function c(p,m){return m.forEach(f=>{let{path:h,op:g}=f,S=p;for(let A=0;A<h.length-1;A++){let R=ic(S),P=h[A];typeof P!="string"&&typeof P!="number"&&(P=""+P),(R===0||R===1)&&(P==="__proto__"||P==="constructor")&&or(19),typeof S=="function"&&P==="prototype"&&or(19),S=Cx(S,P),typeof S!="object"&&or(18,h.join("/"));}let T=ic(S),y=u(f.value),b=h[h.length-1];switch(g){case t:switch(T){case 2:return S.set(b,y);case 3:or(16);default:return S[b]=y}case n:switch(T){case 1:return b==="-"?S.push(y):S.splice(b,0,y);case 2:return S.set(b,y);case 3:return S.add(y);default:return S[b]=y}case r:switch(T){case 1:return S.splice(b,1);case 2:return S.delete(b);case 3:return S.delete(f.value);default:return delete S[b]}default:or(17,g);}}),p}function u(p){if(!Ds(p))return p;if(Array.isArray(p))return p.map(u);if(zf(p))return new Map(Array.from(p.entries()).map(([f,h])=>[f,u(h)]));if(Vf(p))return new Set(Array.from(p).map(u));let m=Object.create(rc(p));for(let f in p)m[f]=u(p[f]);return Ff(p,Df)&&(m[Df]=p[Df]),m}function d(p){return oc(p)?u(p):p}Kfe("Patches",{applyPatches_:c,generatePatches_:o,generateReplacementPatches_:l});}var no=new Qfe;no.produce;var ZW=no.produceWithPatches.bind(no);no.setAutoFreeze.bind(no);no.setUseStrictShallowCopy.bind(no);no.applyPatches.bind(no);no.createDraft.bind(no);no.finishDraft.bind(no);JW();function vE({logger:e,socket:t,baseState:n,recipe:r,description:o}){let[i,a,s]=ZW(n,r),l={id:v4$1(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return t?.emit("copilotPatch",l),e.info({patchJson:JSON.stringify(l)},"Immer patch representation of tool's effect on test"),{patch:l,newState:i}}var QW=({steps:e,fromStep:t,toStep:n})=>{let r={total:0,fastForwardingToStep:!0},o=(i,a)=>{if(i.skipped)return !1;let s=a.map(c=>c.id),l=Af(i.id,s,t.fromStepId,t.parentStepIdChain);if(r.fastForwardingToStep){if(!l)return !1;r.fastForwardingToStep=!1;}return r.total+=1,!!(n&&Af(i.id,s,n.toStepId,n.parentStepIdChain))};return xr({steps:e,earlyStop:!0,onPresetAction:(i,a)=>o(i,a.parentChain),onConditional:(i,a)=>{if(i.skipped)return !1;let s=a.parentChain.map(c=>c.id),l=Af(i.id,s,t.fromStepId,t.parentStepIdChain);if(r.fastForwardingToStep){if(!l)return !1;r.fastForwardingToStep=!1;}return !!(n&&Af(i.id,s,n.toStepId,n.parentStepIdChain))},onSimpleStepContainer:(i,a)=>o(i,a.parentChain)}),r.total};var eq="Cannot add a module step inside another module. Modules cannot be nested.";function kx(e,t){switch(t){case"setup":return e.beforeSteps??[];case"teardown":return e.afterSteps??[];case"main":return e.steps;default:{throw new Error("Unknown test section")}}}function tq(e,t,n){let r=kx(e,t);if(!n?.length)return r;let o=XF(r,n);if(!o)throw new Error(`No step found with parent chain [${n.join(", ")}] in ${t} section, or parent does not support nested steps`);return o}function nq(e,t){let n=t.moduleId,r=o=>{o.type!=="RESOLVED_MODULE"||o.moduleId!==n||(t.parameters!==void 0&&(o.parameters=t.parameters),t.parameterEnums!==void 0&&(o.parameterEnums=t.parameterEnums),t.defaultParameters!==void 0&&(o.defaultParameters=t.defaultParameters),t.name!==void 0&&(o.name=t.name),t.description!==void 0&&(o.description=t.description),t.enabled!==void 0&&(o.enabled=t.enabled),t.steps!==void 0&&(o.steps=t.steps));};for(let o of [e.steps,e.beforeSteps??[],e.afterSteps??[]])xr({steps:o,onPresetAction:r,onConditional:r,onSimpleStepContainer:r});}async function CE({project:e,orgId:t,logger:n,testPath:r,socket:o,saveChangesToDisk:i,supportsFileOutput:a,tempCaches:s,params:l,envName:c}){let u=await he(e),d=await tn(An__default.join(e.rootDir,r),n,u),p={steps:d.steps??[],beforeSteps:d.beforeSteps??[],afterSteps:d.afterSteps??[]},m=await Promise.all(l.steps.map(R=>DT(R,{project:e,logger:n,tempCaches:s}))),f=l.parentStepIdChain,h;try{h=tq(p,l.targetSection,f);}catch(R){return ot(J({text:`Error: ${R.message}`,section:"Error"}))}if(l.startIndex<0||l.startIndex>h.length)return ot(J({text:`Error: Invalid startIndex ${l.startIndex} for splicing ${l.targetSection} section with ${h.length} steps (must be 0-${h.length})`,section:"Error"}));let g=l.steps.length,S=l.deleteCount,T=cloneDeep(h.slice(l.startIndex,l.startIndex+S)),y=cloneDeep(m),b;try{b=vE({logger:n,socket:o,baseState:p,recipe:x=>{let I;if(f?.length&&(I=JF(kx(x,l.targetSection),f,l.targetSection),I.some(F=>F.type==="RESOLVED_MODULE")&&m.some(F=>F.type==="RESOLVED_MODULE")))throw new Error(eq);tq(x,l.targetSection,f).splice(l.startIndex,l.deleteCount,...m);for(let U of m)U.type==="RESOLVED_MODULE"&&nq(x,U);if(I)for(let U of I)U.type==="RESOLVED_MODULE"&&nq(x,U);},description:`Splice ${g} step(s) at index ${l.startIndex} in ${l.targetSection}, removing ${S}`}).newState;}catch(R){if(R instanceof Error&&R.message===eq)return ot(J({text:`Error: ${R.message}`,section:"Error"}));throw R}i&&await qu({relativeTestPath:r,stepLists:b,schemaVersion:De,momenticFiles:u,project:e});let A=[...J({text:`Successfully spliced ${g} step(s) at index ${l.startIndex} in the ${l.targetSection} section, removing ${S} step(s).`,section:"Result"})];return A.push(...await nhe({logger:n,project:e,orgId:t,testId:d.id,environment:c,originalSteps:p,updatedSteps:b})),A.push(...await w$({rootDir:e.rootDir,supportsFileOutput:a,deletedStepRefs:T.map((R,P)=>({id:R.id,index:l.startIndex+P})),insertedStepRefs:y.map((R,P)=>({id:R.id,index:l.startIndex+P})),deletedSteps:iy(T,{includeCache:!1}),insertedSteps:iy(y,{includeCache:!1}),metadata:{section:l.targetSection,parentStepIdChain:f??[],startIndex:l.startIndex,deleteCount:S,insertedCount:g},artifactEntity:"splice-restoration-payload"})),l.returnTest&&A.push(...J({text:JSON.stringify(await dE({project:e,testPath:r,envName:c,logger:n}),null,2),section:"Test Content"})),ot(A)}async function AE({project:e,logger:t,testPath:n,storage:r,controller:o,codeEvalTools:i,socket:a,orgId:s,envName:l,testContext:c,tracer:u,params:d,tokenLimit:p,supportsFileOutput:m,usageTracker:f}){let{fromStep:h,toStep:g,targetSection:S}=d,T=await he(e),y=await tn(An__default.join(e.rootDir,n),t,T),{alwaysSaveCache:b,noCache:A}=Fl(),R=await No({logger:t,orgId:s,project:e,alwaysSaveCache:b,noCache:A});await R.resolveStepCacheEntries({logger:t,schemaVersion:y.schemaVersion,stepLists:{beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[],steps:y.steps},testId:y.id,environment:l,useSnapshotIdentityCache:e.config.fileFormat==="v2"});let P=kx(y,S),x=cloneDeep({steps:y.steps,beforeSteps:y.beforeSteps,afterSteps:y.afterSteps}),{result:I}=Tl(P,h.fromStepId,h.parentStepIdChain);if(!I)return ot(J({text:`Error: No step found with id "${h.fromStepId}" and parent chain [${h.parentStepIdChain.join(", ")}] in ${S} section.`,section:"Error"}));if(g){let{result:te}=Tl(P,g.toStepId,g.parentStepIdChain);if(!te)return ot(J({text:`Error: No step found with id "${g.toStepId}" and parent chain [${g.parentStepIdChain.join(", ")}] in ${S} section.`,section:"Error"}))}if(u?.setProgressTotal){let te=QW({steps:P,fromStep:h,toStep:g});u.setProgressTotal(te);}o.setOpen();let N;try{N=await vx({steps:P,controller:o,storage:r,codeEvalTools:i,logger:t,socket:a,orgId:s,testContext:c,fromStep:h,toStep:g,tracer:u,usageTracker:f});}finally{await f.flush(t);}let{results:U}=N;if(!U||U.length===0)return ot(J({text:"Error: No steps were executed.",section:"Error"}));let F=U.at(-1);if(!F)return ot(J({text:"Error: No steps were executed.",section:"Error"}));let q={logger:t,cacheStorage:R,orgId:s,testId:y.id,environment:l,originalStepsWithCaches:x,updatedStepsWithCaches:{steps:y.steps,beforeSteps:y.beforeSteps??[],afterSteps:y.afterSteps??[]}},H=F.status!=="SUCCESS";await bl({logger:t,cacheStorage:R,orgId:s,testId:y.id,environment:l,stepLists:q.updatedStepsWithCaches,useSnapshotIdentityCache:e.config.fileFormat==="v2"}),H?F.status==="FAILED"&&await Nu(q):await vl(q);let ee=S==="main"?"":` in ${S}`,Ce=te=>{let we="fromStepId"in te?te.fromStepId:te.toStepId;return te.parentStepIdChain.length>0?`id "${we}" (parent chain [${te.parentStepIdChain.join(", ")}])`:`id "${we}"`},D=h?Ce(h):"beginning",W=g?`Steps from ${D} through ${Ce(g)}${ee}`:`Steps from ${D} to end${ee}`,Z=[];if(H)Z.push(...J({text:`Error: step with id ${F.id} failed: ${F.message}`,section:"Error"}));else {o.setOpen();let te=`${W} executed successfully.`;Z.push(...J({text:te,section:"Result"})),F.data&&Z.push(...J({text:`Data: ${JSON.stringify(F.data,null,2)}`,section:"Result Data"}));}let[fe,ue]=await Promise.all([rr({browser:o.browser,supportsFileOutput:m}),Do({testContext:c,supportsFileOutput:m,limits:{tokenLimit:p}})]);return ot([...Z,...fe,...ue])}async function nhe({logger:e,project:t,orgId:n,testId:r,environment:o,originalSteps:i,updatedSteps:a}){let s=[];try{let{alwaysSaveCache:l,noCache:c}=Fl(),u=await No({logger:e,orgId:n,project:t,alwaysSaveCache:l,noCache:c});await bl({logger:e,cacheStorage:u,orgId:n,testId:r,environment:o,stepLists:a,useSnapshotIdentityCache:t.config.fileFormat==="v2"}),await vl({logger:e,cacheStorage:u,orgId:n,testId:r,environment:o,originalStepsWithCaches:i,updatedStepsWithCaches:a});}catch(l){e.warn({err:l},"Failed to save step caches after execution, future runs may be slower"),s.push(...J({text:"Warning: Steps were saved successfully, but updating the step cache failed. Future runs may be slower until the cache is refreshed.",section:"Warning"}));}return s}var Fx=class{constructor(t,n,r,o){this.reporter=t;this.step=n;this.parentStepIdChain=r;this.setTotal=o;}loggerBindings;attachBeforeScreenshot(t){}attachAfterScreenshot(t){}attachBeforeHtmlSnapshot(t){}attachAfterHtmlSnapshot(t){}recordTargetAutoHeal(t){}storeTraceAsset(){}async finish(t){this.reporter.onStepComplete(this.step);}async startSubSteps(){return new RE(this.reporter,this.parentStepIdChain.concat(this.step.id),this.setTotal)}},RE=class{constructor(t,n=[],r){this.reporter=t;this.parentStepIdChain=n;this.setTotal=r;}loggerBindings;setProgressTotal(t){this.setTotal(t);}async getScreenshot(t,n){}async getHtmlSnapshot(t,n){}async startStep(t){return this.reporter.onStepStart(t.step),new Fx(this.reporter,t.step,this.parentStepIdChain,this.setTotal)}};function oq(e,t,n,r){let o=Cf(e),i={completed:0,total:0},a=new AbortController,s=!1,l=p=>{o&&d$(e,i,p,t,a,n);},c=()=>{o&&(s||(s=!0,l("Starting step execution...")));},u=p=>{!Number.isFinite(p)||p<0||(i.total=p);},d={onStepStart:p=>{c(),i.total===i.completed&&(i.total+=1),l(`Starting: ${gn(p)}`);},onStepComplete:p=>{r(),c(),i.completed+=1,i.total<i.completed&&(i.total=i.completed),l(`Completed: ${gn(p)}`);}};return new RE(d,[],u)}var iq=`CLI-style step definition. Use the Step Authoring Guide artifact returned from ${Dc} when you start your session to get the full step schema.`,rhe=Fn({schema:{name:xP,description:"Create a test. The name must satisfy Momentic entity naming rules, and you must provide either a baseUrl or environment or the tool will fail.",inputSchema:Pv},handle:async(e,t,n,r)=>{let{project:o}=e;try{let i=await Nf({project:o,input:t});Qr({type:"mcp:test_create",test_platform:"web"}),n.addPartFromText(JSON.stringify(i,null,2));}catch(i){n.addError(se(i));return}}}),ohe=Fn({schema:{name:wP,description:`List local test artifacts. Returns a Project Context section with projectRootAbsolutePath, projectConfigAbsolutePath, and cwd, plus separate segments for each relevant artifact type: tests, modules, and environments. ${pf} When file output is enabled, the artifact links are relative to cwd. Read or grep only the specific artifact files you need instead of loading everything at once. Assume nothing changed since your last successful call to this tool unless the user indicates updates (e.g. new/changed tests, modules, environments, or project config change); avoid redundant calls just to refresh.`,inputSchema:{}},handle:async(e,t,n,r)=>{let{project:o,logger:i}=e,a=[],s=[];try{let c=await he(o),u=Object.values(c.tests).map(p=>({id:p.id,name:p.name,description:p.description,testFileAbsolutePath:p.fullFilePath,labels:p.labels||[]}));a.push({title:"Tests",entity:"test-list",payload:{tests:u}});let d=Object.values(c.modules).map(p=>({id:p.id,name:p.name,description:p.description,fullFilePath:p.fullFilePath,type:p.type}));a.push({title:"Modules",entity:"module-list",payload:{modules:d}});}catch(c){s.push(`Tests and modules discovery failed: ${se(c)}`);}try{let c=by(o,i);a.push({title:"Environments",entity:"environment-list",payload:{environments:c}});}catch(c){s.push(`Environments discovery failed: ${se(c)}`);}let l=await lj({artifacts:a,rootDir:o.rootDir,supportsFileOutput:e.supportsFileOutput,projectRootAbsolutePath:o.rootDir,projectConfigAbsolutePath:o.configFilePath,cwd:process.cwd()});n.addContentParts(l),s.length>0&&n.addContentParts(J({section:"Discovery Errors",text:s.map(c=>`- ${c}`).join(`
|
|
6191
|
-
`)}));}}),aq=Fn({schema:{name:Mb,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:z.string(),step:z.string().describe(iq)}},handle:async(e,t,n,r)=>{let{sessionId:o,step:i}=t,a=ec({response:n,sessionId:o,toolName:Mb});if(!a)return;a.controller.setOpen();let s;try{s=await yE({project:e.project,step:i,logger:e.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,supportsFileOutput:e.supportsFileOutput,tempCaches:a.tempCaches,usageTracker:a.usageTracker});}finally{await a.usageTracker.flush(e.logger);}n.addContentParts(s);}}),sq=Fn({schema:{name:xb,description:"Insert, delete, or replace steps in the test by index. Use parentStepIdChain to splice into nested steps (e.g. inside a conditional or module). The response always includes a recovery artifact with the full deleted and inserted payloads; only inspect it when you need to undo or inspect a mistaken splice.",inputSchema:{sessionId:z.string(),startIndex:z.number(),deleteCount:z.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:z.array(z.string()).describe(iq),targetSection:qs.default("main"),parentStepIdChain:z.array(z.string()).optional().describe("When splicing into a nested step (e.g. conditional or module), the chain of parent step ids from root to the container. Empty or omit for top-level."),returnTest:z.boolean().default(!1).describe("Return the full post-splice test snapshot. Avoid this by default. Use true only when you truly need the full updated test; the normal response already includes inserted/deleted step references plus a recovery artifact for mistaken-splice recovery.")}},handle:async(e,t,n,r)=>{let o=ec({response:n,sessionId:t.sessionId,toolName:xb});if(!o)return;let i=await CE({project:e.project,orgId:o.orgId,logger:e.logger,testPath:o.relativeTestPath,envName:o.envName,saveChangesToDisk:e.saveChangesToDisk,supportsFileOutput:e.supportsFileOutput,tempCaches:o.tempCaches,params:{startIndex:t.startIndex,deleteCount:t.deleteCount,steps:t.steps,targetSection:t.targetSection,parentStepIdChain:t.parentStepIdChain,returnTest:t.returnTest}});t.steps.length>0&&Qr({type:"mcp:step_added",test_platform:"web",step_count:t.steps.length});let a=i.value.map(s=>s.type==="media"?{type:"media",data:s.data,mediaType:"image/jpeg"}:s);n.addContentParts(a);}}),lq=Fn({schema:{name:Ib,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:z.string(),fromStep:Gh,toStep:jh.optional(),targetSection:qs.default("main"),resetSession:z.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(e,t,n,r)=>{let o=ec({response:n,sessionId:t.sessionId,toolName:Ib});if(!o)return;o.controller.setOpen(),t.resetSession&&await pE({project:e.project,logger:e.logger,relativeTestPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:_o(),baseUrl:Zn(),controller:o.controller,testContext:o.context,supportsFileOutput:e.supportsFileOutput});let i=oq(r,e.logger,n,()=>{eo.touchSession(o.sessionId);}),a=await AE({project:e.project,logger:e.logger,testPath:o.relativeTestPath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:i,params:{fromStep:t.fromStep,toStep:t.toStep,targetSection:t.targetSection},supportsFileOutput:e.supportsFileOutput,envName:o.envName,usageTracker:o.usageTracker});Qr({type:"mcp:run_step_completed",test_platform:"web",status:"completed"});let s=a.value.map(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);n.addContentParts(s);}}),cq=[ohe,rhe];var uq=[FW,UW,BW,zW,aq,lq,sq];function dq(e){let t=e.subDir?An__default.join(e.project.rootDir,e.subDir):e.project.rootDir,n=`${ht(e.name)}.module.yaml`,r=An__default.join(t,n),o=An__default.relative(e.project.rootDir,r),i=yn__default.statSync(r);return {type:le.MODULE,name:e.name,id:e.moduleId,description:e.description??void 0,relativePath:o,fullFilePath:r,platformSep:An__default.sep,fullPathSegments:r.split(An__default.sep),relativePathSegments:o.split(An__default.sep),fileName:n,lastModified:i.mtime,createdAt:i.birthtime}}async function lhe({testPath:e,logger:t,project:n,momenticFiles:r,orgId:o}){let i=await tn(An__default.join(n.rootDir,e),t,r),a=i.envs?.find(c=>c.default)?.name,s=await No({logger:t,orgId:o,project:n}),l=await Mu({cacheStorage:s,logger:t,schemaVersion:i.schemaVersion,stepLists:{steps:i.steps,beforeSteps:i.beforeSteps??void 0,afterSteps:i.afterSteps??void 0},testId:i.id,environment:a,useSnapshotIdentityCache:n.config.fileFormat==="v2"});return {availableSteps:l.steps,baseState:{steps:l.steps,beforeSteps:l.beforeSteps??[],afterSteps:l.afterSteps??[]},cacheSaveContext:{testId:i.id,environment:a,stepCacheStorage:s}}}async function wE({project:e,logger:t,relativeTestPath:n,socket:r,saveChangesToDisk:o,params:i}){let a=kt();gi(i.name);let s=await he(e),l;i.startIndex!==void 0&&n!==void 0&&(l=await lhe({testPath:n,logger:t,project:e,momenticFiles:s,orgId:a}));let{stepsToExtract:c,startIndex:u,endIndex:d}=x$({moduleName:i.name,existingModuleNames:Object.values(s.modules).map(U=>U.name),...i,parameterNames:i.parameters,testPath:n,availableSteps:l?.availableSteps,containsNestedModuleStep:YF}),p=i.subDir?An__default.join(e.rootDir,i.subDir):e.rootDir;i.subDir&&yn__default.mkdirSync(p,{recursive:!0});let m=await Ty({name:i.name,description:i.description??"",enabled:i.enabled??!0,parameters:i.parameters,defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums,steps:c,folder:p,project:e}),f=dq({project:e,name:i.name,moduleId:m.moduleId,subDir:i.subDir,description:m.description??void 0});if(s.modules[m.moduleId]=f,i.startIndex===void 0)return {module:m};if(!n||!l)throw new Error("Failed to initialize extraction state for module create");let h=Object.keys(i.moduleInputs??{}).length>0,g=(m.parameters?.length??0)>0,S;h?S=i.moduleInputs:g?S={}:S=void 0;let T={...m,type:"RESOLVED_MODULE",id:randomUUID(),steps:m.steps,inputs:S},y=U=>{U.steps.splice(u,d-u,T);},{newState:b}=vE({logger:t,socket:r,baseState:l.baseState,recipe:y,description:`Create module "${i.name}" from steps ${u}-${d-1}`}),{environment:A,stepCacheStorage:R,testId:P}=l.cacheSaveContext,x=e.config.fileFormat==="v2",{cachesToSave:I,snapshotCachesToSave:N}=await Sn({stepLists:b,useSnapshotIdentityCache:x,cacheCreationParams:{orgId:a,testId:P,environment:A}});return x&&await R.saveSnapshotCacheEntries({logger:t,entries:N}),await R.saveStepCacheEntries({logger:t,entries:I}),o&&await qu({relativeTestPath:n,stepLists:b,schemaVersion:De,momenticFiles:s,project:e}),{module:m}}var mq=Fn({schema:{name:RP,description:"Create a module. The name must satisfy Momentic entity naming rules or the tool will fail. If startIndex is provided, testPath is required and the specified test range is extracted into the module, then replaced with a module invocation in that test. endIndex may only be provided when startIndex is set.",inputSchema:{name:z.string().describe(Bp),description:z.string(),enabled:z.boolean().default(!0),parameters:z.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:z.record(z.string(),z.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:z.record(z.string(),z.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:z.record(z.string(),z.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant when extracting from a test."),subDir:z.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:z.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:z.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:z.number().optional().describe("End index of steps to extract from the target test (exclusive). Only valid when startIndex is provided. If not provided, extracts just startIndex.")}},handle:async(e,t,n,r)=>{let{testPath:o,...i}=t;try{let a=gG({projectRoot:e.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await wE({project:e.project,logger:e.logger,relativeTestPath:a,saveChangesToDisk:e.saveChangesToDisk,params:i});n.addPartFromText(JSON.stringify(s.module,null,2));}catch(a){n.addError(se(a));}}});var Ad=[...cq,...gE,...uq,mq,Cj,Oj];var hq=Ad.map(e=>e.tool),fq=new Map(hq.map(e=>[e.schema.name,e]));async function gq(e){let{project:t,applicationName:n,daemonPort:r,daemonToken:o,daemonSessionId:i,logger:a,cliVersion:s}=e,l=t.configFilePath;await mE(e);let{context:c}=fE({...e,logger:a.child({daemonSessionId:i}),applicationName:`${n}-daemon`,serverId:i});await T$({adapter:{getTool:u=>{let d=fq.get(u);if(!d)throw new Error(`Unknown web MCP tool '${u}'. Known tools: ${Array.from(fq.keys()).join(", ")}`);return {name:d.schema.name,execute:async({input:p,extra:m})=>await g$({context:c,tool:d,input:p,extra:m})}}},sessionManager:eo,daemonPort:r,daemonToken:o,daemonId:i,cliVersion:s,workerType:"momentic-web-mcp",configPath:l,inactivityTimeoutMsOverride:Ex(e)*2,onShutdown:()=>{Ul();}});}async function Sq({project:e,logger:t,apiKey:n,serverUrl:r,cliVersion:o,applicationName:i,alwaysSaveCache:a,noCache:s,videoDefault:l,headfulDefault:c,devicePixelRatio:u,sessionIdleTimeoutMinutes:d}){rd(r),await od(n);let p=e.configFilePath,m=async()=>u$({workerType:"momentic-web-mcp",configPath:p,apiKey:n,serverUrl:r,cliVersion:o,logger:t,buildDaemonArgs:({entryScript:g})=>uhe({entryScript:g,serverUrl:r,configPath:p,alwaysSaveCache:a,noCache:s,videoDefault:l,headfulDefault:c,devicePixelRatio:u,sessionIdleTimeoutMinutes:d})});await m();let{info:f,mcpLogger:h}=Tx({logger:t,applicationName:`${i}-daemon-proxy`,cliVersion:o});return HT({context:{logger:h},info:f,tools:S$({tools:hq,resolveDaemonStateForCall:m,logger:h})})}function uhe({entryScript:e,serverUrl:t,configPath:n,alwaysSaveCache:r,noCache:o,videoDefault:i,headfulDefault:a,devicePixelRatio:s,sessionIdleTimeoutMinutes:l}){let c=[e,"mcp","--server",t,"--daemon","--config",n,"--headful-browser",a?"true":"false","--video",i?"true":"false"];return r&&c.push("--save-cache"),o&&c.push("--disable-cache"),c.push("--pixel-ratio",String(s)),l!==void 0&&c.push("--session-idle-timeout-minutes",String(l)),c}var Ux=async(e,t)=>{try{let{killed:n,failed:r}=await eo.killAllSessions(e);r.length>0?t.warn({failed:r,reason:e},"Some browser sessions failed to terminate on shutdown"):n.length>0&&t.info({killedCount:n.length,reason:e},"Terminated browser sessions on shutdown");}catch(n){t.warn({err:n,reason:e},"Failed to terminate browser sessions on shutdown");}};async function Bx(e){let{daemon:t,logger:n}=e,r=c$.safeParse(process.env);if(t&&r.success&&r.data[zT]==="momentic-web-mcp")return gq({...e,daemonPort:r.data[UT],daemonToken:r.data[BT],daemonSessionId:r.data[VT]});if(_u(n,!0),t)return await Sq(e);await mE(e);let{context:o,info:i}=fE(e);return HT({context:o,info:i,tools:Ad,shutdownHandlers:[Ux,Ul,async()=>{await cE();}]})}var Hf="2.104.2",mt=du({app:"desktop-server",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:Hf});(async()=>{try{let e=await Xo(mt);e.gitBranchName&&mt.addBinding("branch",e.gitBranchName);}catch{}})();var sc=Router();async function IE(e){return (await Ey(e,mt)).map(r=>{let o=e.modules[r.moduleId];if(!o){C.warn(`Found a dangling module with ID ${r.moduleId} that could not be found on disk.`);return}return {...o,content:r}}).filter(r=>r!==void 0)}sc.get("/",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=await IE(r);t.status(200).json(o);}));sc.get("/tests-join",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=await IE(r),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(r.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await tn(s.fullFilePath,mt,r)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)xr({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{Rb(f)&&d.add(f.moduleId);}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:l,relativePath:c});}}t.status(200).json(i);}));sc.post("/",Ve(async(e,t)=>{let n;try{n=IL.parse(e.body);}catch(s){t.status(400).json({error:`Invalid request body: ${s}`});return}try{gi(n.name);}catch(s){t.status(400).json({error:`Invalid module name: ${s}`});return}let r=xe(),o=(await he(r)).modules;if(Object.values(o).find(s=>s.name===n.name)){t.status(400).send(`A module with the name "${n.name}" already exists. Please choose a different name.`);return}let i=An__default.join(r.rootDir,n.folderPath??"");if(!yn__default.existsSync(i)||!yn__default.statSync(i).isDirectory()){t.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Ty({...n,folder:i,project:r});t.status(201).json(a);}));sc.get("/:moduleId",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n=await he(xe()),r=n.modules[e.params.moduleId];if(!r){t.status(404).json({error:"Module not found."});return}try{let o=await as(r,n,C);t.json(o);}catch(o){t.status(400).json({err:o});}}));sc.post("/:moduleId/duplicate",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=xL.parse(e.body);}catch(f){t.status(400).json({error:`Invalid request body: ${f}`});return}try{gi(n.name);}catch(f){t.status(400).json({error:f.message});return}let r=xe(),o=await he(r),i=o.modules[e.params.moduleId];if(!i){t.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(f=>f.name===n.name)){t.status(400).send(`A module with the name "${n.name}" already exists. Please choose a different name.`);return}let a=n.sourceModuleContent;if(a.moduleId!==e.params.moduleId){t.status(400).json({error:"Duplicate source module content does not match moduleId."});return}let s=An__default.join(r.rootDir,An__default.dirname(i.relativePath));if(!yn__default.existsSync(s)||!yn__default.statSync(s).isDirectory()){t.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let l=ht(n.name),c=An__default.join(s,`${l}.module.yaml`),u=v4$1(),{stepsToSave:d}=await Sn({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:le.MODULE,schemaVersion:De,moduleId:u,name:n.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced,defaultRetries:a.defaultRetries};_l({module:p,filePath:c,projectConfig:r.config});let m={relativeFilePath:An__default.relative(r.rootDir,c)};t.status(201).json(m);}));sc.patch("/:moduleId/metadata",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=_L.parse(e.body);}catch(i){t.status(400).json({error:`Invalid request body: ${i}`});return}let r=xe(),o=await he(r);WB({moduleId:e.params.moduleId,content:n,momenticFiles:o,logger:C,project:r}),t.status(201).json({message:"ok"});}));var yq=sc;var Tq=Router();Tq.get("/",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=new Set;r?.tests&&Object.values(r.tests).forEach(c=>{c.labels?.forEach(u=>o.add(u));});let i=Array.from(o).sort(),a=Object.values(r.tests),s=await IE(r),l={labels:i,tests:a,modules:s};t.status(200).json(l);}));var Eq=Tq;var zx=Router();zx.get("/",Ve((e,t)=>{let n=by(xe(),mt);t.status(200).json(n);}));zx.get("/names",Ve((e,t)=>{let r=xe().config.environments?.map(o=>o.name)??[];t.status(200).json(r);}));var bq=zx;var vq=Router();vq.get("/",Ve((e,t)=>{let n={userId:ti(),orgId:kt(),email:bV(),pylonEmailHash:vV(),cliVersion:Hf};t.status(200).json(n);}));var Cq=vq;var Vx="mcp-session-id",Aq="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",_E=Router();function Ehe(){let e=process.env[Aq];if(!e)return Ls*60*1e3;let t=Number.parseInt(e,10);return Number.isNaN(t)||t<1?(mt.warn({envVar:Aq,rawValue:e,fallback:Ls},"Invalid MCP session idle timeout env var; falling back to default"),Ls*60*1e3):t*60*1e3}function bhe(e){let{headfulDefault:t,supportsFileOutput:n}=e??{},r={serverId:randomUUID(),applicationName:"momentic-mcp-desktop-server",cliVersion:Hf},o=xe(),i=_o(),a=Zn(),s=mt.child({orgId:kt(),userId:ti(),...r}),l=new Tt({baseUrl:a,apiKey:i,logger:s}),c=Lp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Xn(o.config.ai?.agentConfig,{baseUrl:a,apiKey:i,logger:s,mode:"interactive"});return {context:{project:o,orgId:kt(),logger:s,generator:u,apiClient:l,serverId:r.serverId,saveChangesToDisk:!0,supportsFileOutput:n??!0,sessionIdleTimeoutMs:Ehe(),headfulDefault:t??c??!0,categoryDefinitions:Hc(o.config.ai?.classification)},info:r}}var _a={};_E.post("/",async(e,t)=>{let n=String(e.headers[Vx]??"");try{if(n&&_a[n]){await _a[n].handleRequest(e,t,e.body);return}if(!n&&isInitializeRequest(e.body)){let{context:r,info:o}=bhe(),i=Xw(r,o,Ad),a=new StreamableHTTPServerTransport({sessionIdGenerator:()=>randomUUID(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{_a[s]=a;}});a.onclose=()=>{let s=a.sessionId;s&&_a[s]&&delete _a[s],i.close().catch(()=>{});},await i.connect(a),await a.handleRequest(e,t,e.body);return}t.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});}catch{t.headersSent||t.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null});}});_E.get("/",async(e,t)=>{let n=String(e.headers[Vx]??"");if(!n||!_a[n]){t.status(400).send("Invalid or missing session ID");return}await _a[n].handleRequest(e,t);});_E.delete("/",async(e,t)=>{let n=String(e.headers[Vx]??"");if(!n||!_a[n]){t.status(400).send("Invalid or missing session ID");return}let r=_a[n];try{await r.handleRequest(e,t);}catch{t.headersSent||t.status(500).send("Error processing session termination");}});var wq=_E;var xq=Router();xq.get("/:id",Ve(async(e,t)=>{let{id:n}=e.params;if(!n){t.status(400).json({error:"Missing ID"});return}let r=gs();if(!r){t.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await r.fetchOnDemandScreenshot(n);t.setHeader("Content-Type",i),t.status(200).send(o);}catch(o){mt.error({err:o,screenshotId:n},"Failed to proxy on-demand screenshot"),t.status(404).json({error:"Screenshot not found"});}}));var Iq=xq;var PE=Router();PE.get("/",Ve(async(e,t)=>{let n=(await eR()).map(r=>({name:r.config.name,configFilePath:r.configFilePath}));t.status(200).json(n);}));PE.get("/current",Ve((e,t)=>{let n=xe();if(!n){t.status(404).json({error:"No project found."});return}let r={name:n.config.name,configFilePath:n.configFilePath};t.status(200).json(r);}));PE.post("/set",Ve(async(e,t)=>{let n;try{n=ML.parse(e.body);}catch(r){t.status(400).json({error:`Invalid request body: ${r}`});return}mt.info("Setting local project");try{let r=await bt({configFilePath:n.configFilePath});id(r,o=>bt({configFilePath:o}));}catch(r){t.status(400).json({error:`Error setting project: ${r}`});return}t.sendStatus(204);}));var _q=PE;var Pq=Router();Pq.get("/",Ve((e,t)=>{let n=xe(),r={ai:n.config.ai,browser:n.config.browser,displayRoot:n.config.displayRoot};t.status(200).json(r);}));var Mq=Pq;var Rd="3",Rhe=Me`
|
|
6191
|
+
`)}));}}),aq=Fn({schema:{name:Mb,description:"Execute a step without adding it to the test.",inputSchema:{sessionId:z.string(),step:z.string().describe(iq)}},handle:async(e,t,n,r)=>{let{sessionId:o,step:i}=t,a=ec({response:n,sessionId:o,toolName:Mb});if(!a)return;a.controller.setOpen();let s;try{s=await yE({project:e.project,step:i,logger:e.logger,storage:a.storage,controller:a.controller,codeEvalTools:a.codeEvalTools,orgId:a.orgId,testContext:a.context,supportsFileOutput:e.supportsFileOutput,tempCaches:a.tempCaches,usageTracker:a.usageTracker});}finally{await a.usageTracker.flush(e.logger);}n.addContentParts(s);}}),sq=Fn({schema:{name:xb,description:"Insert, delete, or replace steps in the test by index. Use parentStepIdChain to splice into nested steps (e.g. inside a conditional or module). The response always includes a recovery artifact with the full deleted and inserted payloads; only inspect it when you need to undo or inspect a mistaken splice.",inputSchema:{sessionId:z.string(),startIndex:z.number(),deleteCount:z.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:z.array(z.string()).describe(iq),targetSection:qs.default("main"),parentStepIdChain:z.array(z.string()).optional().describe("When splicing into a nested step (e.g. conditional or module), the chain of parent step ids from root to the container. Empty or omit for top-level."),returnTest:z.boolean().default(!1).describe("Return the full post-splice test snapshot. Avoid this by default. Use true only when you truly need the full updated test; the normal response already includes inserted/deleted step references plus a recovery artifact for mistaken-splice recovery.")}},handle:async(e,t,n,r)=>{let o=ec({response:n,sessionId:t.sessionId,toolName:xb});if(!o)return;let i=await CE({project:e.project,orgId:o.orgId,logger:e.logger,testPath:o.relativeTestPath,envName:o.envName,saveChangesToDisk:e.saveChangesToDisk,supportsFileOutput:e.supportsFileOutput,tempCaches:o.tempCaches,params:{startIndex:t.startIndex,deleteCount:t.deleteCount,steps:t.steps,targetSection:t.targetSection,parentStepIdChain:t.parentStepIdChain,returnTest:t.returnTest}});t.steps.length>0&&Qr({type:"mcp:step_added",test_platform:"web",step_count:t.steps.length});let a=i.value.map(s=>s.type==="media"?{type:"media",data:s.data,mediaType:"image/jpeg"}:s);n.addContentParts(a);}}),lq=Fn({schema:{name:Ib,description:"Run one or more steps from the test bound to an active session.",inputSchema:{sessionId:z.string(),fromStep:Gh,toStep:jh.optional(),targetSection:qs.default("main"),resetSession:z.boolean().default(!1).describe("Whether to reset the browser session before running the steps.")}},handle:async(e,t,n,r)=>{let o=ec({response:n,sessionId:t.sessionId,toolName:Ib});if(!o)return;o.controller.setOpen(),t.resetSession&&await pE({project:e.project,logger:e.logger,relativeTestPath:o.relativeTestPath,orgId:o.orgId,storage:o.storage,apiKey:_o(),baseUrl:Zn(),controller:o.controller,testContext:o.context,supportsFileOutput:e.supportsFileOutput});let i=oq(r,e.logger,n,()=>{eo.touchSession(o.sessionId);}),a=await AE({project:e.project,logger:e.logger,testPath:o.relativeTestPath,storage:o.storage,controller:o.controller,codeEvalTools:o.codeEvalTools,orgId:o.orgId,testContext:o.context,tracer:i,params:{fromStep:t.fromStep,toStep:t.toStep,targetSection:t.targetSection},supportsFileOutput:e.supportsFileOutput,envName:o.envName,usageTracker:o.usageTracker});Qr({type:"mcp:run_step_completed",test_platform:"web",status:"completed"});let s=a.value.map(l=>l.type==="media"?{type:"media",data:l.data,mediaType:"image/jpeg"}:l);n.addContentParts(s);}}),cq=[ohe,rhe];var uq=[FW,UW,BW,zW,aq,lq,sq];function dq(e){let t=e.subDir?An__default.join(e.project.rootDir,e.subDir):e.project.rootDir,n=`${ht(e.name)}.module.yaml`,r=An__default.join(t,n),o=An__default.relative(e.project.rootDir,r),i=yn__default.statSync(r);return {type:le.MODULE,name:e.name,id:e.moduleId,description:e.description??void 0,relativePath:o,fullFilePath:r,platformSep:An__default.sep,fullPathSegments:r.split(An__default.sep),relativePathSegments:o.split(An__default.sep),fileName:n,lastModified:i.mtime,createdAt:i.birthtime}}async function lhe({testPath:e,logger:t,project:n,momenticFiles:r,orgId:o}){let i=await tn(An__default.join(n.rootDir,e),t,r),a=i.envs?.find(c=>c.default)?.name,s=await No({logger:t,orgId:o,project:n}),l=await Mu({cacheStorage:s,logger:t,schemaVersion:i.schemaVersion,stepLists:{steps:i.steps,beforeSteps:i.beforeSteps??void 0,afterSteps:i.afterSteps??void 0},testId:i.id,environment:a,useSnapshotIdentityCache:n.config.fileFormat==="v2"});return {availableSteps:l.steps,baseState:{steps:l.steps,beforeSteps:l.beforeSteps??[],afterSteps:l.afterSteps??[]},cacheSaveContext:{testId:i.id,environment:a,stepCacheStorage:s}}}async function wE({project:e,logger:t,relativeTestPath:n,socket:r,saveChangesToDisk:o,params:i}){let a=kt();gi(i.name);let s=await he(e),l;i.startIndex!==void 0&&n!==void 0&&(l=await lhe({testPath:n,logger:t,project:e,momenticFiles:s,orgId:a}));let{stepsToExtract:c,startIndex:u,endIndex:d}=x$({moduleName:i.name,existingModuleNames:Object.values(s.modules).map(U=>U.name),...i,parameterNames:i.parameters,testPath:n,availableSteps:l?.availableSteps,containsNestedModuleStep:YF}),p=i.subDir?An__default.join(e.rootDir,i.subDir):e.rootDir;i.subDir&&yn__default.mkdirSync(p,{recursive:!0});let m=await Ty({name:i.name,description:i.description??"",enabled:i.enabled??!0,parameters:i.parameters,defaultParameters:i.defaultParameters,parameterEnums:i.parameterEnums,steps:c,folder:p,project:e}),f=dq({project:e,name:i.name,moduleId:m.moduleId,subDir:i.subDir,description:m.description??void 0});if(s.modules[m.moduleId]=f,i.startIndex===void 0)return {module:m};if(!n||!l)throw new Error("Failed to initialize extraction state for module create");let h=Object.keys(i.moduleInputs??{}).length>0,g=(m.parameters?.length??0)>0,S;h?S=i.moduleInputs:g?S={}:S=void 0;let T={...m,type:"RESOLVED_MODULE",id:randomUUID(),steps:m.steps,inputs:S},y=U=>{U.steps.splice(u,d-u,T);},{newState:b}=vE({logger:t,socket:r,baseState:l.baseState,recipe:y,description:`Create module "${i.name}" from steps ${u}-${d-1}`}),{environment:A,stepCacheStorage:R,testId:P}=l.cacheSaveContext,x=e.config.fileFormat==="v2",{cachesToSave:I,snapshotCachesToSave:N}=await Sn({stepLists:b,useSnapshotIdentityCache:x,cacheCreationParams:{orgId:a,testId:P,environment:A}});return x&&await R.saveSnapshotCacheEntries({logger:t,entries:N}),await R.saveStepCacheEntries({logger:t,entries:I}),o&&await qu({relativeTestPath:n,stepLists:b,schemaVersion:De,momenticFiles:s,project:e}),{module:m}}var mq=Fn({schema:{name:RP,description:"Create a module. The name must satisfy Momentic entity naming rules or the tool will fail. If startIndex is provided, testPath is required and the specified test range is extracted into the module, then replaced with a module invocation in that test. endIndex may only be provided when startIndex is set.",inputSchema:{name:z.string().describe(Bp),description:z.string(),enabled:z.boolean().default(!0),parameters:z.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:z.record(z.string(),z.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:z.record(z.string(),z.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:z.record(z.string(),z.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant when extracting from a test."),subDir:z.string().optional().describe("Subdirectory to create the module in. If not provided, the module is created in the project root."),testPath:z.string().optional().describe("Relative path to the test to extract steps from. Required when startIndex is provided."),startIndex:z.number().optional().describe("Start index of steps to extract from the target test (0-based)."),endIndex:z.number().optional().describe("End index of steps to extract from the target test (exclusive). Only valid when startIndex is provided. If not provided, extracts just startIndex.")}},handle:async(e,t,n,r)=>{let{testPath:o,...i}=t;try{let a=gG({projectRoot:e.project.rootDir,filePath:o,pathLabel:"testPath"}),s=await wE({project:e.project,logger:e.logger,relativeTestPath:a,saveChangesToDisk:e.saveChangesToDisk,params:i});n.addPartFromText(JSON.stringify(s.module,null,2));}catch(a){n.addError(se(a));}}});var Ad=[...cq,...gE,...uq,mq,Cj,Oj];var hq=Ad.map(e=>e.tool),fq=new Map(hq.map(e=>[e.schema.name,e]));async function gq(e){let{project:t,applicationName:n,daemonPort:r,daemonToken:o,daemonSessionId:i,logger:a,cliVersion:s}=e,l=t.configFilePath;await mE(e);let{context:c}=fE({...e,logger:a.child({daemonSessionId:i}),applicationName:`${n}-daemon`,serverId:i});await T$({adapter:{getTool:u=>{let d=fq.get(u);if(!d)throw new Error(`Unknown web MCP tool '${u}'. Known tools: ${Array.from(fq.keys()).join(", ")}`);return {name:d.schema.name,execute:async({input:p,extra:m})=>await g$({context:c,tool:d,input:p,extra:m})}}},sessionManager:eo,daemonPort:r,daemonToken:o,daemonId:i,cliVersion:s,workerType:"momentic-web-mcp",configPath:l,inactivityTimeoutMsOverride:Ex(e)*2,onShutdown:()=>{Ul();}});}async function Sq({project:e,logger:t,apiKey:n,serverUrl:r,cliVersion:o,applicationName:i,alwaysSaveCache:a,noCache:s,videoDefault:l,headfulDefault:c,devicePixelRatio:u,sessionIdleTimeoutMinutes:d}){rd(r),await od(n);let p=e.configFilePath,m=async()=>u$({workerType:"momentic-web-mcp",configPath:p,apiKey:n,serverUrl:r,cliVersion:o,logger:t,buildDaemonArgs:({entryScript:g})=>uhe({entryScript:g,serverUrl:r,configPath:p,alwaysSaveCache:a,noCache:s,videoDefault:l,headfulDefault:c,devicePixelRatio:u,sessionIdleTimeoutMinutes:d})});await m();let{info:f,mcpLogger:h}=Tx({logger:t,applicationName:`${i}-daemon-proxy`,cliVersion:o});return HT({context:{logger:h},info:f,tools:S$({tools:hq,resolveDaemonStateForCall:m,logger:h})})}function uhe({entryScript:e,serverUrl:t,configPath:n,alwaysSaveCache:r,noCache:o,videoDefault:i,headfulDefault:a,devicePixelRatio:s,sessionIdleTimeoutMinutes:l}){let c=[e,"mcp","--server",t,"--daemon","--config",n,"--headful-browser",a?"true":"false","--video",i?"true":"false"];return r&&c.push("--save-cache"),o&&c.push("--disable-cache"),c.push("--pixel-ratio",String(s)),l!==void 0&&c.push("--session-idle-timeout-minutes",String(l)),c}var Ux=async(e,t)=>{try{let{killed:n,failed:r}=await eo.killAllSessions(e);r.length>0?t.warn({failed:r,reason:e},"Some browser sessions failed to terminate on shutdown"):n.length>0&&t.info({killedCount:n.length,reason:e},"Terminated browser sessions on shutdown");}catch(n){t.warn({err:n,reason:e},"Failed to terminate browser sessions on shutdown");}};async function Bx(e){let{daemon:t,logger:n}=e,r=c$.safeParse(process.env);if(t&&r.success&&r.data[zT]==="momentic-web-mcp")return gq({...e,daemonPort:r.data[UT],daemonToken:r.data[BT],daemonSessionId:r.data[VT]});if(_u(n,!0),t)return await Sq(e);await mE(e);let{context:o,info:i}=fE(e);return HT({context:o,info:i,tools:Ad,shutdownHandlers:[Ux,Ul,async()=>{await cE();}]})}var Hf="2.104.3",mt=du({app:"desktop-server",hostname:hostname(),disableConsoleLogs:!0}).child({cliVersion:Hf});(async()=>{try{let e=await Xo(mt);e.gitBranchName&&mt.addBinding("branch",e.gitBranchName);}catch{}})();var sc=Router();async function IE(e){return (await Ey(e,mt)).map(r=>{let o=e.modules[r.moduleId];if(!o){C.warn(`Found a dangling module with ID ${r.moduleId} that could not be found on disk.`);return}return {...o,content:r}}).filter(r=>r!==void 0)}sc.get("/",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=await IE(r);t.status(200).json(o);}));sc.get("/tests-join",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=await IE(r),i={};for(let s of o)i[s.id]={...s,tests:[]};let a=await Promise.all(Object.values(r.tests).map(async s=>({id:s.id,name:s.name,relativePath:s.relativePath,test:await tn(s.fullFilePath,mt,r)})));for(let{id:s,name:l,relativePath:c,test:u}of a){let d=new Set,p=[u.steps,u.beforeSteps,u.afterSteps];for(let m of p)xr({steps:m??[],onPresetAction:()=>{},onConditional:()=>{},onSimpleStepContainer:f=>{Rb(f)&&d.add(f.moduleId);}});for(let m of d){let f=i[m];f&&f.tests.push({id:s,name:l,relativePath:c});}}t.status(200).json(i);}));sc.post("/",Ve(async(e,t)=>{let n;try{n=IL.parse(e.body);}catch(s){t.status(400).json({error:`Invalid request body: ${s}`});return}try{gi(n.name);}catch(s){t.status(400).json({error:`Invalid module name: ${s}`});return}let r=xe(),o=(await he(r)).modules;if(Object.values(o).find(s=>s.name===n.name)){t.status(400).send(`A module with the name "${n.name}" already exists. Please choose a different name.`);return}let i=An__default.join(r.rootDir,n.folderPath??"");if(!yn__default.existsSync(i)||!yn__default.statSync(i).isDirectory()){t.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Ty({...n,folder:i,project:r});t.status(201).json(a);}));sc.get("/:moduleId",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n=await he(xe()),r=n.modules[e.params.moduleId];if(!r){t.status(404).json({error:"Module not found."});return}try{let o=await as(r,n,C);t.json(o);}catch(o){t.status(400).json({err:o});}}));sc.post("/:moduleId/duplicate",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=xL.parse(e.body);}catch(f){t.status(400).json({error:`Invalid request body: ${f}`});return}try{gi(n.name);}catch(f){t.status(400).json({error:f.message});return}let r=xe(),o=await he(r),i=o.modules[e.params.moduleId];if(!i){t.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(f=>f.name===n.name)){t.status(400).send(`A module with the name "${n.name}" already exists. Please choose a different name.`);return}let a=n.sourceModuleContent;if(a.moduleId!==e.params.moduleId){t.status(400).json({error:"Duplicate source module content does not match moduleId."});return}let s=An__default.join(r.rootDir,An__default.dirname(i.relativePath));if(!yn__default.existsSync(s)||!yn__default.statSync(s).isDirectory()){t.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let l=ht(n.name),c=An__default.join(s,`${l}.module.yaml`),u=v4$1(),{stepsToSave:d}=await Sn({stepLists:{steps:a.steps},createNewCacheIds:!0}),p={fileType:le.MODULE,schemaVersion:De,moduleId:u,name:n.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced,defaultRetries:a.defaultRetries};_l({module:p,filePath:c,projectConfig:r.config});let m={relativeFilePath:An__default.relative(r.rootDir,c)};t.status(201).json(m);}));sc.patch("/:moduleId/metadata",Ve(async(e,t)=>{if(!e.params.moduleId){t.status(400).json({error:"Missing moduleId in url path."});return}let n;try{n=_L.parse(e.body);}catch(i){t.status(400).json({error:`Invalid request body: ${i}`});return}let r=xe(),o=await he(r);WB({moduleId:e.params.moduleId,content:n,momenticFiles:o,logger:C,project:r}),t.status(201).json({message:"ok"});}));var yq=sc;var Tq=Router();Tq.get("/",Ve(async(e,t)=>{let n=xe(),r=await he(n),o=new Set;r?.tests&&Object.values(r.tests).forEach(c=>{c.labels?.forEach(u=>o.add(u));});let i=Array.from(o).sort(),a=Object.values(r.tests),s=await IE(r),l={labels:i,tests:a,modules:s};t.status(200).json(l);}));var Eq=Tq;var zx=Router();zx.get("/",Ve((e,t)=>{let n=by(xe(),mt);t.status(200).json(n);}));zx.get("/names",Ve((e,t)=>{let r=xe().config.environments?.map(o=>o.name)??[];t.status(200).json(r);}));var bq=zx;var vq=Router();vq.get("/",Ve((e,t)=>{let n={userId:ti(),orgId:kt(),email:bV(),pylonEmailHash:vV(),cliVersion:Hf};t.status(200).json(n);}));var Cq=vq;var Vx="mcp-session-id",Aq="MOMENTIC_SESSION_IDLE_TIMEOUT_MINUTES",_E=Router();function Ehe(){let e=process.env[Aq];if(!e)return Ls*60*1e3;let t=Number.parseInt(e,10);return Number.isNaN(t)||t<1?(mt.warn({envVar:Aq,rawValue:e,fallback:Ls},"Invalid MCP session idle timeout env var; falling back to default"),Ls*60*1e3):t*60*1e3}function bhe(e){let{headfulDefault:t,supportsFileOutput:n}=e??{},r={serverId:randomUUID(),applicationName:"momentic-mcp-desktop-server",cliVersion:Hf},o=xe(),i=_o(),a=Zn(),s=mt.child({orgId:kt(),userId:ti(),...r}),l=new Tt({baseUrl:a,apiKey:i,logger:s}),c=Lp(process.env.MOMENTIC_HEADFUL_BROWSER),u=new Xn(o.config.ai?.agentConfig,{baseUrl:a,apiKey:i,logger:s,mode:"interactive"});return {context:{project:o,orgId:kt(),logger:s,generator:u,apiClient:l,serverId:r.serverId,saveChangesToDisk:!0,supportsFileOutput:n??!0,sessionIdleTimeoutMs:Ehe(),headfulDefault:t??c??!0,categoryDefinitions:Hc(o.config.ai?.classification)},info:r}}var _a={};_E.post("/",async(e,t)=>{let n=String(e.headers[Vx]??"");try{if(n&&_a[n]){await _a[n].handleRequest(e,t,e.body);return}if(!n&&isInitializeRequest(e.body)){let{context:r,info:o}=bhe(),i=Xw(r,o,Ad),a=new StreamableHTTPServerTransport({sessionIdGenerator:()=>randomUUID(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{_a[s]=a;}});a.onclose=()=>{let s=a.sessionId;s&&_a[s]&&delete _a[s],i.close().catch(()=>{});},await i.connect(a),await a.handleRequest(e,t,e.body);return}t.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});}catch{t.headersSent||t.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null});}});_E.get("/",async(e,t)=>{let n=String(e.headers[Vx]??"");if(!n||!_a[n]){t.status(400).send("Invalid or missing session ID");return}await _a[n].handleRequest(e,t);});_E.delete("/",async(e,t)=>{let n=String(e.headers[Vx]??"");if(!n||!_a[n]){t.status(400).send("Invalid or missing session ID");return}let r=_a[n];try{await r.handleRequest(e,t);}catch{t.headersSent||t.status(500).send("Error processing session termination");}});var wq=_E;var xq=Router();xq.get("/:id",Ve(async(e,t)=>{let{id:n}=e.params;if(!n){t.status(400).json({error:"Missing ID"});return}let r=gs();if(!r){t.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await r.fetchOnDemandScreenshot(n);t.setHeader("Content-Type",i),t.status(200).send(o);}catch(o){mt.error({err:o,screenshotId:n},"Failed to proxy on-demand screenshot"),t.status(404).json({error:"Screenshot not found"});}}));var Iq=xq;var PE=Router();PE.get("/",Ve(async(e,t)=>{let n=(await eR()).map(r=>({name:r.config.name,configFilePath:r.configFilePath}));t.status(200).json(n);}));PE.get("/current",Ve((e,t)=>{let n=xe();if(!n){t.status(404).json({error:"No project found."});return}let r={name:n.config.name,configFilePath:n.configFilePath};t.status(200).json(r);}));PE.post("/set",Ve(async(e,t)=>{let n;try{n=ML.parse(e.body);}catch(r){t.status(400).json({error:`Invalid request body: ${r}`});return}mt.info("Setting local project");try{let r=await bt({configFilePath:n.configFilePath});id(r,o=>bt({configFilePath:o}));}catch(r){t.status(400).json({error:`Error setting project: ${r}`});return}t.sendStatus(204);}));var _q=PE;var Pq=Router();Pq.get("/",Ve((e,t)=>{let n=xe(),r={ai:n.config.ai,browser:n.config.browser,displayRoot:n.config.displayRoot};t.status(200).json(r);}));var Mq=Pq;var Rd="3",Rhe=Me`
|
|
6192
6192
|
<ai-actions>
|
|
6193
6193
|
AI actions (--step-type AI_ACTION) are special steps that dynamically generate up to 15 sub-steps to achieve a complex goal. They are useful for:
|
|
6194
6194
|
- Multi-step workflows that require decision-making (e.g., "Find and click the first available appointment slot")
|
|
@@ -6534,7 +6534,7 @@ ${e.map(p=>`${Dt}- ${p}`).join(`
|
|
|
6534
6534
|
`));}async function Q2({test:e,reason:t,apiClient:n,project:r,identity:o}){let i=(await he(r)).tests,a=Object.values(i),s=(await n.getQuarantinedTests()).quarantined,l=new Set(s.map(p=>p.testId)),c=a.filter(p=>l.has(p.id)),u=await UE({prompt:"Select a test to unquarantine.",inputtedTest:e,testOptions:c}),d=await BE({prompt:"Enter a reason for unquarantining the test.",inputtedReason:t});await n.unquarantineTest(u,d,o),C.success(`Test ${u.name} has been successfully removed from quarantine.`);}function eK(e){return e?ht(e):"Unknown suite"}async function tK({client:e,orgId:t,suitePaths:n,wait:r,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await e.queueSuiteRuns({paths:n,...i});re.info({orgId:t,suiteRunIds:a,runGroupIds:s,suitePaths:n},"Queued suites remotely"),C.dimmed(`Queued ${n.length} suites.`),r||process.exit(0);let l=Date.now();C.dimmed(`Waiting for ${n.length} suites to finish. You can view results upon completion at:`);for(let g of s)C.dimmed(`${Dt}- ${e.getAppUrl()}/run-groups/${g}`);let c=new Set,u=[],d=g=>(g.status==="FAILED"||g.status==="PASSED"||g.status==="CANCELLED")&&g.runs.every(T=>T.status==="FAILED"&&(T.failureReason||T.finishedAt&&Date.now()-T.finishedAt.getTime()>30*1e3)||T.status==="PASSED"||T.status==="CANCELLED"),p=await IS({name:"suites",getResults:async()=>{let g=s.filter(y=>!u.some(b=>b.id===y)),S=await e.bulkGetRunGroupStatus(g),T=[];for(let y of S)d(y)?u.push(y):T.push(y);return [...u,...T]},timeoutMs:o?o*1e3:void 0,checkDone:g=>(g.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),C.log(`${c.size}/${s.length} ${eK(S.suite?.name)}`)));}),g.every(d))}),m=e.getAppUrl(),h=Iu({results:p,startTime:l,onFailed:g=>{let S=eK(g.suite?.name),T=g.runs.filter(b=>b.status==="FAILED").length,y=g.runs.length;C.error(`${S} (${T}/${y} tests failed):`);for(let b of g.runs)if(b.status==="FAILED"){let A=b.testName||b.test?.name;C.error(` ${A?ht(A):"Unknown test"} (${m}/runs/${b.id})`);}},entity:"suite",getDisplayLine:g=>` ${g.suite?.name?ht(g.suite.name):"Unknown suite name"} (${m}/run-groups/${g.id})`});process.exit(h.failed>0?1:0);}async function nK({tests:e,client:t,orgId:n,...r}){!r.yes&&!await On(`This command will queue ${e.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${t.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await t.queueTests({testPaths:e,...r});if(re.info({queuedTests:o,runIds:i,orgId:n},"Queued tests remotely"),C.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;C.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=t.getAppUrl(),u=Date.now(),d=await IS({name:"runs",getResults:async()=>{let m=i.filter(g=>!s.some(S=>S.id===g)),f=await t.bulkGetRunStatus(m),h=[];for(let g of f)l(g)?s.push(g):h.push(g);return [...s,...h]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(f=>{if(f.status==="RUNNING"&&!a.has(f.id)){a.add(f.id);let h=f.testName||f.test?.name;h&&C.log(`${a.size}/${o.length} ${ht(h)}`);}}),m.every(l))}),p=Iu({results:d,startTime:u,onFailed:m=>{let f=m.testName||m.test?.name;_S(m,f?ht(f):"Unknown test");},getDisplayLine:m=>{let f=m.testName||m.test?.name,h=` ${f?ht(f):"Unknown test"}`;return m.id&&(h+=` (${c}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0);}async function HE(e,t,n,r){if(r){let o=await t.getScreenshot(e,r);if(o){let i=`screenshot-${r}.jpeg`,a=An__default.join(n,i);return yn__default.writeFileSync(a,o),i}}}async function Qge(e,t,n,r){let o=n.folder,i={uuid:r.runAttemptId??randomUUID(),historyId:r.runId??randomUUID(),testCaseId:r.test.id,fullName:r.test.name,name:ht(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:n.suiteName},{name:"host",value:hostname()},{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}`}),r.quarantined&&i.labels.push({name:"quarantined",value:"true"}),r.quarantinedMetadata?.quarantinedReason&&i.labels.push({name:"quarantinedReason",value:r.quarantinedMetadata.quarantinedReason}),r.quarantinedMetadata?.quarantinedAt&&i.labels.push({name:"quarantinedAt",value:r.quarantinedMetadata.quarantinedAt.toISOString()});for(let[l,c]of Object.entries(r.parameters))c!=null&&i.parameters.push({name:l,value:JSON.stringify(c)});r.results&&await yI(e,t,n.folder,i.steps,r.results);let a=eSe(t,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${r.runAttemptId}-result.json`;yn__default.writeFileSync(An__default.join(o,s),JSON.stringify(i,void 0,2));}async function VE(e,t,n,r){let o={name:gn(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 HE(e,t,n,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await HE(e,t,n,r.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data)if(Xd.safeParse(r.data).success){let s=Xd.parse(r.data),l=s.request,c={...s,request:void 0},u=`output-attachment-api-request-${randomUUID()}.json`,d=`output-attachment-api-response-${randomUUID()}.json`,p=An__default.join(n,u),m=An__default.join(n,d);yn__default.writeFileSync(p,JSON.stringify(l,null,2)),yn__default.writeFileSync(m,JSON.stringify(c,null,2)),o.attachments.push({name:"API request details",source:u,type:"application/json"}),o.attachments.push({name:"API response details",source:d,type:"application/json"});}else {let s=z.union([z.object({}).passthrough(),z.array(z.any())]).safeParse(r.data).success,l=`output-attachment-${randomUUID()}.json`,c=An__default.join(n,l);yn__default.writeFileSync(c,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:l,type:s?"application/json":"text/plain"});}return o}async function yI(e,t,n,r,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await VE(e,t,n,i);break}case"CONDITIONAL":{a=await VE(e,t,n,i),a.steps=[],i.assertionResult&&a.steps.push(await VE(e,t,n,i.assertionResult)),await yI(e,t,n,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await VE(e,t,n,i),await yI(e,t,n,a.steps,i.results),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,l]of Object.entries(i.inputs))a.parameters.push({name:s,value:l});}break}}if(!a){e.warn({result:i},"Failed to convert Momentic result to Allure step");continue}if(a.attachments||(a.attachments=[]),i.beforeTestContext){let s=`before-context-${randomUUID()}.json`,l=An__default.join(n,s);writeFileSync(l,oK(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"});}if(i.afterTestContext){let s=`after-context-${randomUUID()}.json`,l=An__default.join(n,s);writeFileSync(l,oK(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"});}r.push(a);}}async function iK(e,t,n,r,o){for(let i of o){if(!i.runId||!i.runAttemptId)throw new Error(`Missing runId/runAttemptId for Allure report generation for test '${i.test.name}'`);let a=t.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId);try{await Qge(e,a,{folder:n,suiteName:r.suiteName},i);}finally{a.close();}}}function oK(e){try{return JSON.stringify(e,void 0,2)??JSON.stringify({value:null},void 0,2)}catch(t){let n=t instanceof Error?t.message:"unknown error";return JSON.stringify({error:n},void 0,2)}}function eSe(e,t,n){let r=e.listVideoAssetPaths();if(r.length===0)return [];let o=[];for(let i of r){let a=An__default.basename(i),s=a,l=An__default.join(t,s);try{yn__default.copyFileSync(i,l);}catch{continue}let c,u=An__default.extname(i).toLowerCase();u===".webm"?c="video/webm":u===".mp4"?c="video/mp4":c="application/octet-stream",o.push({name:a,source:s,type:c});}return o}function GE(e){if(e.status!=="FAILED")return "none";switch(e.failureReason){case"SetupFailureError":return "setup";case"TeardownFailureError":return "teardown";default:return "main"}}function nSe(e){switch(e){case"PASSED":return "passed";case"FAILED":return "failed";case"CANCELLED":return "skipped";case"RETRYING":case"WAITING_FOR_USER":case"PENDING":case"RUNNING":return "unknown";default:return dr(e)}}function cK(e){let t=An__default.relative(".",e);return t===""?e:t}function aK(e,t){return Math.max(0,(e.getTime()-t.getTime())/1e3)}function rSe(e,t,n){let r=aK(t,e),o=aK(n,e);return {start_at:r,end_at:o,duration:Math.max(0,o-r)}}function uK(e){let t=e.reduce((n,[r,o])=>(!o||Object.keys(n).length>=10||(n[r]=o),n),{});return Object.keys(t).length>0?t:void 0}function oSe(e){if(e.status!=="FAILED"||!e.failureReason)return;let t=Da({failureReason:e.failureReason,classification:e.failureDetails?.classification,manualClassification:e.failureDetails?.manualClassification,errorMessage:e.failureDetails?.errorMessage});if(!(t.title==null||t.description==null))return `${t.title}: ${t.description}`}function iSe(e){if(e.status!=="FAILED")return;let t=[e.failureDetails?.classification?.summary,e.failureDetails?.classification?.rootCause,e.failureDetails?.errorMessage].filter(r=>!!r),n=e.failureDetails?.errorStack?.split(`
|
|
6535
6535
|
`).map(r=>r.trim()).filter(Boolean)||[];if(!(t.length===0&&n.length===0))return [{expanded:t,backtrace:n}]}function aSe(e){let t=e.status==="FAILED"?GE(e):void 0;return uK([["attempts",e.attempts.toString()],["run_url",e.runId?`https://app.momentic.ai/runs/${e.runId}`:void 0],["failure_section",t],["quarantined",e.quarantined?"true":"false"],["failure_recovery",e.failureRecoveryDetails?.attempts?"true":"false"]])}function sSe(e,t,n){let r=cK(n.filePath);return {id:n.runId||randomUUID(),scope:e,name:n.testName,location:r,file_name:An__default.basename(r),result:nSe(n.status),failure_reason:oSe(n),failure_expanded:iSe(n),history:rSe(t,n.lastAttemptStartedAt,n.finishedAt),tags:aSe(n)}}function sK(e,t,n,r,o){let i=cK(t);return {id:randomUUID(),scope:e,name:n,location:i,file_name:An__default.basename(i),result:"skipped",history:{start_at:0,end_at:0,duration:0},tags:uK([["quarantined",o?.quarantined||"false"],["failure_recovery","false"]])}}function lSe(e,t){let n=t.map(i=>sSe(e.suiteName,e.startedAt,i)),r=e.testsToSkip.map(i=>sK(e.suiteName,i.relativeFilePath,i.name,i.id,void 0)),o=e.quarantinedTestsToSkip.map(i=>sK(e.suiteName,i.relativeFilePath,i.name,i.id,{quarantined:"true"}));return [...n,...r,...o]}function dK(e,t,n){let r=lSe(t,n);yn__default.writeFileSync(An__default.join(e,`${t.suiteName}.buildkite.json`),JSON.stringify(r,null,2));}function pK(e,t){e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),t.quarantinedReason&&(e.property("quarantined_reason",t.quarantinedReason),e.property("dd_tags[quarantined_reason]",t.quarantinedReason)),t.quarantinedAt&&(e.property("quarantined_at",t.quarantinedAt.toISOString()),e.property("dd_tags[quarantined_at]",t.quarantinedAt.toISOString()));}function uSe(e,t){let n=GE(e);if(t.name(e.testName).className(e.testName).file(An__default.relative(".",e.filePath)).property("id",e.testId).property("dd_tags[id]",e.testId),e.labels&&(t.property("labels",e.labels.join(",")),e.labels.forEach(r=>{t.property("dd_tags[label]",r);})),e.baseUrl&&(t.property("base_url",e.baseUrl),t.property("dd_tags[base_url]",e.baseUrl)),e.runId&&(t.property("run_url",`https://app.momentic.ai/runs/${e.runId}`),t.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${e.runId}`)),e.quarantinedMetadata&&pK(t,e.quarantinedMetadata),n==="setup"&&(t.property("setup_failed","true"),t.property("dd_tags[setup_failed]","true")),n==="main"&&(t.property("main_failed","true"),t.property("dd_tags[main_failed]","true")),n==="teardown"&&(t.property("teardown_failed","true"),t.property("dd_tags[teardown_failed]","true")),e.status==="FAILED"){let r=Da({failureReason:e.failureReason,classification:e.failureDetails?.classification,manualClassification:e.failureDetails?.manualClassification});if(r.title){let{description:o}=r;e.runId&&(o+=` Visit https://app.momentic.ai/runs/${e.runId} for more details.`),t.failure(o,r.title);}e.failureDetails?.errorStack&&t.stacktrace(e.failureDetails.errorStack);}else e.status==="CANCELLED"&&t.skipped();return t.time((e.finishedAt.getTime()-e.lastAttemptStartedAt.getTime())/1e3).property("started_at",e.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",e.lastAttemptStartedAt.toISOString()).property("finished_at",e.finishedAt.toISOString()).property("dd_tags[finished_at]",e.finishedAt.toISOString()),t.property("attempts",e.attempts.toString()).property("dd_tags[attempts]",e.attempts.toString()),e.parameters?.envName&&(t.property("environment",e.parameters.envName),t.property("dd_tags[environment]",e.parameters.envName)),e.parameters?.urlOverride&&t.property("url_override",e.parameters.urlOverride),t}function dSe(e,t,n){let{suiteId:r,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:l,quarantinedTestsMetadata:c}=t,u=e.testSuite().name(o);r&&u.property("id",r),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of n){let p=u.testCase();uSe(d,p);}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(An__default.relative(".",d.relativeFilePath)).property("id",d.id),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(m=>{p.property("dd_tags[label]",m);})),p.skipped();}for(let d of l){let p=u.testCase();p.name(d.name).className(d.name).file(An__default.relative(".",d.relativeFilePath)).property("id",d.id);let m=c[d.id];m&&pK(p,m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(f=>{p.property("dd_tags[label]",f);})),p.skipped();}return u}function mK(e,t,n){let r=cSe.newBuilder();dSe(r,t,n),r.writeTo(An__default.join(e,`${t.suiteName}.xml`));}function fK(e){return {title:gn(e),duration:e.finishedAt.getTime()-e.startedAt.getTime(),error:e.status==="FAILED"?{value:e.failureReason}:void 0,steps:e.results&&e.type!=="PRESET_ACTION"?e.results.map(fK):[]}}async function fSe(e,t,n,r){if(r.results?.length){let o=await HE(e,t,n,r.results[r.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return []}async function hSe(e,t,n,r){let o;if(r.status==="FAILED"&&r.failureReason){let i=Da({failureReason:r.failureReason,classification:r.failureDetails?.classification,manualClassification:r.failureDetails?.manualClassification});o={value:r.failureDetails?.classification?.reason??r.failureReason,message:i.description};}return {status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"interrupted":"failed",duration:r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime(),error:o,retry:r.attempts-1,steps:r.results?.map(fK)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await fSe(e,t,n,r)}}async function gSe(e,t,n,r){return {expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await hSe(e,t,n,r)]}}async function SSe(e,t,n,r){return {tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await gSe(e,t,n,r)],id:r.runId,file:r.filePath}}function TI(e,t){return e.reduce((n,r)=>t(r)?n+1:n,0)}async function ySe(e,t,n,r,o){return {suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(o.map(async i=>{let a=i.runId&&i.runAttemptId?t.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId):new Np;try{return await SSe(e,a,n,i)}finally{a.close();}}))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:TI(o,i=>i.status==="PASSED"),unexpected:TI(o,i=>i.status!=="PASSED"),flaky:TI(o,i=>!!i.isFlake),skipped:0}}}async function hK(e,t,n,r,o){let i=await ySe(e,t,n,r,o);yn__default.writeFileSync(An__default.join(n,`${r.suiteName}.json`),JSON.stringify(i,null,2));}function gK(e){return {testName:e.test.name,testId:e.test.id,filePath:e.filePath,labels:e.test.labels,baseUrl:e.baseUrl,runId:e.runId,quarantined:e.quarantined,quarantinedMetadata:e.quarantinedMetadata,status:e.status,failureRecoveryDetails:e.failureRecoveryDetails,failureDetails:e.failureDetails,failureReason:e.failureReason,finishedAt:e.finishedAt,lastAttemptStartedAt:e.lastAttemptStartedAt,attempts:e.attempts,parameters:e.parameters}}async function SK({logger:e,callbacks:t,format:n,params:r,runs:o,folder:i}){switch(existsSync(i)?statSync(i).isDirectory()||(C.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(C.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),mkdirSync(i,{recursive:!0})),n){case"junit":{let a=o.map(gK);mK(i,r,a);return}case"buildkite-json":{let a=o.map(gK);dK(i,r,a);return}case"allure":case"allure-json":await iK(e,t,i,r,o);return;case"playwright-json":await hK(e,t,i,r,o);return;default:throw new Error(`Unknown reporter format requested: '${n}'`)}}function th(){return yK()?(C.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),C.dimmed(`If you are using a low pixel-density monitor, you should manually set --pixel-ratio to 1 to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
|
|
6536
6536
|
`),2):(C.dimmed("Setting device pixel ratio to 1."),C.dimmed(`If you are using Momentic on a high-pixel density (HiDPI) monitor, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
|
|
6537
|
-
`),1)}function yK(){return platform()==="darwin"&&execSync("system_profiler SPDisplaysDataType").toString().includes("Retina")}function nh(e){yK()&&e===1&&(C.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),C.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."));}async function TK(e,t=!0){let n=xSe(e),r=await RSe.which(n[0],!0),o=n.slice(1),i=ASe.exec(wSe(r),o,{delay:100});if(t)return i}function EK(e){let t=e.trim();if(/^https?:\/\//i.test(t)){let n;try{n=new URL(t);}catch{throw new Error(`Invalid run URL: ${e}`)}let r=n.pathname.split("/").filter(i=>i.length>0),o=r.indexOf("runs");if(o===-1||o===r.length-1)throw new Error(`Could not extract run ID from URL: ${e}. Expected a URL like https://app.momentic.ai/runs/<runId>.`);return r[o+1]}return t}function WE(e){return new Promise((t,n)=>{let r=[];createReadStream(e).pipe(ISe()).on("data",o=>r.push(o)).on("end",()=>t(r)).on("error",o=>n(o));})}var Bn="2.104.2",PSe="https://registry.npmjs.org/momentic",MSe=z.object({versions:z.record(z.string(),z.unknown()).optional()});async function Mr(e){try{await OSe(e);}catch(t){C.warn({err:t},"Failed to check CLI version against NPM servers");}}async function EI(){let e=await ne(fetch(PSe),{milliseconds:5e3});if(!e.ok)throw new Error(`Got error status code ${e.status} ${e.statusText}`);let t=await e.json(),n=MSe.parse(t).versions;if(!n)throw new Error("Failed to fetch npm registry data. Skipping version check.");let r=Bn;for(let o of Object.keys(n))Od.valid(o)&&Od.major(o)===Od.major(Bn)&&Od.gt(o,r)&&Od.prerelease(o)===null&&(r=o);return r}async function OSe(e){let t;for(let n=0;n<2;n++)try{t=await EI();}catch(r){e.warn({err:r},"Failed to fetch latest version from npm registry");}if(!t){e.warn("Failed to fetch npm registry data. Skipping version check.");return}Od.eq(Bn,t)||(C.warn(`Update available: v${Bn} -> v${t}`),C.warn("This version may be missing critical fixes, features, and security updates."),C.warn('Run "npx momentic@latest upgrade" to update'));}OW("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");OW("https://us.i.posthog.com","POSTHOG_WRITE_HOST is not set");var{captureEvent:ks,setAnalyticsIdentity:bI,shutdownAnalytics:vK}=Ng({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://us.i.posthog.com",platform:"cli",identity:"stashed",flushImmediately:!0});async function Ct(){try{await ne(Promise.all([Og(),$t.flush(),vK()]),{milliseconds:5e3});}catch{}}function KE(e){return e.length===1?"test":"tests"}function CK(e){return e===1?"1 worker":`${e} workers`}function AK(e){e.length!==0&&(C.info(`Skipping ${e.length} disabled ${KE(e)}:`),e.forEach(t=>{C.info(`${Dt}- ${[t.relativeFilePath]}`);}),C.log(""));}function RK(e,t){e.length!==0&&(C.info(`Skipping ${e.length} quarantined ${KE(e)}:`),e.forEach(n=>{C.info(`${Dt}- ${[n.relativeFilePath]}: ${t[n.id]?.quarantinedReason}`);}),C.log(""));}function NSe(e,t){e.length!==0&&(C.info(`Running ${e.length} quarantined ${KE(e)} with ${CK(t)}:`),e.forEach(n=>{C.info(`${Dt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`);}),C.log(""));}function DSe(e,t,n){t.length===0&&e.length>0||(C.info(`Running ${t.length} ${KE(t)} with ${CK(n)}:`),t.forEach(r=>{C.info(`${Dt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`);}),C.log(""));}function wK({logger:e,localTestsToRunWithInputs:t,parallel:n,shardCount:r,shardIndex:o}){e.info({tests:t.length,shardCount:r,shardIndex:o,parallel:n},"Running local tests");let[i,a]=partition(t,s=>s.quarantined);NSe(i,n),DSe(i,a,n);}async function xK(e){let{orgId:t,runTracer:n,runGroupTracer:r,project:o,logger:i,generator:a,apiClient:s,testPlatform:l}=e,{runGroupMetadata:c}=r,{runId:u,runMetadata:d}=n;try{let p=Fu(d,u,{runGroupMetadata:c}),m=await Bj(p,n.storageDirectoryPath,{orgId:t,project:o,logger:i,generator:a,apiClient:s});return ks({type:"cli:failure_classification_ran",test_platform:l,success:!0,category:m?.category}),m}catch(p){i.warn({err:p},"Failed to classify test results"),ks({type:"cli:failure_classification_ran",test_platform:l,success:!1});}}async function IK({orgId:e,codeEvalTools:t,logger:n,outputDefinitions:r,testContext:o}){let i={};for(let a of r){let{name:s,value:l}=a;i[s]=await er({orgId:e,s:l,localTools:t,logger:n,context:o});}return i}async function _K({baseUrl:e,envName:t,devicePixelRatio:n,apiClient:r,test:o,storageClient:i,codeEvalTools:a,generator:s,orgId:l,variables:c,logger:u,customHeaders:d,testInputs:p,localBrowserConfig:m,aiSettings:f,visualDiffScreenshotStorage:h,tracer:g,browserTypeOverride:S}){let T={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:re,mode:"runner"},{controller:y,context:b}=await oE({baseUrl:e,envName:t,test:o,variables:c,logger:u,orgId:l,localBrowserConfig:m,aiSettings:f,customHeaders:d,codeEvalTools:a,storage:i,enricher:new hs(T,s),generator:s,visualDiffScreenshotStorage:h,devicePixelRatio:n,browserTypeOverride:S,callbacks:{onNetworkPage:A=>g.onNetworkPage(A),onNetworkLogs:A=>g.onNetworkLogs(A)},videoOptions:g.videoOutputPath?{videoOutputPath:g.videoOutputPath,onVideoPageChange:({videoName:A,timestamp:R})=>{g.setActiveVideo(A,R);}}:void 0,validateBrowserType:A=>{if(MS(A))return;let R=`Browser ${A} is required by the test named ${o.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;C.warn(R),re.warn(R);}});try{await iE({orgId:l,test:o,testInputs:p,localTools:a,logger:u,context:b});}catch(A){try{await y.browser.cleanup();}catch(R){u.error({err:R},"Failed to clean up browser after test input resolution failed");}throw A instanceof Of&&(C.error(A.message),process.exit(1)),A}return {controller:y,context:b}}async function PK({testAdvancedSettings:e,orgSettings:t,logger:n}){if(e.failureRecovery===!1||e.failureRecovery===void 0&&!t?.failureRecovery)return !1;if(!ll){let r="This test is ineligible for failure recovery since this does not appear to be a CI environment";return n.warn(r),C.debug(r),!1}return !0}async function MK({attemptInputs:e,attemptFixtures:t,attemptMetadata:n}){let{orgId:r,runId:o}=n,{controller:i,context:a,codeEvalTools:s,storageClient:l,logger:c,usageTracker:u,tracer:d}=t,{test:p,orgSettings:m}=e;c.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let f={controller:i,storage:l,usageTracker:u,context:a,logger:c,codeEvalTools:s},h={orgId:r,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},g={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await PK({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await nE({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup();}}},testParams:{tracer:d}})}async function OK(e){let{testDefinition:t,logger:n}=e,r=new Date;try{return await USe(e)}catch(o){Ja(o);let i="Fatal error running test";return C.error(`${i}: ${o.message}`),n.error({err:o},i),{results:[],parameters:e,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:t,filePath:t.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{},quarantined:e.quarantined,quarantinedMetadata:e.quarantinedMetadata}}}async function USe(e){let{testDefinition:t,project:n,apiClient:r,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:l,cacheOptions:c,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:f}=e,h=new td(r,o),g=Fy({logger:s,orgId:o,client:r,gitMetadata:l,regenerateCache:c.regenerateCache,alwaysSaveCache:c.alwaysSaveCache,noCache:c.noCache,isolateCachesByEnvironment:n.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:c.bustOldestCachePercentage}),{envName:S,resolvedEnv:T,environmentVariables:y,baseUrl:b}=Vy({test:t,envNameOverride:e.envName,urlOverride:i,resolveEnv:F=>Ol(F,n,s)}),A=await Mu({cacheStorage:g,logger:s,schemaVersion:t.schemaVersion,stepLists:{steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps},testId:t.id,environment:S,useSnapshotIdentityCache:n.config.fileFormat==="v2"}),R=A.steps,P=A.beforeSteps??void 0,x=A.afterSteps??void 0,I=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:t.beforeSteps,steps:t.steps,afterSteps:t.afterSteps},testId:t.id,testName:t.name,directory:dirname(t.relativeFilePath),testDescription:t.description??void 0,testLabels:t.labels,baseUrl:b,environmentName:S,schemaVersion:t.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:e.project.config.ai}),N=s.child(I.loggerBindings||{});Object.entries(I.envVarBindings||{}).forEach(([F,q])=>{y[F]=q;});let U=await BSe({...e,variables:y,envName:S,resolvedEnv:T,baseUrl:b,storageClient:h,tracer:I,runGroupTracer:a,logger:N,cacheStorage:g,stepsWithCaches:R,beforeStepsWithCaches:P,afterStepsWithCaches:x,usageTracker:f});return await I.finish({logger:s,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:I.runId,...U}}async function BSe(e){let{testDefinition:t,stepsWithCaches:n,beforeStepsWithCaches:r,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:l,baseUrl:c,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:f,testInputs:h,variables:g,resolvedEnv:S,retriesOverride:T,devicePixelRatio:y,logUpdate:b,tracer:A,runGroupTracer:R,logger:P,cacheStorage:x,gitMetadata:I,quarantined:N,quarantinedMetadata:U,usageTracker:F}=e,q=i.config.ai?.aiFailureAnalysis??!1,H=new Date,ee=new Ju(i,s,a),Ce={...i.config},D={envName:p,urlOverride:m,customHeaders:f,testInputs:h},W,Z=Math.abs(T??t.retries??i.config.retries??0),fe=[];P.info({...I,labels:t.labels,name:t.name,cwd:process.cwd()},"Starting test run using CLI");for(let ue=0;ue<=Z;ue++){let te=randomUUID(),we=await A.startAttempt(te),Oe=P.child(we.loggerBindings||{}),oe={...t,steps:cloneDeep(n),beforeSteps:cloneDeep(r),afterSteps:cloneDeep(o)};ue!==0&&b("RETRY",`attempt ${ue+1}/${Z+1}`);let _=new Date,ie=Ce.advanced?.fakerConstantSeed,Se=new Bi({httpClient:new Kn({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Oe,mode:"runner"}),fakerSeed:ie?lu:void 0}),ai=we;try{let{controller:wn,context:Or}=await _K({tracer:we,baseUrl:c,envName:p,apiClient:s,devicePixelRatio:y,logger:Oe,storageClient:u,codeEvalTools:Se,test:oe,generator:l,orgId:d,variables:g,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...oe.advanced},browserTypeOverride:e.browserTypeOverride,aiSettings:{...i.config.ai||{},...oe.advanced||{}},visualDiffScreenshotStorage:ee});e.abortSignal&&(e.abortSignal.aborted?wn.executeAbortController.abort():e.abortSignal.addEventListener("abort",()=>{wn.executeAbortController.abort();},{once:!0})),W=await MK({attemptMetadata:{attemptNumber:ue+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Oe,storageClient:u,usageTracker:F,codeEvalTools:Se,apiClient:s,context:Or,controller:wn,tracer:we},attemptInputs:{test:oe,orgSettings:Ce}});let ro=new Date,Xi={logger:P,cacheStorage:x,orgId:d,testId:t.id,environment:p,originalStepsWithCaches:{steps:cloneDeep(n),beforeSteps:cloneDeep(r),afterSteps:cloneDeep(o)},updatedStepsWithCaches:{steps:oe.steps,beforeSteps:oe.beforeSteps,afterSteps:oe.afterSteps}};await bl({logger:P,cacheStorage:x,orgId:d,testId:t.id,environment:p,stepLists:Xi.updatedStepsWithCaches,useSnapshotIdentityCache:i.config.fileFormat==="v2"}),W?.status==="PASSED"?await vl(Xi):W?.status==="FAILED"&&ue===Z&&await Nu(Xi),await we.finish({logger:Oe,result:W}),fe.unshift(W.status);let de=await IK({orgId:d,codeEvalTools:Se,logger:Oe,outputDefinitions:t.outputs??[],testContext:Or}),Ji=SM(fe),si=ue+1;if(W.status!=="FAILED")return {...W,runAttemptId:te,parameters:D,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:ro,attempts:si,baseUrl:c,outputs:de,isFlake:Ji,quarantined:N,quarantinedMetadata:U};let Nd=W.failedStepResult,Fo=Nd?.message||"Unknown failure",oo=Nd?.failureReason??oP(Fo)??"UnknownError",Dd=Oe.child({failureReason:oo,errorMessage:Fo,numAttempts:(Z+1).toString(),name:oe.name});if(ue<Z){Dd.warn(`Retrying failed execution attempt for run: ${Fo}`);continue}Dd.error(`Test failed after all exhausting attempts: ${Fo}`);let pc=new Error(Fo),Zi={errorMessage:Fo,errorStack:pc.stack},Us;if(q)if(i.config.ai?.agentConfig?.["failure-classification"]?.startsWith("v2")){let Uo=await xK({orgId:d,runGroupTracer:R,runTracer:A,project:i,logger:Oe,generator:l,apiClient:s,testPlatform:"web"});Uo&&(Us=Uo.category,oo=Uo.category,Zi.classification={reason:Uo.category,summary:Uo.reasoning,source:"v2"});}else {let Uo;try{if(W.results&&W.results.length>0){let{classification:mc,aiFailureReason:Ye}=await uB({logger:Oe,browserStateStorage:ai,generator:l,fullResults:W,failureReason:oo,error:pc,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Uo=mc,Us=Ye;}}catch(mc){Oe.warn({err:mc},"Failed to classify test results");}Uo&&(Zi.classification=Uo,oo=Us??oo,Zi.classification.source="v1");}return {...W,runAttemptId:te,parameters:D,failureDetails:Zi,failureReason:oo,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:ro,attempts:ue+1,baseUrl:c,outputs:de,quarantined:N,quarantinedMetadata:U}}catch(wn){let Or=`Encountered fatal platform error while running test '${oe.name}': ${wn}`,ro=new Date,Xi=ue+1;Oe.error({err:wn},Or),C.error(Or);let de={errorMessage:wn.message,errStack:wn.stack},Ji={status:"FAILED",failureDetails:de,failureReason:"InternalPlatformError",finishedAt:ro};return await we.finish({logger:Oe,result:{status:"FAILED",results:[]}}),{...Ji,runAttemptId:te,results:[],parameters:D,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:new Date,attempts:Xi,baseUrl:c,outputs:{},quarantined:N,quarantinedMetadata:U}}}throw new Error("This code should not be reachable")}var dc=class{constructor(t,n,r,o){this.orgId=t;this.testId=n;this.testName=r;this.diskStorage=o;}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(t,n){return this.diskStorage.readFile(`${Pn}/${n}.jpeg`)}async getHtmlSnapshot(t,n){return this.diskStorage.readFile(`${Pn}/${n}.html`)?.toString()}recordStepStat(t){t.type!=="PRESET_ACTION"?this.stepFrequenciesByType[t.type]=(this.stepFrequenciesByType[t.type]||0)+1:this.stepFrequenciesByType[t.command.type]=(this.stepFrequenciesByType[t.command.type]||0)+1;}sendFinalizedStepStats(){for(let[t,n]of Object.entries(this.stepFrequenciesByType))$t.increment("test_step_execution",n,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`]);}async startStep(t){let{step:n}=t;this.recordStepStat(n);let r={step:n,status:"RUNNING",startedAt:new Date},o=new vI(this.orgId,this.testId,this.testName,r,this.diskStorage);return this.children.push(o),o}async finish(t){this.finished||(this.finished=!0,await Promise.all(this.children.map(n=>n.finishInternal({status:AM(t.status),finishedAt:t.finishedAt}))),this.sendFinalizedStepStats());}};function zSe(e){switch(e){case"SUCCESS":return "PASSED";case"FAILED":return "FAILED";case"CANCELLED":return "CANCELLED";case"RUNNING":return "RUNNING";case"IDLE":return "PENDING"}}var vI=class{constructor(t,n,r,o,i){this.orgId=t;this.testId=n;this.testName=r;this.metadata=o;this.diskStorage=i;this.interactionTracer=new Ts(void 0,a=>this.storeTraceAsset(a)),ys.initializeRootTracerContext(this.interactionTracer);}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(t){let{snapshotId:n,screenshot:r}=t;this.metadata.beforeSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.jpeg`,contents:r});}attachAfterScreenshot(t){let{snapshotId:n,screenshot:r}=t;this.metadata.afterSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.jpeg`,contents:r});}attachBeforeHtmlSnapshot(t){let{snapshotId:n,html:r}=t;this.metadata.beforeSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.html`,contents:r});}attachAfterHtmlSnapshot(t){let{snapshotId:n,html:r}=t;this.metadata.afterSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.html`,contents:r});}recordTargetAutoHeal(t){let{healType:n}=t,r=n==="AI"?"ai-target-heal":"cache-heal";$t.increment("test_event",1,[`name:${r}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:n,healedAt:new Date};}storeTraceAsset(t){this.diskStorage.storeFile({name:`${Pn}/${t.snapshotId}.${t.extension??"jpeg"}`,contents:t.data});}async finishInternal(t){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(n=>n.finish({status:zSe(t.status),finishedAt:t.finishedAt}))));}recordStepDuration(t,n){if(!wg(t))return;let r=Rg(t);$t.distribution("test_step_duration",n,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`]);}async finish(t){!this.finished&&t.resolvedStep!==void 0&&t.durationMs!==void 0&&this.recordStepDuration(t.resolvedStep,t.durationMs),await this.finishInternal(t.step),t.step.trace=this.interactionTracer.getRootSpan();}async startSubSteps(){let t=new dc(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(t),t}};var YE=class{constructor(t,n,r,o,i,a,s){this.orgId=t;this.testId=n;this.testName=r;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pn),this.harPagesStream=this.diskStorage.createFileStream(`${Pn}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pn}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pn}/resource-usage.ndjson`),this.resourceUsageSampler=ED({keepSamples:!1,onSample:l=>{this.resourceUsageStream.write(`${JSON.stringify(l)}
|
|
6537
|
+
`),1)}function yK(){return platform()==="darwin"&&execSync("system_profiler SPDisplaysDataType").toString().includes("Retina")}function nh(e){yK()&&e===1&&(C.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),C.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."));}async function TK(e,t=!0){let n=xSe(e),r=await RSe.which(n[0],!0),o=n.slice(1),i=ASe.exec(wSe(r),o,{delay:100});if(t)return i}function EK(e){let t=e.trim();if(/^https?:\/\//i.test(t)){let n;try{n=new URL(t);}catch{throw new Error(`Invalid run URL: ${e}`)}let r=n.pathname.split("/").filter(i=>i.length>0),o=r.indexOf("runs");if(o===-1||o===r.length-1)throw new Error(`Could not extract run ID from URL: ${e}. Expected a URL like https://app.momentic.ai/runs/<runId>.`);return r[o+1]}return t}function WE(e){return new Promise((t,n)=>{let r=[];createReadStream(e).pipe(ISe()).on("data",o=>r.push(o)).on("end",()=>t(r)).on("error",o=>n(o));})}var Bn="2.104.3",PSe="https://registry.npmjs.org/momentic",MSe=z.object({versions:z.record(z.string(),z.unknown()).optional()});async function Mr(e){try{await OSe(e);}catch(t){C.warn({err:t},"Failed to check CLI version against NPM servers");}}async function EI(){let e=await ne(fetch(PSe),{milliseconds:5e3});if(!e.ok)throw new Error(`Got error status code ${e.status} ${e.statusText}`);let t=await e.json(),n=MSe.parse(t).versions;if(!n)throw new Error("Failed to fetch npm registry data. Skipping version check.");let r=Bn;for(let o of Object.keys(n))Od.valid(o)&&Od.major(o)===Od.major(Bn)&&Od.gt(o,r)&&Od.prerelease(o)===null&&(r=o);return r}async function OSe(e){let t;for(let n=0;n<2;n++)try{t=await EI();}catch(r){e.warn({err:r},"Failed to fetch latest version from npm registry");}if(!t){e.warn("Failed to fetch npm registry data. Skipping version check.");return}Od.eq(Bn,t)||(C.warn(`Update available: v${Bn} -> v${t}`),C.warn("This version may be missing critical fixes, features, and security updates."),C.warn('Run "npx momentic@latest upgrade" to update'));}OW("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI","POSTHOG_WEB_WRITE_KEY is not set");OW("https://us.i.posthog.com","POSTHOG_WRITE_HOST is not set");var{captureEvent:ks,setAnalyticsIdentity:bI,shutdownAnalytics:vK}=Ng({writeKey:"phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",host:"https://us.i.posthog.com",platform:"cli",identity:"stashed",flushImmediately:!0});async function Ct(){try{await ne(Promise.all([Og(),$t.flush(),vK()]),{milliseconds:5e3});}catch{}}function KE(e){return e.length===1?"test":"tests"}function CK(e){return e===1?"1 worker":`${e} workers`}function AK(e){e.length!==0&&(C.info(`Skipping ${e.length} disabled ${KE(e)}:`),e.forEach(t=>{C.info(`${Dt}- ${[t.relativeFilePath]}`);}),C.log(""));}function RK(e,t){e.length!==0&&(C.info(`Skipping ${e.length} quarantined ${KE(e)}:`),e.forEach(n=>{C.info(`${Dt}- ${[n.relativeFilePath]}: ${t[n.id]?.quarantinedReason}`);}),C.log(""));}function NSe(e,t){e.length!==0&&(C.info(`Running ${e.length} quarantined ${KE(e)} with ${CK(t)}:`),e.forEach(n=>{C.info(`${Dt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`);}),C.log(""));}function DSe(e,t,n){t.length===0&&e.length>0||(C.info(`Running ${t.length} ${KE(t)} with ${CK(n)}:`),t.forEach(r=>{C.info(`${Dt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`);}),C.log(""));}function wK({logger:e,localTestsToRunWithInputs:t,parallel:n,shardCount:r,shardIndex:o}){e.info({tests:t.length,shardCount:r,shardIndex:o,parallel:n},"Running local tests");let[i,a]=partition(t,s=>s.quarantined);NSe(i,n),DSe(i,a,n);}async function xK(e){let{orgId:t,runTracer:n,runGroupTracer:r,project:o,logger:i,generator:a,apiClient:s,testPlatform:l}=e,{runGroupMetadata:c}=r,{runId:u,runMetadata:d}=n;try{let p=Fu(d,u,{runGroupMetadata:c}),m=await Bj(p,n.storageDirectoryPath,{orgId:t,project:o,logger:i,generator:a,apiClient:s});return ks({type:"cli:failure_classification_ran",test_platform:l,success:!0,category:m?.category}),m}catch(p){i.warn({err:p},"Failed to classify test results"),ks({type:"cli:failure_classification_ran",test_platform:l,success:!1});}}async function IK({orgId:e,codeEvalTools:t,logger:n,outputDefinitions:r,testContext:o}){let i={};for(let a of r){let{name:s,value:l}=a;i[s]=await er({orgId:e,s:l,localTools:t,logger:n,context:o});}return i}async function _K({baseUrl:e,envName:t,devicePixelRatio:n,apiClient:r,test:o,storageClient:i,codeEvalTools:a,generator:s,orgId:l,variables:c,logger:u,customHeaders:d,testInputs:p,localBrowserConfig:m,aiSettings:f,visualDiffScreenshotStorage:h,tracer:g,browserTypeOverride:S}){let T={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:re,mode:"runner"},{controller:y,context:b}=await oE({baseUrl:e,envName:t,test:o,variables:c,logger:u,orgId:l,localBrowserConfig:m,aiSettings:f,customHeaders:d,codeEvalTools:a,storage:i,enricher:new hs(T,s),generator:s,visualDiffScreenshotStorage:h,devicePixelRatio:n,browserTypeOverride:S,callbacks:{onNetworkPage:A=>g.onNetworkPage(A),onNetworkLogs:A=>g.onNetworkLogs(A)},videoOptions:g.videoOutputPath?{videoOutputPath:g.videoOutputPath,onVideoPageChange:({videoName:A,timestamp:R})=>{g.setActiveVideo(A,R);}}:void 0,validateBrowserType:A=>{if(MS(A))return;let R=`Browser ${A} is required by the test named ${o.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;C.warn(R),re.warn(R);}});try{await iE({orgId:l,test:o,testInputs:p,localTools:a,logger:u,context:b});}catch(A){try{await y.browser.cleanup();}catch(R){u.error({err:R},"Failed to clean up browser after test input resolution failed");}throw A instanceof Of&&(C.error(A.message),process.exit(1)),A}return {controller:y,context:b}}async function PK({testAdvancedSettings:e,orgSettings:t,logger:n}){if(e.failureRecovery===!1||e.failureRecovery===void 0&&!t?.failureRecovery)return !1;if(!ll){let r="This test is ineligible for failure recovery since this does not appear to be a CI environment";return n.warn(r),C.debug(r),!1}return !0}async function MK({attemptInputs:e,attemptFixtures:t,attemptMetadata:n}){let{orgId:r,runId:o}=n,{controller:i,context:a,codeEvalTools:s,storageClient:l,logger:c,usageTracker:u,tracer:d}=t,{test:p,orgSettings:m}=e;c.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let f={controller:i,storage:l,usageTracker:u,context:a,logger:c,codeEvalTools:s},h={orgId:r,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},g={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await PK({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:c})};return await nE({fixtures:f,inputs:h,options:g,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup();}}},testParams:{tracer:d}})}async function OK(e){let{testDefinition:t,logger:n}=e,r=new Date;try{return await USe(e)}catch(o){Ja(o);let i="Fatal error running test";return C.error(`${i}: ${o.message}`),n.error({err:o},i),{results:[],parameters:e,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:t,filePath:t.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{},quarantined:e.quarantined,quarantinedMetadata:e.quarantinedMetadata}}}async function USe(e){let{testDefinition:t,project:n,apiClient:r,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:l,cacheOptions:c,runId:u,testInputs:d,quarantined:p,quarantinedMetadata:m,usageTracker:f}=e,h=new td(r,o),g=Fy({logger:s,orgId:o,client:r,gitMetadata:l,regenerateCache:c.regenerateCache,alwaysSaveCache:c.alwaysSaveCache,noCache:c.noCache,isolateCachesByEnvironment:n.config?.advanced?.isolateCachesByEnvironment,bustOldestCachePercentage:c.bustOldestCachePercentage}),{envName:S,resolvedEnv:T,environmentVariables:y,baseUrl:b}=Vy({test:t,envNameOverride:e.envName,urlOverride:i,resolveEnv:F=>Ol(F,n,s)}),A=await Mu({cacheStorage:g,logger:s,schemaVersion:t.schemaVersion,stepLists:{steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps},testId:t.id,environment:S,useSnapshotIdentityCache:n.config.fileFormat==="v2"}),R=A.steps,P=A.beforeSteps??void 0,x=A.afterSteps??void 0,I=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:t.beforeSteps,steps:t.steps,afterSteps:t.afterSteps},testId:t.id,testName:t.name,directory:dirname(t.relativeFilePath),testDescription:t.description??void 0,testLabels:t.labels,baseUrl:b,environmentName:S,schemaVersion:t.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m?.quarantinedReason,aiSettings:e.project.config.ai}),N=s.child(I.loggerBindings||{});Object.entries(I.envVarBindings||{}).forEach(([F,q])=>{y[F]=q;});let U=await BSe({...e,variables:y,envName:S,resolvedEnv:T,baseUrl:b,storageClient:h,tracer:I,runGroupTracer:a,logger:N,cacheStorage:g,stepsWithCaches:R,beforeStepsWithCaches:P,afterStepsWithCaches:x,usageTracker:f});return await I.finish({logger:s,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:I.runId,...U}}async function BSe(e){let{testDefinition:t,stepsWithCaches:n,beforeStepsWithCaches:r,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:l,baseUrl:c,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:f,testInputs:h,variables:g,resolvedEnv:S,retriesOverride:T,devicePixelRatio:y,logUpdate:b,tracer:A,runGroupTracer:R,logger:P,cacheStorage:x,gitMetadata:I,quarantined:N,quarantinedMetadata:U,usageTracker:F}=e,q=i.config.ai?.aiFailureAnalysis??!1,H=new Date,ee=new Ju(i,s,a),Ce={...i.config},D={envName:p,urlOverride:m,customHeaders:f,testInputs:h},W,Z=Math.abs(T??t.retries??i.config.retries??0),fe=[];P.info({...I,labels:t.labels,name:t.name,cwd:process.cwd()},"Starting test run using CLI");for(let ue=0;ue<=Z;ue++){let te=randomUUID(),we=await A.startAttempt(te),Oe=P.child(we.loggerBindings||{}),oe={...t,steps:cloneDeep(n),beforeSteps:cloneDeep(r),afterSteps:cloneDeep(o)};ue!==0&&b("RETRY",`attempt ${ue+1}/${Z+1}`);let _=new Date,ie=Ce.advanced?.fakerConstantSeed,Se=new Bi({httpClient:new Kn({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:Oe,mode:"runner"}),fakerSeed:ie?lu:void 0}),ai=we;try{let{controller:wn,context:Or}=await _K({tracer:we,baseUrl:c,envName:p,apiClient:s,devicePixelRatio:y,logger:Oe,storageClient:u,codeEvalTools:Se,test:oe,generator:l,orgId:d,variables:g,customHeaders:f,testInputs:h,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...oe.advanced},browserTypeOverride:e.browserTypeOverride,aiSettings:{...i.config.ai||{},...oe.advanced||{}},visualDiffScreenshotStorage:ee});e.abortSignal&&(e.abortSignal.aborted?wn.executeAbortController.abort():e.abortSignal.addEventListener("abort",()=>{wn.executeAbortController.abort();},{once:!0})),W=await MK({attemptMetadata:{attemptNumber:ue+1,orgId:d,runId:A.runId},attemptFixtures:{logger:Oe,storageClient:u,usageTracker:F,codeEvalTools:Se,apiClient:s,context:Or,controller:wn,tracer:we},attemptInputs:{test:oe,orgSettings:Ce}});let ro=new Date,Xi={logger:P,cacheStorage:x,orgId:d,testId:t.id,environment:p,originalStepsWithCaches:{steps:cloneDeep(n),beforeSteps:cloneDeep(r),afterSteps:cloneDeep(o)},updatedStepsWithCaches:{steps:oe.steps,beforeSteps:oe.beforeSteps,afterSteps:oe.afterSteps}};await bl({logger:P,cacheStorage:x,orgId:d,testId:t.id,environment:p,stepLists:Xi.updatedStepsWithCaches,useSnapshotIdentityCache:i.config.fileFormat==="v2"}),W?.status==="PASSED"?await vl(Xi):W?.status==="FAILED"&&ue===Z&&await Nu(Xi),await we.finish({logger:Oe,result:W}),fe.unshift(W.status);let de=await IK({orgId:d,codeEvalTools:Se,logger:Oe,outputDefinitions:t.outputs??[],testContext:Or}),Ji=SM(fe),si=ue+1;if(W.status!=="FAILED")return {...W,runAttemptId:te,parameters:D,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:ro,attempts:si,baseUrl:c,outputs:de,isFlake:Ji,quarantined:N,quarantinedMetadata:U};let Nd=W.failedStepResult,Fo=Nd?.message||"Unknown failure",oo=Nd?.failureReason??oP(Fo)??"UnknownError",Dd=Oe.child({failureReason:oo,errorMessage:Fo,numAttempts:(Z+1).toString(),name:oe.name});if(ue<Z){Dd.warn(`Retrying failed execution attempt for run: ${Fo}`);continue}Dd.error(`Test failed after all exhausting attempts: ${Fo}`);let pc=new Error(Fo),Zi={errorMessage:Fo,errorStack:pc.stack},Us;if(q)if(i.config.ai?.agentConfig?.["failure-classification"]?.startsWith("v2")){let Uo=await xK({orgId:d,runGroupTracer:R,runTracer:A,project:i,logger:Oe,generator:l,apiClient:s,testPlatform:"web"});Uo&&(Us=Uo.category,oo=Uo.category,Zi.classification={reason:Uo.category,summary:Uo.reasoning,source:"v2"});}else {let Uo;try{if(W.results&&W.results.length>0){let{classification:mc,aiFailureReason:Ye}=await uB({logger:Oe,browserStateStorage:ai,generator:l,fullResults:W,failureReason:oo,error:pc,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Uo=mc,Us=Ye;}}catch(mc){Oe.warn({err:mc},"Failed to classify test results");}Uo&&(Zi.classification=Uo,oo=Us??oo,Zi.classification.source="v1");}return {...W,runAttemptId:te,parameters:D,failureDetails:Zi,failureReason:oo,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:ro,attempts:ue+1,baseUrl:c,outputs:de,quarantined:N,quarantinedMetadata:U}}catch(wn){let Or=`Encountered fatal platform error while running test '${oe.name}': ${wn}`,ro=new Date,Xi=ue+1;Oe.error({err:wn},Or),C.error(Or);let de={errorMessage:wn.message,errStack:wn.stack},Ji={status:"FAILED",failureDetails:de,failureReason:"InternalPlatformError",finishedAt:ro};return await we.finish({logger:Oe,result:{status:"FAILED",results:[]}}),{...Ji,runAttemptId:te,results:[],parameters:D,test:oe,filePath:oe.relativeFilePath,startedAt:H,lastAttemptStartedAt:_,finishedAt:new Date,attempts:Xi,baseUrl:c,outputs:{},quarantined:N,quarantinedMetadata:U}}}throw new Error("This code should not be reachable")}var dc=class{constructor(t,n,r,o){this.orgId=t;this.testId=n;this.testName=r;this.diskStorage=o;}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(t,n){return this.diskStorage.readFile(`${Pn}/${n}.jpeg`)}async getHtmlSnapshot(t,n){return this.diskStorage.readFile(`${Pn}/${n}.html`)?.toString()}recordStepStat(t){t.type!=="PRESET_ACTION"?this.stepFrequenciesByType[t.type]=(this.stepFrequenciesByType[t.type]||0)+1:this.stepFrequenciesByType[t.command.type]=(this.stepFrequenciesByType[t.command.type]||0)+1;}sendFinalizedStepStats(){for(let[t,n]of Object.entries(this.stepFrequenciesByType))$t.increment("test_step_execution",n,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`]);}async startStep(t){let{step:n}=t;this.recordStepStat(n);let r={step:n,status:"RUNNING",startedAt:new Date},o=new vI(this.orgId,this.testId,this.testName,r,this.diskStorage);return this.children.push(o),o}async finish(t){this.finished||(this.finished=!0,await Promise.all(this.children.map(n=>n.finishInternal({status:AM(t.status),finishedAt:t.finishedAt}))),this.sendFinalizedStepStats());}};function zSe(e){switch(e){case"SUCCESS":return "PASSED";case"FAILED":return "FAILED";case"CANCELLED":return "CANCELLED";case"RUNNING":return "RUNNING";case"IDLE":return "PENDING"}}var vI=class{constructor(t,n,r,o,i){this.orgId=t;this.testId=n;this.testName=r;this.metadata=o;this.diskStorage=i;this.interactionTracer=new Ts(void 0,a=>this.storeTraceAsset(a)),ys.initializeRootTracerContext(this.interactionTracer);}children=[];finished=!1;interactionTracer;attachBeforeScreenshot(t){let{snapshotId:n,screenshot:r}=t;this.metadata.beforeSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.jpeg`,contents:r});}attachAfterScreenshot(t){let{snapshotId:n,screenshot:r}=t;this.metadata.afterSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.jpeg`,contents:r});}attachBeforeHtmlSnapshot(t){let{snapshotId:n,html:r}=t;this.metadata.beforeSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.html`,contents:r});}attachAfterHtmlSnapshot(t){let{snapshotId:n,html:r}=t;this.metadata.afterSnapshotId=n,this.diskStorage.storeFile({name:`${Pn}/${n}.html`,contents:r});}recordTargetAutoHeal(t){let{healType:n}=t,r=n==="AI"?"ai-target-heal":"cache-heal";$t.increment("test_event",1,[`name:${r}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:n,healedAt:new Date};}storeTraceAsset(t){this.diskStorage.storeFile({name:`${Pn}/${t.snapshotId}.${t.extension??"jpeg"}`,contents:t.data});}async finishInternal(t){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(n=>n.finish({status:zSe(t.status),finishedAt:t.finishedAt}))));}recordStepDuration(t,n){if(!wg(t))return;let r=Rg(t);$t.distribution("test_step_duration",n,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`]);}async finish(t){!this.finished&&t.resolvedStep!==void 0&&t.durationMs!==void 0&&this.recordStepDuration(t.resolvedStep,t.durationMs),await this.finishInternal(t.step),t.step.trace=this.interactionTracer.getRootSpan();}async startSubSteps(){let t=new dc(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(t),t}};var YE=class{constructor(t,n,r,o,i,a,s){this.orgId=t;this.testId=n;this.testName=r;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(Pn),this.harPagesStream=this.diskStorage.createFileStream(`${Pn}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${Pn}/har-entries.log`),this.resourceUsageStream=this.diskStorage.createFileStream(`${Pn}/resource-usage.ndjson`),this.resourceUsageSampler=ED({keepSamples:!1,onSample:l=>{this.resourceUsageStream.write(`${JSON.stringify(l)}
|
|
6538
6538
|
`),l.system.cpu&&(this.cpuUsageSum+=l.system.cpu.total,this.cpuSampleCount++);let c=l.system.memory.total-l.system.memory.free;this.memoryUsageSum+=c,this.memorySampleCount++;}});}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;resourceUsageStream;resourceUsageSampler;cpuUsageSum=0;cpuSampleCount=0;memoryUsageSum=0;memorySampleCount=0;get loggerBindings(){return {runAttemptId:this.runAttemptId}}getResourceUsageAverages(){return {avgCpuUsage:this.cpuSampleCount>0?this.cpuUsageSum/this.cpuSampleCount:0,avgMemoryUsage:this.memorySampleCount>0?this.memoryUsageSum/this.memorySampleCount:0}}get videoOutputPath(){if(this.recordVideo)return An__default.resolve(this.diskStorage.cwd(),Pn)}setActiveVideo(t,n){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:t,timestamp:n}));}onNetworkPage(t){this.finished||this.harPagesStream.write(`${JSON.stringify(t)}
|
|
6539
6539
|
`);}onNetworkLogs(t){if(!this.finished)for(let[n,r]of Object.entries(t))r.response?(delete this.inProgressHarEntries[n],this.harEntriesStream.write(`${JSON.stringify(r)}
|
|
6540
6540
|
`)):this.inProgressHarEntries[n]=r;}attachConsoleLogs(t){let{logs:n}=t;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(n,null,2)});}attachBrowserCrashDump(t){let{crashReportDirFetcher:n,logger:r}=t,o=n();if(!o)return;let i=new rV;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${Pn}/${Vv}`,contents:i.toBuffer()}),r.info({browserCrashZipName:Vv},"Attached browser crash ZIP");}async finish(t){if(this.finished)return;this.finished=!0;let{logger:n,result:r}=t,o={...this.metadata,status:r.status,finishedAt:new Date,results:JS(r.results,n),beforeResults:r.beforeResults?JS(r.beforeResults,n):void 0,afterResults:r.afterResults?JS(r.afterResults,n):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt})));for(let i of Object.values(this.inProgressHarEntries))this.harEntriesStream.write(`${JSON.stringify(i)}
|
|
@@ -6546,4 +6546,4 @@ ${e.map(p=>`${Dt}- ${p}`).join(`
|
|
|
6546
6546
|
Reasoning: ${m.reasoning}`),process.exit(0);}catch(i){throw re.error({err:i,runId:o,serverId:r},"AI classify command failed"),C.error(`AI classify command failed (classificationId: ${r})`),i}});HK.command("explore",{hidden:!0}).description("Print a diff manifest of changes between two git refs to stdout. Used by the discovery agent to identify new or changed user journeys.").requiredOption("--base <sha>","Base git ref to diff against (branch name, tag, or SHA).").requiredOption("--head <sha>","Head git ref to diff (branch name, tag, or SHA).").option("--cwd <path>","Working directory to run git commands in.",process.cwd()).action(async e=>{await Mr(re),await u2({cwd:An__default.resolve(e.cwd),baseSha:e.base,headSha:e.head}),await Ct(),process.exit(0);});on.command("heal-tests",{hidden:!0}).description("Group failed test results by shared test fixes.").addArgument(FE).addOption(gr).addOption(Sr).addOption(mn).addOption(Ki).addOption(Ma).addOption(Yf).addOption(kE).addOption(Qf).addOption(eh).addOption(Jf).addOption(Zf).addOption(Xf).addOption(new Option("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new Option("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new Option("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new Option("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Pr)).addOption(uI).addOption(new Option("--limit <limit>","Maximum number of failed runs to inspect.").argParser(Zx)).addOption(cI).addOption(dI).addOption(Qx).action(async(e,t)=>{await Mr(re);let n=vm(t),r=Kf(t.customHeaders),o=await bt({configFilePath:t.config,nameFilter:t.filter}),i=t.parallel??o.config.parallel??1;if(i==="AUTO")throw new Error('parallel: "AUTO" is not supported by the web CLI. Use a numeric value.');cpus().length<i*2&&C.warn(`You requested to run tests in parallel ${i} at a time on a machine with ${cpus().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);let a=new Tt({baseUrl:t.server,apiKey:t.apiKey,logger:re}),{orgId:s,userId:l}=await Jm({client:a,skipPrompts:t.yes});bI({userId:l,orgId:s});let c=Ri.parse(JSON.parse(yn__default.readFileSync(An__default.join(e,"metadata.json"),"utf-8"))),{id:u}=c;if(!u)throw new Error(`Results metadata at ${e} does not include a run group ID.`);let d=re.child({cliVersion:Bn,orgId:s,userId:l,runGroupId:u}),p=await Jo(re,a,o);d.info({gitMetadata:p,config:o.config,nodeVersion:process.versions.node},"Got local metadata");let m;t.inputCsv&&(m=await WE(t.inputCsv));let f=t.pixelRatio??th();nh(f);let h={maxConcurrentSessions:i,mode:"queue"};({resultsDir:e,limit:t.limit,project:o,client:a,logger:d,orgId:s,userId:l,runGroupId:u,gitMetadata:p,cacheOptions:n,customHeaders:r,envName:t.env,urlOverride:t.urlOverride,devicePixelRatio:f,testInputMatrix:m,browserTypeOverride:t.browser,start:t.start,waitOn:t.waitOn,waitOnProxy:t.waitOnProxy,waitOnTimeout:t.waitOnTimeout,timeoutMinutes:t.timeoutMinutes,agentOutputStream:t.quiet?void 0:process.stdout,sessionQueue:h,sessionOptions:{envName:t.env,customHeaders:r,devicePixelRatio:f,urlOverride:t.urlOverride,testInputs:m&&m.length===1?m[0]:void 0,browserTypeOverride:t.browser}});C.info("heal-tests is currently a no-op.");});on.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(mn).addOption(Ki).action(async e=>{let t=await bt({configFilePath:e.config,nameFilter:e.filter});C.info("Updating Momentic version in package.json..."),await kK(),C.info("Updating project configuration..."),FK(t),C.success("Your project configuration was successfully updated to the latest recommended settings."),C.info("You can optionally run tests with the `--regenerate-cache` flag to entirely rebuild caches with the newer configuration. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times."),await Ct(),process.exit(0);});async function oye(){zK("Main program started");try{await on.parseAsync(process.argv),await Ct();}catch(e){let t={};try{t.playwrightVersion=execSync("npx playwright --version").toString();}catch(n){re.error({err:n},"Error fetching debug information");}re.error({err:e,debugInfo:t},"Uncaught error in CLI"),C.error(e),await Ct(),process.exit(1);}}Yhe.setMaxListeners(25);process.on("warning",e=>{re.warn({err:e},`Node warning received on CLI: ${e.message}`);});zK("CLI parsing setup complete");oye();
|
|
6547
6547
|
//# sourceMappingURL=out.js.map
|
|
6548
6548
|
//# sourceMappingURL=cli.js.map
|
|
6549
|
-
//# debugId=
|
|
6549
|
+
//# debugId=42b8d727-48f8-5a33-a4a8-92b82d4ae9ba
|